/ Hex Artifact Content
Login

Artifact 40708330a0e9bf79c0ab97109b8014fa04cce858:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  .../*.** Trace o
0350: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
0360: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
0370: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
0380: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
0390: 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c 69  )./***/ int sqli
03a0: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d 20  te3WhereTrace = 
03b0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
03c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
03d0: 55 47 29 20 5c 0a 20 20 20 20 26 26 20 28 64 65  UG) \.    && (de
03e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
03f0: 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
0400: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52  LITE_ENABLE_WHER
0410: 45 54 52 41 43 45 29 29 0a 23 20 64 65 66 69 6e  ETRACE)).# defin
0420: 65 20 57 48 45 52 45 54 52 41 43 45 28 58 29 20  e WHERETRACE(X) 
0430: 20 69 66 28 73 71 6c 69 74 65 33 57 68 65 72 65   if(sqlite3Where
0440: 54 72 61 63 65 29 20 73 71 6c 69 74 65 33 44 65  Trace) sqlite3De
0450: 62 75 67 50 72 69 6e 74 66 20 58 0a 23 65 6c 73  bugPrintf X.#els
0460: 65 0a 23 20 64 65 66 69 6e 65 20 57 48 45 52 45  e.# define WHERE
0470: 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a  TRACE(X).#endif.
0480: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
0490: 72 65 6e 63 65 0a 2a 2f 0a 74 79 70 65 64 65 66  rence.*/.typedef
04a0: 20 73 74 72 75 63 74 20 57 68 65 72 65 43 6c 61   struct WhereCla
04b0: 75 73 65 20 57 68 65 72 65 43 6c 61 75 73 65 3b  use WhereClause;
04c0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
04d0: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 57 68 65  WhereMaskSet Whe
04e0: 72 65 4d 61 73 6b 53 65 74 3b 0a 74 79 70 65 64  reMaskSet;.typed
04f0: 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65 4f  ef struct WhereO
0500: 72 49 6e 66 6f 20 57 68 65 72 65 4f 72 49 6e 66  rInfo WhereOrInf
0510: 6f 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  o;.typedef struc
0520: 74 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 57  t WhereAndInfo W
0530: 68 65 72 65 41 6e 64 49 6e 66 6f 3b 0a 74 79 70  hereAndInfo;.typ
0540: 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72  edef struct Wher
0550: 65 43 6f 73 74 20 57 68 65 72 65 43 6f 73 74 3b  eCost WhereCost;
0560: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72  ../*.** The quer
0570: 79 20 67 65 6e 65 72 61 74 6f 72 20 75 73 65 73  y generator uses
0580: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 73   an array of ins
0590: 74 61 6e 63 65 73 20 6f 66 20 74 68 69 73 20 73  tances of this s
05a0: 74 72 75 63 74 75 72 65 20 74 6f 0a 2a 2a 20 68  tructure to.** h
05b0: 65 6c 70 20 69 74 20 61 6e 61 6c 79 7a 65 20 74  elp it analyze t
05c0: 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
05d0: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
05e0: 6c 61 75 73 65 2e 20 20 45 61 63 68 20 57 48 45  lause.  Each WHE
05f0: 52 45 0a 2a 2a 20 63 6c 61 75 73 65 20 73 75 62  RE.** clause sub
0600: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
0610: 70 61 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65  parated from the
0620: 20 6f 74 68 65 72 73 20 62 79 20 41 4e 44 20 6f   others by AND o
0630: 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20 75 73 75  perators,.** usu
0640: 61 6c 6c 79 2c 20 6f 72 20 73 6f 6d 65 74 69 6d  ally, or sometim
0650: 65 73 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  es subexpression
0660: 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20 4f  s separated by O
0670: 52 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 57 68 65  R..**.** All Whe
0680: 72 65 54 65 72 6d 73 20 61 72 65 20 63 6f 6c 6c  reTerms are coll
0690: 65 63 74 65 64 20 69 6e 74 6f 20 61 20 73 69 6e  ected into a sin
06a0: 67 6c 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  gle WhereClause 
06b0: 73 74 72 75 63 74 75 72 65 2e 20 20 0a 2a 2a 20  structure.  .** 
06c0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 64  The following id
06d0: 65 6e 74 69 74 79 20 68 6f 6c 64 73 3a 0a 2a 2a  entity holds:.**
06e0: 0a 2a 2a 20 20 20 20 20 20 20 20 57 68 65 72 65  .**        Where
06f0: 54 65 72 6d 2e 70 57 43 2d 3e 61 5b 57 68 65 72  Term.pWC->a[Wher
0700: 65 54 65 72 6d 2e 69 64 78 5d 20 3d 3d 20 57 68  eTerm.idx] == Wh
0710: 65 72 65 54 65 72 6d 0a 2a 2a 0a 2a 2a 20 57 68  ereTerm.**.** Wh
0720: 65 6e 20 61 20 74 65 72 6d 20 69 73 20 6f 66 20  en a term is of 
0730: 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 58 20 3c               X <
0750: 6f 70 3e 20 3c 65 78 70 72 3e 0a 2a 2a 0a 2a 2a  op> <expr>.**.**
0760: 20 77 68 65 72 65 20 58 20 69 73 20 61 20 63 6f   where X is a co
0770: 6c 75 6d 6e 20 6e 61 6d 65 20 61 6e 64 20 3c 6f  lumn name and <o
0780: 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 63 65 72  p> is one of cer
0790: 74 61 69 6e 20 6f 70 65 72 61 74 6f 72 73 2c 0a  tain operators,.
07a0: 2a 2a 20 74 68 65 6e 20 57 68 65 72 65 54 65 72  ** then WhereTer
07b0: 6d 2e 6c 65 66 74 43 75 72 73 6f 72 20 61 6e 64  m.leftCursor and
07c0: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 6c 65 66   WhereTerm.u.lef
07d0: 74 43 6f 6c 75 6d 6e 20 72 65 63 6f 72 64 20 74  tColumn record t
07e0: 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d  he.** cursor num
07f0: 62 65 72 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e  ber and column n
0800: 75 6d 62 65 72 20 66 6f 72 20 58 2e 20 20 57 68  umber for X.  Wh
0810: 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f  ereTerm.eOperato
0820: 72 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65  r records.** the
0830: 20 3c 6f 70 3e 20 75 73 69 6e 67 20 61 20 62 69   <op> using a bi
0840: 74 6d 61 73 6b 20 65 6e 63 6f 64 69 6e 67 20 64  tmask encoding d
0850: 65 66 69 6e 65 64 20 62 79 20 57 4f 5f 78 78 78  efined by WO_xxx
0860: 20 62 65 6c 6f 77 2e 20 20 54 68 65 0a 2a 2a 20   below.  The.** 
0870: 75 73 65 20 6f 66 20 61 20 62 69 74 6d 61 73 6b  use of a bitmask
0880: 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72 20 74 68   encoding for th
0890: 65 20 6f 70 65 72 61 74 6f 72 20 61 6c 6c 6f 77  e operator allow
08a0: 73 20 75 73 20 74 6f 20 73 65 61 72 63 68 0a 2a  s us to search.*
08b0: 2a 20 71 75 69 63 6b 6c 79 20 66 6f 72 20 74 65  * quickly for te
08c0: 72 6d 73 20 74 68 61 74 20 6d 61 74 63 68 20 61  rms that match a
08d0: 6e 79 20 6f 66 20 73 65 76 65 72 61 6c 20 64 69  ny of several di
08e0: 66 66 65 72 65 6e 74 20 6f 70 65 72 61 74 6f 72  fferent operator
08f0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 57 68 65 72 65  s..**.** A Where
0900: 54 65 72 6d 20 6d 69 67 68 74 20 61 6c 73 6f 20  Term might also 
0910: 62 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  be two or more s
0920: 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65  ubterms connecte
0930: 64 20 62 79 20 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20  d by OR:.**.**  
0940: 20 20 20 20 20 20 20 28 74 31 2e 58 20 3c 6f 70         (t1.X <op
0950: 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20 28 74 31  > <expr>) OR (t1
0960: 2e 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 29 20  .Y <op> <expr>) 
0970: 4f 52 20 2e 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e  OR .....**.** In
0980: 20 74 68 69 73 20 73 65 63 6f 6e 64 20 63 61 73   this second cas
0990: 65 2c 20 77 74 46 6c 61 67 20 61 73 20 74 68 65  e, wtFlag as the
09a0: 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 73 65 74   TERM_ORINFO set
09b0: 20 61 6e 64 20 65 4f 70 65 72 61 74 6f 72 3d 3d   and eOperator==
09c0: 57 4f 5f 4f 52 0a 2a 2a 20 61 6e 64 20 74 68 65  WO_OR.** and the
09d0: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72   WhereTerm.u.pOr
09e0: 49 6e 66 6f 20 66 69 65 6c 64 20 70 6f 69 6e 74  Info field point
09f0: 73 20 74 6f 20 61 75 78 69 6c 69 61 72 79 20 69  s to auxiliary i
0a00: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 0a  nformation that.
0a10: 2a 2a 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20  ** is collected 
0a20: 61 62 6f 75 74 20 74 68 65 0a 2a 2a 0a 2a 2a 20  about the.**.** 
0a30: 49 66 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65  If a term in the
0a40: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 6f   WHERE clause do
0a50: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 65 69 74  es not match eit
0a60: 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
0a70: 72 65 76 69 6f 75 73 0a 2a 2a 20 63 61 74 65 67  revious.** categ
0a80: 6f 72 69 65 73 2c 20 74 68 65 6e 20 65 4f 70 65  ories, then eOpe
0a90: 72 61 74 6f 72 3d 3d 30 2e 20 20 54 68 65 20 57  rator==0.  The W
0aa0: 68 65 72 65 54 65 72 6d 2e 70 45 78 70 72 20 66  hereTerm.pExpr f
0ab0: 69 65 6c 64 20 69 73 20 73 74 69 6c 6c 20 73 65  ield is still se
0ac0: 74 0a 2a 2a 20 74 6f 20 74 68 65 20 6f 72 69 67  t.** to the orig
0ad0: 69 6e 61 6c 20 73 75 62 65 78 70 72 65 73 73 69  inal subexpressi
0ae0: 6f 6e 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 77  on content and w
0af0: 74 46 6c 61 67 73 20 69 73 20 73 65 74 20 75 70  tFlags is set up
0b00: 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 0a 2a   appropriately.*
0b10: 2a 20 62 75 74 20 6e 6f 20 6f 74 68 65 72 20 66  * but no other f
0b20: 69 65 6c 64 73 20 69 6e 20 74 68 65 20 57 68 65  ields in the Whe
0b30: 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 20 61 72  reTerm object ar
0b40: 65 20 6d 65 61 6e 69 6e 67 66 75 6c 2e 0a 2a 2a  e meaningful..**
0b50: 0a 2a 2a 20 57 68 65 6e 20 65 4f 70 65 72 61 74  .** When eOperat
0b60: 6f 72 21 3d 30 2c 20 70 72 65 72 65 71 52 69 67  or!=0, prereqRig
0b70: 68 74 20 61 6e 64 20 70 72 65 72 65 71 41 6c 6c  ht and prereqAll
0b80: 20 72 65 63 6f 72 64 20 73 65 74 73 20 6f 66 20   record sets of 
0b90: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 2c 0a  cursor numbers,.
0ba0: 2a 2a 20 62 75 74 20 74 68 65 79 20 64 6f 20 73  ** but they do s
0bb0: 6f 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 20 41  o indirectly.  A
0bc0: 20 73 69 6e 67 6c 65 20 57 68 65 72 65 4d 61 73   single WhereMas
0bd0: 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 20 74  kSet structure t
0be0: 72 61 6e 73 6c 61 74 65 73 0a 2a 2a 20 63 75 72  ranslates.** cur
0bf0: 73 6f 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  sor number into 
0c00: 62 69 74 73 20 61 6e 64 20 74 68 65 20 74 72 61  bits and the tra
0c10: 6e 73 6c 61 74 65 64 20 62 69 74 20 69 73 20 73  nslated bit is s
0c20: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 72 65  tored in the pre
0c30: 72 65 71 0a 2a 2a 20 66 69 65 6c 64 73 2e 20 20  req.** fields.  
0c40: 54 68 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20  The translation 
0c50: 69 73 20 75 73 65 64 20 69 6e 20 6f 72 64 65 72  is used in order
0c60: 20 74 6f 20 6d 61 78 69 6d 69 7a 65 20 74 68 65   to maximize the
0c70: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 69   number of.** bi
0c80: 74 73 20 74 68 61 74 20 77 69 6c 6c 20 66 69 74  ts that will fit
0c90: 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 2e 20 20   in a Bitmask.  
0ca0: 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
0cb0: 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20 62 65  numbers might be
0cc0: 0a 2a 2a 20 73 70 72 65 61 64 20 6f 75 74 20 6f  .** spread out o
0cd0: 76 65 72 20 74 68 65 20 6e 6f 6e 2d 6e 65 67 61  ver the non-nega
0ce0: 74 69 76 65 20 69 6e 74 65 67 65 72 73 2e 20 20  tive integers.  
0cf0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  For example, the
0d00: 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65   cursor.** numbe
0d10: 72 73 20 6d 69 67 68 74 20 62 65 20 33 2c 20 38  rs might be 3, 8
0d20: 2c 20 39 2c 20 31 30 2c 20 32 30 2c 20 32 33 2c  , 9, 10, 20, 23,
0d30: 20 34 31 2c 20 61 6e 64 20 34 35 2e 20 20 54 68   41, and 45.  Th
0d40: 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74 0a 2a  e WhereMaskSet.*
0d50: 2a 20 74 72 61 6e 73 6c 61 74 65 73 20 74 68 65  * translates the
0d60: 73 65 20 73 70 61 72 73 65 20 63 75 72 73 6f 72  se sparse cursor
0d70: 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f   numbers into co
0d80: 6e 73 65 63 75 74 69 76 65 20 69 6e 74 65 67 65  nsecutive intege
0d90: 72 73 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20  rs.** beginning 
0da0: 77 69 74 68 20 30 20 69 6e 20 6f 72 64 65 72 20  with 0 in order 
0db0: 74 6f 20 6d 61 6b 65 20 74 68 65 20 62 65 73 74  to make the best
0dc0: 20 70 6f 73 73 69 62 6c 65 20 75 73 65 20 6f 66   possible use of
0dd0: 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a   the available.*
0de0: 2a 20 62 69 74 73 20 69 6e 20 74 68 65 20 42 69  * bits in the Bi
0df0: 74 6d 61 73 6b 2e 20 20 53 6f 2c 20 69 6e 20 74  tmask.  So, in t
0e00: 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65  he example above
0e10: 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  , the cursor num
0e20: 62 65 72 73 0a 2a 2a 20 77 6f 75 6c 64 20 62 65  bers.** would be
0e30: 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 69 6e 74   mapped into int
0e40: 65 67 65 72 73 20 30 20 74 68 72 6f 75 67 68 20  egers 0 through 
0e50: 37 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d  7..**.** The num
0e60: 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
0e70: 61 20 6a 6f 69 6e 20 69 73 20 6c 69 6d 69 74 65  a join is limite
0e80: 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20  d by the number 
0e90: 6f 66 20 62 69 74 73 0a 2a 2a 20 69 6e 20 70 72  of bits.** in pr
0ea0: 65 72 65 71 52 69 67 68 74 20 61 6e 64 20 70 72  ereqRight and pr
0eb0: 65 72 65 71 41 6c 6c 2e 20 20 54 68 65 20 64 65  ereqAll.  The de
0ec0: 66 61 75 6c 74 20 69 73 20 36 34 20 62 69 74 73  fault is 64 bits
0ed0: 2c 20 68 65 6e 63 65 20 53 51 4c 69 74 65 0a 2a  , hence SQLite.*
0ee0: 2a 20 69 73 20 6f 6e 6c 79 20 61 62 6c 65 20 74  * is only able t
0ef0: 6f 20 70 72 6f 63 65 73 73 20 6a 6f 69 6e 73 20  o process joins 
0f00: 77 69 74 68 20 36 34 20 6f 72 20 66 65 77 65 72  with 64 or fewer
0f10: 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 74 79 70 65   tables..*/.type
0f20: 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65  def struct Where
0f30: 54 65 72 6d 20 57 68 65 72 65 54 65 72 6d 3b 0a  Term WhereTerm;.
0f40: 73 74 72 75 63 74 20 57 68 65 72 65 54 65 72 6d  struct WhereTerm
0f50: 20 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72   {.  Expr *pExpr
0f60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0f70: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  Pointer to the s
0f80: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  ubexpression tha
0f90: 74 20 69 73 20 74 68 69 73 20 74 65 72 6d 20 2a  t is this term *
0fa0: 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b  /.  int iParent;
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
0fc0: 69 73 61 62 6c 65 20 70 57 43 2d 3e 61 5b 69 50  isable pWC->a[iP
0fd0: 61 72 65 6e 74 5d 20 77 68 65 6e 20 74 68 69 73  arent] when this
0fe0: 20 74 65 72 6d 20 64 69 73 61 62 6c 65 64 20 2a   term disabled *
0ff0: 2f 0a 20 20 69 6e 74 20 6c 65 66 74 43 75 72 73  /.  int leftCurs
1000: 6f 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  or;         /* C
1010: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
1020: 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78  X in "X <op> <ex
1030: 70 72 3e 22 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20  pr>" */.  union 
1040: 7b 0a 20 20 20 20 69 6e 74 20 6c 65 66 74 43 6f  {.    int leftCo
1050: 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  lumn;         /*
1060: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f   Column number o
1070: 66 20 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c  f X in "X <op> <
1080: 65 78 70 72 3e 22 20 2a 2f 0a 20 20 20 20 57 68  expr>" */.    Wh
1090: 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e  ereOrInfo *pOrIn
10a0: 66 6f 3b 20 20 20 2f 2a 20 45 78 74 72 61 20 69  fo;   /* Extra i
10b0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 66 20 65 4f  nformation if eO
10c0: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 2a  perator==WO_OR *
10d0: 2f 0a 20 20 20 20 57 68 65 72 65 41 6e 64 49 6e  /.    WhereAndIn
10e0: 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 20 2f 2a  fo *pAndInfo; /*
10f0: 20 45 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   Extra informati
1100: 6f 6e 20 69 66 20 65 4f 70 65 72 61 74 6f 72 3d  on if eOperator=
1110: 3d 57 4f 5f 41 4e 44 20 2a 2f 0a 20 20 7d 20 75  =WO_AND */.  } u
1120: 3b 0a 20 20 75 31 36 20 65 4f 70 65 72 61 74 6f  ;.  u16 eOperato
1130: 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  r;          /* A
1140: 20 57 4f 5f 78 78 20 76 61 6c 75 65 20 64 65 73   WO_xx value des
1150: 63 72 69 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a  cribing <op> */.
1160: 20 20 75 38 20 77 74 46 6c 61 67 73 3b 20 20 20    u8 wtFlags;   
1170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 45 52            /* TER
1180: 4d 5f 78 78 78 20 62 69 74 20 66 6c 61 67 73 2e  M_xxx bit flags.
1190: 20 20 53 65 65 20 62 65 6c 6f 77 20 2a 2f 0a 20    See below */. 
11a0: 20 75 38 20 6e 43 68 69 6c 64 3b 20 20 20 20 20   u8 nChild;     
11b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
11c0: 65 72 20 6f 66 20 63 68 69 6c 64 72 65 6e 20 74  er of children t
11d0: 68 61 74 20 6d 75 73 74 20 64 69 73 61 62 6c 65  hat must disable
11e0: 20 75 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c   us */.  WhereCl
11f0: 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20  ause *pWC;      
1200: 20 2f 2a 20 54 68 65 20 63 6c 61 75 73 65 20 74   /* The clause t
1210: 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74  his term is part
1220: 20 6f 66 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b   of */.  Bitmask
1230: 20 70 72 65 72 65 71 52 69 67 68 74 3b 20 20 20   prereqRight;   
1240: 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 74   /* Bitmask of t
1250: 61 62 6c 65 73 20 75 73 65 64 20 62 79 20 70 45  ables used by pE
1260: 78 70 72 2d 3e 70 52 69 67 68 74 20 2a 2f 0a 20  xpr->pRight */. 
1270: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41   Bitmask prereqA
1280: 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 42 69 74 6d  ll;      /* Bitm
1290: 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 72 65  ask of tables re
12a0: 66 65 72 65 6e 63 65 64 20 62 79 20 70 45 78 70  ferenced by pExp
12b0: 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  r */.};../*.** A
12c0: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66  llowed values of
12d0: 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61   WhereTerm.wtFla
12e0: 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45  gs.*/.#define TE
12f0: 52 4d 5f 44 59 4e 41 4d 49 43 20 20 20 20 30 78  RM_DYNAMIC    0x
1300: 30 31 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20  01   /* Need to 
1310: 63 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72  call sqlite3Expr
1320: 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
1330: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52  ) */.#define TER
1340: 4d 5f 56 49 52 54 55 41 4c 20 20 20 20 30 78 30  M_VIRTUAL    0x0
1350: 32 20 20 20 2f 2a 20 41 64 64 65 64 20 62 79 20  2   /* Added by 
1360: 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20  the optimizer.  
1370: 44 6f 20 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a 23  Do not code */.#
1380: 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 44 45  define TERM_CODE
1390: 44 20 20 20 20 20 20 30 78 30 34 20 20 20 2f 2a  D      0x04   /*
13a0: 20 54 68 69 73 20 74 65 72 6d 20 69 73 20 61 6c   This term is al
13b0: 72 65 61 64 79 20 63 6f 64 65 64 20 2a 2f 0a 23  ready coded */.#
13c0: 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 50 49  define TERM_COPI
13d0: 45 44 20 20 20 20 20 30 78 30 38 20 20 20 2f 2a  ED     0x08   /*
13e0: 20 48 61 73 20 61 20 63 68 69 6c 64 20 2a 2f 0a   Has a child */.
13f0: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 49  #define TERM_ORI
1400: 4e 46 4f 20 20 20 20 20 30 78 31 30 20 20 20 2f  NFO     0x10   /
1410: 2a 20 4e 65 65 64 20 74 6f 20 66 72 65 65 20 74  * Need to free t
1420: 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70  he WhereTerm.u.p
1430: 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f  OrInfo object */
1440: 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 41 4e  .#define TERM_AN
1450: 44 49 4e 46 4f 20 20 20 20 30 78 32 30 20 20 20  DINFO    0x20   
1460: 2f 2a 20 4e 65 65 64 20 74 6f 20 66 72 65 65 20  /* Need to free 
1470: 74 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e  the WhereTerm.u.
1480: 70 41 6e 64 49 6e 66 6f 20 6f 62 6a 20 2a 2f 0a  pAndInfo obj */.
1490: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 5f  #define TERM_OR_
14a0: 4f 4b 20 20 20 20 20 20 30 78 34 30 20 20 20 2f  OK      0x40   /
14b0: 2a 20 55 73 65 64 20 64 75 72 69 6e 67 20 4f 52  * Used during OR
14c0: 2d 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69  -clause processi
14d0: 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ng */.#ifdef SQL
14e0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
14f0: 0a 23 20 20 64 65 66 69 6e 65 20 54 45 52 4d 5f  .#  define TERM_
1500: 56 4e 55 4c 4c 20 20 20 20 30 78 38 30 20 20 20  VNULL    0x80   
1510: 2f 2a 20 4d 61 6e 75 66 61 63 74 75 72 65 64 20  /* Manufactured 
1520: 78 3e 4e 55 4c 4c 20 6f 72 20 78 3c 3d 4e 55 4c  x>NULL or x<=NUL
1530: 4c 20 74 65 72 6d 20 2a 2f 0a 23 65 6c 73 65 0a  L term */.#else.
1540: 23 20 20 64 65 66 69 6e 65 20 54 45 52 4d 5f 56  #  define TERM_V
1550: 4e 55 4c 4c 20 20 20 20 30 78 30 30 20 20 20 2f  NULL    0x00   /
1560: 2a 20 44 69 73 61 62 6c 65 64 20 69 66 20 6e 6f  * Disabled if no
1570: 74 20 75 73 69 6e 67 20 73 74 61 74 33 20 2a 2f  t using stat3 */
1580: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
1590: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
15a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
15b0: 63 74 75 72 65 20 68 6f 6c 64 73 20 61 6c 6c 20  cture holds all 
15c0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
15d0: 74 20 61 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  t a.** WHERE cla
15e0: 75 73 65 2e 20 20 4d 6f 73 74 6c 79 20 74 68 69  use.  Mostly thi
15f0: 73 20 69 73 20 61 20 63 6f 6e 74 61 69 6e 65 72  s is a container
1600: 20 66 6f 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   for one or more
1610: 20 57 68 65 72 65 54 65 72 6d 73 2e 0a 2a 2a 0a   WhereTerms..**.
1620: 2a 2a 20 45 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  ** Explanation o
1630: 66 20 70 4f 75 74 65 72 3a 20 20 46 6f 72 20 61  f pOuter:  For a
1640: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66   WHERE clause of
1650: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20   the form.**.** 
1660: 20 20 20 20 20 20 20 20 20 20 61 20 41 4e 44 20            a AND 
1670: 28 28 62 20 41 4e 44 20 63 29 20 4f 52 20 28 64  ((b AND c) OR (d
1680: 20 41 4e 44 20 65 29 29 20 41 4e 44 20 66 0a 2a   AND e)) AND f.*
1690: 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 73  *.** There are s
16a0: 65 70 61 72 61 74 65 20 57 68 65 72 65 43 6c 61  eparate WhereCla
16b0: 75 73 65 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  use objects for 
16c0: 74 68 65 20 77 68 6f 6c 65 20 63 6c 61 75 73 65  the whole clause
16d0: 20 61 6e 64 20 66 6f 72 0a 2a 2a 20 74 68 65 20   and for.** the 
16e0: 73 75 62 63 6c 61 75 73 65 73 20 22 28 62 20 41  subclauses "(b A
16f0: 4e 44 20 63 29 22 20 61 6e 64 20 22 28 64 20 41  ND c)" and "(d A
1700: 4e 44 20 65 29 22 2e 20 20 54 68 65 20 70 4f 75  ND e)".  The pOu
1710: 74 65 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ter field of the
1720: 0a 2a 2a 20 73 75 62 63 6c 61 75 73 65 73 20 70  .** subclauses p
1730: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 57 68 65  oints to the Whe
1740: 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20  reClause object 
1750: 66 6f 72 20 74 68 65 20 77 68 6f 6c 65 20 63 6c  for the whole cl
1760: 61 75 73 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ause..*/.struct 
1770: 57 68 65 72 65 43 6c 61 75 73 65 20 7b 0a 20 20  WhereClause {.  
1780: 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
1790: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17a0: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
17b0: 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74  /.  WhereMaskSet
17c0: 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 2f 2a 20   *pMaskSet;  /* 
17d0: 4d 61 70 70 69 6e 67 20 6f 66 20 74 61 62 6c 65  Mapping of table
17e0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
17f0: 74 6f 20 62 69 74 6d 61 73 6b 73 20 2a 2f 0a 20  to bitmasks */. 
1800: 20 42 69 74 6d 61 73 6b 20 76 6d 61 73 6b 3b 20   Bitmask vmask; 
1810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
1820: 6d 61 73 6b 20 69 64 65 6e 74 69 66 79 69 6e 67  mask identifying
1830: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63   virtual table c
1840: 75 72 73 6f 72 73 20 2a 2f 0a 20 20 57 68 65 72  ursors */.  Wher
1850: 65 43 6c 61 75 73 65 20 2a 70 4f 75 74 65 72 3b  eClause *pOuter;
1860: 20 20 20 20 20 2f 2a 20 4f 75 74 65 72 20 63 6f       /* Outer co
1870: 6e 6a 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75  njunction */.  u
1880: 38 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  8 op;           
1890: 20 20 20 20 20 20 20 20 2f 2a 20 53 70 6c 69 74          /* Split
18a0: 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 4b 5f 41   operator.  TK_A
18b0: 4e 44 20 6f 72 20 54 4b 5f 4f 52 20 2a 2f 0a 20  ND or TK_OR */. 
18c0: 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 3b   u16 wctrlFlags;
18d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 67            /* Mig
18e0: 68 74 20 69 6e 63 6c 75 64 65 20 57 48 45 52 45  ht include WHERE
18f0: 5f 41 4e 44 5f 4f 4e 4c 59 20 2a 2f 0a 20 20 69  _AND_ONLY */.  i
1900: 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
1910: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1920: 72 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20  r of terms */.  
1930: 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20  int nSlot;      
1940: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1950: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
1960: 20 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54   a[] */.  WhereT
1970: 65 72 6d 20 2a 61 3b 20 20 20 20 20 20 20 20 20  erm *a;         
1980: 20 20 20 2f 2a 20 45 61 63 68 20 61 5b 5d 20 64     /* Each a[] d
1990: 65 73 63 72 69 62 65 73 20 61 20 74 65 72 6d 20  escribes a term 
19a0: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 75  of the WHERE clu
19b0: 61 73 65 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ase */.#if defin
19c0: 65 64 28 53 51 4c 49 54 45 5f 53 4d 41 4c 4c 5f  ed(SQLITE_SMALL_
19d0: 53 54 41 43 4b 29 0a 20 20 57 68 65 72 65 54 65  STACK).  WhereTe
19e0: 72 6d 20 61 53 74 61 74 69 63 5b 31 5d 3b 20 20  rm aStatic[1];  
19f0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74 61    /* Initial sta
1a00: 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 5b  tic space for a[
1a10: 5d 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 57 68 65  ] */.#else.  Whe
1a20: 72 65 54 65 72 6d 20 61 53 74 61 74 69 63 5b 38  reTerm aStatic[8
1a30: 5d 3b 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  ];    /* Initial
1a40: 20 73 74 61 74 69 63 20 73 70 61 63 65 20 66 6f   static space fo
1a50: 72 20 61 5b 5d 20 2a 2f 0a 23 65 6e 64 69 66 0a  r a[] */.#endif.
1a60: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72  };../*.** A Wher
1a70: 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65 72  eTerm with eOper
1a80: 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 68 61 73 20  ator==WO_OR has 
1a90: 69 74 73 20 75 2e 70 4f 72 49 6e 66 6f 20 70 6f  its u.pOrInfo po
1aa0: 69 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20  inter set to.** 
1ab0: 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  a dynamically al
1ac0: 6c 6f 63 61 74 65 64 20 69 6e 73 74 61 6e 63 65  located instance
1ad0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1ae0: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  g structure..*/.
1af0: 73 74 72 75 63 74 20 57 68 65 72 65 4f 72 49 6e  struct WhereOrIn
1b00: 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61 75  fo {.  WhereClau
1b10: 73 65 20 77 63 3b 20 20 20 20 20 20 20 20 20 20  se wc;          
1b20: 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e  /* Decomposition
1b30: 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
1b40: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65  /.  Bitmask inde
1b50: 78 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  xable;       /* 
1b60: 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 69  Bitmask of all i
1b70: 6e 64 65 78 61 62 6c 65 20 74 61 62 6c 65 73 20  ndexable tables 
1b80: 69 6e 20 74 68 65 20 63 6c 61 75 73 65 20 2a 2f  in the clause */
1b90: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65  .};../*.** A Whe
1ba0: 72 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65  reTerm with eOpe
1bb0: 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 68 61  rator==WO_AND ha
1bc0: 73 20 69 74 73 20 75 2e 70 41 6e 64 49 6e 66 6f  s its u.pAndInfo
1bd0: 20 70 6f 69 6e 74 65 72 20 73 65 74 20 74 6f 0a   pointer set to.
1be0: 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  ** a dynamically
1bf0: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 73 74 61   allocated insta
1c00: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
1c10: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
1c20: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 41  */.struct WhereA
1c30: 6e 64 49 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65  ndInfo {.  Where
1c40: 43 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20 20  Clause wc;      
1c50: 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 65 78      /* The subex
1c60: 70 72 65 73 73 69 6f 6e 20 62 72 6f 6b 65 6e 20  pression broken 
1c70: 6f 75 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  out */.};../*.**
1c80: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
1c90: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
1ca0: 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 74 72  ructure keeps tr
1cb0: 61 63 6b 20 6f 66 20 61 20 6d 61 70 70 69 6e 67  ack of a mapping
1cc0: 0a 2a 2a 20 62 65 74 77 65 65 6e 20 56 44 42 45  .** between VDBE
1cd0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
1ce0: 61 6e 64 20 62 69 74 73 20 6f 66 20 74 68 65 20  and bits of the 
1cf0: 62 69 74 6d 61 73 6b 73 20 69 6e 20 57 68 65 72  bitmasks in Wher
1d00: 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  eTerm..**.** The
1d10: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
1d20: 62 65 72 73 20 61 72 65 20 73 6d 61 6c 6c 20 69  bers are small i
1d30: 6e 74 65 67 65 72 73 20 63 6f 6e 74 61 69 6e 65  ntegers containe
1d40: 64 20 69 6e 20 0a 2a 2a 20 53 72 63 4c 69 73 74  d in .** SrcList
1d50: 5f 69 74 65 6d 2e 69 43 75 72 73 6f 72 20 61 6e  _item.iCursor an
1d60: 64 20 45 78 70 72 2e 69 54 61 62 6c 65 20 66 69  d Expr.iTable fi
1d70: 65 6c 64 73 2e 20 20 46 6f 72 20 61 6e 79 20 67  elds.  For any g
1d80: 69 76 65 6e 20 57 48 45 52 45 20 0a 2a 2a 20 63  iven WHERE .** c
1d90: 6c 61 75 73 65 2c 20 74 68 65 20 63 75 72 73 6f  lause, the curso
1da0: 72 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20  r numbers might 
1db0: 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  not begin with 0
1dc0: 20 61 6e 64 20 74 68 65 79 20 6d 69 67 68 74 0a   and they might.
1dd0: 2a 2a 20 63 6f 6e 74 61 69 6e 20 67 61 70 73 20  ** contain gaps 
1de0: 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 69 6e 67  in the numbering
1df0: 20 73 65 71 75 65 6e 63 65 2e 20 20 42 75 74 20   sequence.  But 
1e00: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
1e10: 6d 61 78 69 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f  maximum.** use o
1e20: 66 20 74 68 65 20 62 69 74 73 20 69 6e 20 6f 75  f the bits in ou
1e30: 72 20 62 69 74 6d 61 73 6b 73 2e 20 20 54 68 69  r bitmasks.  Thi
1e40: 73 20 73 74 72 75 63 74 75 72 65 20 70 72 6f 76  s structure prov
1e50: 69 64 65 73 20 61 20 6d 61 70 70 69 6e 67 0a 2a  ides a mapping.*
1e60: 2a 20 66 72 6f 6d 20 74 68 65 20 73 70 61 72 73  * from the spars
1e70: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
1e80: 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69 76   into consecutiv
1e90: 65 20 69 6e 74 65 67 65 72 73 20 62 65 67 69 6e  e integers begin
1ea0: 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20 30 2e 0a  ning.** with 0..
1eb0: 2a 2a 0a 2a 2a 20 49 66 20 57 68 65 72 65 4d 61  **.** If WhereMa
1ec0: 73 6b 53 65 74 2e 69 78 5b 41 5d 3d 3d 42 20 69  skSet.ix[A]==B i
1ed0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 54 68 65  t means that The
1ee0: 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 42   A-th bit of a B
1ef0: 69 74 6d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73  itmask.** corres
1f00: 70 6f 6e 64 73 20 56 44 42 45 20 63 75 72 73 6f  ponds VDBE curso
1f10: 72 20 6e 75 6d 62 65 72 20 42 2e 20 20 54 68 65  r number B.  The
1f20: 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 62   A-th bit of a b
1f30: 69 74 6d 61 73 6b 20 69 73 20 31 3c 3c 41 2e 0a  itmask is 1<<A..
1f40: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1f50: 65 2c 20 69 66 20 74 68 65 20 57 48 45 52 45 20  e, if the WHERE 
1f60: 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69 6f  clause expressio
1f70: 6e 20 75 73 65 64 20 74 68 65 73 65 20 56 44 42  n used these VDB
1f80: 45 0a 2a 2a 20 63 75 72 73 6f 72 73 3a 20 20 34  E.** cursors:  4
1f90: 2c 20 35 2c 20 38 2c 20 32 39 2c 20 35 37 2c 20  , 5, 8, 29, 57, 
1fa0: 37 33 2e 20 20 54 68 65 6e 20 74 68 65 20 20 57  73.  Then the  W
1fb0: 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75  hereMaskSet stru
1fc0: 63 74 75 72 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d  cture.** would m
1fd0: 61 70 20 74 68 6f 73 65 20 63 75 72 73 6f 72 20  ap those cursor 
1fe0: 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74  numbers into bit
1ff0: 73 20 30 20 74 68 72 6f 75 67 68 20 35 2e 0a 2a  s 0 through 5..*
2000: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
2010: 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f  he mapping is no
2020: 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 6f 72  t necessarily or
2030: 64 65 72 65 64 2e 20 20 49 6e 20 74 68 65 20 65  dered.  In the e
2040: 78 61 6d 70 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c  xample.** above,
2050: 20 74 68 65 20 6d 61 70 70 69 6e 67 20 6d 69 67   the mapping mig
2060: 68 74 20 67 6f 20 6c 69 6b 65 20 74 68 69 73 3a  ht go like this:
2070: 20 20 34 2d 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d    4->3, 5->1, 8-
2080: 3e 32 2c 20 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37  >2, 29->0,.** 57
2090: 2d 3e 35 2c 20 37 33 2d 3e 34 2e 20 20 4f 72 20  ->5, 73->4.  Or 
20a0: 6f 6e 65 20 6f 66 20 37 31 39 20 6f 74 68 65 72  one of 719 other
20b0: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6d 69   combinations mi
20c0: 67 68 74 20 62 65 20 75 73 65 64 2e 20 49 74 0a  ght be used. It.
20d0: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 6c  ** does not real
20e0: 6c 79 20 6d 61 74 74 65 72 2e 20 20 57 68 61 74  ly matter.  What
20f0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 73   is important is
2100: 20 74 68 61 74 20 73 70 61 72 73 65 20 63 75 72   that sparse cur
2110: 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 61  sor.** numbers a
2120: 6c 6c 20 67 65 74 20 6d 61 70 70 65 64 20 69 6e  ll get mapped in
2130: 74 6f 20 62 69 74 20 6e 75 6d 62 65 72 73 20 74  to bit numbers t
2140: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  hat begin with 0
2150: 20 61 6e 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20   and contain.** 
2160: 6e 6f 20 67 61 70 73 2e 0a 2a 2f 0a 73 74 72 75  no gaps..*/.stru
2170: 63 74 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  ct WhereMaskSet 
2180: 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  {.  int n;      
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
21b0: 73 73 69 67 6e 65 64 20 63 75 72 73 6f 72 20 76  ssigned cursor v
21c0: 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  alues */.  int i
21d0: 78 5b 42 4d 53 5d 3b 20 20 20 20 20 20 20 20 20  x[BMS];         
21e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
21f0: 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65  or assigned to e
2200: 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b 0a 0a 2f  ach bit */.};../
2210: 2a 0a 2a 2a 20 41 20 57 68 65 72 65 43 6f 73 74  *.** A WhereCost
2220: 20 6f 62 6a 65 63 74 20 72 65 63 6f 72 64 73 20   object records 
2230: 61 20 6c 6f 6f 6b 75 70 20 73 74 72 61 74 65 67  a lookup strateg
2240: 79 20 61 6e 64 20 74 68 65 20 65 73 74 69 6d 61  y and the estima
2250: 74 65 64 0a 2a 2a 20 63 6f 73 74 20 6f 66 20 70  ted.** cost of p
2260: 75 72 73 75 69 6e 67 20 74 68 61 74 20 73 74 72  ursuing that str
2270: 61 74 65 67 79 2e 0a 2a 2f 0a 73 74 72 75 63 74  ategy..*/.struct
2280: 20 57 68 65 72 65 43 6f 73 74 20 7b 0a 20 20 57   WhereCost {.  W
2290: 68 65 72 65 50 6c 61 6e 20 70 6c 61 6e 3b 20 20  herePlan plan;  
22a0: 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20    /* The lookup 
22b0: 73 74 72 61 74 65 67 79 20 2a 2f 0a 20 20 64 6f  strategy */.  do
22c0: 75 62 6c 65 20 72 43 6f 73 74 3b 20 20 20 20 20  uble rCost;     
22d0: 20 2f 2a 20 4f 76 65 72 61 6c 6c 20 63 6f 73 74   /* Overall cost
22e0: 20 6f 66 20 70 75 72 73 75 69 6e 67 20 74 68 69   of pursuing thi
22f0: 73 20 73 65 61 72 63 68 20 73 74 72 61 74 65 67  s search strateg
2300: 79 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 75  y */.  Bitmask u
2310: 73 65 64 3b 20 20 20 20 20 20 2f 2a 20 42 69 74  sed;      /* Bit
2320: 6d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20  mask of cursors 
2330: 75 73 65 64 20 62 79 20 74 68 69 73 20 70 6c 61  used by this pla
2340: 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42  n */.};../*.** B
2350: 69 74 6d 61 73 6b 73 20 66 6f 72 20 74 68 65 20  itmasks for the 
2360: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 69  operators that i
2370: 6e 64 69 63 65 73 20 61 72 65 20 61 62 6c 65 20  ndices are able 
2380: 74 6f 20 65 78 70 6c 6f 69 74 2e 20 20 41 6e 0a  to exploit.  An.
2390: 2a 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61  ** OR-ed combina
23a0: 74 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 76 61  tion of these va
23b0: 6c 75 65 73 20 63 61 6e 20 62 65 20 75 73 65 64  lues can be used
23c0: 20 77 68 65 6e 20 73 65 61 72 63 68 69 6e 67 20   when searching 
23d0: 66 6f 72 0a 2a 2a 20 74 65 72 6d 73 20 69 6e 20  for.** terms in 
23e0: 74 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65  the where clause
23f0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f  ..*/.#define WO_
2400: 49 4e 20 20 20 20 20 30 78 30 30 31 0a 23 64 65  IN     0x001.#de
2410: 66 69 6e 65 20 57 4f 5f 45 51 20 20 20 20 20 30  fine WO_EQ     0
2420: 78 30 30 32 0a 23 64 65 66 69 6e 65 20 57 4f 5f  x002.#define WO_
2430: 4c 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28  LT     (WO_EQ<<(
2440: 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29 0a 23 64  TK_LT-TK_EQ)).#d
2450: 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20 20 20 20  efine WO_LE     
2460: 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d 54  (WO_EQ<<(TK_LE-T
2470: 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57  K_EQ)).#define W
2480: 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f 45 51 3c  O_GT     (WO_EQ<
2490: 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51 29 29 0a  <(TK_GT-TK_EQ)).
24a0: 23 64 65 66 69 6e 65 20 57 4f 5f 47 45 20 20 20  #define WO_GE   
24b0: 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 45    (WO_EQ<<(TK_GE
24c0: 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65  -TK_EQ)).#define
24d0: 20 57 4f 5f 4d 41 54 43 48 20 20 30 78 30 34 30   WO_MATCH  0x040
24e0: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49 53 4e 55  .#define WO_ISNU
24f0: 4c 4c 20 30 78 30 38 30 0a 23 64 65 66 69 6e 65  LL 0x080.#define
2500: 20 57 4f 5f 4f 52 20 20 20 20 20 30 78 31 30 30   WO_OR     0x100
2510: 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72         /* Two or
2520: 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74   more OR-connect
2530: 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23 64 65 66  ed terms */.#def
2540: 69 6e 65 20 57 4f 5f 41 4e 44 20 20 20 20 30 78  ine WO_AND    0x
2550: 32 30 30 20 20 20 20 20 20 20 2f 2a 20 54 77 6f  200       /* Two
2560: 20 6f 72 20 6d 6f 72 65 20 41 4e 44 2d 63 6f 6e   or more AND-con
2570: 6e 65 63 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a  nected terms */.
2580: 23 64 65 66 69 6e 65 20 57 4f 5f 4e 4f 4f 50 20  #define WO_NOOP 
2590: 20 20 30 78 38 30 30 20 20 20 20 20 20 20 2f 2a    0x800       /*
25a0: 20 54 68 69 73 20 74 65 72 6d 20 64 6f 65 73 20   This term does 
25b0: 6e 6f 74 20 72 65 73 74 72 69 63 74 20 73 65 61  not restrict sea
25c0: 72 63 68 20 73 70 61 63 65 20 2a 2f 0a 0a 23 64  rch space */..#d
25d0: 65 66 69 6e 65 20 57 4f 5f 41 4c 4c 20 20 20 20  efine WO_ALL    
25e0: 30 78 66 66 66 20 20 20 20 20 20 20 2f 2a 20 4d  0xfff       /* M
25f0: 61 73 6b 20 6f 66 20 61 6c 6c 20 70 6f 73 73 69  ask of all possi
2600: 62 6c 65 20 57 4f 5f 2a 20 76 61 6c 75 65 73 20  ble WO_* values 
2610: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 53 49  */.#define WO_SI
2620: 4e 47 4c 45 20 30 78 30 66 66 20 20 20 20 20 20  NGLE 0x0ff      
2630: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20   /* Mask of all 
2640: 6e 6f 6e 2d 63 6f 6d 70 6f 75 6e 64 20 57 4f 5f  non-compound WO_
2650: 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 0a 2f 2a 0a  * values */../*.
2660: 2a 2a 20 56 61 6c 75 65 20 66 6f 72 20 77 73 46  ** Value for wsF
2670: 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79  lags returned by
2680: 20 62 65 73 74 49 6e 64 65 78 28 29 20 61 6e 64   bestIndex() and
2690: 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 57 68   stored in.** Wh
26a0: 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67 73  ereLevel.wsFlags
26b0: 2e 20 20 54 68 65 73 65 20 66 6c 61 67 73 20 64  .  These flags d
26c0: 65 74 65 72 6d 69 6e 65 20 77 68 69 63 68 20 73  etermine which s
26d0: 65 61 72 63 68 0a 2a 2a 20 73 74 72 61 74 65 67  earch.** strateg
26e0: 69 65 73 20 61 72 65 20 61 70 70 72 6f 70 72 69  ies are appropri
26f0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ate..**.** The l
2700: 65 61 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74  east significant
2710: 20 31 32 20 62 69 74 73 20 69 73 20 72 65 73 65   12 bits is rese
2720: 72 76 65 64 20 61 73 20 61 20 6d 61 73 6b 20 66  rved as a mask f
2730: 6f 72 20 57 4f 5f 20 76 61 6c 75 65 73 20 61 62  or WO_ values ab
2740: 6f 76 65 2e 0a 2a 2a 20 54 68 65 20 57 68 65 72  ove..** The Wher
2750: 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67 73 20 66  eLevel.wsFlags f
2760: 69 65 6c 64 20 69 73 20 75 73 75 61 6c 6c 79 20  ield is usually 
2770: 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f 5f  set to WO_IN|WO_
2780: 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2e 0a 2a 2a  EQ|WO_ISNULL..**
2790: 20 42 75 74 20 69 66 20 74 68 65 20 74 61 62 6c   But if the tabl
27a0: 65 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  e is the right t
27b0: 61 62 6c 65 20 6f 66 20 61 20 6c 65 66 74 20 6a  able of a left j
27c0: 6f 69 6e 2c 20 57 68 65 72 65 4c 65 76 65 6c 2e  oin, WhereLevel.
27d0: 77 73 46 6c 61 67 73 0a 2a 2a 20 69 73 20 73 65  wsFlags.** is se
27e0: 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f 5f 45 51  t to WO_IN|WO_EQ
27f0: 2e 20 20 54 68 65 20 57 68 65 72 65 4c 65 76 65  .  The WhereLeve
2800: 6c 2e 77 73 46 6c 61 67 73 20 66 69 65 6c 64 20  l.wsFlags field 
2810: 63 61 6e 20 74 68 65 6e 20 62 65 20 75 73 65 64  can then be used
2820: 20 61 73 0a 2a 2a 20 74 68 65 20 22 6f 70 22 20   as.** the "op" 
2830: 70 61 72 61 6d 65 74 65 72 20 74 6f 20 66 69 6e  parameter to fin
2840: 64 54 65 72 6d 20 77 68 65 6e 20 77 65 20 61 72  dTerm when we ar
2850: 65 20 72 65 73 6f 6c 76 69 6e 67 20 65 71 75 61  e resolving equa
2860: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
2870: 2e 0a 2a 2a 20 49 53 4e 55 4c 4c 20 63 6f 6e 73  ..** ISNULL cons
2880: 74 72 61 69 6e 74 73 20 77 69 6c 6c 20 74 68 65  traints will the
2890: 6e 20 6e 6f 74 20 62 65 20 75 73 65 64 20 6f 6e  n not be used on
28a0: 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
28b0: 20 6f 66 20 61 20 6c 65 66 74 0a 2a 2a 20 6a 6f   of a left.** jo
28c0: 69 6e 2e 20 20 54 69 63 6b 65 74 73 20 23 32 31  in.  Tickets #21
28d0: 37 37 20 61 6e 64 20 23 32 31 38 39 2e 0a 2a 2f  77 and #2189..*/
28e0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52  .#define WHERE_R
28f0: 4f 57 49 44 5f 45 51 20 20 20 20 20 30 78 30 30  OWID_EQ     0x00
2900: 30 30 31 30 30 30 20 20 2f 2a 20 72 6f 77 69 64  001000  /* rowid
2910: 3d 45 58 50 52 20 6f 72 20 72 6f 77 69 64 20 49  =EXPR or rowid I
2920: 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69  N (...) */.#defi
2930: 6e 65 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52  ne WHERE_ROWID_R
2940: 41 4e 47 45 20 20 30 78 30 30 30 30 32 30 30 30  ANGE  0x00002000
2950: 20 20 2f 2a 20 72 6f 77 69 64 3c 45 58 50 52 20    /* rowid<EXPR 
2960: 61 6e 64 2f 6f 72 20 72 6f 77 69 64 3e 45 58 50  and/or rowid>EXP
2970: 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  R */.#define WHE
2980: 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 20 20 20  RE_COLUMN_EQ    
2990: 30 78 30 30 30 31 30 30 30 30 20 20 2f 2a 20 78  0x00010000  /* x
29a0: 3d 45 58 50 52 20 6f 72 20 78 20 49 4e 20 28 2e  =EXPR or x IN (.
29b0: 2e 2e 29 20 6f 72 20 78 20 49 53 20 4e 55 4c 4c  ..) or x IS NULL
29c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
29d0: 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 30  E_COLUMN_RANGE 0
29e0: 78 30 30 30 32 30 30 30 30 20 20 2f 2a 20 78 3c  x00020000  /* x<
29f0: 45 58 50 52 20 61 6e 64 2f 6f 72 20 78 3e 45 58  EXPR and/or x>EX
2a00: 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  PR */.#define WH
2a10: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 20 20  ERE_COLUMN_IN   
2a20: 20 30 78 30 30 30 34 30 30 30 30 20 20 2f 2a 20   0x00040000  /* 
2a30: 78 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64  x IN (...) */.#d
2a40: 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55  efine WHERE_COLU
2a50: 4d 4e 5f 4e 55 4c 4c 20 20 30 78 30 30 30 38 30  MN_NULL  0x00080
2a60: 30 30 30 20 20 2f 2a 20 78 20 49 53 20 4e 55 4c  000  /* x IS NUL
2a70: 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  L */.#define WHE
2a80: 52 45 5f 49 4e 44 45 58 45 44 20 20 20 20 20 20  RE_INDEXED      
2a90: 30 78 30 30 30 66 30 30 30 30 20 20 2f 2a 20 41  0x000f0000  /* A
2aa0: 6e 79 74 68 69 6e 67 20 74 68 61 74 20 75 73 65  nything that use
2ab0: 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 23 64  s an index */.#d
2ac0: 65 66 69 6e 65 20 57 48 45 52 45 5f 4e 4f 54 5f  efine WHERE_NOT_
2ad0: 46 55 4c 4c 53 43 41 4e 20 30 78 31 30 30 66 33  FULLSCAN 0x100f3
2ae0: 30 30 30 20 20 2f 2a 20 44 6f 65 73 20 6e 6f 74  000  /* Does not
2af0: 20 64 6f 20 61 20 66 75 6c 6c 20 74 61 62 6c 65   do a full table
2b00: 20 73 63 61 6e 20 2a 2f 0a 23 64 65 66 69 6e 65   scan */.#define
2b10: 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 20   WHERE_IN_ABLE  
2b20: 20 20 20 20 30 78 30 30 30 66 31 30 30 30 20 20      0x000f1000  
2b30: 2f 2a 20 41 62 6c 65 20 74 6f 20 73 75 70 70 6f  /* Able to suppo
2b40: 72 74 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  rt an IN operato
2b50: 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  r */.#define WHE
2b60: 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 20 20 20  RE_TOP_LIMIT    
2b70: 30 78 30 30 31 30 30 30 30 30 20 20 2f 2a 20 78  0x00100000  /* x
2b80: 3c 45 58 50 52 20 6f 72 20 78 3c 3d 45 58 50 52  <EXPR or x<=EXPR
2b90: 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23   constraint */.#
2ba0: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 42 54 4d  define WHERE_BTM
2bb0: 5f 4c 49 4d 49 54 20 20 20 20 30 78 30 30 32 30  _LIMIT    0x0020
2bc0: 30 30 30 30 20 20 2f 2a 20 78 3e 45 58 50 52 20  0000  /* x>EXPR 
2bd0: 6f 72 20 78 3e 3d 45 58 50 52 20 63 6f 6e 73 74  or x>=EXPR const
2be0: 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65  raint */.#define
2bf0: 20 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49   WHERE_BOTH_LIMI
2c00: 54 20 20 20 30 78 30 30 33 30 30 30 30 30 20 20  T   0x00300000  
2c10: 2f 2a 20 42 6f 74 68 20 78 3e 45 58 50 52 20 61  /* Both x>EXPR a
2c20: 6e 64 20 78 3c 45 58 50 52 20 2a 2f 0a 23 64 65  nd x<EXPR */.#de
2c30: 66 69 6e 65 20 57 48 45 52 45 5f 49 44 58 5f 4f  fine WHERE_IDX_O
2c40: 4e 4c 59 20 20 20 20 20 30 78 30 30 38 30 30 30  NLY     0x008000
2c50: 30 30 20 20 2f 2a 20 55 73 65 20 69 6e 64 65 78  00  /* Use index
2c60: 20 6f 6e 6c 79 20 2d 20 6f 6d 69 74 20 74 61 62   only - omit tab
2c70: 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  le */.#define WH
2c80: 45 52 45 5f 4f 52 44 45 52 42 59 20 20 20 20 20  ERE_ORDERBY     
2c90: 20 30 78 30 31 30 30 30 30 30 30 20 20 2f 2a 20   0x01000000  /* 
2ca0: 4f 75 74 70 75 74 20 77 69 6c 6c 20 61 70 70 65  Output will appe
2cb0: 61 72 20 69 6e 20 63 6f 72 72 65 63 74 20 6f 72  ar in correct or
2cc0: 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  der */.#define W
2cd0: 48 45 52 45 5f 52 45 56 45 52 53 45 20 20 20 20  HERE_REVERSE    
2ce0: 20 20 30 78 30 32 30 30 30 30 30 30 20 20 2f 2a    0x02000000  /*
2cf0: 20 53 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65   Scan in reverse
2d00: 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e   order */.#defin
2d10: 65 20 57 48 45 52 45 5f 55 4e 49 51 55 45 20 20  e WHERE_UNIQUE  
2d20: 20 20 20 20 20 30 78 30 34 30 30 30 30 30 30 20       0x04000000 
2d30: 20 2f 2a 20 53 65 6c 65 63 74 73 20 6e 6f 20 6d   /* Selects no m
2d40: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77  ore than one row
2d50: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
2d60: 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 30  E_VIRTUALTABLE 0
2d70: 78 30 38 30 30 30 30 30 30 20 20 2f 2a 20 55 73  x08000000  /* Us
2d80: 65 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 20  e virtual-table 
2d90: 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 23 64  processing */.#d
2da0: 65 66 69 6e 65 20 57 48 45 52 45 5f 4d 55 4c 54  efine WHERE_MULT
2db0: 49 5f 4f 52 20 20 20 20 20 30 78 31 30 30 30 30  I_OR     0x10000
2dc0: 30 30 30 20 20 2f 2a 20 4f 52 20 75 73 69 6e 67  000  /* OR using
2dd0: 20 6d 75 6c 74 69 70 6c 65 20 69 6e 64 69 63 65   multiple indice
2de0: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  s */.#define WHE
2df0: 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20 20 20  RE_TEMP_INDEX   
2e00: 30 78 32 30 30 30 30 30 30 30 20 20 2f 2a 20 55  0x20000000  /* U
2e10: 73 65 73 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ses an ephemeral
2e20: 20 69 6e 64 65 78 20 2a 2f 0a 23 64 65 66 69 6e   index */.#defin
2e30: 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
2e40: 20 20 20 20 20 30 78 34 30 30 30 30 30 30 30 20       0x40000000 
2e50: 20 2f 2a 20 43 6f 72 72 65 63 74 20 6f 72 64 65   /* Correct orde
2e60: 72 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 2a  r for DISTINCT *
2e70: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
2e80: 43 4f 56 45 52 5f 53 43 41 4e 20 20 20 30 78 38  COVER_SCAN   0x8
2e90: 30 30 30 30 30 30 30 20 20 2f 2a 20 46 75 6c 6c  0000000  /* Full
2ea0: 20 73 63 61 6e 20 6f 66 20 61 20 63 6f 76 65 72   scan of a cover
2eb0: 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 0a 2f 2a  ing index */../*
2ec0: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
2ed0: 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 57 68   preallocated Wh
2ee0: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
2ef0: 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ure..*/.static v
2f00: 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 49  oid whereClauseI
2f10: 6e 69 74 28 0a 20 20 57 68 65 72 65 43 6c 61 75  nit(.  WhereClau
2f20: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
2f30: 2f 2a 20 54 68 65 20 57 68 65 72 65 43 6c 61 75  /* The WhereClau
2f40: 73 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61 6c  se to be initial
2f50: 69 7a 65 64 20 2a 2f 0a 20 20 50 61 72 73 65 20  ized */.  Parse 
2f60: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
2f70: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
2f80: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
2f90: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
2fa0: 73 6b 53 65 74 2c 20 20 2f 2a 20 4d 61 70 70 69  skSet,  /* Mappi
2fb0: 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65 20 63 75  ng from table cu
2fc0: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 74 6f 20  rsor numbers to 
2fd0: 62 69 74 6d 61 73 6b 73 20 2a 2f 0a 20 20 75 31  bitmasks */.  u1
2fe0: 36 20 77 63 74 72 6c 46 6c 61 67 73 20 20 20 20  6 wctrlFlags    
2ff0: 20 20 20 20 20 20 20 2f 2a 20 4d 69 67 68 74 20         /* Might 
3000: 69 6e 63 6c 75 64 65 20 57 48 45 52 45 5f 41 4e  include WHERE_AN
3010: 44 5f 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 70  D_ONLY */.){.  p
3020: 57 43 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61  WC->pParse = pPa
3030: 72 73 65 3b 0a 20 20 70 57 43 2d 3e 70 4d 61 73  rse;.  pWC->pMas
3040: 6b 53 65 74 20 3d 20 70 4d 61 73 6b 53 65 74 3b  kSet = pMaskSet;
3050: 0a 20 20 70 57 43 2d 3e 70 4f 75 74 65 72 20 3d  .  pWC->pOuter =
3060: 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72 6d   0;.  pWC->nTerm
3070: 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53 6c   = 0;.  pWC->nSl
3080: 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28 70  ot = ArraySize(p
3090: 57 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20 20  WC->aStatic);.  
30a0: 70 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61 53  pWC->a = pWC->aS
30b0: 74 61 74 69 63 3b 0a 20 20 70 57 43 2d 3e 76 6d  tatic;.  pWC->vm
30c0: 61 73 6b 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e  ask = 0;.  pWC->
30d0: 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74  wctrlFlags = wct
30e0: 72 6c 46 6c 61 67 73 3b 0a 7d 0a 0a 2f 2a 20 46  rlFlags;.}../* F
30f0: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
3100: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
3110: 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
3120: 28 57 68 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a  (WhereClause*);.
3130: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
3140: 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73  e all memory ass
3150: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57  ociated with a W
3160: 68 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63  hereOrInfo objec
3170: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
3180: 64 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c  d whereOrInfoDel
3190: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
31a0: 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29   WhereOrInfo *p)
31b0: 7b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43  {.  whereClauseC
31c0: 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20  lear(&p->wc);.  
31d0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
31e0: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  , p);.}../*.** D
31f0: 65 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65  eallocate all me
3200: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
3210: 77 69 74 68 20 61 20 57 68 65 72 65 41 6e 64 49  with a WhereAndI
3220: 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  nfo object..*/.s
3230: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
3240: 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 73 71  AndInfoDelete(sq
3250: 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
3260: 41 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77  AndInfo *p){.  w
3270: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
3280: 26 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74  &p->wc);.  sqlit
3290: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
32a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f  .}../*.** Deallo
32b0: 63 61 74 65 20 61 20 57 68 65 72 65 43 6c 61 75  cate a WhereClau
32c0: 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  se structure.  T
32d0: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73  he WhereClause s
32e0: 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65  tructure.** itse
32f0: 6c 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e  lf is not freed.
3300: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
3310: 73 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66  s the inverse of
3320: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
3330: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
3340: 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  id whereClauseCl
3350: 65 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 20  ear(WhereClause 
3360: 2a 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  *pWC){.  int i;.
3370: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a    WhereTerm *a;.
3380: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
3390: 70 57 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  pWC->pParse->db;
33a0: 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54  .  for(i=pWC->nT
33b0: 65 72 6d 2d 31 2c 20 61 3d 70 57 43 2d 3e 61 3b  erm-1, a=pWC->a;
33c0: 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 61 2b 2b 29   i>=0; i--, a++)
33d0: 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e 77 74 46  {.    if( a->wtF
33e0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e 41  lags & TERM_DYNA
33f0: 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  MIC ){.      sql
3400: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
3410: 62 2c 20 61 2d 3e 70 45 78 70 72 29 3b 0a 20 20  b, a->pExpr);.  
3420: 20 20 7d 0a 20 20 20 20 69 66 28 20 61 2d 3e 77    }.    if( a->w
3430: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52  tFlags & TERM_OR
3440: 49 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20 77 68  INFO ){.      wh
3450: 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65 74 65 28  ereOrInfoDelete(
3460: 64 62 2c 20 61 2d 3e 75 2e 70 4f 72 49 6e 66 6f  db, a->u.pOrInfo
3470: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
3480: 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45   a->wtFlags & TE
3490: 52 4d 5f 41 4e 44 49 4e 46 4f 20 29 7b 0a 20 20  RM_ANDINFO ){.  
34a0: 20 20 20 20 77 68 65 72 65 41 6e 64 49 6e 66 6f      whereAndInfo
34b0: 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e  Delete(db, a->u.
34c0: 70 41 6e 64 49 6e 66 6f 29 3b 0a 20 20 20 20 7d  pAndInfo);.    }
34d0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 43 2d 3e  .  }.  if( pWC->
34e0: 61 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20  a!=pWC->aStatic 
34f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
3500: 46 72 65 65 28 64 62 2c 20 70 57 43 2d 3e 61 29  Free(db, pWC->a)
3510: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
3520: 64 64 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20  dd a single new 
3530: 57 68 65 72 65 54 65 72 6d 20 65 6e 74 72 79 20  WhereTerm entry 
3540: 74 6f 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  to the WhereClau
3550: 73 65 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a 2a  se object pWC..*
3560: 2a 20 54 68 65 20 6e 65 77 20 57 68 65 72 65 54  * The new WhereT
3570: 65 72 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f  erm object is co
3580: 6e 73 74 72 75 63 74 65 64 20 66 72 6f 6d 20 45  nstructed from E
3590: 78 70 72 20 70 20 61 6e 64 20 77 69 74 68 20 77  xpr p and with w
35a0: 74 46 6c 61 67 73 2e 0a 2a 2a 20 54 68 65 20 69  tFlags..** The i
35b0: 6e 64 65 78 20 69 6e 20 70 57 43 2d 3e 61 5b 5d  ndex in pWC->a[]
35c0: 20 6f 66 20 74 68 65 20 6e 65 77 20 57 68 65 72   of the new Wher
35d0: 65 54 65 72 6d 20 69 73 20 72 65 74 75 72 6e 65  eTerm is returne
35e0: 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a  d on success..**
35f0: 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 20 69   0 is returned i
3600: 66 20 74 68 65 20 6e 65 77 20 57 68 65 72 65 54  f the new WhereT
3610: 65 72 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  erm could not be
3620: 20 61 64 64 65 64 20 64 75 65 20 74 6f 20 61 20   added due to a 
3630: 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61  memory.** alloca
3640: 74 69 6f 6e 20 65 72 72 6f 72 2e 20 20 54 68 65  tion error.  The
3650: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
3660: 6f 6e 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20  on failure will 
3670: 62 65 20 72 65 63 6f 72 64 65 64 20 69 6e 0a 2a  be recorded in.*
3680: 2a 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63  * the db->malloc
3690: 46 61 69 6c 65 64 20 66 6c 61 67 20 73 6f 20 74  Failed flag so t
36a0: 68 61 74 20 68 69 67 68 65 72 2d 6c 65 76 65 6c  hat higher-level
36b0: 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 64   functions can d
36c0: 65 74 65 63 74 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  etect it..**.** 
36d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
36e0: 6c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 73  l increase the s
36f0: 69 7a 65 20 6f 66 20 74 68 65 20 70 57 43 2d 3e  ize of the pWC->
3700: 61 5b 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63  a[] array as nec
3710: 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  essary..**.** If
3720: 20 74 68 65 20 77 74 46 6c 61 67 73 20 61 72 67   the wtFlags arg
3730: 75 6d 65 6e 74 20 69 6e 63 6c 75 64 65 73 20 54  ument includes T
3740: 45 52 4d 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65  ERM_DYNAMIC, the
3750: 6e 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  n responsibility
3760: 0a 2a 2a 20 66 6f 72 20 66 72 65 65 69 6e 67 20  .** for freeing 
3770: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
3780: 20 69 73 20 61 73 73 75 6d 65 64 20 62 79 20 74   is assumed by t
3790: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f  he WhereClause o
37a0: 62 6a 65 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68  bject pWC..** Th
37b0: 69 73 20 69 73 20 74 72 75 65 20 65 76 65 6e 20  is is true even 
37c0: 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
37d0: 66 61 69 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74  fails to allocat
37e0: 65 20 61 20 6e 65 77 20 57 68 65 72 65 54 65 72  e a new WhereTer
37f0: 6d 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47  m..**.** WARNING
3800: 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  :  This routine 
3810: 6d 69 67 68 74 20 72 65 61 6c 6c 6f 63 61 74 65  might reallocate
3820: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
3830: 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 57 68 65 72  to store.** Wher
3840: 65 54 65 72 6d 73 2e 20 20 41 6c 6c 20 70 6f 69  eTerms.  All poi
3850: 6e 74 65 72 73 20 74 6f 20 57 68 65 72 65 54 65  nters to WhereTe
3860: 72 6d 73 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  rms should be in
3870: 76 61 6c 69 64 61 74 65 64 20 61 66 74 65 72 0a  validated after.
3880: 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  ** calling this 
3890: 72 6f 75 74 69 6e 65 2e 20 20 53 75 63 68 20 70  routine.  Such p
38a0: 6f 69 6e 74 65 72 73 20 6d 61 79 20 62 65 20 72  ointers may be r
38b0: 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20  einitialized by 
38c0: 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 74  referencing.** t
38d0: 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61  he pWC->a[] arra
38e0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
38f0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
3900: 72 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  rt(WhereClause *
3910: 70 57 43 2c 20 45 78 70 72 20 2a 70 2c 20 75 38  pWC, Expr *p, u8
3920: 20 77 74 46 6c 61 67 73 29 7b 0a 20 20 57 68 65   wtFlags){.  Whe
3930: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
3940: 20 69 6e 74 20 69 64 78 3b 0a 20 20 74 65 73 74   int idx;.  test
3950: 63 61 73 65 28 20 77 74 46 6c 61 67 73 20 26 20  case( wtFlags & 
3960: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20  TERM_VIRTUAL ); 
3970: 20 2f 2a 20 45 56 3a 20 52 2d 30 30 32 31 31 2d   /* EV: R-00211-
3980: 31 35 31 30 30 20 2a 2f 0a 20 20 69 66 28 20 70  15100 */.  if( p
3990: 57 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e  WC->nTerm>=pWC->
39a0: 6e 53 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65  nSlot ){.    Whe
39b0: 72 65 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70  reTerm *pOld = p
39c0: 57 43 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69 74  WC->a;.    sqlit
39d0: 65 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 50  e3 *db = pWC->pP
39e0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70 57  arse->db;.    pW
39f0: 43 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62  C->a = sqlite3Db
3a00: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
3a10: 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a  zeof(pWC->a[0])*
3a20: 70 57 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29 3b 0a  pWC->nSlot*2 );.
3a30: 20 20 20 20 69 66 28 20 70 57 43 2d 3e 61 3d 3d      if( pWC->a==
3a40: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77  0 ){.      if( w
3a50: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59  tFlags & TERM_DY
3a60: 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 20  NAMIC ){.       
3a70: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
3a80: 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20  te(db, p);.     
3a90: 20 7d 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 20   }.      pWC->a 
3aa0: 3d 20 70 4f 6c 64 3b 0a 20 20 20 20 20 20 72 65  = pOld;.      re
3ab0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
3ac0: 20 20 6d 65 6d 63 70 79 28 70 57 43 2d 3e 61 2c    memcpy(pWC->a,
3ad0: 20 70 4f 6c 64 2c 20 73 69 7a 65 6f 66 28 70 57   pOld, sizeof(pW
3ae0: 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 54  C->a[0])*pWC->nT
3af0: 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  erm);.    if( pO
3b00: 6c 64 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63  ld!=pWC->aStatic
3b10: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
3b20: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f 6c 64  3DbFree(db, pOld
3b30: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 43  );.    }.    pWC
3b40: 2d 3e 6e 53 6c 6f 74 20 3d 20 73 71 6c 69 74 65  ->nSlot = sqlite
3b50: 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62  3DbMallocSize(db
3b60: 2c 20 70 57 43 2d 3e 61 29 2f 73 69 7a 65 6f 66  , pWC->a)/sizeof
3b70: 28 70 57 43 2d 3e 61 5b 30 5d 29 3b 0a 20 20 7d  (pWC->a[0]);.  }
3b80: 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d  .  pTerm = &pWC-
3b90: 3e 61 5b 69 64 78 20 3d 20 70 57 43 2d 3e 6e 54  >a[idx = pWC->nT
3ba0: 65 72 6d 2b 2b 5d 3b 0a 20 20 70 54 65 72 6d 2d  erm++];.  pTerm-
3bb0: 3e 70 45 78 70 72 20 3d 20 70 3b 0a 20 20 70 54  >pExpr = p;.  pT
3bc0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 3d 20 77  erm->wtFlags = w
3bd0: 74 46 6c 61 67 73 3b 0a 20 20 70 54 65 72 6d 2d  tFlags;.  pTerm-
3be0: 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 54  >pWC = pWC;.  pT
3bf0: 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d  erm->iParent = -
3c00: 31 3b 0a 20 20 72 65 74 75 72 6e 20 69 64 78 3b  1;.  return idx;
3c10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
3c20: 6f 75 74 69 6e 65 20 69 64 65 6e 74 69 66 69 65  outine identifie
3c30: 73 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73  s subexpressions
3c40: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
3c50: 61 75 73 65 20 77 68 65 72 65 0a 2a 2a 20 65 61  ause where.** ea
3c60: 63 68 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ch subexpression
3c70: 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79   is separated by
3c80: 20 74 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f   the AND operato
3c90: 72 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a  r or some other.
3ca0: 2a 2a 20 6f 70 65 72 61 74 6f 72 20 73 70 65 63  ** operator spec
3cb0: 69 66 69 65 64 20 69 6e 20 74 68 65 20 6f 70 20  ified in the op 
3cc0: 70 61 72 61 6d 65 74 65 72 2e 20 20 54 68 65 20  parameter.  The 
3cd0: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
3ce0: 63 74 75 72 65 0a 2a 2a 20 69 73 20 66 69 6c 6c  cture.** is fill
3cf0: 65 64 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73  ed with pointers
3d00: 20 74 6f 20 73 75 62 65 78 70 72 65 73 73 69 6f   to subexpressio
3d10: 6e 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  ns.  For example
3d20: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 57 48 45 52 45  :.**.**    WHERE
3d30: 20 20 61 3d 3d 27 68 65 6c 6c 6f 27 20 41 4e 44    a=='hello' AND
3d40: 20 63 6f 61 6c 65 73 63 65 28 62 2c 31 31 29 3c   coalesce(b,11)<
3d50: 31 30 20 41 4e 44 20 28 63 2b 31 32 21 3d 64 20  10 AND (c+12!=d 
3d60: 4f 52 20 63 3d 3d 32 32 29 0a 2a 2a 20 20 20 20  OR c==22).**    
3d70: 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f         \________
3d80: 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f  /     \_________
3d90: 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f  ______/     \___
3da0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a  _____________/.*
3db0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f  *            slo
3dc0: 74 5b 30 5d 20 20 20 20 20 20 20 20 20 20 20 20  t[0]            
3dd0: 73 6c 6f 74 5b 31 5d 20 20 20 20 20 20 20 20 20  slot[1]         
3de0: 20 20 20 20 20 20 73 6c 6f 74 5b 32 5d 0a 2a 2a        slot[2].**
3df0: 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  .** The original
3e00: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
3e10: 20 70 45 78 70 72 20 69 73 20 75 6e 61 6c 74 65   pExpr is unalte
3e20: 72 65 64 2e 20 20 41 6c 6c 20 74 68 69 73 20 72  red.  All this r
3e30: 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 69  outine.** does i
3e40: 73 20 6d 61 6b 65 20 73 6c 6f 74 5b 5d 20 65 6e  s make slot[] en
3e50: 74 72 69 65 73 20 70 6f 69 6e 74 20 74 6f 20 73  tries point to s
3e60: 75 62 73 74 72 75 63 74 75 72 65 20 77 69 74 68  ubstructure with
3e70: 69 6e 20 70 45 78 70 72 2e 0a 2a 2a 0a 2a 2a 20  in pExpr..**.** 
3e80: 49 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  In the previous 
3e90: 73 65 6e 74 65 6e 63 65 20 61 6e 64 20 69 6e 20  sentence and in 
3ea0: 74 68 65 20 64 69 61 67 72 61 6d 2c 20 22 73 6c  the diagram, "sl
3eb0: 6f 74 5b 5d 22 20 72 65 66 65 72 73 20 74 6f 0a  ot[]" refers to.
3ec0: 2a 2a 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  ** the WhereClau
3ed0: 73 65 2e 61 5b 5d 20 61 72 72 61 79 2e 20 20 54  se.a[] array.  T
3ee0: 68 65 20 73 6c 6f 74 5b 5d 20 61 72 72 61 79 20  he slot[] array 
3ef0: 67 72 6f 77 73 20 61 73 20 6e 65 65 64 65 64 20  grows as needed 
3f00: 74 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c  to contain.** al
3f10: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  l terms of the W
3f20: 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  HERE clause..*/.
3f30: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
3f40: 65 53 70 6c 69 74 28 57 68 65 72 65 43 6c 61 75  eSplit(WhereClau
3f50: 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70  se *pWC, Expr *p
3f60: 45 78 70 72 2c 20 69 6e 74 20 6f 70 29 7b 0a 20  Expr, int op){. 
3f70: 20 70 57 43 2d 3e 6f 70 20 3d 20 28 75 38 29 6f   pWC->op = (u8)o
3f80: 70 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  p;.  if( pExpr==
3f90: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
3fa0: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f 70 20  ( pExpr->op!=op 
3fb0: 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75  ){.    whereClau
3fc0: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 45  seInsert(pWC, pE
3fd0: 78 70 72 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  xpr, 0);.  }else
3fe0: 7b 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69 74  {.    whereSplit
3ff0: 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70 4c 65  (pWC, pExpr->pLe
4000: 66 74 2c 20 6f 70 29 3b 0a 20 20 20 20 77 68 65  ft, op);.    whe
4010: 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78  reSplit(pWC, pEx
4020: 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 29 3b  pr->pRight, op);
4030: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
4040: 69 74 69 61 6c 69 7a 65 20 61 6e 20 65 78 70 72  itialize an expr
4050: 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20  ession mask set 
4060: 28 61 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  (a WhereMaskSet 
4070: 6f 62 6a 65 63 74 29 0a 2a 2f 0a 23 64 65 66 69  object).*/.#defi
4080: 6e 65 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 50  ne initMaskSet(P
4090: 29 20 20 6d 65 6d 73 65 74 28 50 2c 20 30 2c 20  )  memset(P, 0, 
40a0: 73 69 7a 65 6f 66 28 2a 50 29 29 0a 0a 2f 2a 0a  sizeof(*P))../*.
40b0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62 69  ** Return the bi
40c0: 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 67 69  tmask for the gi
40d0: 76 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ven cursor numbe
40e0: 72 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 0a  r.  Return 0 if.
40f0: 2a 2a 20 69 43 75 72 73 6f 72 20 69 73 20 6e 6f  ** iCursor is no
4100: 74 20 69 6e 20 74 68 65 20 73 65 74 2e 0a 2a 2f  t in the set..*/
4110: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
4120: 67 65 74 4d 61 73 6b 28 57 68 65 72 65 4d 61 73  getMask(WhereMas
4130: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
4140: 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20  int iCursor){.  
4150: 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
4160: 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69   pMaskSet->n<=(i
4170: 6e 74 29 73 69 7a 65 6f 66 28 42 69 74 6d 61 73  nt)sizeof(Bitmas
4180: 6b 29 2a 38 20 29 3b 0a 20 20 66 6f 72 28 69 3d  k)*8 );.  for(i=
4190: 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e  0; i<pMaskSet->n
41a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
41b0: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d  pMaskSet->ix[i]=
41c0: 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  =iCursor ){.    
41d0: 20 20 72 65 74 75 72 6e 20 28 28 42 69 74 6d 61    return ((Bitma
41e0: 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 20 20 7d 0a  sk)1)<<i;.    }.
41f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
4200: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
4210: 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72 20 63  a new mask for c
4220: 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e 0a 2a  ursor iCursor..*
4230: 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  *.** There is on
4240: 65 20 63 75 72 73 6f 72 20 70 65 72 20 74 61 62  e cursor per tab
4250: 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
4260: 6c 61 75 73 65 2e 20 20 54 68 65 20 6e 75 6d 62  lause.  The numb
4270: 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65 73 20  er of.** tables 
4280: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
4290: 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79  se is limited by
42a0: 20 61 20 74 65 73 74 20 65 61 72 6c 79 20 69 6e   a test early in
42b0: 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 57   the.** sqlite3W
42c0: 68 65 72 65 42 65 67 69 6e 28 29 20 72 6f 75 74  hereBegin() rout
42d0: 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e 6f 77  ine.  So we know
42e0: 20 74 68 61 74 20 74 68 65 20 70 4d 61 73 6b 53   that the pMaskS
42f0: 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72 72 61  et->ix[].** arra
4300: 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76 65  y will never ove
4310: 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  rflow..*/.static
4320: 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61 73 6b   void createMask
4330: 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70  (WhereMaskSet *p
4340: 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75  MaskSet, int iCu
4350: 72 73 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28  rsor){.  assert(
4360: 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c 20 41   pMaskSet->n < A
4370: 72 72 61 79 53 69 7a 65 28 70 4d 61 73 6b 53 65  rraySize(pMaskSe
4380: 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d 61 73  t->ix) );.  pMas
4390: 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b 53 65  kSet->ix[pMaskSe
43a0: 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72 73 6f  t->n++] = iCurso
43b0: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  r;.}../*.** This
43c0: 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 28   routine walks (
43d0: 72 65 63 75 72 73 69 76 65 6c 79 29 20 61 6e 20  recursively) an 
43e0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
43f0: 61 6e 64 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a  and generates.**
4400: 20 61 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63   a bitmask indic
4410: 61 74 69 6e 67 20 77 68 69 63 68 20 74 61 62 6c  ating which tabl
4420: 65 73 20 61 72 65 20 75 73 65 64 20 69 6e 20 74  es are used in t
4430: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  hat expression.*
4440: 2a 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e  * tree..**.** In
4450: 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73 20   order for this 
4460: 72 6f 75 74 69 6e 65 20 74 6f 20 77 6f 72 6b 2c  routine to work,
4470: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
4480: 63 74 69 6f 6e 20 6d 75 73 74 20 68 61 76 65 0a  ction must have.
4490: 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e  ** previously in
44a0: 76 6f 6b 65 64 20 73 71 6c 69 74 65 33 52 65 73  voked sqlite3Res
44b0: 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 20  olveExprNames() 
44c0: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
44d0: 6e 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20 68  n.  See.** the h
44e0: 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e  eader comment on
44f0: 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66 6f   that routine fo
4500: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
4510: 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65  ormation..** The
4520: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
4530: 78 70 72 4e 61 6d 65 73 28 29 20 72 6f 75 74 69  xprNames() routi
4540: 6e 65 73 20 6c 6f 6f 6b 73 20 66 6f 72 20 63 6f  nes looks for co
4550: 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 0a 2a  lumn names and.*
4560: 2a 20 73 65 74 73 20 74 68 65 69 72 20 6f 70 63  * sets their opc
4570: 6f 64 65 73 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d  odes to TK_COLUM
4580: 4e 20 61 6e 64 20 74 68 65 69 72 20 45 78 70 72  N and their Expr
4590: 2e 69 54 61 62 6c 65 20 66 69 65 6c 64 73 20 74  .iTable fields t
45a0: 6f 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 63 75  o.** the VDBE cu
45b0: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
45c0: 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  he table.  This 
45d0: 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 68 61 73  routine just has
45e0: 20 74 6f 0a 2a 2a 20 74 72 61 6e 73 6c 61 74 65   to.** translate
45f0: 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
4600: 65 72 73 20 69 6e 74 6f 20 62 69 74 6d 61 73 6b  ers into bitmask
4610: 20 76 61 6c 75 65 73 20 61 6e 64 20 4f 52 20 61   values and OR a
4620: 6c 6c 0a 2a 2a 20 74 68 65 20 62 69 74 6d 61 73  ll.** the bitmas
4630: 6b 73 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2f 0a  ks together..*/.
4640: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
4650: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
4660: 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c  e(WhereMaskSet*,
4670: 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61   ExprList*);.sta
4680: 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72  tic Bitmask expr
4690: 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65  SelectTableUsage
46a0: 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c 20  (WhereMaskSet*, 
46b0: 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74 69 63  Select*);.static
46c0: 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54 61 62   Bitmask exprTab
46d0: 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73  leUsage(WhereMas
46e0: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
46f0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69 74 6d  Expr *p){.  Bitm
4700: 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20  ask mask = 0;.  
4710: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
4720: 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70  n 0;.  if( p->op
4730: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  ==TK_COLUMN ){. 
4740: 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d 61 73     mask = getMas
4750: 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69  k(pMaskSet, p->i
4760: 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65 74 75  Table);.    retu
4770: 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20 6d  rn mask;.  }.  m
4780: 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c 65 55  ask = exprTableU
4790: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
47a0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d 61 73  ->pRight);.  mas
47b0: 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73  k |= exprTableUs
47c0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  age(pMaskSet, p-
47d0: 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 45  >pLeft);.  if( E
47e0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
47f0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
4800: 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  ){.    mask |= e
4810: 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73  xprSelectTableUs
4820: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  age(pMaskSet, p-
4830: 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d  >x.pSelect);.  }
4840: 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b 20 7c  else{.    mask |
4850: 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  = exprListTableU
4860: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
4870: 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a  ->x.pList);.  }.
4880: 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d    return mask;.}
4890: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
48a0: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
48b0: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  ge(WhereMaskSet 
48c0: 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 4c  *pMaskSet, ExprL
48d0: 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
48e0: 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73 6b 20  nt i;.  Bitmask 
48f0: 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20  mask = 0;.  if( 
4900: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72  pList ){.    for
4910: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
4920: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
4930: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61    mask |= exprTa
4940: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
4950: 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  t, pList->a[i].p
4960: 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Expr);.    }.  }
4970: 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a  .  return mask;.
4980: 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  }.static Bitmask
4990: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
49a0: 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53  Usage(WhereMaskS
49b0: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 53 65  et *pMaskSet, Se
49c0: 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42 69 74  lect *pS){.  Bit
49d0: 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20  mask mask = 0;. 
49e0: 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a 20 20   while( pS ){.  
49f0: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20    SrcList *pSrc 
4a00: 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20  = pS->pSrc;.    
4a10: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74  mask |= exprList
4a20: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
4a30: 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73 74 29  Set, pS->pEList)
4a40: 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  ;.    mask |= ex
4a50: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
4a60: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
4a70: 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 6d 61  GroupBy);.    ma
4a80: 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61  sk |= exprListTa
4a90: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
4aa0: 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42 79 29  t, pS->pOrderBy)
4ab0: 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  ;.    mask |= ex
4ac0: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
4ad0: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68 65 72  skSet, pS->pWher
4ae0: 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  e);.    mask |= 
4af0: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
4b00: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 48 61  MaskSet, pS->pHa
4b10: 76 69 6e 67 29 3b 0a 20 20 20 20 69 66 28 20 41  ving);.    if( A
4b20: 4c 57 41 59 53 28 70 53 72 63 21 3d 30 29 20 29  LWAYS(pSrc!=0) )
4b30: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
4b40: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
4b50: 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  pSrc->nSrc; i++)
4b60: 7b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20 7c  {.        mask |
4b70: 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  = exprSelectTabl
4b80: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
4b90: 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c   pSrc->a[i].pSel
4ba0: 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 6d 61  ect);.        ma
4bb0: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
4bc0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
4bd0: 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b 0a  Src->a[i].pOn);.
4be0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4bf0: 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72 69 6f    pS = pS->pPrio
4c00: 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  r;.  }.  return 
4c10: 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  mask;.}../*.** R
4c20: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
4c30: 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74 6f 72  e given operator
4c40: 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f   is one of the o
4c50: 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 69 73  perators that is
4c60: 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20  .** allowed for 
4c70: 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57 48 45  an indexable WHE
4c80: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 20  RE clause term. 
4c90: 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f 70 65   The allowed ope
4ca0: 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20 22 3d  rators are.** "=
4cb0: 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22 3c 3d  ", "<", ">", "<=
4cc0: 22 2c 20 22 3e 3d 22 2c 20 61 6e 64 20 22 49 4e  ", ">=", and "IN
4cd0: 22 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45  "..**.** IMPLEME
4ce0: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 35 39  NTATION-OF: R-59
4cf0: 39 32 36 2d 32 36 33 39 33 20 54 6f 20 62 65 20  926-26393 To be 
4d00: 75 73 61 62 6c 65 20 62 79 20 61 6e 20 69 6e 64  usable by an ind
4d10: 65 78 20 61 20 74 65 72 6d 20 6d 75 73 74 20 62  ex a term must b
4d20: 65 0a 2a 2a 20 6f 66 20 6f 6e 65 20 6f 66 20 74  e.** of one of t
4d30: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72  he following for
4d40: 6d 73 3a 20 63 6f 6c 75 6d 6e 20 3d 20 65 78 70  ms: column = exp
4d50: 72 65 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e 20 3e  ression column >
4d60: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 63   expression.** c
4d70: 6f 6c 75 6d 6e 20 3e 3d 20 65 78 70 72 65 73 73  olumn >= express
4d80: 69 6f 6e 20 63 6f 6c 75 6d 6e 20 3c 20 65 78 70  ion column < exp
4d90: 72 65 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e 20 3c  ression column <
4da0: 3d 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  = expression.** 
4db0: 65 78 70 72 65 73 73 69 6f 6e 20 3d 20 63 6f 6c  expression = col
4dc0: 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 3e  umn expression >
4dd0: 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69   column expressi
4de0: 6f 6e 20 3e 3d 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  on >= column.** 
4df0: 65 78 70 72 65 73 73 69 6f 6e 20 3c 20 63 6f 6c  expression < col
4e00: 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 3c  umn expression <
4e10: 3d 20 63 6f 6c 75 6d 6e 20 63 6f 6c 75 6d 6e 20  = column column 
4e20: 49 4e 0a 2a 2a 20 28 65 78 70 72 65 73 73 69 6f  IN.** (expressio
4e30: 6e 2d 6c 69 73 74 29 20 63 6f 6c 75 6d 6e 20 49  n-list) column I
4e40: 4e 20 28 73 75 62 71 75 65 72 79 29 20 63 6f 6c  N (subquery) col
4e50: 75 6d 6e 20 49 53 20 4e 55 4c 4c 0a 2a 2f 0a 73  umn IS NULL.*/.s
4e60: 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 77 65  tatic int allowe
4e70: 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20 20 61  dOp(int op){.  a
4e80: 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f  ssert( TK_GT>TK_
4e90: 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b 5f 47  EQ && TK_GT<TK_G
4ea0: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54  E );.  assert( T
4eb0: 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b  K_LT>TK_EQ && TK
4ec0: 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61  _LT<TK_GE );.  a
4ed0: 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54 4b 5f  ssert( TK_LE>TK_
4ee0: 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b 5f 47  EQ && TK_LE<TK_G
4ef0: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54  E );.  assert( T
4f00: 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20 29 3b  K_GE==TK_EQ+4 );
4f10: 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d 54 4b  .  return op==TK
4f20: 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b 5f 45  _IN || (op>=TK_E
4f30: 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45 29 20  Q && op<=TK_GE) 
4f40: 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  || op==TK_ISNULL
4f50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20  ;.}../*.** Swap 
4f60: 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66 20 74  two objects of t
4f70: 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23 64 65  ype TYPE..*/.#de
4f80: 66 69 6e 65 20 53 57 41 50 28 54 59 50 45 2c 41  fine SWAP(TYPE,A
4f90: 2c 42 29 20 7b 54 59 50 45 20 74 3d 41 3b 20 41  ,B) {TYPE t=A; A
4fa0: 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a 2a 2a  =B; B=t;}../*.**
4fb0: 20 43 6f 6d 6d 75 74 65 20 61 20 63 6f 6d 70 61   Commute a compa
4fc0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20  rison operator. 
4fd0: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   Expressions of 
4fe0: 74 68 65 20 66 6f 72 6d 20 22 58 20 6f 70 20 59  the form "X op Y
4ff0: 22 0a 2a 2a 20 61 72 65 20 63 6f 6e 76 65 72 74  ".** are convert
5000: 65 64 20 69 6e 74 6f 20 22 59 20 6f 70 20 58 22  ed into "Y op X"
5010: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 6f 6c  ..**.** If a col
5020: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
5030: 69 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  is associated wi
5040: 74 68 20 65 69 74 68 65 72 20 74 68 65 20 6c 65  th either the le
5050: 66 74 20 6f 72 20 72 69 67 68 74 0a 2a 2a 20 73  ft or right.** s
5060: 69 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 61  ide of the compa
5070: 72 69 73 6f 6e 2c 20 69 74 20 72 65 6d 61 69 6e  rison, it remain
5080: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
5090: 68 20 74 68 65 20 73 61 6d 65 20 73 69 64 65 20  h the same side 
50a0: 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 63 6f 6d  after.** the com
50b0: 6d 75 74 61 74 69 6f 6e 2e 20 53 6f 20 22 59 20  mutation. So "Y 
50c0: 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f  collate NOCASE o
50d0: 70 20 58 22 20 62 65 63 6f 6d 65 73 20 0a 2a 2a  p X" becomes .**
50e0: 20 22 58 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41   "X collate NOCA
50f0: 53 45 20 6f 70 20 59 22 2e 20 54 68 69 73 20 69  SE op Y". This i
5100: 73 20 62 65 63 61 75 73 65 20 61 6e 79 20 63 6f  s because any co
5110: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
5120: 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c 65 66 74 20   on.** the left 
5130: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 20 63  hand side of a c
5140: 6f 6d 70 61 72 69 73 6f 6e 20 6f 76 65 72 72 69  omparison overri
5150: 64 65 73 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f  des any collatio
5160: 6e 20 73 65 71 75 65 6e 63 65 20 0a 2a 2a 20 61  n sequence .** a
5170: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 72  ttached to the r
5180: 69 67 68 74 2e 20 46 6f 72 20 74 68 65 20 73 61  ight. For the sa
5190: 6d 65 20 72 65 61 73 6f 6e 20 74 68 65 20 45 50  me reason the EP
51a0: 5f 45 78 70 43 6f 6c 6c 61 74 65 20 66 6c 61 67  _ExpCollate flag
51b0: 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d 6d 75  .** is not commu
51c0: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
51d0: 6f 69 64 20 65 78 70 72 43 6f 6d 6d 75 74 65 28  oid exprCommute(
51e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
51f0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 75  xpr *pExpr){.  u
5200: 31 36 20 65 78 70 52 69 67 68 74 20 3d 20 28 70  16 expRight = (p
5210: 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c  Expr->pRight->fl
5220: 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c  ags & EP_ExpColl
5230: 61 74 65 29 3b 0a 20 20 75 31 36 20 65 78 70 4c  ate);.  u16 expL
5240: 65 66 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 4c  eft = (pExpr->pL
5250: 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  eft->flags & EP_
5260: 45 78 70 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 61  ExpCollate);.  a
5270: 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70  ssert( allowedOp
5280: 28 70 45 78 70 72 2d 3e 6f 70 29 20 26 26 20 70  (pExpr->op) && p
5290: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20  Expr->op!=TK_IN 
52a0: 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52 69 67  );.  pExpr->pRig
52b0: 68 74 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ht->pColl = sqli
52c0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
52d0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
52e0: 69 67 68 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e  ight);.  pExpr->
52f0: 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 20 3d 20 73  pLeft->pColl = s
5300: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
5310: 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  q(pParse, pExpr-
5320: 3e 70 4c 65 66 74 29 3b 0a 20 20 53 57 41 50 28  >pLeft);.  SWAP(
5330: 43 6f 6c 6c 53 65 71 2a 2c 70 45 78 70 72 2d 3e  CollSeq*,pExpr->
5340: 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 2c 70 45  pRight->pColl,pE
5350: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c  xpr->pLeft->pCol
5360: 6c 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52 69  l);.  pExpr->pRi
5370: 67 68 74 2d 3e 66 6c 61 67 73 20 3d 20 28 70 45  ght->flags = (pE
5380: 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61  xpr->pRight->fla
5390: 67 73 20 26 20 7e 45 50 5f 45 78 70 43 6f 6c 6c  gs & ~EP_ExpColl
53a0: 61 74 65 29 20 7c 20 65 78 70 4c 65 66 74 3b 0a  ate) | expLeft;.
53b0: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e    pExpr->pLeft->
53c0: 66 6c 61 67 73 20 3d 20 28 70 45 78 70 72 2d 3e  flags = (pExpr->
53d0: 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 7e  pLeft->flags & ~
53e0: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 20 7c  EP_ExpCollate) |
53f0: 20 65 78 70 52 69 67 68 74 3b 0a 20 20 53 57 41   expRight;.  SWA
5400: 50 28 45 78 70 72 2a 2c 70 45 78 70 72 2d 3e 70  P(Expr*,pExpr->p
5410: 52 69 67 68 74 2c 70 45 78 70 72 2d 3e 70 4c 65  Right,pExpr->pLe
5420: 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  ft);.  if( pExpr
5430: 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b 0a 20  ->op>=TK_GT ){. 
5440: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54     assert( TK_LT
5450: 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a 20 20 20  ==TK_GT+2 );.   
5460: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d   assert( TK_GE==
5470: 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20 20 61  TK_LE+2 );.    a
5480: 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f  ssert( TK_GT>TK_
5490: 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  EQ );.    assert
54a0: 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20 29 3b  ( TK_GT<TK_LE );
54b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
54c0: 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 26 26  pr->op>=TK_GT &&
54d0: 20 70 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b 5f 47   pExpr->op<=TK_G
54e0: 45 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  E );.    pExpr->
54f0: 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70  op = ((pExpr->op
5500: 2d 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f 47 54  -TK_GT)^2)+TK_GT
5510: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
5520: 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20 54 4b  ranslate from TK
5530: 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  _xx operator to 
5540: 57 4f 5f 78 78 20 62 69 74 6d 61 73 6b 2e 0a 2a  WO_xx bitmask..*
5550: 2f 0a 73 74 61 74 69 63 20 75 31 36 20 6f 70 65  /.static u16 ope
5560: 72 61 74 6f 72 4d 61 73 6b 28 69 6e 74 20 6f 70  ratorMask(int op
5570: 29 7b 0a 20 20 75 31 36 20 63 3b 0a 20 20 61 73  ){.  u16 c;.  as
5580: 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28  sert( allowedOp(
5590: 6f 70 29 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d  op) );.  if( op=
55a0: 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 63 20  =TK_IN ){.    c 
55b0: 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65  = WO_IN;.  }else
55c0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55   if( op==TK_ISNU
55d0: 4c 4c 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f  LL ){.    c = WO
55e0: 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65  _ISNULL;.  }else
55f0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 57  {.    assert( (W
5600: 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29  O_EQ<<(op-TK_EQ)
5610: 29 20 3c 20 30 78 37 66 66 66 20 29 3b 0a 20 20  ) < 0x7fff );.  
5620: 20 20 63 20 3d 20 28 75 31 36 29 28 57 4f 5f 45    c = (u16)(WO_E
5630: 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 3b 0a  Q<<(op-TK_EQ));.
5640: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 70    }.  assert( op
5650: 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 63  !=TK_ISNULL || c
5660: 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==WO_ISNULL );. 
5670: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
5680: 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e 20 29  IN || c==WO_IN )
5690: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
56a0: 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f 5f 45  TK_EQ || c==WO_E
56b0: 51 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  Q );.  assert( o
56c0: 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d 3d 57  p!=TK_LT || c==W
56d0: 4f 5f 4c 54 20 29 3b 0a 20 20 61 73 73 65 72 74  O_LT );.  assert
56e0: 28 20 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 63  ( op!=TK_LE || c
56f0: 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 61 73 73  ==WO_LE );.  ass
5700: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 54 20 7c  ert( op!=TK_GT |
5710: 7c 20 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a 20 20  | c==WO_GT );.  
5720: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47  assert( op!=TK_G
5730: 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20 29 3b  E || c==WO_GE );
5740: 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a  .  return c;.}..
5750: 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72  /*.** Search for
5760: 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57   a term in the W
5770: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
5780: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
5790: 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a  "X <op> <expr>".
57a0: 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61 20  ** where X is a 
57b0: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
57c0: 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c   iColumn of tabl
57d0: 65 20 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e 20  e iCur and <op> 
57e0: 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 65  is one of.** the
57f0: 20 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20   WO_xx operator 
5800: 63 6f 64 65 73 20 73 70 65 63 69 66 69 65 64 20  codes specified 
5810: 62 79 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65  by the op parame
5820: 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ter..** Return a
5830: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
5840: 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20  term.  Return 0 
5850: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f  if not found..*/
5860: 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65 72  .static WhereTer
5870: 6d 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20 57  m *findTerm(.  W
5880: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
5890: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
58a0: 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73  E clause to be s
58b0: 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74  earched */.  int
58c0: 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20   iCur,          
58d0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
58e0: 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20  ber of LHS */.  
58f0: 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20  int iColumn,    
5900: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
5910: 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f  number of LHS */
5920: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
5930: 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20  ady,     /* RHS 
5940: 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70  must not overlap
5950: 20 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20   with this mask 
5960: 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20 20  */.  u32 op,    
5970: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
5980: 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75  sk of WO_xx valu
5990: 65 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70  es describing op
59a0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65  erator */.  Inde
59b0: 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
59c0: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d    /* Must be com
59d0: 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69  patible with thi
59e0: 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20  s index, if not 
59f0: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  NULL */.){.  Whe
5a00: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
5a10: 20 69 6e 74 20 6b 3b 0a 20 20 61 73 73 65 72 74   int k;.  assert
5a20: 28 20 69 43 75 72 3e 3d 30 20 29 3b 0a 20 20 6f  ( iCur>=0 );.  o
5a30: 70 20 26 3d 20 57 4f 5f 41 4c 4c 3b 0a 20 20 66  p &= WO_ALL;.  f
5a40: 6f 72 28 3b 20 70 57 43 3b 20 70 57 43 3d 70 57  or(; pWC; pWC=pW
5a50: 43 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20 20  C->pOuter){.    
5a60: 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
5a70: 2c 20 6b 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  , k=pWC->nTerm; 
5a80: 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29  k; k--, pTerm++)
5a90: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  {.      if( pTer
5aa0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
5ab0: 43 75 72 0a 20 20 20 20 20 20 20 20 20 26 26 20  Cur.         && 
5ac0: 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
5ad0: 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 3d  ght & notReady)=
5ae0: 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  =0.         && p
5af0: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
5b00: 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20  mn==iColumn.    
5b10: 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e       && (pTerm->
5b20: 65 4f 70 65 72 61 74 6f 72 20 26 20 6f 70 29 21  eOperator & op)!
5b30: 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  =0.      ){.    
5b40: 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e      if( iColumn>
5b50: 3d 30 20 26 26 20 70 49 64 78 20 26 26 20 70 54  =0 && pIdx && pT
5b60: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d  erm->eOperator!=
5b70: 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  WO_ISNULL ){.   
5b80: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20         Expr *pX 
5b90: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
5ba0: 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65            CollSe
5bb0: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  q *pColl;.      
5bc0: 20 20 20 20 63 68 61 72 20 69 64 78 61 66 66 3b      char idxaff;
5bd0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a  .          int j
5be0: 3b 0a 20 20 20 20 20 20 20 20 20 20 50 61 72 73  ;.          Pars
5bf0: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d  e *pParse = pWC-
5c00: 3e 70 50 61 72 73 65 3b 0a 20 20 0a 20 20 20 20  >pParse;.  .    
5c10: 20 20 20 20 20 20 69 64 78 61 66 66 20 3d 20 70        idxaff = p
5c20: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  Idx->pTable->aCo
5c30: 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e  l[iColumn].affin
5c40: 69 74 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ity;.          i
5c50: 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78  f( !sqlite3Index
5c60: 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20 69  AffinityOk(pX, i
5c70: 64 78 61 66 66 29 20 29 20 63 6f 6e 74 69 6e 75  dxaff) ) continu
5c80: 65 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20  e;.  .          
5c90: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  /* Figure out th
5ca0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
5cb0: 65 6e 63 65 20 72 65 71 75 69 72 65 64 20 66 72  ence required fr
5cc0: 6f 6d 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 0a  om an index for.
5cd0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
5ce0: 74 6f 20 62 65 20 75 73 65 66 75 6c 20 66 6f 72  to be useful for
5cf0: 20 6f 70 74 69 6d 69 73 69 6e 67 20 65 78 70 72   optimising expr
5d00: 65 73 73 69 6f 6e 20 70 58 2e 20 53 74 6f 72 65  ession pX. Store
5d10: 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20   this.          
5d20: 2a 2a 20 76 61 6c 75 65 20 69 6e 20 76 61 72 69  ** value in vari
5d30: 61 62 6c 65 20 70 43 6f 6c 6c 2e 0a 20 20 20 20  able pColl..    
5d40: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
5d50: 20 20 20 61 73 73 65 72 74 28 70 58 2d 3e 70 4c     assert(pX->pL
5d60: 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eft);.          
5d70: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42  pColl = sqlite3B
5d80: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
5d90: 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  Seq(pParse, pX->
5da0: 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68  pLeft, pX->pRigh
5db0: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  t);.          as
5dc0: 73 65 72 74 28 70 43 6f 6c 6c 20 7c 7c 20 70 50  sert(pColl || pP
5dd0: 61 72 73 65 2d 3e 6e 45 72 72 29 3b 0a 20 20 0a  arse->nErr);.  .
5de0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
5df0: 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  0; pIdx->aiColum
5e00: 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a  n[j]!=iColumn; j
5e10: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
5e20: 20 69 66 28 20 4e 45 56 45 52 28 6a 3e 3d 70 49   if( NEVER(j>=pI
5e30: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 20 72  dx->nColumn) ) r
5e40: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
5e50: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
5e60: 66 28 20 70 43 6f 6c 6c 20 26 26 20 73 71 6c 69  f( pColl && sqli
5e70: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c  te3StrICmp(pColl
5e80: 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61  ->zName, pIdx->a
5e90: 7a 43 6f 6c 6c 5b 6a 5d 29 20 29 20 63 6f 6e 74  zColl[j]) ) cont
5ea0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
5eb0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
5ec0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Term;.      }.  
5ed0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
5ee0: 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72   0;.}../* Forwar
5ef0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
5f00: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41  tatic void exprA
5f10: 6e 61 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a 2c  nalyze(SrcList*,
5f20: 20 57 68 65 72 65 43 6c 61 75 73 65 2a 2c 20 69   WhereClause*, i
5f30: 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  nt);../*.** Call
5f40: 20 65 78 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20   exprAnalyze on 
5f50: 61 6c 6c 20 74 65 72 6d 73 20 69 6e 20 61 20 57  all terms in a W
5f60: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a  HERE clause.  .*
5f70: 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76  *.**.*/.static v
5f80: 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 41  oid exprAnalyzeA
5f90: 6c 6c 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ll(.  SrcList *p
5fa0: 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  TabList,       /
5fb0: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
5fc0: 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  e */.  WhereClau
5fd0: 73 65 20 2a 70 57 43 20 20 20 20 20 20 20 20 20  se *pWC         
5fe0: 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  /* the WHERE cla
5ff0: 75 73 65 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  use to be analyz
6000: 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ed */.){.  int i
6010: 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e  ;.  for(i=pWC->n
6020: 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  Term-1; i>=0; i-
6030: 2d 29 7b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c  -){.    exprAnal
6040: 79 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 70 57  yze(pTabList, pW
6050: 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  C, i);.  }.}..#i
6060: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6070: 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54  T_LIKE_OPTIMIZAT
6080: 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  ION./*.** Check 
6090: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 67 69  to see if the gi
60a0: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ven expression i
60b0: 73 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42  s a LIKE or GLOB
60c0: 20 6f 70 65 72 61 74 6f 72 20 74 68 61 74 0a 2a   operator that.*
60d0: 2a 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a  * can be optimiz
60e0: 65 64 20 75 73 69 6e 67 20 69 6e 65 71 75 61 6c  ed using inequal
60f0: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  ity constraints.
6100: 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
6110: 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e 64   it is.** so and
6120: 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a   false if not..*
6130: 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f  *.** In order fo
6140: 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 74  r the operator t
6150: 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c 65  o be optimizible
6160: 2c 20 74 68 65 20 52 48 53 20 6d 75 73 74 20 62  , the RHS must b
6170: 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 69  e a string.** li
6180: 74 65 72 61 6c 20 74 68 61 74 20 64 6f 65 73 20  teral that does 
6190: 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61  not begin with a
61a0: 20 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f 0a   wildcard.  .*/.
61b0: 73 74 61 74 69 63 20 69 6e 74 20 69 73 4c 69 6b  static int isLik
61c0: 65 4f 72 47 6c 6f 62 28 0a 20 20 50 61 72 73 65  eOrGlob(.  Parse
61d0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
61e0: 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
61f0: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
6200: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
6210: 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 65  Expr,      /* Te
6220: 73 74 20 74 68 69 73 20 65 78 70 72 65 73 73 69  st this expressi
6230: 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70  on */.  Expr **p
6240: 70 50 72 65 66 69 78 2c 20 20 2f 2a 20 50 6f 69  pPrefix,  /* Poi
6250: 6e 74 65 72 20 74 6f 20 54 4b 5f 53 54 52 49 4e  nter to TK_STRIN
6260: 47 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74  G expression wit
6270: 68 20 70 61 74 74 65 72 6e 20 70 72 65 66 69 78  h pattern prefix
6280: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73 43 6f   */.  int *pisCo
6290: 6d 70 6c 65 74 65 2c 20 2f 2a 20 54 72 75 65 20  mplete, /* True 
62a0: 69 66 20 74 68 65 20 6f 6e 6c 79 20 77 69 6c 64  if the only wild
62b0: 63 61 72 64 20 69 73 20 25 20 69 6e 20 74 68 65  card is % in the
62c0: 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20   last character 
62d0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f 43 61 73  */.  int *pnoCas
62e0: 65 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  e      /* True i
62f0: 66 20 75 70 70 65 72 63 61 73 65 20 69 73 20 65  f uppercase is e
6300: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c 6f 77  quivalent to low
6310: 65 72 63 61 73 65 20 2a 2f 0a 29 7b 0a 20 20 63  ercase */.){.  c
6320: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30  onst char *z = 0
6330: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72  ;         /* Str
6340: 69 6e 67 20 6f 6e 20 52 48 53 20 6f 66 20 4c 49  ing on RHS of LI
6350: 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  KE operator */. 
6360: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a   Expr *pRight, *
6370: 70 4c 65 66 74 3b 20 20 20 20 20 20 2f 2a 20 52  pLeft;      /* R
6380: 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69  ight and left si
6390: 7a 65 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61  ze of LIKE opera
63a0: 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  tor */.  ExprLis
63b0: 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20  t *pList;       
63c0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6f      /* List of o
63d0: 70 65 72 61 6e 64 73 20 74 6f 20 74 68 65 20 4c  perands to the L
63e0: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  IKE operator */.
63f0: 20 20 69 6e 74 20 63 3b 20 20 20 20 20 20 20 20    int c;        
6400: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6410: 4f 6e 65 20 63 68 61 72 61 63 74 65 72 20 69 6e  One character in
6420: 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 63 6e   z[] */.  int cn
6430: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
6440: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6450: 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20 70  f non-wildcard p
6460: 72 65 66 69 78 20 63 68 61 72 61 63 74 65 72 73  refix characters
6470: 20 2a 2f 0a 20 20 63 68 61 72 20 77 63 5b 33 5d   */.  char wc[3]
6480: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6490: 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 63 68 61   /* Wildcard cha
64a0: 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 73 71 6c  racters */.  sql
64b0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
64c0: 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62  e->db;  /* Datab
64d0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
64e0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
64f0: 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20 69  e *pVal = 0;.  i
6500: 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
6510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63            /* Opc
6520: 6f 64 65 20 6f 66 20 70 52 69 67 68 74 20 2a 2f  ode of pRight */
6530: 0a 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ..  if( !sqlite3
6540: 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64  IsLikeFunction(d
6550: 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43 61 73  b, pExpr, pnoCas
6560: 65 2c 20 77 63 29 20 29 7b 0a 20 20 20 20 72 65  e, wc) ){.    re
6570: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66 64  turn 0;.  }.#ifd
6580: 65 66 20 53 51 4c 49 54 45 5f 45 42 43 44 49 43  ef SQLITE_EBCDIC
6590: 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61 73 65 20  .  if( *pnoCase 
65a0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64  ) return 0;.#end
65b0: 69 66 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78  if.  pList = pEx
65c0: 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 70  pr->x.pList;.  p
65d0: 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Left = pList->a[
65e0: 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20  1].pExpr;.  if( 
65f0: 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pLeft->op!=TK_CO
6600: 4c 55 4d 4e 20 0a 20 20 20 7c 7c 20 73 71 6c 69  LUMN .   || sqli
6610: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
6620: 70 4c 65 66 74 29 21 3d 53 51 4c 49 54 45 5f 41  pLeft)!=SQLITE_A
6630: 46 46 5f 54 45 58 54 20 0a 20 20 20 7c 7c 20 49  FF_TEXT .   || I
6640: 73 56 69 72 74 75 61 6c 28 70 4c 65 66 74 2d 3e  sVirtual(pLeft->
6650: 70 54 61 62 29 0a 20 20 29 7b 0a 20 20 20 20 2f  pTab).  ){.    /
6660: 2a 20 49 4d 50 3a 20 52 2d 30 32 30 36 35 2d 34  * IMP: R-02065-4
6670: 39 34 36 35 20 54 68 65 20 6c 65 66 74 2d 68 61  9465 The left-ha
6680: 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 4c  nd side of the L
6690: 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72  IKE or GLOB oper
66a0: 61 74 6f 72 20 6d 75 73 74 0a 20 20 20 20 2a 2a  ator must.    **
66b0: 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   be the name of 
66c0: 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d  an indexed colum
66d0: 6e 20 77 69 74 68 20 54 45 58 54 20 61 66 66 69  n with TEXT affi
66e0: 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74  nity. */.    ret
66f0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 0;.  }.  ass
6700: 65 72 74 28 20 70 4c 65 66 74 2d 3e 69 43 6f 6c  ert( pLeft->iCol
6710: 75 6d 6e 21 3d 28 2d 31 29 20 29 3b 20 2f 2a 20  umn!=(-1) ); /* 
6720: 42 65 63 61 75 73 65 20 49 50 4b 20 6e 65 76 65  Because IPK neve
6730: 72 20 68 61 73 20 41 46 46 5f 54 45 58 54 20 2a  r has AFF_TEXT *
6740: 2f 0a 0a 20 20 70 52 69 67 68 74 20 3d 20 70 4c  /..  pRight = pL
6750: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
6760: 0a 20 20 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e  .  op = pRight->
6770: 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  op;.  if( op==TK
6780: 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20  _REGISTER ){.   
6790: 20 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e 6f 70   op = pRight->op
67a0: 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d  2;.  }.  if( op=
67b0: 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a  =TK_VARIABLE ){.
67c0: 20 20 20 20 56 64 62 65 20 2a 70 52 65 70 72 65      Vdbe *pRepre
67d0: 70 61 72 65 20 3d 20 70 50 61 72 73 65 2d 3e 70  pare = pParse->p
67e0: 52 65 70 72 65 70 61 72 65 3b 0a 20 20 20 20 69  Reprepare;.    i
67f0: 6e 74 20 69 43 6f 6c 20 3d 20 70 52 69 67 68 74  nt iCol = pRight
6800: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70  ->iColumn;.    p
6810: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Val = sqlite3Vdb
6820: 65 47 65 74 56 61 6c 75 65 28 70 52 65 70 72 65  eGetValue(pRepre
6830: 70 61 72 65 2c 20 69 43 6f 6c 2c 20 53 51 4c 49  pare, iCol, SQLI
6840: 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a 20 20  TE_AFF_NONE);.  
6850: 20 20 69 66 28 20 70 56 61 6c 20 26 26 20 73 71    if( pVal && sq
6860: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
6870: 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54 45 5f 54  (pVal)==SQLITE_T
6880: 45 58 54 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d  EXT ){.      z =
6890: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
68a0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c  _value_text(pVal
68b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
68c0: 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61  ite3VdbeSetVarma
68d0: 73 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  sk(pParse->pVdbe
68e0: 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 61 73 73  , iCol);.    ass
68f0: 65 72 74 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d  ert( pRight->op=
6900: 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 7c 7c 20  =TK_VARIABLE || 
6910: 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 52  pRight->op==TK_R
6920: 45 47 49 53 54 45 52 20 29 3b 0a 20 20 7d 65 6c  EGISTER );.  }el
6930: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 54  se if( op==TK_ST
6940: 52 49 4e 47 20 29 7b 0a 20 20 20 20 7a 20 3d 20  RING ){.    z = 
6950: 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e  pRight->u.zToken
6960: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 7b  ;.  }.  if( z ){
6970: 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20  .    cnt = 0;.  
6980: 20 20 77 68 69 6c 65 28 20 28 63 3d 7a 5b 63 6e    while( (c=z[cn
6990: 74 5d 29 21 3d 30 20 26 26 20 63 21 3d 77 63 5b  t])!=0 && c!=wc[
69a0: 30 5d 20 26 26 20 63 21 3d 77 63 5b 31 5d 20 26  0] && c!=wc[1] &
69b0: 26 20 63 21 3d 77 63 5b 32 5d 20 29 7b 0a 20 20  & c!=wc[2] ){.  
69c0: 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d      cnt++;.    }
69d0: 0a 20 20 20 20 69 66 28 20 63 6e 74 21 3d 30 20  .    if( cnt!=0 
69e0: 26 26 20 32 35 35 21 3d 28 75 38 29 7a 5b 63 6e  && 255!=(u8)z[cn
69f0: 74 2d 31 5d 20 29 7b 0a 20 20 20 20 20 20 45 78  t-1] ){.      Ex
6a00: 70 72 20 2a 70 50 72 65 66 69 78 3b 0a 20 20 20  pr *pPrefix;.   
6a10: 20 20 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20     *pisComplete 
6a20: 3d 20 63 3d 3d 77 63 5b 30 5d 20 26 26 20 7a 5b  = c==wc[0] && z[
6a30: 63 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20 20 20 20  cnt+1]==0;.     
6a40: 20 70 50 72 65 66 69 78 20 3d 20 73 71 6c 69 74   pPrefix = sqlit
6a50: 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 53 54  e3Expr(db, TK_ST
6a60: 52 49 4e 47 2c 20 7a 29 3b 0a 20 20 20 20 20 20  RING, z);.      
6a70: 69 66 28 20 70 50 72 65 66 69 78 20 29 20 70 50  if( pPrefix ) pP
6a80: 72 65 66 69 78 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  refix->u.zToken[
6a90: 63 6e 74 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  cnt] = 0;.      
6aa0: 2a 70 70 50 72 65 66 69 78 20 3d 20 70 50 72 65  *ppPrefix = pPre
6ab0: 66 69 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  fix;.      if( o
6ac0: 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29  p==TK_VARIABLE )
6ad0: 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 20 2a  {.        Vdbe *
6ae0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
6af0: 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
6b00: 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b  e3VdbeSetVarmask
6b10: 28 76 2c 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c  (v, pRight->iCol
6b20: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66  umn);.        if
6b30: 28 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 26  ( *pisComplete &
6b40: 26 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b  & pRight->u.zTok
6b50: 65 6e 5b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20  en[1] ){.       
6b60: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 68 73     /* If the rhs
6b70: 20 6f 66 20 74 68 65 20 4c 49 4b 45 20 65 78 70   of the LIKE exp
6b80: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76 61 72  ression is a var
6b90: 69 61 62 6c 65 2c 20 61 6e 64 20 74 68 65 20 63  iable, and the c
6ba0: 75 72 72 65 6e 74 0a 20 20 20 20 20 20 20 20 20  urrent.         
6bb0: 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65   ** value of the
6bc0: 20 76 61 72 69 61 62 6c 65 20 6d 65 61 6e 73 20   variable means 
6bd0: 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
6be0: 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 4c   to invoke the L
6bf0: 49 4b 45 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  IKE.          **
6c00: 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20   function, then 
6c10: 6e 6f 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 77  no OP_Variable w
6c20: 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20  ill be added to 
6c30: 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20 20 20  the program..   
6c40: 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63         ** This c
6c50: 61 75 73 65 73 20 70 72 6f 62 6c 65 6d 73 20 66  auses problems f
6c60: 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  or the sqlite3_b
6c70: 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61  ind_parameter_na
6c80: 6d 65 28 29 0a 20 20 20 20 20 20 20 20 20 20 2a  me().          *
6c90: 2a 20 41 50 49 2e 20 54 6f 20 77 6f 72 6b 61 72  * API. To workar
6ca0: 6f 75 6e 64 20 74 68 65 6d 2c 20 61 64 64 20 61  ound them, add a
6cb0: 20 64 75 6d 6d 79 20 4f 50 5f 56 61 72 69 61 62   dummy OP_Variab
6cc0: 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 20  le here..       
6cd0: 20 20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20     */ .         
6ce0: 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
6cf0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
6d00: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  se);.          s
6d10: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
6d20: 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 52 69  rget(pParse, pRi
6d30: 67 68 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  ght, r1);.      
6d40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
6d50: 68 61 6e 67 65 50 33 28 76 2c 20 73 71 6c 69 74  hangeP3(v, sqlit
6d60: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
6d70: 72 28 76 29 2d 31 2c 20 30 29 3b 0a 20 20 20 20  r(v)-1, 0);.    
6d80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
6d90: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
6da0: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  se, r1);.       
6db0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
6dc0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20  else{.      z = 
6dd0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
6de0: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
6df0: 28 70 56 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e  (pVal);.  return
6e00: 20 28 7a 21 3d 30 29 3b 0a 7d 0a 23 65 6e 64 69   (z!=0);.}.#endi
6e10: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
6e20: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
6e30: 4f 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20  ON */...#ifndef 
6e40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
6e50: 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43  UALTABLE./*.** C
6e60: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
6e70: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
6e80: 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ion is of the fo
6e90: 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  rm.**.**        
6ea0: 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78   column MATCH ex
6eb0: 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69  pr.**.** If it i
6ec0: 73 20 74 68 65 6e 20 72 65 74 75 72 6e 20 54 52  s then return TR
6ed0: 55 45 2e 20 20 49 66 20 6e 6f 74 2c 20 72 65 74  UE.  If not, ret
6ee0: 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74  urn FALSE..*/.st
6ef0: 61 74 69 63 20 69 6e 74 20 69 73 4d 61 74 63 68  atic int isMatch
6f00: 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20 45 78 70 72  OfColumn(.  Expr
6f10: 20 2a 70 45 78 70 72 20 20 20 20 20 20 2f 2a 20   *pExpr      /* 
6f20: 54 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73  Test this expres
6f30: 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  sion */.){.  Exp
6f40: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 0a 20  rList *pList;.. 
6f50: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
6f60: 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20  TK_FUNCTION ){. 
6f70: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
6f80: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
6f90: 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a  rICmp(pExpr->u.z
6fa0: 54 6f 6b 65 6e 2c 22 6d 61 74 63 68 22 29 21 3d  Token,"match")!=
6fb0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
6fc0: 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d  0;.  }.  pList =
6fd0: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
6fe0: 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45  .  if( pList->nE
6ff0: 78 70 72 21 3d 32 20 29 7b 0a 20 20 20 20 72 65  xpr!=2 ){.    re
7000: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
7010: 28 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ( pList->a[1].pE
7020: 78 70 72 2d 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f  xpr->op != TK_CO
7030: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  LUMN ){.    retu
7040: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
7050: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
7060: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
7070: 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f  RTUALTABLE */../
7080: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 42 61 73  *.** If the pBas
7090: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69  e expression ori
70a0: 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f  ginated in the O
70b0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
70c0: 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20  e of.** a join, 
70d0: 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68  then transfer th
70e0: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 61  e appropriate ma
70f0: 72 6b 69 6e 67 73 20 6f 76 65 72 20 74 6f 20 64  rkings over to d
7100: 65 72 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  erived..*/.stati
7110: 63 20 76 6f 69 64 20 74 72 61 6e 73 66 65 72 4a  c void transferJ
7120: 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 45 78 70 72  oinMarkings(Expr
7130: 20 2a 70 44 65 72 69 76 65 64 2c 20 45 78 70 72   *pDerived, Expr
7140: 20 2a 70 42 61 73 65 29 7b 0a 20 20 70 44 65 72   *pBase){.  pDer
7150: 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70  ived->flags |= p
7160: 42 61 73 65 2d 3e 66 6c 61 67 73 20 26 20 45 50  Base->flags & EP
7170: 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 70 44 65  _FromJoin;.  pDe
7180: 72 69 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69  rived->iRightJoi
7190: 6e 54 61 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e  nTable = pBase->
71a0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b  iRightJoinTable;
71b0: 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
71c0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f  (SQLITE_OMIT_OR_
71d0: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26  OPTIMIZATION) &&
71e0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
71f0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
7200: 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 20  /*.** Analyze a 
7210: 74 65 72 6d 20 74 68 61 74 20 63 6f 6e 73 69 73  term that consis
7220: 74 73 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ts of two or mor
7230: 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 0a 2a  e OR-connected.*
7240: 2a 20 73 75 62 74 65 72 6d 73 2e 20 20 53 6f 20  * subterms.  So 
7250: 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e  in:.**.**     ..
7260: 2e 20 57 48 45 52 45 20 20 28 61 3d 35 29 20 41  . WHERE  (a=5) A
7270: 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d 39 20 4f  ND (b=7 OR c=9 O
7280: 52 20 64 3d 31 33 29 20 41 4e 44 20 28 64 3d 31  R d=13) AND (d=1
7290: 33 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  3).**           
72a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5e                 ^
72b0: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e  ^^^^^^^^^^^^^^^^
72c0: 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ^^^.**.** This r
72d0: 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20  outine analyzes 
72e0: 74 65 72 6d 73 20 73 75 63 68 20 61 73 20 74 68  terms such as th
72f0: 65 20 6d 69 64 64 6c 65 20 74 65 72 6d 20 69 6e  e middle term in
7300: 20 74 68 65 20 61 62 6f 76 65 20 65 78 61 6d 70   the above examp
7310: 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72 65 4f 72  le..** A WhereOr
7320: 54 65 72 6d 20 6f 62 6a 65 63 74 20 69 73 20 63  Term object is c
7330: 6f 6d 70 75 74 65 64 20 61 6e 64 20 61 74 74 61  omputed and atta
7340: 63 68 65 64 20 74 6f 20 74 68 65 20 74 65 72 6d  ched to the term
7350: 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61 6c 79 73   under.** analys
7360: 69 73 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  is, regardless o
7370: 66 20 74 68 65 20 6f 75 74 63 6f 6d 65 20 6f 66  f the outcome of
7380: 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e 20 20   the analysis.  
7390: 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  Hence:.**.**    
73a0: 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61   WhereTerm.wtFla
73b0: 67 73 20 20 20 7c 3d 20 20 54 45 52 4d 5f 4f 52  gs   |=  TERM_OR
73c0: 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57 68 65 72  INFO.**     Wher
73d0: 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20  eTerm.u.pOrInfo 
73e0: 20 3d 20 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   =  a dynamicall
73f0: 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72  y allocated Wher
7400: 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a  eOrTerm object.*
7410: 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 62 65  *.** The term be
7420: 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 6d 75 73  ing analyzed mus
7430: 74 20 68 61 76 65 20 74 77 6f 20 6f 72 20 6d 6f  t have two or mo
7440: 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e 65 63 74  re of OR-connect
7450: 65 64 20 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20  ed subterms..** 
7460: 41 20 73 69 6e 67 6c 65 20 73 75 62 74 65 72 6d  A single subterm
7470: 20 6d 69 67 68 74 20 62 65 20 61 20 73 65 74 20   might be a set 
7480: 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64  of AND-connected
7490: 20 73 75 62 2d 73 75 62 74 65 72 6d 73 2e 0a 2a   sub-subterms..*
74a0: 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 74 65  * Examples of te
74b0: 72 6d 73 20 75 6e 64 65 72 20 61 6e 61 6c 79 73  rms under analys
74c0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 41  is:.**.**     (A
74d0: 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20  )     t1.x=t2.y 
74e0: 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20 4f 52 20  OR t1.x=t2.z OR 
74f0: 74 31 2e 79 3d 31 35 20 4f 52 20 74 31 2e 7a 3d  t1.y=15 OR t1.z=
7500: 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20 20 28 42  t3.a+5.**     (B
7510: 29 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52  )     x=expr1 OR
7520: 20 65 78 70 72 32 3d 78 20 4f 52 20 78 3d 65 78   expr2=x OR x=ex
7530: 70 72 33 0a 2a 2a 20 20 20 20 20 28 43 29 20 20  pr3.**     (C)  
7540: 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20     t1.x=t2.y OR 
7550: 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e 44 20 74  (t1.x=t2.z AND t
7560: 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20 20 20 28  1.y=15).**     (
7570: 44 29 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f  D)     x=expr1 O
7580: 52 20 28 79 3e 31 31 20 41 4e 44 20 79 3c 32 32  R (y>11 AND y<22
7590: 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27 2a 68 65   AND z LIKE '*he
75a0: 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20 20 28 45  llo*').**     (E
75b0: 29 20 20 20 20 20 28 70 2e 61 3d 31 20 41 4e 44  )     (p.a=1 AND
75c0: 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e 63 3d 33   q.b=2 AND r.c=3
75d0: 29 20 4f 52 20 28 70 2e 78 3d 34 20 41 4e 44 20  ) OR (p.x=4 AND 
75e0: 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a 3d 36 29  q.y=5 AND r.z=6)
75f0: 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a  .**.** CASE 1:.*
7600: 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74  *.** If all subt
7610: 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20  erms are of the 
7620: 66 6f 72 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f  form T.C=expr fo
7630: 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f  r some single co
7640: 6c 75 6d 6e 20 6f 66 20 43 0a 2a 2a 20 61 20 73  lumn of C.** a s
7650: 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 20 28 61  ingle table T (a
7660: 73 20 73 68 6f 77 6e 20 69 6e 20 65 78 61 6d 70  s shown in examp
7670: 6c 65 20 42 20 61 62 6f 76 65 29 20 74 68 65 6e  le B above) then
7680: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 76 69   create a new vi
7690: 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 74 68  rtual.** term th
76a0: 61 74 20 69 73 20 61 6e 20 65 71 75 69 76 61 6c  at is an equival
76b0: 65 6e 74 20 49 4e 20 65 78 70 72 65 73 73 69 6f  ent IN expressio
76c0: 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  n.  In other wor
76d0: 64 73 2c 20 69 66 20 74 68 65 20 74 65 72 6d 0a  ds, if the term.
76e0: 2a 2a 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65  ** being analyze
76f0: 64 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  d is:.**.**     
7700: 20 78 20 3d 20 65 78 70 72 31 20 20 4f 52 20 20   x = expr1  OR  
7710: 65 78 70 72 32 20 3d 20 78 20 20 4f 52 20 20 78  expr2 = x  OR  x
7720: 20 3d 20 65 78 70 72 33 0a 2a 2a 0a 2a 2a 20 74   = expr3.**.** t
7730: 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77  hen create a new
7740: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6c 69   virtual term li
7750: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
7760: 20 20 20 20 78 20 49 4e 20 28 65 78 70 72 31 2c      x IN (expr1,
7770: 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a 0a  expr2,expr3).**.
7780: 2a 2a 20 43 41 53 45 20 32 3a 0a 2a 2a 0a 2a 2a  ** CASE 2:.**.**
7790: 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d 73   If all subterms
77a0: 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 20 62   are indexable b
77b0: 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  y a single table
77c0: 20 54 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 0a   T, then set.**.
77d0: 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  **     WhereTerm
77e0: 2e 65 4f 70 65 72 61 74 6f 72 20 20 20 20 20 20  .eOperator      
77f0: 20 20 20 20 20 20 20 20 3d 20 20 57 4f 5f 4f 52          =  WO_OR
7800: 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72  .**     WhereTer
7810: 6d 2e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64  m.u.pOrInfo->ind
7820: 65 78 61 62 6c 65 20 20 7c 3d 20 20 74 68 65 20  exable  |=  the 
7830: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
7840: 72 20 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a 2a 20  r table T.**.** 
7850: 41 20 73 75 62 74 65 72 6d 20 69 73 20 22 69 6e  A subterm is "in
7860: 64 65 78 61 62 6c 65 22 20 69 66 20 69 74 20 69  dexable" if it i
7870: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  s of the form.**
7880: 20 22 54 2e 43 20 3c 6f 70 3e 20 3c 65 78 70 72   "T.C <op> <expr
7890: 3e 22 20 77 68 65 72 65 20 43 20 69 73 20 61 6e  >" where C is an
78a0: 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c  y column of tabl
78b0: 65 20 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f 70 3e  e T and .** <op>
78c0: 20 69 73 20 6f 6e 65 20 6f 66 20 22 3d 22 2c 20   is one of "=", 
78d0: 22 3c 22 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c 20  "<", "<=", ">", 
78e0: 22 3e 3d 22 2c 20 22 49 53 20 4e 55 4c 4c 22 2c  ">=", "IS NULL",
78f0: 20 6f 72 20 22 49 4e 22 2e 0a 2a 2a 20 41 20 73   or "IN"..** A s
7900: 75 62 74 65 72 6d 20 69 73 20 61 6c 73 6f 20 69  ubterm is also i
7910: 6e 64 65 78 61 62 6c 65 20 69 66 20 69 74 20 69  ndexable if it i
7920: 73 20 61 6e 20 41 4e 44 20 6f 66 20 74 77 6f 20  s an AND of two 
7930: 6f 72 20 6d 6f 72 65 0a 2a 2a 20 73 75 62 73 75  or more.** subsu
7940: 62 74 65 72 6d 73 20 61 74 20 6c 65 61 73 74 20  bterms at least 
7950: 6f 6e 65 20 6f 66 20 77 68 69 63 68 20 69 73 20  one of which is 
7960: 69 6e 64 65 78 61 62 6c 65 2e 20 20 49 6e 64 65  indexable.  Inde
7970: 78 61 62 6c 65 20 41 4e 44 20 0a 2a 2a 20 73 75  xable AND .** su
7980: 62 74 65 72 6d 73 20 68 61 76 65 20 74 68 65 69  bterms have thei
7990: 72 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20  r eOperator set 
79a0: 74 6f 20 57 4f 5f 41 4e 44 20 61 6e 64 20 74 68  to WO_AND and th
79b0: 65 79 20 68 61 76 65 0a 2a 2a 20 75 2e 70 41 6e  ey have.** u.pAn
79c0: 64 49 6e 66 6f 20 73 65 74 20 74 6f 20 61 20 64  dInfo set to a d
79d0: 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  ynamically alloc
79e0: 61 74 65 64 20 57 68 65 72 65 41 6e 64 54 65 72  ated WhereAndTer
79f0: 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  m object..**.** 
7a00: 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 70 6f 69  From another poi
7a10: 6e 74 20 6f 66 20 76 69 65 77 2c 20 22 69 6e 64  nt of view, "ind
7a20: 65 78 61 62 6c 65 22 20 6d 65 61 6e 73 20 74 68  exable" means th
7a30: 61 74 20 74 68 65 20 73 75 62 74 65 72 6d 20 63  at the subterm c
7a40: 6f 75 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74 69 61  ould.** potentia
7a50: 6c 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68  lly be used with
7a60: 20 61 6e 20 69 6e 64 65 78 20 69 66 20 61 6e 20   an index if an 
7a70: 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65  appropriate inde
7a80: 78 20 65 78 69 73 74 73 2e 0a 2a 2a 20 54 68 69  x exists..** Thi
7a90: 73 20 61 6e 61 6c 79 73 69 73 20 64 6f 65 73 20  s analysis does 
7aa0: 6e 6f 74 20 63 6f 6e 73 69 64 65 72 20 77 68 65  not consider whe
7ab0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
7ac0: 69 6e 64 65 78 20 65 78 69 73 74 73 3b 20 74 68  index exists; th
7ad0: 61 74 0a 2a 2a 20 69 73 20 73 6f 6d 65 74 68 69  at.** is somethi
7ae0: 6e 67 20 74 68 65 20 62 65 73 74 49 6e 64 65 78  ng the bestIndex
7af0: 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  () routine will 
7b00: 64 65 74 65 72 6d 69 6e 65 2e 20 20 54 68 69 73  determine.  This
7b10: 20 61 6e 61 6c 79 73 69 73 0a 2a 2a 20 6f 6e 6c   analysis.** onl
7b20: 79 20 6c 6f 6f 6b 73 20 61 74 20 77 68 65 74 68  y looks at wheth
7b30: 65 72 20 73 75 62 74 65 72 6d 73 20 61 70 70 72  er subterms appr
7b40: 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 64 65  opriate for inde
7b50: 78 69 6e 67 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a  xing exist..**.*
7b60: 2a 20 41 6c 6c 20 65 78 61 6d 70 6c 65 73 20 41  * All examples A
7b70: 20 74 68 72 6f 75 67 68 20 45 20 61 62 6f 76 65   through E above
7b80: 20 61 6c 6c 20 73 61 74 69 73 66 79 20 63 61 73   all satisfy cas
7b90: 65 20 32 2e 20 20 42 75 74 20 69 66 20 61 20 74  e 2.  But if a t
7ba0: 65 72 6d 0a 2a 2a 20 61 6c 73 6f 20 73 74 61 74  erm.** also stat
7bb0: 69 73 66 69 65 73 20 63 61 73 65 20 31 20 28 73  isfies case 1 (s
7bc0: 75 63 68 20 61 73 20 42 29 20 77 65 20 6b 6e 6f  uch as B) we kno
7bd0: 77 20 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d  w that the optim
7be0: 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77  izer will.** alw
7bf0: 61 79 73 20 70 72 65 66 65 72 20 63 61 73 65 20  ays prefer case 
7c00: 31 2c 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61  1, so in that ca
7c10: 73 65 20 77 65 20 70 72 65 74 65 6e 64 20 74 68  se we pretend th
7c20: 61 74 20 63 61 73 65 20 32 20 69 73 20 6e 6f 74  at case 2 is not
7c30: 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 2e 0a 2a  .** satisfied..*
7c40: 2a 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 62 65  *.** It might be
7c50: 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 6d   the case that m
7c60: 75 6c 74 69 70 6c 65 20 74 61 62 6c 65 73 20 61  ultiple tables a
7c70: 72 65 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 46  re indexable.  F
7c80: 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28  or example,.** (
7c90: 45 29 20 61 62 6f 76 65 20 69 73 20 69 6e 64 65  E) above is inde
7ca0: 78 61 62 6c 65 20 6f 6e 20 74 61 62 6c 65 73 20  xable on tables 
7cb0: 50 2c 20 51 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a  P, Q, and R..**.
7cc0: 2a 2a 20 54 65 72 6d 73 20 74 68 61 74 20 73 61  ** Terms that sa
7cd0: 74 69 73 66 79 20 63 61 73 65 20 32 20 61 72 65  tisfy case 2 are
7ce0: 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20   candidates for 
7cf0: 6c 6f 6f 6b 75 70 20 62 79 20 75 73 69 6e 67 0a  lookup by using.
7d00: 2a 2a 20 73 65 70 61 72 61 74 65 20 69 6e 64 69  ** separate indi
7d10: 63 65 73 20 74 6f 20 66 69 6e 64 20 72 6f 77 69  ces to find rowi
7d20: 64 73 20 66 6f 72 20 65 61 63 68 20 73 75 62 74  ds for each subt
7d30: 65 72 6d 20 61 6e 64 20 63 6f 6d 70 6f 73 69 6e  erm and composin
7d40: 67 0a 2a 2a 20 74 68 65 20 75 6e 69 6f 6e 20 6f  g.** the union o
7d50: 66 20 61 6c 6c 20 72 6f 77 69 64 73 20 75 73 69  f all rowids usi
7d60: 6e 67 20 61 20 52 6f 77 53 65 74 20 6f 62 6a 65  ng a RowSet obje
7d70: 63 74 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d  ct.  This is sim
7d80: 69 6c 61 72 0a 2a 2a 20 74 6f 20 22 62 69 74 6d  ilar.** to "bitm
7d90: 61 70 20 69 6e 64 69 63 65 73 22 20 69 6e 20 6f  ap indices" in o
7da0: 74 68 65 72 20 64 61 74 61 62 61 73 65 20 65 6e  ther database en
7db0: 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48  gines..**.** OTH
7dc0: 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66  ERWISE:.**.** If
7dd0: 20 6e 65 69 74 68 65 72 20 63 61 73 65 20 31 20   neither case 1 
7de0: 6e 6f 72 20 63 61 73 65 20 32 20 61 70 70 6c 79  nor case 2 apply
7df0: 2c 20 74 68 65 6e 20 6c 65 61 76 65 20 74 68 65  , then leave the
7e00: 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74   eOperator set t
7e10: 6f 0a 2a 2a 20 7a 65 72 6f 2e 20 20 54 68 69 73  o.** zero.  This
7e20: 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 75 73 65   term is not use
7e30: 66 75 6c 20 66 6f 72 20 73 65 61 72 63 68 2e 0a  ful for search..
7e40: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
7e50: 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d  xprAnalyzeOrTerm
7e60: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  (.  SrcList *pSr
7e70: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c,            /*
7e80: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
7e90: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
7ea0: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
7eb0: 2f 2a 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  /* the complete 
7ec0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
7ed0: 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20    int idxTerm   
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
7ef0: 6e 64 65 78 20 6f 66 20 74 68 65 20 4f 52 2d 74  ndex of the OR-t
7f00: 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  erm to be analyz
7f10: 65 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65  ed */.){.  Parse
7f20: 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e   *pParse = pWC->
7f30: 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
7f40: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
7f50: 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  text */.  sqlite
7f60: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
7f70: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
7f80: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
7f90: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68  nnection */.  Wh
7fa0: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d  ereTerm *pTerm =
7fb0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
7fc0: 5d 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72  ];    /* The ter
7fd0: 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  m to be analyzed
7fe0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
7ff0: 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
8000: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
8010: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
8020: 6f 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20  of the term */. 
8030: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70   WhereMaskSet *p
8040: 4d 61 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70  MaskSet = pWC->p
8050: 4d 61 73 6b 53 65 74 3b 20 2f 2a 20 54 61 62 6c  MaskSet; /* Tabl
8060: 65 20 75 73 65 20 6d 61 73 6b 73 20 2a 2f 0a 20  e use masks */. 
8070: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
8080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8090: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
80a0: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57   counters */.  W
80b0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57  hereClause *pOrW
80c0: 63 3b 20 20 20 20 20 20 20 2f 2a 20 42 72 65 61  c;       /* Brea
80d0: 6b 75 70 20 6f 66 20 70 54 65 72 6d 20 69 6e 74  kup of pTerm int
80e0: 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20  o subterms */.  
80f0: 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65  WhereTerm *pOrTe
8100: 72 6d 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 53  rm;       /* A S
8110: 75 62 2d 74 65 72 6d 20 77 69 74 68 69 6e 20 74  ub-term within t
8120: 68 65 20 70 4f 72 57 63 20 2a 2f 0a 20 20 57 68  he pOrWc */.  Wh
8130: 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e  ereOrInfo *pOrIn
8140: 66 6f 3b 20 20 20 20 20 2f 2a 20 41 64 64 69 74  fo;     /* Addit
8150: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
8160: 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  n associated wit
8170: 68 20 70 54 65 72 6d 20 2a 2f 0a 20 20 42 69 74  h pTerm */.  Bit
8180: 6d 61 73 6b 20 63 68 6e 67 54 6f 49 4e 3b 20 20  mask chngToIN;  
8190: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73         /* Tables
81a0: 20 74 68 61 74 20 6d 69 67 68 74 20 73 61 74 69   that might sati
81b0: 73 66 79 20 63 61 73 65 20 31 20 2a 2f 0a 20 20  sfy case 1 */.  
81c0: 42 69 74 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c  Bitmask indexabl
81d0: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  e;        /* Tab
81e0: 6c 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 64  les that are ind
81f0: 65 78 61 62 6c 65 2c 20 73 61 74 69 73 66 79 69  exable, satisfyi
8200: 6e 67 20 63 61 73 65 20 32 20 2a 2f 0a 0a 20 20  ng case 2 */..  
8210: 2f 2a 0a 20 20 2a 2a 20 42 72 65 61 6b 20 74 68  /*.  ** Break th
8220: 65 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f  e OR clause into
8230: 20 69 74 73 20 73 65 70 61 72 61 74 65 20 73 75   its separate su
8240: 62 74 65 72 6d 73 2e 20 20 54 68 65 20 73 75 62  bterms.  The sub
8250: 74 65 72 6d 73 20 61 72 65 0a 20 20 2a 2a 20 73  terms are.  ** s
8260: 74 6f 72 65 64 20 69 6e 20 61 20 57 68 65 72 65  tored in a Where
8270: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
8280: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 77 69 74 68   containing with
8290: 69 6e 20 74 68 65 20 57 68 65 72 65 4f 72 49 6e  in the WhereOrIn
82a0: 66 6f 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20 74  fo.  ** object t
82b0: 68 61 74 20 69 73 20 61 74 74 61 63 68 65 64 20  hat is attached 
82c0: 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
82d0: 4f 52 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a  OR clause term..
82e0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
82f0: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
8300: 20 28 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54   (TERM_DYNAMIC|T
8310: 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f  ERM_ORINFO|TERM_
8320: 41 4e 44 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a  ANDINFO))==0 );.
8330: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
8340: 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20  >op==TK_OR );.  
8350: 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
8360: 20 3d 20 70 4f 72 49 6e 66 6f 20 3d 20 73 71 6c   = pOrInfo = sql
8370: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
8380: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4f 72  (db, sizeof(*pOr
8390: 49 6e 66 6f 29 29 3b 0a 20 20 69 66 28 20 70 4f  Info));.  if( pO
83a0: 72 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72  rInfo==0 ) retur
83b0: 6e 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c  n;.  pTerm->wtFl
83c0: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e  ags |= TERM_ORIN
83d0: 46 4f 3b 0a 20 20 70 4f 72 57 63 20 3d 20 26 70  FO;.  pOrWc = &p
83e0: 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 77 68  OrInfo->wc;.  wh
83f0: 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70 4f  ereClauseInit(pO
8400: 72 57 63 2c 20 70 57 43 2d 3e 70 50 61 72 73 65  rWc, pWC->pParse
8410: 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70 57 43 2d  , pMaskSet, pWC-
8420: 3e 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20  >wctrlFlags);.  
8430: 77 68 65 72 65 53 70 6c 69 74 28 70 4f 72 57 63  whereSplit(pOrWc
8440: 2c 20 70 45 78 70 72 2c 20 54 4b 5f 4f 52 29 3b  , pExpr, TK_OR);
8450: 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c  .  exprAnalyzeAl
8460: 6c 28 70 53 72 63 2c 20 70 4f 72 57 63 29 3b 0a  l(pSrc, pOrWc);.
8470: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
8480: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
8490: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 57 63  .  assert( pOrWc
84a0: 2d 3e 6e 54 65 72 6d 3e 3d 32 20 29 3b 0a 0a 20  ->nTerm>=2 );.. 
84b0: 20 2f 2a 0a 20 20 2a 2a 20 43 6f 6d 70 75 74 65   /*.  ** Compute
84c0: 20 74 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c   the set of tabl
84d0: 65 73 20 74 68 61 74 20 6d 69 67 68 74 20 73 61  es that might sa
84e0: 74 69 73 66 79 20 63 61 73 65 73 20 31 20 6f 72  tisfy cases 1 or
84f0: 20 32 2e 0a 20 20 2a 2f 0a 20 20 69 6e 64 65 78   2..  */.  index
8500: 61 62 6c 65 20 3d 20 7e 28 42 69 74 6d 61 73 6b  able = ~(Bitmask
8510: 29 30 3b 0a 20 20 63 68 6e 67 54 6f 49 4e 20 3d  )0;.  chngToIN =
8520: 20 7e 28 70 57 43 2d 3e 76 6d 61 73 6b 29 3b 0a   ~(pWC->vmask);.
8530: 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e    for(i=pOrWc->n
8540: 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d  Term-1, pOrTerm=
8550: 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 20 26  pOrWc->a; i>=0 &
8560: 26 20 69 6e 64 65 78 61 62 6c 65 3b 20 69 2d 2d  & indexable; i--
8570: 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20  , pOrTerm++){.  
8580: 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e    if( (pOrTerm->
8590: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 53  eOperator & WO_S
85a0: 49 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20  INGLE)==0 ){.   
85b0: 20 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20     WhereAndInfo 
85c0: 2a 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20  *pAndInfo;.     
85d0: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
85e0: 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 30 20 29  ->eOperator==0 )
85f0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8600: 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67  (pOrTerm->wtFlag
8610: 73 20 26 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46  s & (TERM_ANDINF
8620: 4f 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d  O|TERM_ORINFO))=
8630: 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 68 6e 67  =0 );.      chng
8640: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20  ToIN = 0;.      
8650: 70 41 6e 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pAndInfo = sqlit
8660: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
8670: 2c 20 73 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e  , sizeof(*pAndIn
8680: 66 6f 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  fo));.      if( 
8690: 70 41 6e 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pAndInfo ){.    
86a0: 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
86b0: 2a 70 41 6e 64 57 43 3b 0a 20 20 20 20 20 20 20  *pAndWC;.       
86c0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 41 6e 64   WhereTerm *pAnd
86d0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e  Term;.        in
86e0: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 42 69 74  t j;.        Bit
86f0: 6d 61 73 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20  mask b = 0;.    
8700: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70      pOrTerm->u.p
8710: 41 6e 64 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e  AndInfo = pAndIn
8720: 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54  fo;.        pOrT
8730: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
8740: 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20  TERM_ANDINFO;.  
8750: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65        pOrTerm->e
8760: 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e  Operator = WO_AN
8770: 44 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57  D;.        pAndW
8780: 43 20 3d 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77  C = &pAndInfo->w
8790: 63 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  c;.        where
87a0: 43 6c 61 75 73 65 49 6e 69 74 28 70 41 6e 64 57  ClauseInit(pAndW
87b0: 43 2c 20 70 57 43 2d 3e 70 50 61 72 73 65 2c 20  C, pWC->pParse, 
87c0: 70 4d 61 73 6b 53 65 74 2c 20 70 57 43 2d 3e 77  pMaskSet, pWC->w
87d0: 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20  ctrlFlags);.    
87e0: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70      whereSplit(p
87f0: 41 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e  AndWC, pOrTerm->
8800: 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a  pExpr, TK_AND);.
8810: 20 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c          exprAnal
8820: 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e  yzeAll(pSrc, pAn
8830: 64 57 43 29 3b 0a 20 20 20 20 20 20 20 20 70 41  dWC);.        pA
8840: 6e 64 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20 70  ndWC->pOuter = p
8850: 57 43 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  WC;.        test
8860: 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  case( db->malloc
8870: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
8880: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
8890: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
88a0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41       for(j=0, pA
88b0: 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61  ndTerm=pAndWC->a
88c0: 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72  ; j<pAndWC->nTer
88d0: 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d  m; j++, pAndTerm
88e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
88f0: 20 61 73 73 65 72 74 28 20 70 41 6e 64 54 65 72   assert( pAndTer
8900: 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20  m->pExpr );.    
8910: 20 20 20 20 20 20 20 20 69 66 28 20 61 6c 6c 6f          if( allo
8920: 77 65 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e  wedOp(pAndTerm->
8930: 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20  pExpr->op) ){.  
8940: 20 20 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d              b |=
8950: 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
8960: 74 2c 20 70 41 6e 64 54 65 72 6d 2d 3e 6c 65 66  t, pAndTerm->lef
8970: 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  tCursor);.      
8980: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8990: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
89a0: 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20        indexable 
89b0: 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20  &= b;.      }.  
89c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54    }else if( pOrT
89d0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
89e0: 45 52 4d 5f 43 4f 50 49 45 44 20 29 7b 0a 20 20  ERM_COPIED ){.  
89f0: 20 20 20 20 2f 2a 20 53 6b 69 70 20 74 68 69 73      /* Skip this
8a00: 20 74 65 72 6d 20 66 6f 72 20 6e 6f 77 2e 20 20   term for now.  
8a10: 57 65 20 72 65 76 69 73 69 74 20 69 74 20 77 68  We revisit it wh
8a20: 65 6e 20 77 65 20 70 72 6f 63 65 73 73 20 74 68  en we process th
8a30: 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65  e.      ** corre
8a40: 73 70 6f 6e 64 69 6e 67 20 54 45 52 4d 5f 56 49  sponding TERM_VI
8a50: 52 54 55 41 4c 20 74 65 72 6d 20 2a 2f 0a 20 20  RTUAL term */.  
8a60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42    }else{.      B
8a70: 69 74 6d 61 73 6b 20 62 3b 0a 20 20 20 20 20 20  itmask b;.      
8a80: 62 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73  b = getMask(pMas
8a90: 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c  kSet, pOrTerm->l
8aa0: 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  eftCursor);.    
8ab0: 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77    if( pOrTerm->w
8ac0: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
8ad0: 52 54 55 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  RTUAL ){.       
8ae0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68   WhereTerm *pOth
8af0: 65 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 70  er = &pOrWc->a[p
8b00: 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d  OrTerm->iParent]
8b10: 3b 0a 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67  ;.        b |= g
8b20: 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
8b30: 20 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75 72   pOther->leftCur
8b40: 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  sor);.      }.  
8b50: 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d      indexable &=
8b60: 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   b;.      if( pO
8b70: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
8b80: 21 3d 57 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20  !=WO_EQ ){.     
8b90: 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b     chngToIN = 0;
8ba0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8bb0: 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 26        chngToIN &
8bc0: 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = b;.      }.   
8bd0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a   }.  }..  /*.  *
8be0: 2a 20 52 65 63 6f 72 64 20 74 68 65 20 73 65 74  * Record the set
8bf0: 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20   of tables that 
8c00: 73 61 74 69 73 66 79 20 63 61 73 65 20 32 2e 20  satisfy case 2. 
8c10: 20 54 68 65 20 73 65 74 20 6d 69 67 68 74 20 62   The set might b
8c20: 65 0a 20 20 2a 2a 20 65 6d 70 74 79 2e 0a 20 20  e.  ** empty..  
8c30: 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e 69 6e  */.  pOrInfo->in
8c40: 64 65 78 61 62 6c 65 20 3d 20 69 6e 64 65 78 61  dexable = indexa
8c50: 62 6c 65 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f  ble;.  pTerm->eO
8c60: 70 65 72 61 74 6f 72 20 3d 20 69 6e 64 65 78 61  perator = indexa
8c70: 62 6c 65 3d 3d 30 20 3f 20 30 20 3a 20 57 4f 5f  ble==0 ? 0 : WO_
8c80: 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63  OR;..  /*.  ** c
8c90: 68 6e 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61 20  hngToIN holds a 
8ca0: 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68  set of tables th
8cb0: 61 74 20 2a 6d 69 67 68 74 2a 20 73 61 74 69 73  at *might* satis
8cc0: 66 79 20 63 61 73 65 20 31 2e 20 20 42 75 74 0a  fy case 1.  But.
8cd0: 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20    ** we have to 
8ce0: 64 6f 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  do some addition
8cf0: 61 6c 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 73  al checking to s
8d00: 65 65 20 69 66 20 63 61 73 65 20 31 20 72 65 61  ee if case 1 rea
8d10: 6c 6c 79 0a 20 20 2a 2a 20 69 73 20 73 61 74 69  lly.  ** is sati
8d20: 73 66 69 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  sfied..  **.  **
8d30: 20 63 68 6e 67 54 6f 49 4e 20 77 69 6c 6c 20 68   chngToIN will h
8d40: 6f 6c 64 20 65 69 74 68 65 72 20 30 2c 20 31 2c  old either 0, 1,
8d50: 20 6f 72 20 32 20 62 69 74 73 2e 20 20 54 68 65   or 2 bits.  The
8d60: 20 30 2d 62 69 74 20 63 61 73 65 20 6d 65 61 6e   0-bit case mean
8d70: 73 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 72  s.  ** that ther
8d80: 65 20 69 73 20 6e 6f 20 70 6f 73 73 69 62 69 6c  e is no possibil
8d90: 69 74 79 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d  ity of transform
8da0: 69 6e 67 20 74 68 65 20 4f 52 20 63 6c 61 75 73  ing the OR claus
8db0: 65 20 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20 49  e into an.  ** I
8dc0: 4e 20 6f 70 65 72 61 74 6f 72 20 62 65 63 61 75  N operator becau
8dd0: 73 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74  se one or more t
8de0: 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 20 63  erms in the OR c
8df0: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 0a 20 20  lause contain.  
8e00: 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  ** something oth
8e10: 65 72 20 74 68 61 6e 20 3d 3d 20 6f 6e 20 61 20  er than == on a 
8e20: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73 69  column in the si
8e30: 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65  ngle table.  The
8e40: 20 31 2d 62 69 74 0a 20 20 2a 2a 20 63 61 73 65   1-bit.  ** case
8e50: 20 6d 65 61 6e 73 20 74 68 61 74 20 65 76 65 72   means that ever
8e60: 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  y term of the OR
8e70: 20 63 6c 61 75 73 65 20 69 73 20 6f 66 20 74 68   clause is of th
8e80: 65 20 66 6f 72 6d 0a 20 20 2a 2a 20 22 74 61 62  e form.  ** "tab
8e90: 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72 22 20  le.column=expr" 
8ea0: 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20  for some single 
8eb0: 74 61 62 6c 65 2e 20 20 54 68 65 20 6f 6e 65 20  table.  The one 
8ec0: 62 69 74 20 74 68 61 74 20 69 73 20 73 65 74 0a  bit that is set.
8ed0: 20 20 2a 2a 20 77 69 6c 6c 20 63 6f 72 72 65 73    ** will corres
8ee0: 70 6f 6e 64 20 74 6f 20 74 68 65 20 63 6f 6d 6d  pond to the comm
8ef0: 6f 6e 20 74 61 62 6c 65 2e 20 20 57 65 20 73 74  on table.  We st
8f00: 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 65 63  ill need to chec
8f10: 6b 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 73  k to make.  ** s
8f20: 75 72 65 20 74 68 65 20 73 61 6d 65 20 63 6f 6c  ure the same col
8f30: 75 6d 6e 20 69 73 20 75 73 65 64 20 6f 6e 20 61  umn is used on a
8f40: 6c 6c 20 74 65 72 6d 73 2e 20 20 54 68 65 20 32  ll terms.  The 2
8f50: 2d 62 69 74 20 63 61 73 65 20 69 73 20 77 68 65  -bit case is whe
8f60: 6e 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 20 74  n.  ** the all t
8f70: 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20  erms are of the 
8f80: 66 6f 72 6d 20 22 74 61 62 6c 65 31 2e 63 6f 6c  form "table1.col
8f90: 75 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c 75 6d  umn=table2.colum
8fa0: 6e 22 2e 20 20 49 74 0a 20 20 2a 2a 20 6d 69 67  n".  It.  ** mig
8fb0: 68 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ht be possible t
8fc0: 6f 20 66 6f 72 6d 20 61 6e 20 49 4e 20 6f 70 65  o form an IN ope
8fd0: 72 61 74 6f 72 20 77 69 74 68 20 65 69 74 68 65  rator with eithe
8fe0: 72 20 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 0a  r table1.column.
8ff0: 20 20 2a 2a 20 6f 72 20 74 61 62 6c 65 32 2e 63    ** or table2.c
9000: 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 4c 48 53  olumn as the LHS
9010: 20 69 66 20 65 69 74 68 65 72 20 69 73 20 63 6f   if either is co
9020: 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65  mmon to every te
9030: 72 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 4f  rm of.  ** the O
9040: 52 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20  R clause..  **. 
9050: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 65   ** Note that te
9060: 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rms of the form 
9070: 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d 74  "table.column1=t
9080: 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20 28 74  able.column2" (t
9090: 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61 62  he.  ** same tab
90a0: 6c 65 20 6f 6e 20 62 6f 74 68 20 73 69 7a 65 73  le on both sizes
90b0: 20 6f 66 20 74 68 65 20 3d 3d 29 20 63 61 6e 6e   of the ==) cann
90c0: 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 2e  ot be optimized.
90d0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e 67  .  */.  if( chng
90e0: 54 6f 49 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20  ToIN ){.    int 
90f0: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30  okToChngToIN = 0
9100: 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ;     /* True if
9110: 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20   the conversion 
9120: 74 6f 20 49 4e 20 69 73 20 76 61 6c 69 64 20 2a  to IN is valid *
9130: 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d  /.    int iColum
9140: 6e 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  n = -1;         
9150: 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78 20  /* Column index 
9160: 6f 6e 20 6c 68 73 20 6f 66 20 49 4e 20 6f 70 65  on lhs of IN ope
9170: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74  rator */.    int
9180: 20 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 20 20   iCursor = -1;  
9190: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
91a0: 63 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74 6f  cursor common to
91b0: 20 61 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a 20 20   all terms */.  
91c0: 20 20 69 6e 74 20 6a 20 3d 20 30 3b 20 20 20 20    int j = 0;    
91d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
91e0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
91f0: 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
9200: 72 20 61 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  r a table and co
9210: 6c 75 6d 6e 20 74 68 61 74 20 61 70 70 65 61 72  lumn that appear
9220: 73 20 6f 6e 20 6f 6e 65 20 73 69 64 65 20 6f 72  s on one side or
9230: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65   the.    ** othe
9240: 72 20 6f 66 20 74 68 65 20 3d 3d 20 6f 70 65 72  r of the == oper
9250: 61 74 6f 72 20 69 6e 20 65 76 65 72 79 20 73 75  ator in every su
9260: 62 74 65 72 6d 2e 20 20 54 68 61 74 20 74 61 62  bterm.  That tab
9270: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20 20  le and column.  
9280: 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 63    ** will be rec
9290: 6f 72 64 65 64 20 69 6e 20 69 43 75 72 73 6f 72  orded in iCursor
92a0: 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20 20 54   and iColumn.  T
92b0: 68 65 72 65 20 6d 69 67 68 74 20 6e 6f 74 20 62  here might not b
92c0: 65 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63  e any.    ** suc
92d0: 68 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  h table and colu
92e0: 6d 6e 2e 20 20 53 65 74 20 6f 6b 54 6f 43 68 6e  mn.  Set okToChn
92f0: 67 54 6f 49 4e 20 69 66 20 61 6e 20 61 70 70 72  gToIN if an appr
9300: 6f 70 72 69 61 74 65 20 74 61 62 6c 65 0a 20 20  opriate table.  
9310: 20 20 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 20    ** and column 
9320: 69 73 20 66 6f 75 6e 64 20 62 75 74 20 6c 65 61  is found but lea
9330: 76 65 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  ve okToChngToIN 
9340: 66 61 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f 75  false if not fou
9350: 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  nd..    */.    f
9360: 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20 26 26 20 21  or(j=0; j<2 && !
9370: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a 2b  okToChngToIN; j+
9380: 2b 29 7b 0a 20 20 20 20 20 20 70 4f 72 54 65 72  +){.      pOrTer
9390: 6d 20 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a 20 20  m = pOrWc->a;.  
93a0: 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d      for(i=pOrWc-
93b0: 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20  >nTerm-1; i>=0; 
93c0: 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  i--, pOrTerm++){
93d0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
93e0: 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61   pOrTerm->eOpera
93f0: 74 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20  tor==WO_EQ );.  
9400: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77        pOrTerm->w
9410: 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f  tFlags &= ~TERM_
9420: 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69  OR_OK;.        i
9430: 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  f( pOrTerm->left
9440: 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20  Cursor==iCursor 
9450: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
9460: 54 68 69 73 20 69 73 20 74 68 65 20 32 2d 62 69  This is the 2-bi
9470: 74 20 63 61 73 65 20 61 6e 64 20 77 65 20 61 72  t case and we ar
9480: 65 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  e on the second 
9490: 69 74 65 72 61 74 69 6f 6e 20 61 6e 64 0a 20 20  iteration and.  
94a0: 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65          ** curre
94b0: 6e 74 20 74 65 72 6d 20 69 73 20 66 72 6f 6d 20  nt term is from 
94c0: 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74  the first iterat
94d0: 69 6f 6e 2e 20 20 53 6f 20 73 6b 69 70 20 74 68  ion.  So skip th
94e0: 69 73 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  is term. */.    
94f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d        assert( j=
9500: 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =1 );.          
9510: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
9520: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
9530: 28 63 68 6e 67 54 6f 49 4e 20 26 20 67 65 74 4d  (chngToIN & getM
9540: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 4f  ask(pMaskSet, pO
9550: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
9560: 72 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r))==0 ){.      
9570: 20 20 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d      /* This term
9580: 20 6d 75 73 74 20 62 65 20 6f 66 20 74 68 65 20   must be of the 
9590: 66 6f 72 6d 20 74 31 2e 61 3d 3d 74 32 2e 62 20  form t1.a==t2.b 
95a0: 77 68 65 72 65 20 74 32 20 69 73 20 69 6e 20 74  where t2 is in t
95b0: 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
95c0: 63 68 6e 67 54 6f 49 4e 20 73 65 74 20 62 75 74  chngToIN set but
95d0: 20 74 31 20 69 73 20 6e 6f 74 2e 20 20 54 68 69   t1 is not.  Thi
95e0: 73 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 65  s term will be e
95f0: 69 74 68 65 72 20 70 72 65 63 65 65 64 65 64 0a  ither preceeded.
9600: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
9610: 66 6f 6c 6c 77 65 64 20 62 79 20 61 6e 20 69 6e  follwed by an in
9620: 76 65 72 74 65 64 20 63 6f 70 79 20 28 74 32 2e  verted copy (t2.
9630: 62 3d 3d 74 31 2e 61 29 2e 20 20 53 6b 69 70 20  b==t1.a).  Skip 
9640: 74 68 69 73 20 74 65 72 6d 20 0a 20 20 20 20 20  this term .     
9650: 20 20 20 20 20 2a 2a 20 61 6e 64 20 75 73 65 20       ** and use 
9660: 69 74 73 20 69 6e 76 65 72 73 69 6f 6e 2e 20 2a  its inversion. *
9670: 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
9680: 63 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77  case( pOrTerm->w
9690: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  tFlags & TERM_CO
96a0: 50 49 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20  PIED );.        
96b0: 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 72 54    testcase( pOrT
96c0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
96d0: 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20  ERM_VIRTUAL );. 
96e0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
96f0: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
9700: 73 20 26 20 28 54 45 52 4d 5f 43 4f 50 49 45 44  s & (TERM_COPIED
9710: 7c 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 20 29  |TERM_VIRTUAL) )
9720: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
9730: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
9740: 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20          iColumn 
9750: 3d 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66  = pOrTerm->u.lef
9760: 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  tColumn;.       
9770: 20 69 43 75 72 73 6f 72 20 3d 20 70 4f 72 54 65   iCursor = pOrTe
9780: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3b 0a  rm->leftCursor;.
9790: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
97a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
97b0: 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   i<0 ){.        
97c0: 2f 2a 20 4e 6f 20 63 61 6e 64 69 64 61 74 65 20  /* No candidate 
97d0: 74 61 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61 73  table+column was
97e0: 20 66 6f 75 6e 64 2e 20 20 54 68 69 73 20 63 61   found.  This ca
97f0: 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 0a 20 20 20  n only occur.   
9800: 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73       ** on the s
9810: 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20  econd iteration 
9820: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
9830: 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20  t( j==1 );.     
9840: 20 20 20 61 73 73 65 72 74 28 20 28 63 68 6e 67     assert( (chng
9850: 54 6f 49 4e 26 28 63 68 6e 67 54 6f 49 4e 2d 31  ToIN&(chngToIN-1
9860: 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ))==0 );.       
9870: 20 61 73 73 65 72 74 28 20 63 68 6e 67 54 6f 49   assert( chngToI
9880: 4e 3d 3d 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b  N==getMask(pMask
9890: 53 65 74 2c 20 69 43 75 72 73 6f 72 29 20 29 3b  Set, iCursor) );
98a0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
98b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
98c0: 73 74 63 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a  stcase( j==1 );.
98d0: 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76  .      /* We hav
98e0: 65 20 66 6f 75 6e 64 20 61 20 63 61 6e 64 69 64  e found a candid
98f0: 61 74 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  ate table and co
9900: 6c 75 6d 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20  lumn.  Check to 
9910: 73 65 65 20 69 66 20 74 68 61 74 0a 20 20 20 20  see if that.    
9920: 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 63    ** table and c
9930: 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20  olumn is common 
9940: 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  to every term in
9950: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 2a   the OR clause *
9960: 2f 0a 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67  /.      okToChng
9970: 54 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20  ToIN = 1;.      
9980: 66 6f 72 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b  for(; i>=0 && ok
9990: 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c  ToChngToIN; i--,
99a0: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
99b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
99c0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  Term->eOperator=
99d0: 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20  =WO_EQ );.      
99e0: 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c    if( pOrTerm->l
99f0: 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 73  eftCursor!=iCurs
9a00: 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
9a10: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
9a20: 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b   &= ~TERM_OR_OK;
9a30: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
9a40: 66 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65  f( pOrTerm->u.le
9a50: 66 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d  ftColumn!=iColum
9a60: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  n ){.          o
9a70: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b  kToChngToIN = 0;
9a80: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
9a90: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 66            int af
9aa0: 66 4c 65 66 74 2c 20 61 66 66 52 69 67 68 74 3b  fLeft, affRight;
9ab0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
9ac0: 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
9ad0: 73 69 64 65 20 69 73 20 61 6c 73 6f 20 61 20 63  side is also a c
9ae0: 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20  olumn, then the 
9af0: 61 66 66 69 6e 69 74 69 65 73 0a 20 20 20 20 20  affinities.     
9b00: 20 20 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68 20       ** of both 
9b10: 72 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73  right and left s
9b20: 69 64 65 73 20 6d 75 73 74 20 62 65 20 73 75 63  ides must be suc
9b30: 68 20 74 68 61 74 20 6e 6f 20 74 79 70 65 0a 20  h that no type. 
9b40: 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 76           ** conv
9b50: 65 72 73 69 6f 6e 73 20 61 72 65 20 72 65 71 75  ersions are requ
9b60: 69 72 65 64 20 6f 6e 20 74 68 65 20 72 69 67 68  ired on the righ
9b70: 74 2e 20 20 28 54 69 63 6b 65 74 20 23 32 32 34  t.  (Ticket #224
9b80: 39 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  9).          */.
9b90: 20 20 20 20 20 20 20 20 20 20 61 66 66 52 69 67            affRig
9ba0: 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
9bb0: 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d  Affinity(pOrTerm
9bc0: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  ->pExpr->pRight)
9bd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 4c  ;.          affL
9be0: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
9bf0: 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72  rAffinity(pOrTer
9c00: 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  m->pExpr->pLeft)
9c10: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
9c20: 61 66 66 52 69 67 68 74 21 3d 30 20 26 26 20 61  affRight!=0 && a
9c30: 66 66 52 69 67 68 74 21 3d 61 66 66 4c 65 66 74  ffRight!=affLeft
9c40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
9c50: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30  okToChngToIN = 0
9c60: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
9c70: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
9c80: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
9c90: 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20  |= TERM_OR_OK;. 
9ca0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
9cb0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
9cc0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68   }..    /* At th
9cd0: 69 73 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43 68  is point, okToCh
9ce0: 6e 67 54 6f 49 4e 20 69 73 20 74 72 75 65 20 69  ngToIN is true i
9cf0: 66 20 6f 72 69 67 69 6e 61 6c 20 70 54 65 72 6d  f original pTerm
9d00: 20 73 61 74 69 73 66 69 65 73 0a 20 20 20 20 2a   satisfies.    *
9d10: 2a 20 63 61 73 65 20 31 2e 20 20 49 6e 20 74 68  * case 1.  In th
9d20: 61 74 20 63 61 73 65 2c 20 63 6f 6e 73 74 72 75  at case, constru
9d30: 63 74 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  ct a new virtual
9d40: 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 0a 20   term that is . 
9d50: 20 20 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e 76     ** pTerm conv
9d60: 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 49 4e  erted into an IN
9d70: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a   operator..    *
9d80: 2a 0a 20 20 20 20 2a 2a 20 45 56 3a 20 52 2d 30  *.    ** EV: R-0
9d90: 30 32 31 31 2d 31 35 31 30 30 0a 20 20 20 20 2a  0211-15100.    *
9da0: 2f 0a 20 20 20 20 69 66 28 20 6f 6b 54 6f 43 68  /.    if( okToCh
9db0: 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20 20  ngToIN ){.      
9dc0: 45 78 70 72 20 2a 70 44 75 70 3b 20 20 20 20 20  Expr *pDup;     
9dd0: 20 20 20 20 20 20 20 2f 2a 20 41 20 74 72 61 6e         /* A tran
9de0: 73 69 65 6e 74 20 64 75 70 6c 69 63 61 74 65 20  sient duplicate 
9df0: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
9e00: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
9e10: 69 73 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68  ist = 0;   /* Th
9e20: 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
9e30: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
9e40: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
9e50: 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  0;       /* The 
9e60: 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  LHS of the IN op
9e70: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
9e80: 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20  Expr *pNew;     
9e90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
9ea0: 6d 70 6c 65 74 65 20 49 4e 20 6f 70 65 72 61 74  mplete IN operat
9eb0: 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72  or */..      for
9ec0: 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d  (i=pOrWc->nTerm-
9ed0: 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63  1, pOrTerm=pOrWc
9ee0: 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  ->a; i>=0; i--, 
9ef0: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
9f00: 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
9f10: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
9f20: 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e  _OR_OK)==0 ) con
9f30: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61  tinue;.        a
9f40: 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e  ssert( pOrTerm->
9f50: 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51  eOperator==WO_EQ
9f60: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
9f70: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  rt( pOrTerm->lef
9f80: 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72  tCursor==iCursor
9f90: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
9fa0: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c  rt( pOrTerm->u.l
9fb0: 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  eftColumn==iColu
9fc0: 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44  mn );.        pD
9fd0: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
9fe0: 44 75 70 28 64 62 2c 20 70 4f 72 54 65 72 6d 2d  Dup(db, pOrTerm-
9ff0: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  >pExpr->pRight, 
a000: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73  0);.        pLis
a010: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
a020: 69 73 74 41 70 70 65 6e 64 28 70 57 43 2d 3e 70  istAppend(pWC->p
a030: 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 44  Parse, pList, pD
a040: 75 70 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65  up);.        pLe
a050: 66 74 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45  ft = pOrTerm->pE
a060: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
a070: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
a080: 28 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20  ( pLeft!=0 );.  
a090: 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74      pDup = sqlit
a0a0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c  e3ExprDup(db, pL
a0b0: 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  eft, 0);.      p
a0c0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50 45 78  New = sqlite3PEx
a0d0: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e  pr(pParse, TK_IN
a0e0: 2c 20 70 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20  , pDup, 0, 0);. 
a0f0: 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b       if( pNew ){
a100: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78  .        int idx
a110: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 74 72 61  New;.        tra
a120: 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67  nsferJoinMarking
a130: 73 28 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a  s(pNew, pExpr);.
a140: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a150: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
a160: 28 70 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c  (pNew, EP_xIsSel
a170: 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ect) );.        
a180: 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20  pNew->x.pList = 
a190: 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69  pList;.        i
a1a0: 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61  dxNew = whereCla
a1b0: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
a1c0: 4e 65 77 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  New, TERM_VIRTUA
a1d0: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
a1e0: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
a1f0: 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a  e( idxNew==0 );.
a200: 20 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c          exprAnal
a210: 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69  yze(pSrc, pWC, i
a220: 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20  dxNew);.        
a230: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
a240: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  idxTerm];.      
a250: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d    pWC->a[idxNew]
a260: 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
a270: 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  rm;.        pTer
a280: 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20  m->nChild = 1;. 
a290: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a2a0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
a2b0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
a2c0: 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ist);.      }.  
a2d0: 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72      pTerm->eOper
a2e0: 61 74 6f 72 20 3d 20 57 4f 5f 4e 4f 4f 50 3b 20  ator = WO_NOOP; 
a2f0: 20 2f 2a 20 63 61 73 65 20 31 20 74 72 75 6d 70   /* case 1 trump
a300: 73 20 63 61 73 65 20 32 20 2a 2f 0a 20 20 20 20  s case 2 */.    
a310: 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  }.  }.}.#endif /
a320: 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  * !SQLITE_OMIT_O
a330: 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 26  R_OPTIMIZATION &
a340: 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  & !SQLITE_OMIT_S
a350: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 2f 2a 0a  UBQUERY */.../*.
a360: 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 74 6f 20  ** The input to 
a370: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
a380: 61 6e 20 57 68 65 72 65 54 65 72 6d 20 73 74 72  an WhereTerm str
a390: 75 63 74 75 72 65 20 77 69 74 68 20 6f 6e 6c 79  ucture with only
a3a0: 20 74 68 65 0a 2a 2a 20 22 70 45 78 70 72 22 20   the.** "pExpr" 
a3b0: 66 69 65 6c 64 20 66 69 6c 6c 65 64 20 69 6e 2e  field filled in.
a3c0: 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69    The job of thi
a3d0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20  s routine is to 
a3e0: 61 6e 61 6c 79 7a 65 20 74 68 65 0a 2a 2a 20 73  analyze the.** s
a3f0: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  ubexpression and
a400: 20 70 6f 70 75 6c 61 74 65 20 61 6c 6c 20 74 68   populate all th
a410: 65 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f  e other fields o
a420: 66 20 74 68 65 20 57 68 65 72 65 54 65 72 6d 0a  f the WhereTerm.
a430: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ** structure..**
a440: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
a450: 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ssion is of the 
a460: 66 6f 72 6d 20 22 3c 65 78 70 72 3e 20 3c 6f 70  form "<expr> <op
a470: 3e 20 58 22 20 69 74 20 67 65 74 73 20 63 6f 6d  > X" it gets com
a480: 6d 75 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  muted.** to the 
a490: 73 74 61 6e 64 61 72 64 20 66 6f 72 6d 20 6f 66  standard form of
a4a0: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
a4b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
a4c0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20  xpression is of 
a4d0: 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e  the form "X <op>
a4e0: 20 59 22 20 77 68 65 72 65 20 62 6f 74 68 20 58   Y" where both X
a4f0: 20 61 6e 64 20 59 20 61 72 65 0a 2a 2a 20 63 6f   and Y are.** co
a500: 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 74 68 65 20  lumns, then the 
a510: 6f 72 69 67 69 6e 61 6c 20 65 78 70 72 65 73 73  original express
a520: 69 6f 6e 20 69 73 20 75 6e 63 68 61 6e 67 65 64  ion is unchanged
a530: 20 61 6e 64 20 61 20 6e 65 77 20 76 69 72 74 75   and a new virtu
a540: 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f 66 20 74 68  al.** term of th
a550: 65 20 66 6f 72 6d 20 22 59 20 3c 6f 70 3e 20 58  e form "Y <op> X
a560: 22 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  " is added to th
a570: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61  e WHERE clause a
a580: 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 73  nd.** analyzed s
a590: 65 70 61 72 61 74 65 6c 79 2e 20 20 54 68 65 20  eparately.  The 
a5a0: 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 20 69 73  original term is
a5b0: 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54 45 52   marked with TER
a5c0: 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20 61 6e 64 20  M_COPIED.** and 
a5d0: 74 68 65 20 6e 65 77 20 74 65 72 6d 20 69 73 20  the new term is 
a5e0: 6d 61 72 6b 65 64 20 77 69 74 68 20 54 45 52 4d  marked with TERM
a5f0: 5f 44 59 4e 41 4d 49 43 20 28 62 65 63 61 75 73  _DYNAMIC (becaus
a600: 65 20 69 74 27 73 20 70 45 78 70 72 0a 2a 2a 20  e it's pExpr.** 
a610: 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65  needs to be free
a620: 64 20 77 69 74 68 20 74 68 65 20 57 68 65 72 65  d with the Where
a630: 43 6c 61 75 73 65 29 20 61 6e 64 20 54 45 52 4d  Clause) and TERM
a640: 5f 56 49 52 54 55 41 4c 20 28 62 65 63 61 75 73  _VIRTUAL (becaus
a650: 65 20 69 74 0a 2a 2a 20 69 73 20 61 20 63 6f 6d  e it.** is a com
a660: 6d 75 74 65 64 20 63 6f 70 79 20 6f 66 20 61 20  muted copy of a 
a670: 70 72 69 6f 72 20 74 65 72 6d 2e 29 20 20 54 68  prior term.)  Th
a680: 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 20  e original term 
a690: 68 61 73 20 6e 43 68 69 6c 64 3d 31 0a 2a 2a 20  has nChild=1.** 
a6a0: 61 6e 64 20 74 68 65 20 63 6f 70 79 20 68 61 73  and the copy has
a6b0: 20 69 64 78 50 61 72 65 6e 74 20 73 65 74 20 74   idxParent set t
a6c0: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
a6d0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d  he original term
a6e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a6f0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 0a 20 20   exprAnalyze(.  
a700: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
a710: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65            /* the
a720: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
a730: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
a740: 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  WC,         /* t
a750: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
a760: 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d  */.  int idxTerm
a770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a780: 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74  * Index of the t
a790: 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  erm to be analyz
a7a0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  ed */.){.  Where
a7b0: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a7d0: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  he term to be an
a7e0: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72  alyzed */.  Wher
a7f0: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
a800: 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et;          /* 
a810: 53 65 74 20 6f 66 20 74 61 62 6c 65 20 69 6e 64  Set of table ind
a820: 65 78 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78  ex masks */.  Ex
a830: 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20  pr *pExpr;      
a840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a850: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
a860: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
a870: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
a880: 72 65 71 4c 65 66 74 3b 20 20 20 20 20 20 20 20  reqLeft;        
a890: 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75        /* Prerequ
a8a0: 65 73 69 74 65 73 20 6f 66 20 74 68 65 20 70 45  esites of the pE
a8b0: 78 70 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20  xpr->pLeft */.  
a8c0: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c  Bitmask prereqAl
a8d0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
a8e0: 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74 65   /* Prerequesite
a8f0: 73 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20  s of pExpr */.  
a900: 42 69 74 6d 61 73 6b 20 65 78 74 72 61 52 69 67  Bitmask extraRig
a910: 68 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ht = 0;         
a920: 20 2f 2a 20 45 78 74 72 61 20 64 65 70 65 6e 64   /* Extra depend
a930: 65 6e 63 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a  encies on LEFT J
a940: 4f 49 4e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  OIN */.  Expr *p
a950: 53 74 72 31 20 3d 20 30 3b 20 20 20 20 20 20 20  Str1 = 0;       
a960: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53            /* RHS
a970: 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70   of LIKE/GLOB op
a980: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
a990: 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20  isComplete = 0; 
a9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a9b0: 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42  RHS of LIKE/GLOB
a9c0: 20 65 6e 64 73 20 77 69 74 68 20 77 69 6c 64 63   ends with wildc
a9d0: 61 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43  ard */.  int noC
a9e0: 61 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ase = 0;        
a9f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b            /* LIK
aa00: 45 2f 47 4c 4f 42 20 64 69 73 74 69 6e 67 75 69  E/GLOB distingui
aa10: 73 68 65 73 20 63 61 73 65 20 2a 2f 0a 20 20 69  shes case */.  i
aa20: 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
aa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa40: 2f 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65  /* Top-level ope
aa50: 72 61 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f  rator.  pExpr->o
aa60: 70 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  p */.  Parse *pP
aa70: 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72  arse = pWC->pPar
aa80: 73 65 3b 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se;     /* Parsi
aa90: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
aaa0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
aab0: 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
aac0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
aad0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66  nection */..  if
aae0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
aaf0: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
ab00: 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20  ;.  }.  pTerm = 
ab10: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
ab20: 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 70  ;.  pMaskSet = p
ab30: 57 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a 20 20  WC->pMaskSet;.  
ab40: 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
ab50: 45 78 70 72 3b 0a 20 20 70 72 65 72 65 71 4c 65  Expr;.  prereqLe
ab60: 66 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  ft = exprTableUs
ab70: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
ab80: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6f  xpr->pLeft);.  o
ab90: 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
aba0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29   if( op==TK_IN )
abb0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
abc0: 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
abd0: 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  ;.    if( ExprHa
abe0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
abf0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
ac00: 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70  {.      pTerm->p
ac10: 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70  rereqRight = exp
ac20: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
ac30: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
ac40: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  r->x.pSelect);. 
ac50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ac60: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
ac70: 68 74 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62  ht = exprListTab
ac80: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
ac90: 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
aca0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
acb0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55   if( op==TK_ISNU
acc0: 4c 4c 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d  LL ){.    pTerm-
acd0: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30  >prereqRight = 0
ace0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
acf0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
ad00: 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  t = exprTableUsa
ad10: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
ad20: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d  pr->pRight);.  }
ad30: 0a 20 20 70 72 65 72 65 71 41 6c 6c 20 3d 20 65  .  prereqAll = e
ad40: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
ad50: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 29 3b 0a  askSet, pExpr);.
ad60: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
ad70: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
ad80: 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
ad90: 20 42 69 74 6d 61 73 6b 20 78 20 3d 20 67 65 74   Bitmask x = get
ada0: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
adb0: 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Expr->iRightJoin
adc0: 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 72 65 72  Table);.    prer
add0: 65 71 41 6c 6c 20 7c 3d 20 78 3b 0a 20 20 20 20  eqAll |= x;.    
ade0: 65 78 74 72 61 52 69 67 68 74 20 3d 20 78 2d 31  extraRight = x-1
adf0: 3b 20 20 2f 2a 20 4f 4e 20 63 6c 61 75 73 65 20  ;  /* ON clause 
ae00: 74 65 72 6d 73 20 6d 61 79 20 6e 6f 74 20 62 65  terms may not be
ae10: 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e   used with an in
ae20: 64 65 78 0a 20 20 20 20 20 20 20 20 20 20 20 20  dex.            
ae30: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e             ** on
ae40: 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 61   left table of a
ae50: 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 54 69 63   LEFT JOIN.  Tic
ae60: 6b 65 74 20 23 33 30 31 35 20 2a 2f 0a 20 20 7d  ket #3015 */.  }
ae70: 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  .  pTerm->prereq
ae80: 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b  All = prereqAll;
ae90: 0a 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  .  pTerm->leftCu
aea0: 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 54 65  rsor = -1;.  pTe
aeb0: 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31  rm->iParent = -1
aec0: 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  ;.  pTerm->eOper
aed0: 61 74 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  ator = 0;.  if( 
aee0: 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 26 26  allowedOp(op) &&
aef0: 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
af00: 69 67 68 74 20 26 20 70 72 65 72 65 71 4c 65 66  ight & prereqLef
af10: 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78 70  t)==0 ){.    Exp
af20: 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
af30: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 45 78 70  ->pLeft;.    Exp
af40: 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70  r *pRight = pExp
af50: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 69  r->pRight;.    i
af60: 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  f( pLeft->op==TK
af70: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
af80: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
af90: 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62  or = pLeft->iTab
afa0: 6c 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  le;.      pTerm-
afb0: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20  >u.leftColumn = 
afc0: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pLeft->iColumn;.
afd0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70        pTerm->eOp
afe0: 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f  erator = operato
aff0: 72 4d 61 73 6b 28 6f 70 29 3b 0a 20 20 20 20 7d  rMask(op);.    }
b000: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 20  .    if( pRight 
b010: 26 26 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  && pRight->op==T
b020: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
b030: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65    WhereTerm *pNe
b040: 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  w;.      Expr *p
b050: 44 75 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Dup;.      if( p
b060: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
b070: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  >=0 ){.        i
b080: 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20  nt idxNew;.     
b090: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
b0a0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
b0b0: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
b0c0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
b0d0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
b0e0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
b0f0: 65 74 65 28 64 62 2c 20 70 44 75 70 29 3b 0a 20  ete(db, pDup);. 
b100: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b           return;
b110: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b120: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
b130: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
b140: 43 2c 20 70 44 75 70 2c 20 54 45 52 4d 5f 56 49  C, pDup, TERM_VI
b150: 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
b160: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  IC);.        if(
b170: 20 69 64 78 4e 65 77 3d 3d 30 20 29 20 72 65 74   idxNew==0 ) ret
b180: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  urn;.        pNe
b190: 77 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e  w = &pWC->a[idxN
b1a0: 65 77 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ew];.        pNe
b1b0: 77 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  w->iParent = idx
b1c0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54  Term;.        pT
b1d0: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
b1e0: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20  xTerm];.        
b1f0: 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20  pTerm->nChild = 
b200: 31 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  1;.        pTerm
b210: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
b220: 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20  M_COPIED;.      
b230: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
b240: 44 75 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  Dup = pExpr;.   
b250: 20 20 20 20 20 70 4e 65 77 20 3d 20 70 54 65 72       pNew = pTer
b260: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
b270: 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 70 50 61   exprCommute(pPa
b280: 72 73 65 2c 20 70 44 75 70 29 3b 0a 20 20 20 20  rse, pDup);.    
b290: 20 20 70 4c 65 66 74 20 3d 20 70 44 75 70 2d 3e    pLeft = pDup->
b2a0: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 4e 65  pLeft;.      pNe
b2b0: 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  w->leftCursor = 
b2c0: 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20  pLeft->iTable;. 
b2d0: 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 6c 65 66       pNew->u.lef
b2e0: 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d  tColumn = pLeft-
b2f0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
b300: 74 65 73 74 63 61 73 65 28 20 28 70 72 65 72 65  testcase( (prere
b310: 71 4c 65 66 74 20 7c 20 65 78 74 72 61 52 69 67  qLeft | extraRig
b320: 68 74 29 20 21 3d 20 70 72 65 72 65 71 4c 65 66  ht) != prereqLef
b330: 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  t );.      pNew-
b340: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 70  >prereqRight = p
b350: 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72  rereqLeft | extr
b360: 61 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70 4e  aRight;.      pN
b370: 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20  ew->prereqAll = 
b380: 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20  prereqAll;.     
b390: 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72   pNew->eOperator
b3a0: 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28   = operatorMask(
b3b0: 70 44 75 70 2d 3e 6f 70 29 3b 0a 20 20 20 20 7d  pDup->op);.    }
b3c0: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
b3d0: 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45  LITE_OMIT_BETWEE
b3e0: 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20  N_OPTIMIZATION. 
b3f0: 20 2f 2a 20 49 66 20 61 20 74 65 72 6d 20 69 73   /* If a term is
b400: 20 74 68 65 20 42 45 54 57 45 45 4e 20 6f 70 65   the BETWEEN ope
b410: 72 61 74 6f 72 2c 20 63 72 65 61 74 65 20 74 77  rator, create tw
b420: 6f 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65  o new virtual te
b430: 72 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20 64 65  rms.  ** that de
b440: 66 69 6e 65 20 74 68 65 20 72 61 6e 67 65 20 74  fine the range t
b450: 68 61 74 20 74 68 65 20 42 45 54 57 45 45 4e 20  hat the BETWEEN 
b460: 69 6d 70 6c 65 6d 65 6e 74 73 2e 20 20 46 6f 72  implements.  For
b470: 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   example:.  **. 
b480: 20 2a 2a 20 20 20 20 20 20 61 20 42 45 54 57 45   **      a BETWE
b490: 45 4e 20 62 20 41 4e 44 20 63 0a 20 20 2a 2a 0a  EN b AND c.  **.
b4a0: 20 20 2a 2a 20 69 73 20 63 6f 6e 76 65 72 74 65    ** is converte
b4b0: 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  d into:.  **.  *
b4c0: 2a 20 20 20 20 20 20 28 61 20 42 45 54 57 45 45  *      (a BETWEE
b4d0: 4e 20 62 20 41 4e 44 20 63 29 20 41 4e 44 20 28  N b AND c) AND (
b4e0: 61 3e 3d 62 29 20 41 4e 44 20 28 61 3c 3d 63 29  a>=b) AND (a<=c)
b4f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 74  .  **.  ** The t
b500: 77 6f 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65  wo new terms are
b510: 20 61 64 64 65 64 20 6f 6e 74 6f 20 74 68 65 20   added onto the 
b520: 65 6e 64 20 6f 66 20 74 68 65 20 57 68 65 72 65  end of the Where
b530: 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 2e 0a 20  Clause object.. 
b540: 20 2a 2a 20 54 68 65 20 6e 65 77 20 74 65 72 6d   ** The new term
b550: 73 20 61 72 65 20 22 64 79 6e 61 6d 69 63 22 20  s are "dynamic" 
b560: 61 6e 64 20 61 72 65 20 63 68 69 6c 64 72 65 6e  and are children
b570: 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
b580: 20 42 45 54 57 45 45 4e 0a 20 20 2a 2a 20 74 65   BETWEEN.  ** te
b590: 72 6d 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20  rm.  That means 
b5a0: 74 68 61 74 20 69 66 20 74 68 65 20 42 45 54 57  that if the BETW
b5b0: 45 45 4e 20 74 65 72 6d 20 69 73 20 63 6f 64 65  EEN term is code
b5c0: 64 2c 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20  d, the children 
b5d0: 61 72 65 0a 20 20 2a 2a 20 73 6b 69 70 70 65 64  are.  ** skipped
b5e0: 2e 20 20 4f 72 2c 20 69 66 20 74 68 65 20 63 68  .  Or, if the ch
b5f0: 69 6c 64 72 65 6e 20 61 72 65 20 73 61 74 69 73  ildren are satis
b600: 66 69 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78  fied by an index
b610: 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20  , the original. 
b620: 20 2a 2a 20 42 45 54 57 45 45 4e 20 74 65 72 6d   ** BETWEEN term
b630: 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a   is skipped..  *
b640: 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78  /.  else if( pEx
b650: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45  pr->op==TK_BETWE
b660: 45 4e 20 26 26 20 70 57 43 2d 3e 6f 70 3d 3d 54  EN && pWC->op==T
b670: 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 45 78 70  K_AND ){.    Exp
b680: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
b690: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
b6a0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74     int i;.    st
b6b0: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 6f 70  atic const u8 op
b6c0: 73 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b  s[] = {TK_GE, TK
b6d0: 5f 4c 45 7d 3b 0a 20 20 20 20 61 73 73 65 72 74  _LE};.    assert
b6e0: 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  ( pList!=0 );.  
b6f0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
b700: 3e 6e 45 78 70 72 3d 3d 32 20 29 3b 0a 20 20 20  >nExpr==2 );.   
b710: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69   for(i=0; i<2; i
b720: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
b730: 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20  *pNewExpr;.     
b740: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
b750: 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71     pNewExpr = sq
b760: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
b770: 65 2c 20 6f 70 73 5b 69 5d 2c 20 0a 20 20 20 20  e, ops[i], .    
b780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b790: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b7a0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70  ExprDup(db, pExp
b7b0: 72 2d 3e 70 4c 65 66 74 2c 20 30 29 2c 0a 20 20  r->pLeft, 0),.  
b7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7d0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
b7e0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c  e3ExprDup(db, pL
b7f0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
b800: 20 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69   0), 0);.      i
b810: 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61  dxNew = whereCla
b820: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
b830: 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49  NewExpr, TERM_VI
b840: 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
b850: 49 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  IC);.      testc
b860: 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29  ase( idxNew==0 )
b870: 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c  ;.      exprAnal
b880: 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69  yze(pSrc, pWC, i
b890: 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 54  dxNew);.      pT
b8a0: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
b8b0: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 57  xTerm];.      pW
b8c0: 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61  C->a[idxNew].iPa
b8d0: 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a  rent = idxTerm;.
b8e0: 20 20 20 20 7d 0a 20 20 20 20 70 54 65 72 6d 2d      }.    pTerm-
b8f0: 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 7d  >nChild = 2;.  }
b900: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
b910: 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f  E_OMIT_BETWEEN_O
b920: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
b930: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
b940: 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49  ITE_OMIT_OR_OPTI
b950: 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64 65  MIZATION) && !de
b960: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
b970: 54 5f 53 55 42 51 55 45 52 59 29 0a 20 20 2f 2a  T_SUBQUERY).  /*
b980: 20 41 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d 20   Analyze a term 
b990: 74 68 61 74 20 69 73 20 63 6f 6d 70 6f 73 65 64  that is composed
b9a0: 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   of two or more 
b9b0: 73 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74  subterms connect
b9c0: 65 64 20 62 79 0a 20 20 2a 2a 20 61 6e 20 4f 52  ed by.  ** an OR
b9d0: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a   operator..  */.
b9e0: 20 20 65 6c 73 65 20 69 66 28 20 70 45 78 70 72    else if( pExpr
b9f0: 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20  ->op==TK_OR ){. 
ba00: 20 20 20 61 73 73 65 72 74 28 20 70 57 43 2d 3e     assert( pWC->
ba10: 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20  op==TK_AND );.  
ba20: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54    exprAnalyzeOrT
ba30: 65 72 6d 28 70 53 72 63 2c 20 70 57 43 2c 20 69  erm(pSrc, pWC, i
ba40: 64 78 54 65 72 6d 29 3b 0a 20 20 20 20 70 54 65  dxTerm);.    pTe
ba50: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
ba60: 54 65 72 6d 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69  Term];.  }.#endi
ba70: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
ba80: 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
ba90: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
baa0: 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50  ITE_OMIT_LIKE_OP
bab0: 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20  TIMIZATION.  /* 
bac0: 41 64 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  Add constraints 
bad0: 74 6f 20 72 65 64 75 63 65 20 74 68 65 20 73 65  to reduce the se
bae0: 61 72 63 68 20 73 70 61 63 65 20 6f 6e 20 61 20  arch space on a 
baf0: 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 0a 20 20 2a  LIKE or GLOB.  *
bb00: 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a  * operator..  **
bb10: 0a 20 20 2a 2a 20 41 20 6c 69 6b 65 20 70 61 74  .  ** A like pat
bb20: 74 65 72 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d  tern of the form
bb30: 20 22 78 20 4c 49 4b 45 20 27 61 62 63 25 27 22   "x LIKE 'abc%'"
bb40: 20 69 73 20 63 68 61 6e 67 65 64 20 69 6e 74 6f   is changed into
bb50: 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a   constraints.  *
bb60: 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  *.  **          
bb70: 78 3e 3d 27 61 62 63 27 20 41 4e 44 20 78 3c 27  x>='abc' AND x<'
bb80: 61 62 64 27 20 41 4e 44 20 78 20 4c 49 4b 45 20  abd' AND x LIKE 
bb90: 27 61 62 63 25 27 0a 20 20 2a 2a 0a 20 20 2a 2a  'abc%'.  **.  **
bba0: 20 54 68 65 20 6c 61 73 74 20 63 68 61 72 61 63   The last charac
bbb0: 74 65 72 20 6f 66 20 74 68 65 20 70 72 65 66 69  ter of the prefi
bbc0: 78 20 22 61 62 63 22 20 69 73 20 69 6e 63 72 65  x "abc" is incre
bbd0: 6d 65 6e 74 65 64 20 74 6f 20 66 6f 72 6d 20 74  mented to form t
bbe0: 68 65 0a 20 20 2a 2a 20 74 65 72 6d 69 6e 61 74  he.  ** terminat
bbf0: 69 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e 20 22 61  ion condition "a
bc00: 62 64 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  bd"..  */.  if( 
bc10: 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20  pWC->op==TK_AND 
bc20: 0a 20 20 20 26 26 20 69 73 4c 69 6b 65 4f 72 47  .   && isLikeOrG
bc30: 6c 6f 62 28 70 50 61 72 73 65 2c 20 70 45 78 70  lob(pParse, pExp
bc40: 72 2c 20 26 70 53 74 72 31 2c 20 26 69 73 43 6f  r, &pStr1, &isCo
bc50: 6d 70 6c 65 74 65 2c 20 26 6e 6f 43 61 73 65 29  mplete, &noCase)
bc60: 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  .  ){.    Expr *
bc70: 70 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20  pLeft;       /* 
bc80: 4c 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42  LHS of LIKE/GLOB
bc90: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
bca0: 20 45 78 70 72 20 2a 70 53 74 72 32 3b 20 20 20   Expr *pStr2;   
bcb0: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70      /* Copy of p
bcc0: 53 74 72 31 20 2d 20 52 48 53 20 6f 66 20 4c 49  Str1 - RHS of LI
bcd0: 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72  KE/GLOB operator
bce0: 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 4e   */.    Expr *pN
bcf0: 65 77 45 78 70 72 31 3b 0a 20 20 20 20 45 78 70  ewExpr1;.    Exp
bd00: 72 20 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20 20  r *pNewExpr2;.  
bd10: 20 20 69 6e 74 20 69 64 78 4e 65 77 31 3b 0a 20    int idxNew1;. 
bd20: 20 20 20 69 6e 74 20 69 64 78 4e 65 77 32 3b 0a     int idxNew2;.
bd30: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
bd40: 6c 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74  ll;    /* Collat
bd50: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20  ing sequence to 
bd60: 75 73 65 20 2a 2f 0a 0a 20 20 20 20 70 4c 65 66  use */..    pLef
bd70: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
bd80: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
bd90: 20 20 20 20 70 53 74 72 32 20 3d 20 73 71 6c 69      pStr2 = sqli
bda0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
bdb0: 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 69 66  Str1, 0);.    if
bdc0: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
bdd0: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 75 38 20  led ){.      u8 
bde0: 63 2c 20 2a 70 43 3b 20 20 20 20 20 20 20 2f 2a  c, *pC;       /*
bdf0: 20 4c 61 73 74 20 63 68 61 72 61 63 74 65 72 20   Last character 
be00: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
be10: 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 20   wildcard */.   
be20: 20 20 20 70 43 20 3d 20 28 75 38 2a 29 26 70 53     pC = (u8*)&pS
be30: 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 73 71  tr2->u.zToken[sq
be40: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 53  lite3Strlen30(pS
be50: 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2d 31  tr2->u.zToken)-1
be60: 5d 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 70 43  ];.      c = *pC
be70: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61  ;.      if( noCa
be80: 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  se ){.        /*
be90: 20 54 68 65 20 70 6f 69 6e 74 20 69 73 20 74 6f   The point is to
bea0: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6c   increment the l
beb0: 61 73 74 20 63 68 61 72 61 63 74 65 72 20 62 65  ast character be
bec0: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a 20  fore the first. 
bed0: 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 64 63 61         ** wildca
bee0: 72 64 2e 20 20 42 75 74 20 69 66 20 77 65 20 69  rd.  But if we i
bef0: 6e 63 72 65 6d 65 6e 74 20 27 40 27 2c 20 74 68  ncrement '@', th
bf00: 61 74 20 77 69 6c 6c 20 70 75 73 68 20 69 74 20  at will push it 
bf10: 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  into the.       
bf20: 20 2a 2a 20 61 6c 70 68 61 62 65 74 69 63 20 72   ** alphabetic r
bf30: 61 6e 67 65 20 77 68 65 72 65 20 63 61 73 65 20  ange where case 
bf40: 63 6f 6e 76 65 72 73 69 6f 6e 73 20 77 69 6c 6c  conversions will
bf50: 20 6d 65 73 73 20 75 70 20 74 68 65 20 0a 20 20   mess up the .  
bf60: 20 20 20 20 20 20 2a 2a 20 69 6e 65 71 75 61 6c        ** inequal
bf70: 69 74 79 2e 20 20 54 6f 20 61 76 6f 69 64 20 74  ity.  To avoid t
bf80: 68 69 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  his, make sure t
bf90: 6f 20 61 6c 73 6f 20 72 75 6e 20 74 68 65 20 66  o also run the f
bfa0: 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 4c  ull.        ** L
bfb0: 49 4b 45 20 6f 6e 20 61 6c 6c 20 63 61 6e 64 69  IKE on all candi
bfc0: 64 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73  date expressions
bfd0: 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68 65   by clearing the
bfe0: 20 69 73 43 6f 6d 70 6c 65 74 65 20 66 6c 61 67   isComplete flag
bff0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
c000: 20 20 20 20 69 66 28 20 63 3d 3d 27 41 27 2d 31      if( c=='A'-1
c010: 20 29 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20   ) isComplete = 
c020: 30 3b 20 20 20 2f 2a 20 45 56 3a 20 52 2d 36 34  0;   /* EV: R-64
c030: 33 33 39 2d 30 38 32 30 37 20 2a 2f 0a 0a 0a 20  339-08207 */... 
c040: 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74         c = sqlit
c050: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63  e3UpperToLower[c
c060: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
c070: 20 2a 70 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20   *pC = c + 1;.  
c080: 20 20 7d 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20    }.    pColl = 
c090: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
c0a0: 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54  eq(db, SQLITE_UT
c0b0: 46 38 2c 20 6e 6f 43 61 73 65 20 3f 20 22 4e 4f  F8, noCase ? "NO
c0c0: 43 41 53 45 22 20 3a 20 22 42 49 4e 41 52 59 22  CASE" : "BINARY"
c0d0: 2c 30 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70  ,0);.    pNewExp
c0e0: 72 31 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  r1 = sqlite3PExp
c0f0: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 47 45 2c  r(pParse, TK_GE,
c100: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
c110: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
c120: 70 72 53 65 74 43 6f 6c 6c 28 73 71 6c 69 74 65  prSetColl(sqlite
c130: 33 45 78 70 72 44 75 70 28 64 62 2c 70 4c 65 66  3ExprDup(db,pLef
c140: 74 2c 30 29 2c 20 70 43 6f 6c 6c 29 2c 0a 20 20  t,0), pColl),.  
c150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c160: 20 20 20 70 53 74 72 31 2c 20 30 29 3b 0a 20 20     pStr1, 0);.  
c170: 20 20 69 64 78 4e 65 77 31 20 3d 20 77 68 65 72    idxNew1 = wher
c180: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
c190: 43 2c 20 70 4e 65 77 45 78 70 72 31 2c 20 54 45  C, pNewExpr1, TE
c1a0: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
c1b0: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65  DYNAMIC);.    te
c1c0: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 31 3d  stcase( idxNew1=
c1d0: 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e  =0 );.    exprAn
c1e0: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
c1f0: 20 69 64 78 4e 65 77 31 29 3b 0a 20 20 20 20 70   idxNew1);.    p
c200: 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74  NewExpr2 = sqlit
c210: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
c220: 54 4b 5f 4c 54 2c 0a 20 20 20 20 20 20 20 20 20  TK_LT,.         
c230: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
c240: 74 65 33 45 78 70 72 53 65 74 43 6f 6c 6c 28 73  te3ExprSetColl(s
c250: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
c260: 2c 70 4c 65 66 74 2c 30 29 2c 20 70 43 6f 6c 6c  ,pLeft,0), pColl
c270: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
c280: 20 20 20 20 20 20 20 20 70 53 74 72 32 2c 20 30          pStr2, 0
c290: 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 32 20 3d  );.    idxNew2 =
c2a0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
c2b0: 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72  rt(pWC, pNewExpr
c2c0: 32 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  2, TERM_VIRTUAL|
c2d0: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
c2e0: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78     testcase( idx
c2f0: 4e 65 77 32 3d 3d 30 20 29 3b 0a 20 20 20 20 65  New2==0 );.    e
c300: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
c310: 20 70 57 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a   pWC, idxNew2);.
c320: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
c330: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
c340: 20 20 69 66 28 20 69 73 43 6f 6d 70 6c 65 74 65    if( isComplete
c350: 20 29 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61   ){.      pWC->a
c360: 5b 69 64 78 4e 65 77 31 5d 2e 69 50 61 72 65 6e  [idxNew1].iParen
c370: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
c380: 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77     pWC->a[idxNew
c390: 32 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  2].iParent = idx
c3a0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72  Term;.      pTer
c3b0: 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20  m->nChild = 2;. 
c3c0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
c3d0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  /* SQLITE_OMIT_L
c3e0: 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IKE_OPTIMIZATION
c3f0: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
c400: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
c410: 54 41 42 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61  TABLE.  /* Add a
c420: 20 57 4f 5f 4d 41 54 43 48 20 61 75 78 69 6c 69   WO_MATCH auxili
c430: 61 72 79 20 74 65 72 6d 20 74 6f 20 74 68 65 20  ary term to the 
c440: 63 6f 6e 73 74 72 61 69 6e 74 20 73 65 74 20 69  constraint set i
c450: 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  f the.  ** curre
c460: 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  nt expression is
c470: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 63   of the form:  c
c480: 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72  olumn MATCH expr
c490: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69 6e 66 6f  ..  ** This info
c4a0: 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
c4b0: 62 79 20 74 68 65 20 78 42 65 73 74 49 6e 64 65  by the xBestInde
c4c0: 78 20 6d 65 74 68 6f 64 73 20 6f 66 0a 20 20 2a  x methods of.  *
c4d0: 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  * virtual tables
c4e0: 2e 20 20 54 68 65 20 6e 61 74 69 76 65 20 71 75  .  The native qu
c4f0: 65 72 79 20 6f 70 74 69 6d 69 7a 65 72 20 64 6f  ery optimizer do
c500: 65 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 0a 20  es not attempt. 
c510: 20 2a 2a 20 74 6f 20 64 6f 20 61 6e 79 74 68 69   ** to do anythi
c520: 6e 67 20 77 69 74 68 20 4d 41 54 43 48 20 66 75  ng with MATCH fu
c530: 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  nctions..  */.  
c540: 69 66 28 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c  if( isMatchOfCol
c550: 75 6d 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20  umn(pExpr) ){.  
c560: 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20    int idxNew;.  
c570: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
c580: 2a 70 4c 65 66 74 3b 0a 20 20 20 20 57 68 65 72  *pLeft;.    Wher
c590: 65 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b  eTerm *pNewTerm;
c5a0: 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 70 72 65  .    Bitmask pre
c5b0: 72 65 71 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65  reqColumn, prere
c5c0: 71 45 78 70 72 3b 0a 0a 20 20 20 20 70 52 69 67  qExpr;..    pRig
c5d0: 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ht = pExpr->x.pL
c5e0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
c5f0: 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78  .    pLeft = pEx
c600: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31  pr->x.pList->a[1
c610: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 72 65  ].pExpr;.    pre
c620: 72 65 71 45 78 70 72 20 3d 20 65 78 70 72 54 61  reqExpr = exprTa
c630: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
c640: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  t, pRight);.    
c650: 70 72 65 72 65 71 43 6f 6c 75 6d 6e 20 3d 20 65  prereqColumn = e
c660: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
c670: 61 73 6b 53 65 74 2c 20 70 4c 65 66 74 29 3b 0a  askSet, pLeft);.
c680: 20 20 20 20 69 66 28 20 28 70 72 65 72 65 71 45      if( (prereqE
c690: 78 70 72 20 26 20 70 72 65 72 65 71 43 6f 6c 75  xpr & prereqColu
c6a0: 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mn)==0 ){.      
c6b0: 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a  Expr *pNewExpr;.
c6c0: 20 20 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d        pNewExpr =
c6d0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
c6e0: 61 72 73 65 2c 20 54 4b 5f 4d 41 54 43 48 2c 20  arse, TK_MATCH, 
c6f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
c710: 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  , sqlite3ExprDup
c720: 28 64 62 2c 20 70 52 69 67 68 74 2c 20 30 29 2c  (db, pRight, 0),
c730: 20 30 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65   0);.      idxNe
c740: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
c750: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45  nsert(pWC, pNewE
c760: 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  xpr, TERM_VIRTUA
c770: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
c780: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
c790: 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20   idxNew==0 );.  
c7a0: 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26      pNewTerm = &
c7b0: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a  pWC->a[idxNew];.
c7c0: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
c7d0: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72  prereqRight = pr
c7e0: 65 72 65 71 45 78 70 72 3b 0a 20 20 20 20 20 20  ereqExpr;.      
c7f0: 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75  pNewTerm->leftCu
c800: 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54  rsor = pLeft->iT
c810: 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77  able;.      pNew
c820: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
c830: 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c  mn = pLeft->iCol
c840: 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  umn;.      pNewT
c850: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
c860: 20 57 4f 5f 4d 41 54 43 48 3b 0a 20 20 20 20 20   WO_MATCH;.     
c870: 20 70 4e 65 77 54 65 72 6d 2d 3e 69 50 61 72 65   pNewTerm->iPare
c880: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
c890: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
c8a0: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
c8b0: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
c8c0: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 65  d = 1;.      pTe
c8d0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
c8e0: 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20  ERM_COPIED;.    
c8f0: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72    pNewTerm->prer
c900: 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70  eqAll = pTerm->p
c910: 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a  rereqAll;.    }.
c920: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
c930: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
c940: 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65  LTABLE */..#ifde
c950: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
c960: 53 54 41 54 33 0a 20 20 2f 2a 20 57 68 65 6e 20  STAT3.  /* When 
c970: 73 71 6c 69 74 65 5f 73 74 61 74 33 20 68 69 73  sqlite_stat3 his
c980: 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73 20 61  togram data is a
c990: 76 61 69 6c 61 62 6c 65 20 61 6e 20 6f 70 65 72  vailable an oper
c9a0: 61 74 6f 72 20 6f 66 20 74 68 65 0a 20 20 2a 2a  ator of the.  **
c9b0: 20 66 6f 72 6d 20 22 78 20 49 53 20 4e 4f 54 20   form "x IS NOT 
c9c0: 4e 55 4c 4c 22 20 63 61 6e 20 73 6f 6d 65 74 69  NULL" can someti
c9d0: 6d 65 73 20 62 65 20 65 76 61 6c 75 61 74 65 64  mes be evaluated
c9e0: 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 6c   more efficientl
c9f0: 79 0a 20 20 2a 2a 20 61 73 20 22 78 3e 4e 55 4c  y.  ** as "x>NUL
ca00: 4c 22 20 69 66 20 78 20 69 73 20 6e 6f 74 20 61  L" if x is not a
ca10: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
ca20: 59 20 4b 45 59 2e 20 20 53 6f 20 63 6f 6e 73 74  Y KEY.  So const
ca30: 72 75 63 74 20 61 0a 20 20 2a 2a 20 76 69 72 74  ruct a.  ** virt
ca40: 75 61 6c 20 74 65 72 6d 20 6f 66 20 74 68 61 74  ual term of that
ca50: 20 66 6f 72 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   form..  **.  **
ca60: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 76   Note that the v
ca70: 69 72 74 75 61 6c 20 74 65 72 6d 20 6d 75 73 74  irtual term must
ca80: 20 62 65 20 74 61 67 67 65 64 20 77 69 74 68 20   be tagged with 
ca90: 54 45 52 4d 5f 56 4e 55 4c 4c 2e 20 20 54 68 69  TERM_VNULL.  Thi
caa0: 73 0a 20 20 2a 2a 20 54 45 52 4d 5f 56 4e 55 4c  s.  ** TERM_VNUL
cab0: 4c 20 74 61 67 20 77 69 6c 6c 20 73 75 70 70 72  L tag will suppr
cac0: 65 73 73 20 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c  ess the not-null
cad0: 20 63 68 65 63 6b 20 61 74 20 74 68 65 20 62 65   check at the be
cae0: 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f 66 20  ginning.  ** of 
caf0: 74 68 65 20 6c 6f 6f 70 2e 20 20 57 69 74 68 6f  the loop.  Witho
cb00: 75 74 20 74 68 65 20 54 45 52 4d 5f 56 4e 55 4c  ut the TERM_VNUL
cb10: 4c 20 66 6c 61 67 2c 20 74 68 65 20 6e 6f 74 2d  L flag, the not-
cb20: 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74 0a 20 20  null check at.  
cb30: 2a 2a 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  ** the start of 
cb40: 74 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20 70 72  the loop will pr
cb50: 65 76 65 6e 74 20 61 6e 79 20 72 65 73 75 6c 74  event any result
cb60: 73 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 74  s from being ret
cb70: 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  urned..  */.  if
cb80: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
cb90: 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20 70 45  NOTNULL.   && pE
cba0: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d  xpr->pLeft->op==
cbb0: 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20  TK_COLUMN.   && 
cbc0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 43  pExpr->pLeft->iC
cbd0: 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 29 7b 0a 20 20  olumn>=0.  ){.  
cbe0: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
cbf0: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66  ;.    Expr *pLef
cc00: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
cc10: 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77  ;.    int idxNew
cc20: 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
cc30: 2a 70 4e 65 77 54 65 72 6d 3b 0a 0a 20 20 20 20  *pNewTerm;..    
cc40: 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74  pNewExpr = sqlit
cc50: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
cc60: 54 4b 5f 47 54 2c 0a 20 20 20 20 20 20 20 20 20  TK_GT,.         
cc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc80: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
cc90: 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 2c  p(db, pLeft, 0),
cca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ccb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
ccc0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
ccd0: 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c  , TK_NULL, 0, 0,
cce0: 20 30 29 2c 20 30 29 3b 0a 0a 20 20 20 20 69 64   0), 0);..    id
ccf0: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
cd00: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
cd10: 65 77 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  ewExpr,.        
cd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd30: 20 20 20 20 20 20 54 45 52 4d 5f 56 49 52 54 55        TERM_VIRTU
cd40: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c  AL|TERM_DYNAMIC|
cd50: 54 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20 20 20  TERM_VNULL);.   
cd60: 20 69 66 28 20 69 64 78 4e 65 77 20 29 7b 0a 20   if( idxNew ){. 
cd70: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20       pNewTerm = 
cd80: 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b  &pWC->a[idxNew];
cd90: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
cda0: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30  >prereqRight = 0
cdb0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
cdc0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70  ->leftCursor = p
cdd0: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Left->iTable;.  
cde0: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e      pNewTerm->u.
cdf0: 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65  leftColumn = pLe
ce00: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ft->iColumn;.   
ce10: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70     pNewTerm->eOp
ce20: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 47 54 3b 0a  erator = WO_GT;.
ce30: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
ce40: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
ce50: 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  m;.      pTerm =
ce60: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
ce70: 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ];.      pTerm->
ce80: 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
ce90: 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
cea0: 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b   |= TERM_COPIED;
ceb0: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
cec0: 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65  >prereqAll = pTe
ced0: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20  rm->prereqAll;. 
cee0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
cef0: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
cf00: 5f 53 54 41 54 20 2a 2f 0a 0a 20 20 2f 2a 20 50  _STAT */..  /* P
cf10: 72 65 76 65 6e 74 20 4f 4e 20 63 6c 61 75 73 65  revent ON clause
cf20: 20 74 65 72 6d 73 20 6f 66 20 61 20 4c 45 46 54   terms of a LEFT
cf30: 20 4a 4f 49 4e 20 66 72 6f 6d 20 62 65 69 6e 67   JOIN from being
cf40: 20 75 73 65 64 20 74 6f 20 64 72 69 76 65 0a 20   used to drive. 
cf50: 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 66 6f 72   ** an index for
cf60: 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
cf70: 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  eft of the join.
cf80: 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 2d 3e 70  .  */.  pTerm->p
cf90: 72 65 72 65 71 52 69 67 68 74 20 7c 3d 20 65 78  rereqRight |= ex
cfa0: 74 72 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a  traRight;.}../*.
cfb0: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
cfc0: 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65 78 70  f any of the exp
cfd0: 72 65 73 73 69 6f 6e 73 20 69 6e 20 70 4c 69 73  ressions in pLis
cfe0: 74 2d 3e 61 5b 69 46 69 72 73 74 2e 2e 2e 5d 20  t->a[iFirst...] 
cff0: 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 20 72 65 66  contain.** a ref
d000: 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 74 61  erence to any ta
d010: 62 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ble other than t
d020: 68 65 20 69 42 61 73 65 20 74 61 62 6c 65 2e 0a  he iBase table..
d030: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
d040: 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54 61 62  ferencesOtherTab
d050: 6c 65 73 28 0a 20 20 45 78 70 72 4c 69 73 74 20  les(.  ExprList 
d060: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  *pList,         
d070: 20 2f 2a 20 53 65 61 72 63 68 20 65 78 70 72 65   /* Search expre
d080: 73 73 69 6f 6e 73 20 69 6e 20 74 68 73 20 6c 69  ssions in ths li
d090: 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73  st */.  WhereMas
d0a0: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
d0b0: 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f    /* Mapping fro
d0c0: 6d 20 74 61 62 6c 65 73 20 74 6f 20 62 69 74 6d  m tables to bitm
d0d0: 61 70 73 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69  aps */.  int iFi
d0e0: 72 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  rst,            
d0f0: 20 20 20 2f 2a 20 42 65 20 73 65 61 72 63 68 69     /* Be searchi
d100: 6e 67 20 77 69 74 68 20 74 68 65 20 69 46 69 72  ng with the iFir
d110: 73 74 2d 74 68 20 65 78 70 72 65 73 73 69 6f 6e  st-th expression
d120: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65 20   */.  int iBase 
d130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d140: 2f 2a 20 49 67 6e 6f 72 65 20 72 65 66 65 72 65  /* Ignore refere
d150: 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74 61 62  nces to this tab
d160: 6c 65 20 2a 2f 0a 29 7b 0a 20 20 42 69 74 6d 61  le */.){.  Bitma
d170: 73 6b 20 61 6c 6c 6f 77 65 64 20 3d 20 7e 67 65  sk allowed = ~ge
d180: 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
d190: 69 42 61 73 65 29 3b 0a 20 20 77 68 69 6c 65 28  iBase);.  while(
d1a0: 20 69 46 69 72 73 74 3c 70 4c 69 73 74 2d 3e 6e   iFirst<pList->n
d1b0: 45 78 70 72 20 29 7b 0a 20 20 20 20 69 66 28 20  Expr ){.    if( 
d1c0: 28 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28  (exprTableUsage(
d1d0: 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73 74 2d  pMaskSet, pList-
d1e0: 3e 61 5b 69 46 69 72 73 74 2b 2b 5d 2e 70 45 78  >a[iFirst++].pEx
d1f0: 70 72 29 26 61 6c 6c 6f 77 65 64 29 21 3d 30 20  pr)&allowed)!=0 
d200: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
d210: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
d220: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
d230: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
d240: 73 65 61 72 63 68 65 73 20 74 68 65 20 65 78 70  searches the exp
d250: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 61 73  ression list pas
d260: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
d270: 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 66 6f  d argument.** fo
d280: 72 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  r an expression 
d290: 6f 66 20 74 79 70 65 20 54 4b 5f 43 4f 4c 55 4d  of type TK_COLUM
d2a0: 4e 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f  N that refers to
d2b0: 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e   the same column
d2c0: 20 61 6e 64 0a 2a 2a 20 75 73 65 73 20 74 68 65   and.** uses the
d2d0: 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6f 6e 20   same collation 
d2e0: 73 65 71 75 65 6e 63 65 20 61 73 20 74 68 65 20  sequence as the 
d2f0: 69 43 6f 6c 27 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol'th column o
d300: 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a  f index pIdx..**
d310: 20 41 72 67 75 6d 65 6e 74 20 69 42 61 73 65 20   Argument iBase 
d320: 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  is the cursor nu
d330: 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 74 68  mber used for th
d340: 65 20 74 61 62 6c 65 20 74 68 61 74 20 70 49 64  e table that pId
d350: 78 20 72 65 66 65 72 73 0a 2a 2a 20 74 6f 2e 0a  x refers.** to..
d360: 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 6e  **.** If such an
d370: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
d380: 6f 75 6e 64 2c 20 69 74 73 20 69 6e 64 65 78 20  ound, its index 
d390: 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73  in pList->a[] is
d3a0: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a   returned. If.**
d3b0: 20 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 69   no expression i
d3c0: 73 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72  s found, -1 is r
d3d0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
d3e0: 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 64 65 78  ic int findIndex
d3f0: 43 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Col(.  Parse *pP
d400: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
d410: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
d420: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
d430: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
d440: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d450: 45 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  Expression list 
d460: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69  to search */.  i
d470: 6e 74 20 69 42 61 73 65 2c 20 20 20 20 20 20 20  nt iBase,       
d480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d490: 2a 20 43 75 72 73 6f 72 20 66 6f 72 20 74 61 62  * Cursor for tab
d4a0: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
d4b0: 74 68 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64  th pIdx */.  Ind
d4c0: 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20  ex *pIdx,       
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d4e0: 49 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20 63  Index to match c
d4f0: 6f 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e  olumn of */.  in
d500: 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20  t iCol          
d510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d520: 20 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   Column of index
d530: 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a   to match */.){.
d540: 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
d550: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
d560: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c  Idx->azColl[iCol
d570: 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ];..  for(i=0; i
d580: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
d590: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
d5a0: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70   = pList->a[i].p
d5b0: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 2d  Expr;.    if( p-
d5c0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
d5d0: 20 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d      && p->iColum
d5e0: 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  n==pIdx->aiColum
d5f0: 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26 26 20  n[iCol].     && 
d600: 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65  p->iTable==iBase
d610: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 43 6f  .    ){.      Co
d620: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
d630: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
d640: 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  q(pParse, p);.  
d650: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
d660: 43 6f 6c 6c 29 20 26 26 20 30 3d 3d 73 71 6c 69  Coll) && 0==sqli
d670: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c  te3StrICmp(pColl
d680: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20  ->zName, zColl) 
d690: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
d6a0: 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n i;.      }.   
d6b0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
d6c0: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   -1;.}../*.** Th
d6d0: 69 73 20 72 6f 75 74 69 6e 65 20 64 65 74 65 72  is routine deter
d6e0: 6d 69 6e 65 73 20 69 66 20 70 49 64 78 20 63 61  mines if pIdx ca
d6f0: 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 73 73  n be used to ass
d700: 69 73 74 20 69 6e 20 70 72 6f 63 65 73 73 69 6e  ist in processin
d710: 67 20 61 0a 2a 2a 20 44 49 53 54 49 4e 43 54 20  g a.** DISTINCT 
d720: 71 75 61 6c 69 66 69 65 72 2e 20 49 6e 20 6f 74  qualifier. In ot
d730: 68 65 72 20 77 6f 72 64 73 2c 20 69 74 20 74 65  her words, it te
d740: 73 74 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e  sts whether or n
d750: 6f 74 20 75 73 69 6e 67 20 74 68 69 73 0a 2a 2a  ot using this.**
d760: 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6f   index for the o
d770: 75 74 65 72 20 6c 6f 6f 70 20 67 75 61 72 61 6e  uter loop guaran
d780: 74 65 65 73 20 74 68 61 74 20 72 6f 77 73 20 77  tees that rows w
d790: 69 74 68 20 65 71 75 61 6c 20 76 61 6c 75 65 73  ith equal values
d7a0: 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 65 78 70 72   for.** all expr
d7b0: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 70  essions in the p
d7c0: 44 69 73 74 69 6e 63 74 20 6c 69 73 74 20 61 72  Distinct list ar
d7d0: 65 20 64 65 6c 69 76 65 72 65 64 20 67 72 6f 75  e delivered grou
d7e0: 70 65 64 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2a  ped together..**
d7f0: 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
d800: 20 74 68 65 20 71 75 65 72 79 20 0a 2a 2a 0a 2a   the query .**.*
d810: 2a 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49  *   SELECT DISTI
d820: 4e 43 54 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d  NCT a, b, c FROM
d830: 20 74 62 6c 20 57 48 45 52 45 20 61 20 3d 20 3f   tbl WHERE a = ?
d840: 0a 2a 2a 0a 2a 2a 20 63 61 6e 20 62 65 6e 65 66  .**.** can benef
d850: 69 74 20 66 72 6f 6d 20 61 6e 79 20 69 6e 64 65  it from any inde
d860: 78 20 6f 6e 20 63 6f 6c 75 6d 6e 73 20 22 62 22  x on columns "b"
d870: 20 61 6e 64 20 22 63 22 2e 0a 2a 2f 0a 73 74 61   and "c"..*/.sta
d880: 74 69 63 20 69 6e 74 20 69 73 44 69 73 74 69 6e  tic int isDistin
d890: 63 74 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  ctIndex(.  Parse
d8a0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
d8b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
d8c0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
d8d0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
d8e0: 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 20  pWC,            
d8f0: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
d900: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 49 6e 64 65  clause */.  Inde
d910: 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
d920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
d930: 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 63  he index being c
d940: 6f 6e 73 69 64 65 72 65 64 20 2a 2f 0a 20 20 69  onsidered */.  i
d950: 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20 20 20  nt base,        
d960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d970: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
d980: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 70 49  for the table pI
d990: 64 78 20 69 73 20 6f 6e 20 2a 2f 0a 20 20 45 78  dx is on */.  Ex
d9a0: 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63  prList *pDistinc
d9b0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
d9c0: 20 54 68 65 20 44 49 53 54 49 4e 43 54 20 65 78   The DISTINCT ex
d9d0: 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 69  pressions */.  i
d9e0: 6e 74 20 6e 45 71 43 6f 6c 20 20 20 20 20 20 20  nt nEqCol       
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
da00: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65  * Number of inde
da10: 78 20 63 6f 6c 75 6d 6e 73 20 77 69 74 68 20 3d  x columns with =
da20: 3d 20 2a 2f 0a 29 7b 0a 20 20 42 69 74 6d 61 73  = */.){.  Bitmas
da30: 6b 20 6d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20  k mask = 0;     
da40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
da50: 6b 20 6f 66 20 75 6e 61 63 63 6f 75 6e 74 65 64  k of unaccounted
da60: 20 66 6f 72 20 70 44 69 73 74 69 6e 63 74 20 65   for pDistinct e
da70: 78 70 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  xprs */.  int i;
da80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
daa0: 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
dab0: 2f 0a 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 7a  /..  if( pIdx->z
dac0: 4e 61 6d 65 3d 3d 30 20 7c 7c 20 70 44 69 73 74  Name==0 || pDist
dad0: 69 6e 63 74 3d 3d 30 20 7c 7c 20 70 44 69 73 74  inct==0 || pDist
dae0: 69 6e 63 74 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53  inct->nExpr>=BMS
daf0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 74   ) return 0;.  t
db00: 65 73 74 63 61 73 65 28 20 70 44 69 73 74 69 6e  estcase( pDistin
db10: 63 74 2d 3e 6e 45 78 70 72 3d 3d 42 4d 53 2d 31  ct->nExpr==BMS-1
db20: 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74   );..  /* Loop t
db30: 68 72 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 65  hrough all the e
db40: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
db50: 65 20 64 69 73 74 69 6e 63 74 20 6c 69 73 74 2e  e distinct list.
db60: 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 6d 0a   If any of them.
db70: 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20 73 69 6d    ** are not sim
db80: 70 6c 65 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72  ple column refer
db90: 65 6e 63 65 73 2c 20 72 65 74 75 72 6e 20 65 61  ences, return ea
dba0: 72 6c 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rly. Otherwise, 
dbb0: 74 65 73 74 20 69 66 20 74 68 65 0a 20 20 2a 2a  test if the.  **
dbc0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
dbd0: 6e 74 61 69 6e 73 20 61 20 22 63 6f 6c 3d 58 22  ntains a "col=X"
dbe0: 20 63 6c 61 75 73 65 2e 20 49 66 20 69 74 20 64   clause. If it d
dbf0: 6f 65 73 2c 20 74 68 65 20 65 78 70 72 65 73 73  oes, the express
dc00: 69 6f 6e 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20  ion.  ** can be 
dc10: 69 67 6e 6f 72 65 64 2e 20 49 66 20 69 74 20 64  ignored. If it d
dc20: 6f 65 73 20 6e 6f 74 2c 20 61 6e 64 20 74 68 65  oes not, and the
dc30: 20 63 6f 6c 75 6d 6e 20 64 6f 65 73 20 6e 6f 74   column does not
dc40: 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 65 0a 20   belong to the. 
dc50: 20 2a 2a 20 73 61 6d 65 20 74 61 62 6c 65 20 61   ** same table a
dc60: 73 20 69 6e 64 65 78 20 70 49 64 78 2c 20 72 65  s index pIdx, re
dc70: 74 75 72 6e 20 65 61 72 6c 79 2e 20 46 69 6e 61  turn early. Fina
dc80: 6c 6c 79 2c 20 69 66 20 74 68 65 72 65 20 69 73  lly, if there is
dc90: 20 6e 6f 0a 20 20 2a 2a 20 6d 61 74 63 68 69 6e   no.  ** matchin
dca0: 67 20 22 63 6f 6c 3d 58 22 20 65 78 70 72 65 73  g "col=X" expres
dcb0: 73 69 6f 6e 20 61 6e 64 20 74 68 65 20 63 6f 6c  sion and the col
dcc0: 75 6d 6e 20 69 73 20 6f 6e 20 74 68 65 20 73 61  umn is on the sa
dcd0: 6d 65 20 74 61 62 6c 65 20 61 73 20 70 49 64 78  me table as pIdx
dce0: 2c 0a 20 20 2a 2a 20 73 65 74 20 74 68 65 20 63  ,.  ** set the c
dcf0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
dd00: 20 69 6e 20 76 61 72 69 61 62 6c 65 20 6d 61 73   in variable mas
dd10: 6b 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  k..  */.  for(i=
dd20: 30 3b 20 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e  0; i<pDistinct->
dd30: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
dd40: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
dd50: 6d 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d  m;.    Expr *p =
dd60: 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d   pDistinct->a[i]
dd70: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
dd80: 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op!=TK_COLUMN
dd90: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
dda0: 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
ddb0: 6d 28 70 57 43 2c 20 70 2d 3e 69 54 61 62 6c 65  m(pWC, p->iTable
ddc0: 2c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 7e 28  , p->iColumn, ~(
ddd0: 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51  Bitmask)0, WO_EQ
dde0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54  , 0);.    if( pT
ddf0: 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 45 78 70  erm ){.      Exp
de00: 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pX = pTerm->p
de10: 45 78 70 72 3b 0a 20 20 20 20 20 20 43 6f 6c 6c  Expr;.      Coll
de20: 53 65 71 20 2a 70 31 20 3d 20 73 71 6c 69 74 65  Seq *p1 = sqlite
de30: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
de40: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58  llSeq(pParse, pX
de50: 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69  ->pLeft, pX->pRi
de60: 67 68 74 29 3b 0a 20 20 20 20 20 20 43 6f 6c 6c  ght);.      Coll
de70: 53 65 71 20 2a 70 32 20 3d 20 73 71 6c 69 74 65  Seq *p2 = sqlite
de80: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
de90: 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 69  rse, p);.      i
dea0: 66 28 20 70 31 3d 3d 70 32 20 29 20 63 6f 6e 74  f( p1==p2 ) cont
deb0: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
dec0: 69 66 28 20 70 2d 3e 69 54 61 62 6c 65 21 3d 62  if( p->iTable!=b
ded0: 61 73 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ase ) return 0;.
dee0: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 28 28 28 42      mask |= (((B
def0: 69 74 6d 61 73 6b 29 31 29 20 3c 3c 20 69 29 3b  itmask)1) << i);
df00: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 6e 45  .  }..  for(i=nE
df10: 71 43 6f 6c 3b 20 6d 61 73 6b 20 26 26 20 69 3c  qCol; mask && i<
df20: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
df30: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 45 78  ++){.    int iEx
df40: 70 72 20 3d 20 66 69 6e 64 49 6e 64 65 78 43 6f  pr = findIndexCo
df50: 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69  l(pParse, pDisti
df60: 6e 63 74 2c 20 62 61 73 65 2c 20 70 49 64 78 2c  nct, base, pIdx,
df70: 20 69 29 3b 0a 20 20 20 20 69 66 28 20 69 45 78   i);.    if( iEx
df80: 70 72 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  pr<0 ) break;.  
df90: 20 20 6d 61 73 6b 20 26 3d 20 7e 28 28 28 42 69    mask &= ~(((Bi
dfa0: 74 6d 61 73 6b 29 31 29 20 3c 3c 20 69 45 78 70  tmask)1) << iExp
dfb0: 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  r);.  }..  retur
dfc0: 6e 20 28 6d 61 73 6b 3d 3d 30 29 3b 0a 7d 0a 0a  n (mask==0);.}..
dfd0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
dfe0: 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ue if the DISTIN
dff0: 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69  CT expression-li
e000: 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  st passed as the
e010: 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 0a   third argument.
e020: 2a 2a 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e  ** is redundant.
e030: 20 41 20 44 49 53 54 49 4e 43 54 20 6c 69 73 74   A DISTINCT list
e040: 20 69 73 20 72 65 64 75 6e 64 61 6e 74 20 69 66   is redundant if
e050: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
e060: 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 55 4e 49 51  ntains a.** UNIQ
e070: 55 45 20 69 6e 64 65 78 20 74 68 61 74 20 67 75  UE index that gu
e080: 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68  arantees that th
e090: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
e0a0: 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20 64 69  query will be di
e0b0: 73 74 69 6e 63 74 0a 2a 2a 20 61 6e 79 77 61 79  stinct.** anyway
e0c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e0d0: 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64  isDistinctRedund
e0e0: 61 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ant(.  Parse *pP
e0f0: 61 72 73 65 2c 0a 20 20 53 72 63 4c 69 73 74 20  arse,.  SrcList 
e100: 2a 70 54 61 62 4c 69 73 74 2c 0a 20 20 57 68 65  *pTabList,.  Whe
e110: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20  reClause *pWC,. 
e120: 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74   ExprList *pDist
e130: 69 6e 63 74 0a 29 7b 0a 20 20 54 61 62 6c 65 20  inct.){.  Table 
e140: 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a  *pTab;.  Index *
e150: 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b 20 20  pIdx;.  int i;  
e160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e170: 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20 69          .  int i
e180: 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Base;..  /* If t
e190: 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74 68 61  here is more tha
e1a0: 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20 73  n one table or s
e1b0: 75 62 2d 73 65 6c 65 63 74 20 69 6e 20 74 68 65  ub-select in the
e1c0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 0a   FROM clause of.
e1d0: 20 20 2a 2a 20 74 68 69 73 20 71 75 65 72 79 2c    ** this query,
e1e0: 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f   then it will no
e1f0: 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  t be possible to
e200: 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20 44   show that the D
e210: 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20 63 6c  ISTINCT .  ** cl
e220: 61 75 73 65 20 69 73 20 72 65 64 75 6e 64 61 6e  ause is redundan
e230: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  t. */.  if( pTab
e240: 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20 29 20  List->nSrc!=1 ) 
e250: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 42 61 73  return 0;.  iBas
e260: 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  e = pTabList->a[
e270: 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 70 54  0].iCursor;.  pT
e280: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
e290: 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20  [0].pTab;..  /* 
e2a0: 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65 78  If any of the ex
e2b0: 70 72 65 73 73 69 6f 6e 73 20 69 73 20 61 6e 20  pressions is an 
e2c0: 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61  IPK column on ta
e2d0: 62 6c 65 20 69 42 61 73 65 2c 20 74 68 65 6e 20  ble iBase, then 
e2e0: 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74 72 75  return .  ** tru
e2f0: 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28 70 2d  e. Note: The (p-
e300: 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 29 20  >iTable==iBase) 
e310: 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 65 73  part of this tes
e320: 74 20 6d 61 79 20 62 65 20 66 61 6c 73 65 20 69  t may be false i
e330: 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  f the.  ** curre
e340: 6e 74 20 53 45 4c 45 43 54 20 69 73 20 61 20 63  nt SELECT is a c
e350: 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d 71 75  orrelated sub-qu
e360: 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ery..  */.  for(
e370: 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e 63 74  i=0; i<pDistinct
e380: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
e390: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 44 69     Expr *p = pDi
e3a0: 73 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45 78  stinct->a[i].pEx
e3b0: 70 72 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f  pr;.    if( p->o
e3c0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
e3d0: 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65  p->iTable==iBase
e3e0: 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30   && p->iColumn<0
e3f0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
e400: 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f  ..  /* Loop thro
e410: 75 67 68 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ugh all indices 
e420: 6f 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 63 68  on the table, ch
e430: 65 63 6b 69 6e 67 20 65 61 63 68 20 74 6f 20 73  ecking each to s
e440: 65 65 20 69 66 20 69 74 20 6d 61 6b 65 73 0a 20  ee if it makes. 
e450: 20 2a 2a 20 74 68 65 20 44 49 53 54 49 4e 43 54   ** the DISTINCT
e460: 20 71 75 61 6c 69 66 69 65 72 20 72 65 64 75 6e   qualifier redun
e470: 64 61 6e 74 2e 20 49 74 20 64 6f 65 73 20 73 6f  dant. It does so
e480: 20 69 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   if:.  **.  **  
e490: 20 31 2e 20 54 68 65 20 69 6e 64 65 78 20 69 73   1. The index is
e4a0: 20 69 74 73 65 6c 66 20 55 4e 49 51 55 45 2c 20   itself UNIQUE, 
e4b0: 61 6e 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  and.  **.  **   
e4c0: 32 2e 20 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f  2. All of the co
e4d0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64  lumns in the ind
e4e0: 65 78 20 61 72 65 20 65 69 74 68 65 72 20 70 61  ex are either pa
e4f0: 72 74 20 6f 66 20 74 68 65 20 70 44 69 73 74 69  rt of the pDisti
e500: 6e 63 74 0a 20 20 2a 2a 20 20 20 20 20 20 6c 69  nct.  **      li
e510: 73 74 2c 20 6f 72 20 65 6c 73 65 20 74 68 65 20  st, or else the 
e520: 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
e530: 74 61 69 6e 73 20 61 20 74 65 72 6d 20 6f 66 20  tains a term of 
e540: 74 68 65 20 66 6f 72 6d 20 22 63 6f 6c 3d 58 22  the form "col=X"
e550: 2c 0a 20 20 2a 2a 20 20 20 20 20 20 77 68 65 72  ,.  **      wher
e560: 65 20 58 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  e X is a constan
e570: 74 20 76 61 6c 75 65 2e 20 54 68 65 20 63 6f 6c  t value. The col
e580: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73  lation sequences
e590: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 20 20 20   of the.  **    
e5a0: 20 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 6e 64    comparison and
e5b0: 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 65 78 70   select-list exp
e5c0: 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 6d 61  ressions must ma
e5d0: 74 63 68 20 74 68 6f 73 65 20 6f 66 20 74 68 65  tch those of the
e5e0: 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a   index..  **.  *
e5f0: 2a 20 20 20 33 2e 20 41 6c 6c 20 6f 66 20 74 68  *   3. All of th
e600: 6f 73 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  ose index column
e610: 73 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  s for which the 
e620: 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 6f 65  WHERE clause doe
e630: 73 20 6e 6f 74 0a 20 20 2a 2a 20 20 20 20 20 20  s not.  **      
e640: 63 6f 6e 74 61 69 6e 20 61 20 22 63 6f 6c 3d 58  contain a "col=X
e650: 22 20 74 65 72 6d 20 61 72 65 20 73 75 62 6a 65  " term are subje
e660: 63 74 20 74 6f 20 61 20 4e 4f 54 20 4e 55 4c 4c  ct to a NOT NULL
e670: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a   constraint..  *
e680: 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61  /.  for(pIdx=pTa
e690: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
e6a0: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
e6b0: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 64 78  t){.    if( pIdx
e6c0: 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f  ->onError==OE_No
e6d0: 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ne ) continue;. 
e6e0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
e6f0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  dx->nColumn; i++
e700: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  ){.      int iCo
e710: 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  l = pIdx->aiColu
e720: 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  mn[i];.      if(
e730: 20 30 3d 3d 66 69 6e 64 54 65 72 6d 28 70 57 43   0==findTerm(pWC
e740: 2c 20 69 42 61 73 65 2c 20 69 43 6f 6c 2c 20 7e  , iBase, iCol, ~
e750: 28 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45  (Bitmask)0, WO_E
e760: 51 2c 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20  Q, pIdx) ){.    
e770: 20 20 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 20      int iIdxCol 
e780: 3d 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70  = findIndexCol(p
e790: 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74  Parse, pDistinct
e7a0: 2c 20 69 42 61 73 65 2c 20 70 49 64 78 2c 20 69  , iBase, pIdx, i
e7b0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
e7c0: 49 64 78 43 6f 6c 3c 30 20 7c 7c 20 70 54 61 62  IdxCol<0 || pTab
e7d0: 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43  ->aCol[pIdx->aiC
e7e0: 6f 6c 75 6d 6e 5b 69 5d 5d 2e 6e 6f 74 4e 75 6c  olumn[i]].notNul
e7f0: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l==0 ){.        
e800: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
e810: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
e820: 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 49 64 78  .    if( i==pIdx
e830: 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->nColumn ){.   
e840: 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78     /* This index
e850: 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68   implies that th
e860: 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69  e DISTINCT quali
e870: 66 69 65 72 20 69 73 20 72 65 64 75 6e 64 61 6e  fier is redundan
e880: 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  t. */.      retu
e890: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
e8a0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
e8b0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
e8c0: 6e 65 20 64 65 63 69 64 65 73 20 69 66 20 70 49  ne decides if pI
e8d0: 64 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  dx can be used t
e8e0: 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52  o satisfy the OR
e8f0: 44 45 52 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65  DER BY.** clause
e900: 2e 20 20 49 66 20 69 74 20 63 61 6e 2c 20 69 74  .  If it can, it
e910: 20 72 65 74 75 72 6e 73 20 31 2e 20 20 49 66 20   returns 1.  If 
e920: 70 49 64 78 20 63 61 6e 6e 6f 74 20 73 61 74 69  pIdx cannot sati
e930: 73 66 79 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52  sfy the.** ORDER
e940: 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 69 73   BY clause, this
e950: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
e960: 20 30 2e 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72   0..**.** pOrder
e970: 42 79 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  By is an ORDER B
e980: 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 61 20  Y clause from a 
e990: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
e9a0: 2e 20 20 70 54 61 62 20 69 73 20 74 68 65 0a 2a  .  pTab is the.*
e9b0: 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c  * left-most tabl
e9c0: 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
e9d0: 61 75 73 65 20 6f 66 20 74 68 61 74 20 73 61 6d  ause of that sam
e9e0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
e9f0: 6e 74 20 61 6e 64 0a 2a 2a 20 74 68 65 20 74 61  nt and.** the ta
ea00: 62 6c 65 20 68 61 73 20 61 20 63 75 72 73 6f 72  ble has a cursor
ea10: 20 6e 75 6d 62 65 72 20 6f 66 20 22 62 61 73 65   number of "base
ea20: 22 2e 20 20 70 49 64 78 20 69 73 20 61 6e 20 69  ".  pIdx is an i
ea30: 6e 64 65 78 20 6f 6e 20 70 54 61 62 2e 0a 2a 2a  ndex on pTab..**
ea40: 0a 2a 2a 20 6e 45 71 43 6f 6c 20 69 73 20 74 68  .** nEqCol is th
ea50: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
ea60: 6d 6e 73 20 6f 66 20 70 49 64 78 20 74 68 61 74  mns of pIdx that
ea70: 20 61 72 65 20 75 73 65 64 20 61 73 20 65 71 75   are used as equ
ea80: 61 6c 69 74 79 0a 2a 2a 20 63 6f 6e 73 74 72 61  ality.** constra
ea90: 69 6e 74 73 2e 20 20 41 6e 79 20 6f 66 20 74 68  ints.  Any of th
eaa0: 65 73 65 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20  ese columns may 
eab0: 62 65 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20  be missing from 
eac0: 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20  the ORDER BY.** 
ead0: 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 6d  clause and the m
eae0: 61 74 63 68 20 63 61 6e 20 73 74 69 6c 6c 20 62  atch can still b
eaf0: 65 20 61 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a  e a success..**.
eb00: 2a 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20  ** All terms of 
eb10: 74 68 65 20 4f 52 44 45 52 20 42 59 20 74 68 61  the ORDER BY tha
eb20: 74 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20  t match against 
eb30: 74 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62  the index must b
eb40: 65 20 65 69 74 68 65 72 0a 2a 2a 20 41 53 43 20  e either.** ASC 
eb50: 6f 72 20 44 45 53 43 2e 20 20 28 54 65 72 6d 73  or DESC.  (Terms
eb60: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
eb70: 20 63 6c 61 75 73 65 20 70 61 73 74 20 74 68 65   clause past the
eb80: 20 65 6e 64 20 6f 66 20 61 20 55 4e 49 51 55 45   end of a UNIQUE
eb90: 0a 2a 2a 20 69 6e 64 65 78 20 64 6f 20 6e 6f 74  .** index do not
eba0: 20 6e 65 65 64 20 74 6f 20 73 61 74 69 73 66 79   need to satisfy
ebb0: 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
ebc0: 2e 29 20 20 54 68 65 20 2a 70 62 52 65 76 20 76  .)  The *pbRev v
ebd0: 61 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74 20 74  alue is.** set t
ebe0: 6f 20 31 20 69 66 20 74 68 65 20 4f 52 44 45 52  o 1 if the ORDER
ebf0: 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c   BY clause is al
ec00: 6c 20 44 45 53 43 20 61 6e 64 20 69 74 20 69 73  l DESC and it is
ec10: 20 73 65 74 20 74 6f 20 30 20 69 66 0a 2a 2a 20   set to 0 if.** 
ec20: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
ec30: 75 73 65 20 69 73 20 61 6c 6c 20 41 53 43 2e 0a  use is all ASC..
ec40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
ec50: 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 0a 20 20  SortingIndex(.  
ec60: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
ec70: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
ec80: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
ec90: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
eca0: 61 73 6b 53 65 74 2c 20 2f 2a 20 4d 61 70 70 69  askSet, /* Mappi
ecb0: 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65 20 63 75  ng from table cu
ecc0: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 74 6f 20  rsor numbers to 
ecd0: 62 69 74 6d 61 70 73 20 2a 2f 0a 20 20 49 6e 64  bitmaps */.  Ind
ece0: 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20  ex *pIdx,       
ecf0: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
ed00: 78 20 77 65 20 61 72 65 20 74 65 73 74 69 6e 67  x we are testing
ed10: 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65 2c 20   */.  int base, 
ed20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ed30: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   Cursor number f
ed40: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  or the table to 
ed50: 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 45  be sorted */.  E
ed60: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
ed70: 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  y,     /* The OR
ed80: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
ed90: 0a 20 20 69 6e 74 20 6e 45 71 43 6f 6c 2c 20 20  .  int nEqCol,  
eda0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
edb0: 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 20 63 6f  mber of index co
edc0: 6c 75 6d 6e 73 20 77 69 74 68 20 3d 3d 20 63 6f  lumns with == co
edd0: 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 69  nstraints */.  i
ede0: 6e 74 20 77 73 46 6c 61 67 73 2c 20 20 20 20 20  nt wsFlags,     
edf0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
ee00: 75 73 61 67 65 73 20 66 6c 61 67 73 20 2a 2f 0a  usages flags */.
ee10: 20 20 69 6e 74 20 2a 70 62 52 65 76 20 20 20 20    int *pbRev    
ee20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
ee30: 20 74 6f 20 31 20 69 66 20 4f 52 44 45 52 20 42   to 1 if ORDER B
ee40: 59 20 69 73 20 44 45 53 43 20 2a 2f 0a 29 7b 0a  Y is DESC */.){.
ee50: 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
ee60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee70: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
ee80: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74  rs */.  int sort
ee90: 4f 72 64 65 72 20 3d 20 30 3b 20 20 20 20 20 20  Order = 0;      
eea0: 20 20 20 20 20 20 20 20 2f 2a 20 58 4f 52 20 6f          /* XOR o
eeb0: 66 20 69 6e 64 65 78 20 61 6e 64 20 4f 52 44 45  f index and ORDE
eec0: 52 20 42 59 20 73 6f 72 74 20 64 69 72 65 63 74  R BY sort direct
eed0: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65  ion */.  int nTe
eee0: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
eef0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
ef00: 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74  er of ORDER BY t
ef10: 65 72 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  erms */.  struct
ef20: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
ef30: 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20 41 20 74  pTerm;    /* A t
ef40: 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52  erm of the ORDER
ef50: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
ef60: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
ef70: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
ef80: 20 21 70 4f 72 64 65 72 42 79 20 29 20 72 65 74   !pOrderBy ) ret
ef90: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 77 73 46  urn 0;.  if( wsF
efa0: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
efb0: 55 4d 4e 5f 49 4e 20 29 20 72 65 74 75 72 6e 20  UMN_IN ) return 
efc0: 30 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 62  0;.  if( pIdx->b
efd0: 55 6e 6f 72 64 65 72 65 64 20 29 20 72 65 74 75  Unordered ) retu
efe0: 72 6e 20 30 3b 0a 0a 20 20 6e 54 65 72 6d 20 3d  rn 0;..  nTerm =
eff0: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
f000: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 72  ;.  assert( nTer
f010: 6d 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 72 67  m>0 );..  /* Arg
f020: 75 6d 65 6e 74 20 70 49 64 78 20 6d 75 73 74 20  ument pIdx must 
f030: 65 69 74 68 65 72 20 70 6f 69 6e 74 20 74 6f 20  either point to 
f040: 61 20 27 72 65 61 6c 27 20 6e 61 6d 65 64 20 69  a 'real' named i
f050: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2c 20  ndex structure, 
f060: 0a 20 20 2a 2a 20 6f 72 20 61 6e 20 69 6e 64 65  .  ** or an inde
f070: 78 20 73 74 72 75 63 74 75 72 65 20 61 6c 6c 6f  x structure allo
f080: 63 61 74 65 64 20 6f 6e 20 74 68 65 20 73 74 61  cated on the sta
f090: 63 6b 20 62 79 20 62 65 73 74 42 74 72 65 65 49  ck by bestBtreeI
f0a0: 6e 64 65 78 28 29 20 74 6f 0a 20 20 2a 2a 20 72  ndex() to.  ** r
f0b0: 65 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77  epresent the row
f0c0: 69 64 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  id index that is
f0d0: 20 70 61 72 74 20 6f 66 20 65 76 65 72 79 20 74   part of every t
f0e0: 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65  able.  */.  asse
f0f0: 72 74 28 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20  rt( pIdx->zName 
f100: 7c 7c 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  || (pIdx->nColum
f110: 6e 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e 61 69  n==1 && pIdx->ai
f120: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 2d 31 29 20 29  Column[0]==-1) )
f130: 3b 0a 0a 20 20 2f 2a 20 4d 61 74 63 68 20 74 65  ;..  /* Match te
f140: 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
f150: 20 42 59 20 63 6c 61 75 73 65 20 61 67 61 69 6e   BY clause again
f160: 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20  st columns of.  
f170: 2a 2a 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  ** the index..  
f180: 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  **.  ** Note tha
f190: 74 20 69 6e 64 69 63 65 73 20 68 61 76 65 20 70  t indices have p
f1a0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 72 65 67  Idx->nColumn reg
f1b0: 75 6c 61 72 20 63 6f 6c 75 6d 6e 73 20 70 6c 75  ular columns plu
f1c0: 73 0a 20 20 2a 2a 20 6f 6e 65 20 61 64 64 69 74  s.  ** one addit
f1d0: 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20 63 6f 6e  ional column con
f1e0: 74 61 69 6e 69 6e 67 20 74 68 65 20 72 6f 77 69  taining the rowi
f1f0: 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 63 6f  d.  The rowid co
f200: 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65  lumn.  ** of the
f210: 20 69 6e 64 65 78 20 69 73 20 61 6c 73 6f 20 61   index is also a
f220: 6c 6c 6f 77 65 64 20 74 6f 20 6d 61 74 63 68 20  llowed to match 
f230: 61 67 61 69 6e 73 74 20 74 68 65 20 4f 52 44 45  against the ORDE
f240: 52 20 42 59 0a 20 20 2a 2a 20 63 6c 61 75 73 65  R BY.  ** clause
f250: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6a  ..  */.  for(i=j
f260: 3d 30 2c 20 70 54 65 72 6d 3d 70 4f 72 64 65 72  =0, pTerm=pOrder
f270: 42 79 2d 3e 61 3b 20 6a 3c 6e 54 65 72 6d 20 26  By->a; j<nTerm &
f280: 26 20 69 3c 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75  & i<=pIdx->nColu
f290: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  mn; i++){.    Ex
f2a0: 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20  pr *pExpr;      
f2b0: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
f2c0: 6f 6e 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  on of the ORDER 
f2d0: 42 59 20 70 54 65 72 6d 20 2a 2f 0a 20 20 20 20  BY pTerm */.    
f2e0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
f2f0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74     /* The collat
f300: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ing sequence of 
f310: 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 69 6e 74  pExpr */.    int
f320: 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 3b 20   termSortOrder; 
f330: 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 66 6f  /* Sort order fo
f340: 72 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20  r this term */. 
f350: 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20     int iColumn; 
f360: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74        /* The i-t
f370: 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  h column of the 
f380: 69 6e 64 65 78 2e 20 20 2d 31 20 66 6f 72 20 72  index.  -1 for r
f390: 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  owid */.    int 
f3a0: 69 53 6f 72 74 4f 72 64 65 72 3b 20 20 20 20 2f  iSortOrder;    /
f3b0: 2a 20 31 20 66 6f 72 20 44 45 53 43 2c 20 30 20  * 1 for DESC, 0 
f3c0: 66 6f 72 20 41 53 43 20 6f 6e 20 74 68 65 20 69  for ASC on the i
f3d0: 2d 74 68 20 69 6e 64 65 78 20 74 65 72 6d 20 2a  -th index term *
f3e0: 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  /.    const char
f3f0: 20 2a 7a 43 6f 6c 6c 3b 20 2f 2a 20 4e 61 6d 65   *zColl; /* Name
f400: 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e   of the collatin
f410: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 69  g sequence for i
f420: 2d 74 68 20 69 6e 64 65 78 20 74 65 72 6d 20 2a  -th index term *
f430: 2f 0a 0a 20 20 20 20 70 45 78 70 72 20 3d 20 70  /..    pExpr = p
f440: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
f450: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
f460: 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78  TK_COLUMN || pEx
f470: 70 72 2d 3e 69 54 61 62 6c 65 21 3d 62 61 73 65  pr->iTable!=base
f480: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 6e   ){.      /* Can
f490: 20 6e 6f 74 20 75 73 65 20 61 6e 20 69 6e 64 65   not use an inde
f4a0: 78 20 73 6f 72 74 20 6f 6e 20 61 6e 79 74 68 69  x sort on anythi
f4b0: 6e 67 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61  ng that is not a
f4c0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 0a 20   column in the. 
f4d0: 20 20 20 20 20 2a 2a 20 6c 65 66 74 2d 6d 6f 73       ** left-mos
f4e0: 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 46  t table of the F
f4f0: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
f500: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f510: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
f520: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
f530: 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a  pParse, pExpr);.
f540: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
f550: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  {.      pColl = 
f560: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
f570: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64     }.    if( pId
f580: 78 2d 3e 7a 4e 61 6d 65 20 26 26 20 69 3c 70 49  x->zName && i<pI
f590: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  dx->nColumn ){. 
f5a0: 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70       iColumn = p
f5b0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
f5c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
f5d0: 75 6d 6e 3d 3d 70 49 64 78 2d 3e 70 54 61 62 6c  umn==pIdx->pTabl
f5e0: 65 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20  e->iPKey ){.    
f5f0: 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31      iColumn = -1
f600: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f610: 69 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 49 64  iSortOrder = pId
f620: 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  x->aSortOrder[i]
f630: 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20  ;.      zColl = 
f640: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b  pIdx->azColl[i];
f650: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f660: 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a    iColumn = -1;.
f670: 20 20 20 20 20 20 69 53 6f 72 74 4f 72 64 65 72        iSortOrder
f680: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 43 6f 6c   = 0;.      zCol
f690: 6c 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  l = pColl->zName
f6a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f6b0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  pExpr->iColumn!=
f6c0: 69 43 6f 6c 75 6d 6e 20 7c 7c 20 73 71 6c 69 74  iColumn || sqlit
f6d0: 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d  e3StrICmp(pColl-
f6e0: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29  >zName, zColl) )
f6f0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20  {.      /* Term 
f700: 6a 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  j of the ORDER B
f710: 59 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f  Y clause does no
f720: 74 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 69  t match column i
f730: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   of the index */
f740: 0a 20 20 20 20 20 20 69 66 28 20 69 3c 6e 45 71  .      if( i<nEq
f750: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  Col ){.        /
f760: 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63 6f  * If an index co
f770: 6c 75 6d 6e 20 74 68 61 74 20 69 73 20 63 6f 6e  lumn that is con
f780: 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 20 66  strained by == f
f790: 61 69 6c 73 20 74 6f 20 6d 61 74 63 68 20 61 6e  ails to match an
f7a0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45  .        ** ORDE
f7b0: 52 20 42 59 20 74 65 72 6d 2c 20 74 68 61 74 20  R BY term, that 
f7c0: 69 73 20 4f 4b 2e 20 20 4a 75 73 74 20 69 67 6e  is OK.  Just ign
f7d0: 6f 72 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  ore that column 
f7e0: 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20  of the index.   
f7f0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
f800: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
f810: 7d 65 6c 73 65 20 69 66 28 20 69 3d 3d 70 49 64  }else if( i==pId
f820: 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  x->nColumn ){.  
f830: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 63        /* Index c
f840: 6f 6c 75 6d 6e 20 69 20 69 73 20 74 68 65 20 72  olumn i is the r
f850: 6f 77 69 64 2e 20 20 41 6c 6c 20 6f 74 68 65 72  owid.  All other
f860: 20 74 65 72 6d 73 20 6d 61 74 63 68 2e 20 2a 2f   terms match. */
f870: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
f880: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f890: 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 69 6e       /* If an in
f8a0: 64 65 78 20 63 6f 6c 75 6d 6e 20 66 61 69 6c 73  dex column fails
f8b0: 20 74 6f 20 6d 61 74 63 68 20 61 6e 64 20 69 73   to match and is
f8c0: 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65 64   not constrained
f8d0: 20 62 79 20 3d 3d 0a 20 20 20 20 20 20 20 20 2a   by ==.        *
f8e0: 2a 20 74 68 65 6e 20 74 68 65 20 69 6e 64 65 78  * then the index
f8f0: 20 63 61 6e 6e 6f 74 20 73 61 74 69 73 66 79 20   cannot satisfy 
f900: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6f 6e  the ORDER BY con
f910: 73 74 72 61 69 6e 74 2e 0a 20 20 20 20 20 20 20  straint..       
f920: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75   */.        retu
f930: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
f940: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
f950: 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
f960: 21 3d 30 20 7c 7c 20 69 43 6f 6c 75 6d 6e 3d 3d  !=0 || iColumn==
f970: 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  -1 );.    assert
f980: 28 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64  ( pTerm->sortOrd
f990: 65 72 3d 3d 30 20 7c 7c 20 70 54 65 72 6d 2d 3e  er==0 || pTerm->
f9a0: 73 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29 3b 0a  sortOrder==1 );.
f9b0: 20 20 20 20 61 73 73 65 72 74 28 20 69 53 6f 72      assert( iSor
f9c0: 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 69 53 6f  tOrder==0 || iSo
f9d0: 72 74 4f 72 64 65 72 3d 3d 31 20 29 3b 0a 20 20  rtOrder==1 );.  
f9e0: 20 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 20    termSortOrder 
f9f0: 3d 20 69 53 6f 72 74 4f 72 64 65 72 20 5e 20 70  = iSortOrder ^ p
fa00: 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b  Term->sortOrder;
fa10: 0a 20 20 20 20 69 66 28 20 69 3e 6e 45 71 43 6f  .    if( i>nEqCo
fa20: 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 74  l ){.      if( t
fa30: 65 72 6d 53 6f 72 74 4f 72 64 65 72 21 3d 73 6f  ermSortOrder!=so
fa40: 72 74 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 20  rtOrder ){.     
fa50: 20 20 20 2f 2a 20 49 6e 64 69 63 65 73 20 63 61     /* Indices ca
fa60: 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 69  n only be used i
fa70: 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20 74  f all ORDER BY t
fa80: 65 72 6d 73 20 70 61 73 74 20 74 68 65 0a 20 20  erms past the.  
fa90: 20 20 20 20 20 20 2a 2a 20 65 71 75 61 6c 69 74        ** equalit
faa0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  y constraints ar
fab0: 65 20 61 6c 6c 20 65 69 74 68 65 72 20 44 45 53  e all either DES
fac0: 43 20 6f 72 20 41 53 43 2e 20 2a 2f 0a 20 20 20  C or ASC. */.   
fad0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
fae0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
faf0: 7b 0a 20 20 20 20 20 20 73 6f 72 74 4f 72 64 65  {.      sortOrde
fb00: 72 20 3d 20 74 65 72 6d 53 6f 72 74 4f 72 64 65  r = termSortOrde
fb10: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b  r;.    }.    j++
fb20: 3b 0a 20 20 20 20 70 54 65 72 6d 2b 2b 3b 0a 20  ;.    pTerm++;. 
fb30: 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30     if( iColumn<0
fb40: 20 26 26 20 21 72 65 66 65 72 65 6e 63 65 73 4f   && !referencesO
fb50: 74 68 65 72 54 61 62 6c 65 73 28 70 4f 72 64 65  therTables(pOrde
fb60: 72 42 79 2c 20 70 4d 61 73 6b 53 65 74 2c 20 6a  rBy, pMaskSet, j
fb70: 2c 20 62 61 73 65 29 20 29 7b 0a 20 20 20 20 20  , base) ){.     
fb80: 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78   /* If the index
fb90: 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65  ed column is the
fba0: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 61 6e 64   primary key and
fbb0: 20 65 76 65 72 79 74 68 69 6e 67 20 6d 61 74 63   everything matc
fbc0: 68 65 73 0a 20 20 20 20 20 20 2a 2a 20 73 6f 20  hes.      ** so 
fbd0: 66 61 72 20 61 6e 64 20 6e 6f 6e 65 20 6f 66 20  far and none of 
fbe0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72  the ORDER BY ter
fbf0: 6d 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 20  ms to the right 
fc00: 72 65 66 65 72 65 6e 63 65 20 6f 74 68 65 72 0a  reference other.
fc10: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20        ** tables 
fc20: 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20 74 68 65  in the join, the
fc30: 6e 20 77 65 20 61 72 65 20 61 73 73 75 72 65 64  n we are assured
fc40: 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20   that the index 
fc50: 63 61 6e 20 62 65 20 75 73 65 64 20 0a 20 20 20  can be used .   
fc60: 20 20 20 2a 2a 20 74 6f 20 73 6f 72 74 20 62 65     ** to sort be
fc70: 63 61 75 73 65 20 74 68 65 20 70 72 69 6d 61 72  cause the primar
fc80: 79 20 6b 65 79 20 69 73 20 75 6e 69 71 75 65 20  y key is unique 
fc90: 61 6e 64 20 73 6f 20 6e 6f 6e 65 20 6f 66 20 74  and so none of t
fca0: 68 65 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a  he other.      *
fcb0: 2a 20 63 6f 6c 75 6d 6e 73 20 77 69 6c 6c 20 6d  * columns will m
fcc0: 61 6b 65 20 61 6e 79 20 64 69 66 66 65 72 65 6e  ake any differen
fcd0: 63 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ce.      */.    
fce0: 20 20 6a 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20    j = nTerm;.   
fcf0: 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 62 52 65 76   }.  }..  *pbRev
fd00: 20 3d 20 73 6f 72 74 4f 72 64 65 72 21 3d 30 3b   = sortOrder!=0;
fd10: 0a 20 20 69 66 28 20 6a 3e 3d 6e 54 65 72 6d 20  .  if( j>=nTerm 
fd20: 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 74 65  ){.    /* All te
fd30: 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
fd40: 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 63   BY clause are c
fd50: 6f 76 65 72 65 64 20 62 79 20 74 68 69 73 20 69  overed by this i
fd60: 6e 64 65 78 20 73 6f 0a 20 20 20 20 2a 2a 20 74  ndex so.    ** t
fd70: 68 69 73 20 69 6e 64 65 78 20 63 61 6e 20 62 65  his index can be
fd80: 20 75 73 65 64 20 66 6f 72 20 73 6f 72 74 69 6e   used for sortin
fd90: 67 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  g. */.    return
fda0: 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49   1;.  }.  if( pI
fdb0: 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  dx->onError!=OE_
fdc0: 4e 6f 6e 65 20 26 26 20 69 3d 3d 70 49 64 78 2d  None && i==pIdx-
fdd0: 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 26  >nColumn.      &
fde0: 26 20 28 77 73 46 6c 61 67 73 20 26 20 57 48 45  & (wsFlags & WHE
fdf0: 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 3d  RE_COLUMN_NULL)=
fe00: 3d 30 0a 20 20 20 20 20 20 26 26 20 21 72 65 66  =0.      && !ref
fe10: 65 72 65 6e 63 65 73 4f 74 68 65 72 54 61 62 6c  erencesOtherTabl
fe20: 65 73 28 70 4f 72 64 65 72 42 79 2c 20 70 4d 61  es(pOrderBy, pMa
fe30: 73 6b 53 65 74 2c 20 6a 2c 20 62 61 73 65 29 20  skSet, j, base) 
fe40: 0a 20 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e  .  ){.    Column
fe50: 20 2a 61 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 70   *aCol = pIdx->p
fe60: 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 0a 0a 20 20  Table->aCol;..  
fe70: 20 20 2f 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f    /* All terms o
fe80: 66 20 74 68 69 73 20 69 6e 64 65 78 20 6d 61 74  f this index mat
fe90: 63 68 20 73 6f 6d 65 20 70 72 65 66 69 78 20 6f  ch some prefix o
fea0: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
feb0: 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68  lause,.    ** th
fec0: 65 20 69 6e 64 65 78 20 69 73 20 55 4e 49 51 55  e index is UNIQU
fed0: 45 2c 20 61 6e 64 20 6e 6f 20 74 65 72 6d 73 20  E, and no terms 
fee0: 6f 6e 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74  on the tail of t
fef0: 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20  he ORDER BY.    
ff00: 2a 2a 20 72 65 66 65 72 20 74 6f 20 6f 74 68 65  ** refer to othe
ff10: 72 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f  r tables in a jo
ff20: 69 6e 2e 20 53 6f 2c 20 61 73 73 75 6d 69 6e 67  in. So, assuming
ff30: 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20   that the index 
ff40: 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 76  entries.    ** v
ff50: 69 73 69 74 65 64 20 63 6f 6e 74 61 69 6e 20 6e  isited contain n
ff60: 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74  o NULL values, t
ff70: 68 65 6e 20 74 68 69 73 20 69 6e 64 65 78 20 64  hen this index d
ff80: 65 6c 69 76 65 72 73 20 72 6f 77 73 20 69 6e 0a  elivers rows in.
ff90: 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75 69      ** the requi
ffa0: 72 65 64 20 6f 72 64 65 72 2e 0a 20 20 20 20 2a  red order..    *
ffb0: 2a 0a 20 20 20 20 2a 2a 20 49 74 20 69 73 20 6e  *.    ** It is n
ffc0: 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
ffd0: 61 6e 79 20 6f 66 20 74 68 65 20 66 69 72 73 74  any of the first
ffe0: 20 6e 45 71 43 6f 6c 20 69 6e 64 65 78 20 66 69   nEqCol index fi
fff0: 65 6c 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a  elds to be.    *
10000 2a 20 4e 55 4c 4c 20 28 73 69 6e 63 65 20 74 68  * NULL (since th
10010 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
10020 22 3d 22 20 6f 70 65 72 61 74 6f 72 20 69 6e 20  "=" operator in 
10030 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
10040 20 77 6f 75 6c 64 20 0a 20 20 20 20 2a 2a 20 6e   would .    ** n
10050 6f 74 20 62 65 20 74 72 75 65 29 2e 20 53 6f 20  ot be true). So 
10060 69 66 20 61 6c 6c 20 72 65 6d 61 69 6e 69 6e 67  if all remaining
10070 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 68   index columns h
10080 61 76 65 20 4e 4f 54 20 4e 55 4c 4c 20 0a 20 20  ave NOT NULL .  
10090 20 20 2a 2a 20 63 6f 6e 73 74 61 69 6e 74 73 20    ** constaints 
100a0 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 6d  attached to them
100b0 2c 20 77 65 20 63 61 6e 20 62 65 20 63 6f 6e 66  , we can be conf
100c0 69 64 65 6e 74 20 74 68 61 74 20 74 68 65 20 76  ident that the v
100d0 69 73 69 74 65 64 0a 20 20 20 20 2a 2a 20 69 6e  isited.    ** in
100e0 64 65 78 20 65 6e 74 72 69 65 73 20 61 72 65 20  dex entries are 
100f0 66 72 65 65 20 6f 66 20 4e 55 4c 4c 73 2e 20 20  free of NULLs.  
10100 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 6e 45 71  */.    for(i=nEq
10110 43 6f 6c 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f  Col; i<pIdx->nCo
10120 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
10130 20 20 69 66 28 20 61 43 6f 6c 5b 70 49 64 78 2d    if( aCol[pIdx-
10140 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 6e 6f  >aiColumn[i]].no
10150 74 4e 75 6c 6c 3d 3d 30 20 29 20 62 72 65 61 6b  tNull==0 ) break
10160 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
10170 72 6e 20 28 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f  rn (i==pIdx->nCo
10180 6c 75 6d 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74  lumn);.  }.  ret
10190 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
101a0 50 72 65 70 61 72 65 20 61 20 63 72 75 64 65 20  Prepare a crude 
101b0 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
101c0 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65  logarithm of the
101d0 20 69 6e 70 75 74 20 76 61 6c 75 65 2e 0a 2a 2a   input value..**
101e0 20 54 68 65 20 72 65 73 75 6c 74 73 20 6e 65 65   The results nee
101f0 64 20 6e 6f 74 20 62 65 20 65 78 61 63 74 2e 20  d not be exact. 
10200 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 75 73   This is only us
10210 65 64 20 66 6f 72 20 65 73 74 69 6d 61 74 69 6e  ed for estimatin
10220 67 0a 2a 2a 20 74 68 65 20 74 6f 74 61 6c 20 63  g.** the total c
10230 6f 73 74 20 6f 66 20 70 65 72 66 6f 72 6d 69 6e  ost of performin
10240 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 69 74  g operations wit
10250 68 20 4f 28 6c 6f 67 4e 29 20 6f 72 20 4f 28 4e  h O(logN) or O(N
10260 6c 6f 67 4e 29 0a 2a 2a 20 63 6f 6d 70 6c 65 78  logN).** complex
10270 69 74 79 2e 20 20 42 65 63 61 75 73 65 20 4e 20  ity.  Because N 
10280 69 73 20 6a 75 73 74 20 61 20 67 75 65 73 73 2c  is just a guess,
10290 20 69 74 20 69 73 20 6e 6f 20 67 72 65 61 74 20   it is no great 
102a0 74 72 61 67 65 64 79 20 69 66 0a 2a 2a 20 6c 6f  tragedy if.** lo
102b0 67 4e 20 69 73 20 61 20 6c 69 74 74 6c 65 20 6f  gN is a little o
102c0 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f  ff..*/.static do
102d0 75 62 6c 65 20 65 73 74 4c 6f 67 28 64 6f 75 62  uble estLog(doub
102e0 6c 65 20 4e 29 7b 0a 20 20 64 6f 75 62 6c 65 20  le N){.  double 
102f0 6c 6f 67 4e 20 3d 20 31 3b 0a 20 20 64 6f 75 62  logN = 1;.  doub
10300 6c 65 20 78 20 3d 20 31 30 3b 0a 20 20 77 68 69  le x = 10;.  whi
10310 6c 65 28 20 4e 3e 78 20 29 7b 0a 20 20 20 20 6c  le( N>x ){.    l
10320 6f 67 4e 20 2b 3d 20 31 3b 0a 20 20 20 20 78 20  ogN += 1;.    x 
10330 2a 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 72 65 74  *= 10;.  }.  ret
10340 75 72 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a 2f 2a 0a  urn logN;.}../*.
10350 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65 73 20  ** Two routines 
10360 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 74 68 65  for printing the
10370 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73   content of an s
10380 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
10390 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20  o.** structure. 
103a0 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   Used for testin
103b0 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
103c0 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74 68 65  only.  If neithe
103d0 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54  r.** SQLITE_TEST
103e0 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 42 55 47   or SQLITE_DEBUG
103f0 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20 74 68   are defined, th
10400 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65  en these routine
10410 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e  s.** are no-ops.
10420 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
10430 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
10440 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65  TUALTABLE) && de
10450 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
10460 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  UG).static void 
10470 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53  TRACE_IDX_INPUTS
10480 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69  (sqlite3_index_i
10490 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  nfo *p){.  int i
104a0 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
104b0 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65 74  WhereTrace ) ret
104c0 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
104d0 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  i<p->nConstraint
104e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
104f0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
10500 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d    constraint[%d]
10510 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d  : col=%d termid=
10520 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c 65 64  %d op=%d usabled
10530 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69  =%d\n",.       i
10540 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
10550 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75  straint[i].iColu
10560 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  mn,.       p->aC
10570 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65  onstraint[i].iTe
10580 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20  rmOffset,.      
10590 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
105a0 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d  i].op,.       p-
105b0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
105c0 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66  usable);.  }.  f
105d0 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72  or(i=0; i<p->nOr
105e0 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
105f0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
10600 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79 5b 25  ntf("  orderby[%
10610 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d  d]: col=%d desc=
10620 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c  %d\n",.       i,
10630 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65  .       p->aOrde
10640 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a  rBy[i].iColumn,.
10650 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72         p->aOrder
10660 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d  By[i].desc);.  }
10670 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54  .}.static void T
10680 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53  RACE_IDX_OUTPUTS
10690 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69  (sqlite3_index_i
106a0 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  nfo *p){.  int i
106b0 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
106c0 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65 74  WhereTrace ) ret
106d0 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
106e0 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  i<p->nConstraint
106f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
10700 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
10710 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61 72 67    usage[%d]: arg
10720 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c  vIdx=%d omit=%d\
10730 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20  n",.       i,.  
10740 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
10750 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  intUsage[i].argv
10760 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 70 2d  Index,.       p-
10770 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
10780 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a  e[i].omit);.  }.
10790 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
107a0 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d 3d 25  intf("  idxNum=%
107b0 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29  d\n", p->idxNum)
107c0 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
107d0 50 72 69 6e 74 66 28 22 20 20 69 64 78 53 74 72  Printf("  idxStr
107e0 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74  =%s\n", p->idxSt
107f0 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  r);.  sqlite3Deb
10800 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65  ugPrintf("  orde
10810 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e  rByConsumed=%d\n
10820 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  ", p->orderByCon
10830 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74 65  sumed);.  sqlite
10840 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
10850 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d 25 67  estimatedCost=%g
10860 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65  \n", p->estimate
10870 64 43 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73 65 0a  dCost);.}.#else.
10880 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44  #define TRACE_ID
10890 58 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65 66  X_INPUTS(A).#def
108a0 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f 55  ine TRACE_IDX_OU
108b0 54 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66 0a  TPUTS(A).#endif.
108c0 0a 2f 2a 20 0a 2a 2a 20 52 65 71 75 69 72 65 64  ./* .** Required
108d0 20 62 65 63 61 75 73 65 20 62 65 73 74 49 6e 64   because bestInd
108e0 65 78 28 29 20 69 73 20 63 61 6c 6c 65 64 20 62  ex() is called b
108f0 79 20 62 65 73 74 4f 72 43 6c 61 75 73 65 49 6e  y bestOrClauseIn
10900 64 65 78 28 29 20 0a 2a 2f 0a 73 74 61 74 69 63  dex() .*/.static
10910 20 76 6f 69 64 20 62 65 73 74 49 6e 64 65 78 28   void bestIndex(
10920 0a 20 20 20 20 50 61 72 73 65 2a 2c 20 57 68 65  .    Parse*, Whe
10930 72 65 43 6c 61 75 73 65 2a 2c 20 73 74 72 75 63  reClause*, struc
10940 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 2a 2c  t SrcList_item*,
10950 0a 20 20 20 20 42 69 74 6d 61 73 6b 2c 20 42 69  .    Bitmask, Bi
10960 74 6d 61 73 6b 2c 20 57 68 65 72 65 43 6f 73 74  tmask, WhereCost
10970 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  *);../*.** This 
10980 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
10990 20 74 6f 20 66 69 6e 64 20 61 6e 20 73 63 61 6e   to find an scan
109a0 6e 69 6e 67 20 73 74 72 61 74 65 67 79 20 74 68  ning strategy th
109b0 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 0a  at can be used .
109c0 2a 2a 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 61  ** to optimize a
109d0 6e 20 27 4f 52 27 20 65 78 70 72 65 73 73 69 6f  n 'OR' expressio
109e0 6e 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  n that is part o
109f0 66 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  f a WHERE clause
10a00 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62  . .**.** The tab
10a10 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
10a20 74 68 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  th FROM clause t
10a30 65 72 6d 20 70 53 72 63 20 6d 61 79 20 62 65 20  erm pSrc may be 
10a40 65 69 74 68 65 72 20 61 0a 2a 2a 20 72 65 67 75  either a.** regu
10a50 6c 61 72 20 42 2d 54 72 65 65 20 74 61 62 6c 65  lar B-Tree table
10a60 20 6f 72 20 61 20 76 69 72 74 75 61 6c 20 74 61   or a virtual ta
10a70 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ble..*/.static v
10a80 6f 69 64 20 62 65 73 74 4f 72 43 6c 61 75 73 65  oid bestOrClause
10a90 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
10aa0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
10ab0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
10ac0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
10ad0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
10ae0 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  C,           /* 
10af0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
10b00 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
10b10 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
10b20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
10b30 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61  ause term to sea
10b40 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  rch */.  Bitmask
10b50 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20   notReady,      
10b60 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
10b70 63 75 72 73 6f 72 73 20 6e 6f 74 20 61 76 61 69  cursors not avai
10b80 6c 61 62 6c 65 20 66 6f 72 20 69 6e 64 65 78 69  lable for indexi
10b90 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ng */.  Bitmask 
10ba0 6e 6f 74 56 61 6c 69 64 2c 20 20 20 20 20 20 20  notValid,       
10bb0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 6e      /* Cursors n
10bc0 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ot available for
10bd0 20 61 6e 79 20 70 75 72 70 6f 73 65 20 2a 2f 0a   any purpose */.
10be0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
10bf0 65 72 42 79 2c 20 20 20 20 20 20 20 20 20 2f 2a  erBy,         /*
10c00 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
10c10 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
10c20 6f 73 74 20 2a 70 43 6f 73 74 20 20 20 20 20 20  ost *pCost      
10c30 20 20 20 20 20 20 2f 2a 20 4c 6f 77 65 73 74 20        /* Lowest 
10c40 63 6f 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20  cost query plan 
10c50 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
10c60 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
10c70 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 63 6f 6e 73  IMIZATION.  cons
10c80 74 20 69 6e 74 20 69 43 75 72 20 3d 20 70 53 72  t int iCur = pSr
10c90 63 2d 3e 69 43 75 72 73 6f 72 3b 20 20 20 2f 2a  c->iCursor;   /*
10ca0 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74   The cursor of t
10cb0 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 61  he table to be a
10cc0 63 63 65 73 73 65 64 20 2a 2f 0a 20 20 63 6f 6e  ccessed */.  con
10cd0 73 74 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 53  st Bitmask maskS
10ce0 72 63 20 3d 20 67 65 74 4d 61 73 6b 28 70 57 43  rc = getMask(pWC
10cf0 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 69 43 75 72  ->pMaskSet, iCur
10d00 29 3b 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 66  );  /* Bitmask f
10d10 6f 72 20 70 53 72 63 20 2a 2f 0a 20 20 57 68 65  or pSrc */.  Whe
10d20 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70  reTerm * const p
10d30 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b  WCEnd = &pWC->a[
10d40 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 20 20 20 20  pWC->nTerm];    
10d50 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57      /* End of pW
10d60 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  C->a[] */.  Wher
10d70 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
10d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10d90 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   A single term o
10da0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
10db0 73 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  se */..  /* The 
10dc0 4f 52 2d 63 6c 61 75 73 65 20 6f 70 74 69 6d 69  OR-clause optimi
10dd0 7a 61 74 69 6f 6e 20 69 73 20 64 69 73 61 6c 6c  zation is disall
10de0 6f 77 65 64 20 69 66 20 74 68 65 20 49 4e 44 45  owed if the INDE
10df0 58 45 44 20 42 59 20 6f 72 0a 20 20 2a 2a 20 4e  XED BY or.  ** N
10e00 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73  OT INDEXED claus
10e10 65 73 20 61 72 65 20 75 73 65 64 20 6f 72 20 69  es are used or i
10e20 66 20 74 68 65 20 57 48 45 52 45 5f 41 4e 44 5f  f the WHERE_AND_
10e30 4f 4e 4c 59 20 62 69 74 20 69 73 20 73 65 74 2e  ONLY bit is set.
10e40 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e   */.  if( pSrc->
10e50 6e 6f 74 49 6e 64 65 78 65 64 20 7c 7c 20 70 53  notIndexed || pS
10e60 72 63 2d 3e 70 49 6e 64 65 78 21 3d 30 20 29 7b  rc->pIndex!=0 ){
10e70 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
10e80 0a 20 20 69 66 28 20 70 57 43 2d 3e 77 63 74 72  .  if( pWC->wctr
10e90 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  lFlags & WHERE_A
10ea0 4e 44 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 72  ND_ONLY ){.    r
10eb0 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
10ec0 20 53 65 61 72 63 68 20 74 68 65 20 57 48 45 52   Search the WHER
10ed0 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66  E clause terms f
10ee0 6f 72 20 61 20 75 73 61 62 6c 65 20 57 4f 5f 4f  or a usable WO_O
10ef0 52 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 66 6f 72  R term. */.  for
10f00 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70  (pTerm=pWC->a; p
10f10 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65  Term<pWCEnd; pTe
10f20 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  rm++){.    if( p
10f30 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  Term->eOperator=
10f40 3d 57 4f 5f 4f 52 20 0a 20 20 20 20 20 26 26 20  =WO_OR .     && 
10f50 28 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  ((pTerm->prereqA
10f60 6c 6c 20 26 20 7e 6d 61 73 6b 53 72 63 29 20 26  ll & ~maskSrc) &
10f70 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 0a 20 20   notReady)==0.  
10f80 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e     && (pTerm->u.
10f90 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62  pOrInfo->indexab
10fa0 6c 65 20 26 20 6d 61 73 6b 53 72 63 29 21 3d 30  le & maskSrc)!=0
10fb0 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 57   .    ){.      W
10fc0 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e  hereClause * con
10fd0 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65 72  st pOrWC = &pTer
10fe0 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63  m->u.pOrInfo->wc
10ff0 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  ;.      WhereTer
11000 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 45  m * const pOrWCE
11010 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70  nd = &pOrWC->a[p
11020 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20  OrWC->nTerm];.  
11030 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
11040 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e  OrTerm;.      in
11050 74 20 66 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  t flags = WHERE_
11060 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20  MULTI_OR;.      
11070 64 6f 75 62 6c 65 20 72 54 6f 74 61 6c 20 3d 20  double rTotal = 
11080 30 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20  0;.      double 
11090 6e 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 20 20  nRow = 0;.      
110a0 42 69 74 6d 61 73 6b 20 75 73 65 64 20 3d 20 30  Bitmask used = 0
110b0 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 4f 72  ;..      for(pOr
110c0 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70  Term=pOrWC->a; p
110d0 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b  OrTerm<pOrWCEnd;
110e0 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
110f0 20 20 20 20 20 57 68 65 72 65 43 6f 73 74 20 73       WhereCost s
11100 54 65 72 6d 43 6f 73 74 3b 0a 20 20 20 20 20 20  TermCost;.      
11110 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e    WHERETRACE((".
11120 2e 2e 20 4d 75 6c 74 69 2d 69 6e 64 65 78 20 4f  .. Multi-index O
11130 52 20 74 65 73 74 69 6e 67 20 66 6f 72 20 74 65  R testing for te
11140 72 6d 20 25 64 20 6f 66 20 25 64 2e 2e 2e 2e 5c  rm %d of %d....\
11150 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28  n", .          (
11160 70 4f 72 54 65 72 6d 20 2d 20 70 4f 72 57 43 2d  pOrTerm - pOrWC-
11170 3e 61 29 2c 20 28 70 54 65 72 6d 20 2d 20 70 57  >a), (pTerm - pW
11180 43 2d 3e 61 29 0a 20 20 20 20 20 20 20 20 29 29  C->a).        ))
11190 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
111a0 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
111b0 3d 3d 57 4f 5f 41 4e 44 20 29 7b 0a 20 20 20 20  ==WO_AND ){.    
111c0 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73        WhereClaus
111d0 65 20 2a 70 41 6e 64 57 43 20 3d 20 26 70 4f 72  e *pAndWC = &pOr
111e0 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f  Term->u.pAndInfo
111f0 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 20 20  ->wc;.          
11200 62 65 73 74 49 6e 64 65 78 28 70 50 61 72 73 65  bestIndex(pParse
11210 2c 20 70 41 6e 64 57 43 2c 20 70 53 72 63 2c 20  , pAndWC, pSrc, 
11220 6e 6f 74 52 65 61 64 79 2c 20 6e 6f 74 56 61 6c  notReady, notVal
11230 69 64 2c 20 26 73 54 65 72 6d 43 6f 73 74 29 3b  id, &sTermCost);
11240 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
11250 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  f( pOrTerm->left
11260 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a  Cursor==iCur ){.
11270 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 43            WhereC
11280 6c 61 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20  lause tempWC;.  
11290 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70          tempWC.p
112a0 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61  Parse = pWC->pPa
112b0 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 74  rse;.          t
112c0 65 6d 70 57 43 2e 70 4d 61 73 6b 53 65 74 20 3d  empWC.pMaskSet =
112d0 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a   pWC->pMaskSet;.
112e0 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
112f0 2e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20  .pOuter = pWC;. 
11300 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
11310 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20  op = TK_AND;.   
11320 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 61 20         tempWC.a 
11330 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20  = pOrTerm;.     
11340 20 20 20 20 20 74 65 6d 70 57 43 2e 77 63 74 72       tempWC.wctr
11350 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20  lFlags = 0;.    
11360 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6e 54 65        tempWC.nTe
11370 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rm = 1;.        
11380 20 20 62 65 73 74 49 6e 64 65 78 28 70 50 61 72    bestIndex(pPar
11390 73 65 2c 20 26 74 65 6d 70 57 43 2c 20 70 53 72  se, &tempWC, pSr
113a0 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e 6f 74  c, notReady, not
113b0 56 61 6c 69 64 2c 20 26 73 54 65 72 6d 43 6f 73  Valid, &sTermCos
113c0 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  t);.        }els
113d0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  e{.          con
113e0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
113f0 0a 20 20 20 20 20 20 20 20 72 54 6f 74 61 6c 20  .        rTotal 
11400 2b 3d 20 73 54 65 72 6d 43 6f 73 74 2e 72 43 6f  += sTermCost.rCo
11410 73 74 3b 0a 20 20 20 20 20 20 20 20 6e 52 6f 77  st;.        nRow
11420 20 2b 3d 20 73 54 65 72 6d 43 6f 73 74 2e 70 6c   += sTermCost.pl
11430 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20  an.nRow;.       
11440 20 75 73 65 64 20 7c 3d 20 73 54 65 72 6d 43 6f   used |= sTermCo
11450 73 74 2e 75 73 65 64 3b 0a 20 20 20 20 20 20 20  st.used;.       
11460 20 69 66 28 20 72 54 6f 74 61 6c 3e 3d 70 43 6f   if( rTotal>=pCo
11470 73 74 2d 3e 72 43 6f 73 74 20 29 20 62 72 65 61  st->rCost ) brea
11480 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
11490 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
114a0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
114b0 75 73 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68  use, increase th
114c0 65 20 73 63 61 6e 20 63 6f 73 74 20 74 6f 20 61  e scan cost to a
114d0 63 63 6f 75 6e 74 20 0a 20 20 20 20 20 20 2a 2a  ccount .      **
114e0 20 66 6f 72 20 74 68 65 20 63 6f 73 74 20 6f 66   for the cost of
114f0 20 74 68 65 20 73 6f 72 74 2e 20 2a 2f 0a 20 20   the sort. */.  
11500 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
11510 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 57  !=0 ){.        W
11520 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20  HERETRACE(("... 
11530 73 6f 72 74 69 6e 67 20 69 6e 63 72 65 61 73 65  sorting increase
11540 73 20 4f 52 20 63 6f 73 74 20 25 2e 39 67 20 74  s OR cost %.9g t
11550 6f 20 25 2e 39 67 5c 6e 22 2c 0a 20 20 20 20 20  o %.9g\n",.     
11560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
11570 54 6f 74 61 6c 2c 20 72 54 6f 74 61 6c 2b 6e 52  Total, rTotal+nR
11580 6f 77 2a 65 73 74 4c 6f 67 28 6e 52 6f 77 29 29  ow*estLog(nRow))
11590 29 3b 0a 20 20 20 20 20 20 20 20 72 54 6f 74 61  );.        rTota
115a0 6c 20 2b 3d 20 6e 52 6f 77 2a 65 73 74 4c 6f 67  l += nRow*estLog
115b0 28 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 7d 0a  (nRow);.      }.
115c0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
115d0 20 63 6f 73 74 20 6f 66 20 73 63 61 6e 6e 69 6e   cost of scannin
115e0 67 20 75 73 69 6e 67 20 74 68 69 73 20 4f 52 20  g using this OR 
115f0 74 65 72 6d 20 66 6f 72 20 6f 70 74 69 6d 69 7a  term for optimiz
11600 61 74 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a  ation is.      *
11610 2a 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  * less than the 
11620 63 75 72 72 65 6e 74 20 63 6f 73 74 20 73 74 6f  current cost sto
11630 72 65 64 20 69 6e 20 70 43 6f 73 74 2c 20 72 65  red in pCost, re
11640 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65 6e  place the conten
11650 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70  ts.      ** of p
11660 43 6f 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 57  Cost. */.      W
11670 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20  HERETRACE(("... 
11680 6d 75 6c 74 69 2d 69 6e 64 65 78 20 4f 52 20 63  multi-index OR c
11690 6f 73 74 3d 25 2e 39 67 20 6e 72 6f 77 3d 25 2e  ost=%.9g nrow=%.
116a0 39 67 5c 6e 22 2c 20 72 54 6f 74 61 6c 2c 20 6e  9g\n", rTotal, n
116b0 52 6f 77 29 29 3b 0a 20 20 20 20 20 20 69 66 28  Row));.      if(
116c0 20 72 54 6f 74 61 6c 3c 70 43 6f 73 74 2d 3e 72   rTotal<pCost->r
116d0 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Cost ){.        
116e0 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20 72  pCost->rCost = r
116f0 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 20 20 70  Total;.        p
11700 43 6f 73 74 2d 3e 75 73 65 64 20 3d 20 75 73 65  Cost->used = use
11710 64 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74  d;.        pCost
11720 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 6e 52  ->plan.nRow = nR
11730 6f 77 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 73  ow;.        pCos
11740 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  t->plan.wsFlags 
11750 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20  = flags;.       
11760 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70   pCost->plan.u.p
11770 54 65 72 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  Term = pTerm;.  
11780 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
11790 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
117a0 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
117b0 41 54 49 4f 4e 20 2a 2f 0a 7d 0a 0a 23 69 66 6e  ATION */.}..#ifn
117c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
117d0 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
117e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
117f0 45 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63  E if the WHERE c
11800 6c 61 75 73 65 20 74 65 72 6d 20 70 54 65 72 6d  lause term pTerm
11810 20 69 73 20 6f 66 20 61 20 66 6f 72 6d 20 77 68   is of a form wh
11820 65 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20  ere it.** could 
11830 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20  be used with an 
11840 69 6e 64 65 78 20 74 6f 20 61 63 63 65 73 73 20  index to access 
11850 70 53 72 63 2c 20 61 73 73 75 6d 69 6e 67 20 61  pSrc, assuming a
11860 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  n appropriate.**
11870 20 69 6e 64 65 78 20 65 78 69 73 74 65 64 2e 0a   index existed..
11880 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
11890 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28  rmCanDriveIndex(
118a0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
118b0 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
118c0 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73    /* WHERE claus
118d0 65 20 74 65 72 6d 20 74 6f 20 63 68 65 63 6b 20  e term to check 
118e0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
118f0 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
11900 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 77 65 20      /* Table we 
11910 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 61 63  are trying to ac
11920 63 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  cess */.  Bitmas
11930 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 20  k notReady      
11940 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
11950 65 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70  es in outer loop
11960 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  s of the join */
11970 0a 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a  .){.  char aff;.
11980 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
11990 74 43 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69  tCursor!=pSrc->i
119a0 43 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20  Cursor ) return 
119b0 30 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  0;.  if( pTerm->
119c0 65 4f 70 65 72 61 74 6f 72 21 3d 57 4f 5f 45 51  eOperator!=WO_EQ
119d0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
119e0 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
119f0 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64  qRight & notRead
11a00 79 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30  y)!=0 ) return 0
11a10 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63 2d 3e  ;.  aff = pSrc->
11a20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d  pTab->aCol[pTerm
11a30 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e  ->u.leftColumn].
11a40 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66 28 20  affinity;.  if( 
11a50 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66  !sqlite3IndexAff
11a60 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70  inityOk(pTerm->p
11a70 45 78 70 72 2c 20 61 66 66 29 20 29 20 72 65 74  Expr, aff) ) ret
11a80 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
11a90 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  1;.}.#endif..#if
11aa0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11ab0 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
11ac0 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 71 75  ./*.** If the qu
11ad0 65 72 79 20 70 6c 61 6e 20 66 6f 72 20 70 53 72  ery plan for pSr
11ae0 63 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 70  c specified in p
11af0 43 6f 73 74 20 69 73 20 61 20 66 75 6c 6c 20 74  Cost is a full t
11b00 61 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 61 6e 64  able scan.** and
11b10 20 69 6e 64 65 78 69 6e 67 20 69 73 20 61 6c 6c   indexing is all
11b20 6f 77 73 20 28 69 66 20 74 68 65 72 65 20 69 73  ows (if there is
11b30 20 6e 6f 20 4e 4f 54 20 49 4e 44 45 58 45 44 20   no NOT INDEXED 
11b40 63 6c 61 75 73 65 29 20 61 6e 64 20 69 74 0a 2a  clause) and it.*
11b50 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 6f  * possible to co
11b60 6e 73 74 72 75 63 74 20 61 20 74 72 61 6e 73 69  nstruct a transi
11b70 65 6e 74 20 69 6e 64 65 78 20 74 68 61 74 20 77  ent index that w
11b80 6f 75 6c 64 20 70 65 72 66 6f 72 6d 20 62 65 74  ould perform bet
11b90 74 65 72 0a 2a 2a 20 74 68 61 6e 20 61 20 66 75  ter.** than a fu
11ba0 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 65 76  ll table scan ev
11bb0 65 6e 20 77 68 65 6e 20 74 68 65 20 63 6f 73 74  en when the cost
11bc0 20 6f 66 20 63 6f 6e 73 74 72 75 63 74 69 6e 67   of constructing
11bd0 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 69 73   the index.** is
11be0 20 74 61 6b 65 6e 20 69 6e 74 6f 20 61 63 63 6f   taken into acco
11bf0 75 6e 74 2c 20 74 68 65 6e 20 61 6c 74 65 72 20  unt, then alter 
11c00 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20 74  the query plan t
11c10 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 74 72 61  o use the.** tra
11c20 6e 73 69 65 6e 74 20 69 6e 64 65 78 2e 0a 2a 2f  nsient index..*/
11c30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65 73  .static void bes
11c40 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28  tAutomaticIndex(
11c50 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
11c60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
11c70 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
11c80 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
11c90 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
11ca0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
11cb0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
11cc0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
11cd0 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54  tem *pSrc,  /* T
11ce0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
11cf0 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  erm to search */
11d00 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
11d10 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ady,           /
11d20 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72  * Mask of cursor
11d30 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61  s that are not a
11d40 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68  vailable */.  Wh
11d50 65 72 65 43 6f 73 74 20 2a 70 43 6f 73 74 20 20  ereCost *pCost  
11d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77            /* Low
11d70 65 73 74 20 63 6f 73 74 20 71 75 65 72 79 20 70  est cost query p
11d80 6c 61 6e 20 2a 2f 0a 29 7b 0a 20 20 64 6f 75 62  lan */.){.  doub
11d90 6c 65 20 6e 54 61 62 6c 65 52 6f 77 3b 20 20 20  le nTableRow;   
11da0 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20          /* Rows 
11db0 69 6e 20 74 68 65 20 69 6e 70 75 74 20 74 61 62  in the input tab
11dc0 6c 65 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6c  le */.  double l
11dd0 6f 67 4e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ogN;            
11de0 20 20 20 20 2f 2a 20 6c 6f 67 28 6e 54 61 62 6c      /* log(nTabl
11df0 65 52 6f 77 29 20 2a 2f 0a 20 20 64 6f 75 62 6c  eRow) */.  doubl
11e00 65 20 63 6f 73 74 54 65 6d 70 49 64 78 3b 20 20  e costTempIdx;  
11e10 20 20 20 20 20 20 20 2f 2a 20 70 65 72 2d 71 75         /* per-qu
11e20 65 72 79 20 63 6f 73 74 20 6f 66 20 74 68 65 20  ery cost of the 
11e30 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20  transient index 
11e40 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
11e50 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
11e60 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72   /* A single ter
11e70 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
11e80 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
11e90 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20  Term *pWCEnd;   
11ea0 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
11eb0 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 54   pWC->a[] */.  T
11ec0 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20 20  able *pTable;   
11ed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
11ee0 62 6c 65 20 74 68 74 20 6d 69 67 68 74 20 62 65  ble tht might be
11ef0 20 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 69   indexed */..  i
11f00 66 28 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72  f( pParse->nQuer
11f10 79 4c 6f 6f 70 3c 3d 28 64 6f 75 62 6c 65 29 31  yLoop<=(double)1
11f20 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65   ){.    /* There
11f30 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20   is no point in 
11f40 62 75 69 6c 64 69 6e 67 20 61 6e 20 61 75 74 6f  building an auto
11f50 6d 61 74 69 63 20 69 6e 64 65 78 20 66 6f 72 20  matic index for 
11f60 61 20 73 69 6e 67 6c 65 20 73 63 61 6e 20 2a 2f  a single scan */
11f70 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
11f80 0a 20 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e  .  if( (pParse->
11f90 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
11fa0 54 45 5f 41 75 74 6f 49 6e 64 65 78 29 3d 3d 30  TE_AutoIndex)==0
11fb0 20 29 7b 0a 20 20 20 20 2f 2a 20 41 75 74 6f 6d   ){.    /* Autom
11fc0 61 74 69 63 20 69 6e 64 69 63 65 73 20 61 72 65  atic indices are
11fd0 20 64 69 73 61 62 6c 65 64 20 61 74 20 72 75 6e   disabled at run
11fe0 2d 74 69 6d 65 20 2a 2f 0a 20 20 20 20 72 65 74  -time */.    ret
11ff0 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  urn;.  }.  if( (
12000 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c  pCost->plan.wsFl
12010 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f  ags & WHERE_NOT_
12020 46 55 4c 4c 53 43 41 4e 29 21 3d 30 20 29 7b 0a  FULLSCAN)!=0 ){.
12030 20 20 20 20 2f 2a 20 57 65 20 61 6c 72 65 61 64      /* We alread
12040 79 20 68 61 76 65 20 73 6f 6d 65 20 6b 69 6e 64  y have some kind
12050 20 6f 66 20 69 6e 64 65 78 20 69 6e 20 75 73 65   of index in use
12060 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 2e   for this query.
12070 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   */.    return;.
12080 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e    }.  if( pSrc->
12090 6e 6f 74 49 6e 64 65 78 65 64 20 29 7b 0a 20 20  notIndexed ){.  
120a0 20 20 2f 2a 20 54 68 65 20 4e 4f 54 20 49 4e 44    /* The NOT IND
120b0 45 58 45 44 20 63 6c 61 75 73 65 20 61 70 70 65  EXED clause appe
120c0 61 72 73 20 69 6e 20 74 68 65 20 53 51 4c 2e 20  ars in the SQL. 
120d0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  */.    return;. 
120e0 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 69   }.  if( pSrc->i
120f0 73 43 6f 72 72 65 6c 61 74 65 64 20 29 7b 0a 20  sCorrelated ){. 
12100 20 20 20 2f 2a 20 54 68 65 20 73 6f 75 72 63 65     /* The source
12110 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64   is a correlated
12120 20 73 75 62 2d 71 75 65 72 79 2e 20 4e 6f 20 70   sub-query. No p
12130 6f 69 6e 74 20 69 6e 20 69 6e 64 65 78 69 6e 67  oint in indexing
12140 20 69 74 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75   it. */.    retu
12150 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  rn;.  }..  asser
12160 74 28 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72  t( pParse->nQuer
12170 79 4c 6f 6f 70 20 3e 3d 20 28 64 6f 75 62 6c 65  yLoop >= (double
12180 29 31 20 29 3b 0a 20 20 70 54 61 62 6c 65 20 3d  )1 );.  pTable =
12190 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 6e   pSrc->pTab;.  n
121a0 54 61 62 6c 65 52 6f 77 20 3d 20 70 54 61 62 6c  TableRow = pTabl
121b0 65 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20 6c 6f  e->nRowEst;.  lo
121c0 67 4e 20 3d 20 65 73 74 4c 6f 67 28 6e 54 61 62  gN = estLog(nTab
121d0 6c 65 52 6f 77 29 3b 0a 20 20 63 6f 73 74 54 65  leRow);.  costTe
121e0 6d 70 49 64 78 20 3d 20 32 2a 6c 6f 67 4e 2a 28  mpIdx = 2*logN*(
121f0 6e 54 61 62 6c 65 52 6f 77 2f 70 50 61 72 73 65  nTableRow/pParse
12200 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2b 20 31  ->nQueryLoop + 1
12210 29 3b 0a 20 20 69 66 28 20 63 6f 73 74 54 65 6d  );.  if( costTem
12220 70 49 64 78 3e 3d 70 43 6f 73 74 2d 3e 72 43 6f  pIdx>=pCost->rCo
12230 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  st ){.    /* The
12240 20 63 6f 73 74 20 6f 66 20 63 72 65 61 74 69 6e   cost of creatin
12250 67 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20  g the transient 
12260 74 61 62 6c 65 20 77 6f 75 6c 64 20 62 65 20 67  table would be g
12270 72 65 61 74 65 72 20 74 68 61 6e 0a 20 20 20 20  reater than.    
12280 2a 2a 20 64 6f 69 6e 67 20 74 68 65 20 66 75 6c  ** doing the ful
12290 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a  l table scan */.
122a0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
122b0 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  .  /* Search for
122c0 20 61 6e 79 20 65 71 75 61 6c 69 74 79 20 63 6f   any equality co
122d0 6d 70 61 72 69 73 6f 6e 20 74 65 72 6d 20 2a 2f  mparison term */
122e0 0a 20 20 70 57 43 45 6e 64 20 3d 20 26 70 57 43  .  pWCEnd = &pWC
122f0 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b  ->a[pWC->nTerm];
12300 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
12310 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
12320 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
12330 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76   if( termCanDriv
12340 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53  eIndex(pTerm, pS
12350 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b  rc, notReady) ){
12360 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
12370 45 28 28 22 61 75 74 6f 2d 69 6e 64 65 78 20 72  E(("auto-index r
12380 65 64 75 63 65 73 20 63 6f 73 74 20 66 72 6f 6d  educes cost from
12390 20 25 2e 31 66 20 74 6f 20 25 2e 31 66 5c 6e 22   %.1f to %.1f\n"
123a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
123b0 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f        pCost->rCo
123c0 73 74 2c 20 63 6f 73 74 54 65 6d 70 49 64 78 29  st, costTempIdx)
123d0 29 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  );.      pCost->
123e0 72 43 6f 73 74 20 3d 20 63 6f 73 74 54 65 6d 70  rCost = costTemp
123f0 49 64 78 3b 0a 20 20 20 20 20 20 70 43 6f 73 74  Idx;.      pCost
12400 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 6c 6f  ->plan.nRow = lo
12410 67 4e 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 43  gN + 1;.      pC
12420 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  ost->plan.wsFlag
12430 73 20 3d 20 57 48 45 52 45 5f 54 45 4d 50 5f 49  s = WHERE_TEMP_I
12440 4e 44 45 58 3b 0a 20 20 20 20 20 20 70 43 6f 73  NDEX;.      pCos
12450 74 2d 3e 75 73 65 64 20 3d 20 70 54 65 72 6d 2d  t->used = pTerm-
12460 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20  >prereqRight;.  
12470 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
12480 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
12490 65 66 69 6e 65 20 62 65 73 74 41 75 74 6f 6d 61  efine bestAutoma
124a0 74 69 63 49 6e 64 65 78 28 41 2c 42 2c 43 2c 44  ticIndex(A,B,C,D
124b0 2c 45 29 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f  ,E)  /* no-op */
124c0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
124d0 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
124e0 5f 49 4e 44 45 58 20 2a 2f 0a 0a 0a 23 69 66 6e  _INDEX */...#ifn
124f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12500 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
12510 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
12520 6f 64 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ode to construct
12530 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63   the Index objec
12540 74 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74  t for an automat
12550 69 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20  ic index.** and 
12560 74 6f 20 73 65 74 20 75 70 20 74 68 65 20 57 68  to set up the Wh
12570 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20  ereLevel object 
12580 70 4c 65 76 65 6c 20 73 6f 20 74 68 61 74 20 74  pLevel so that t
12590 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
125a0 72 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f  r.** makes use o
125b0 66 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  f the automatic 
125c0 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  index..*/.static
125d0 20 76 6f 69 64 20 63 6f 6e 73 74 72 75 63 74 41   void constructA
125e0 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20  utomaticIndex(. 
125f0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
12600 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12610 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
12620 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ext */.  WhereCl
12630 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
12640 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
12650 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
12660 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
12670 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65  m *pSrc,  /* The
12680 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
12690 6d 20 74 6f 20 67 65 74 20 74 68 65 20 6e 65 78  m to get the nex
126a0 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74  t index */.  Bit
126b0 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20  mask notReady,  
126c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
126d0 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74   of cursors that
126e0 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62   are not availab
126f0 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  le */.  WhereLev
12700 65 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20 20 20  el *pLevel      
12710 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77      /* Write new
12720 20 69 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a 29   index here */.)
12730 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b  {.  int nColumn;
12740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12750 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
12760 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e 73  umns in the cons
12770 74 72 75 63 74 65 64 20 69 6e 64 65 78 20 2a 2f  tructed index */
12780 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
12790 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  erm;           /
127a0 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  * A single term 
127b0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
127c0 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  use */.  WhereTe
127d0 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20  rm *pWCEnd;     
127e0 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70       /* End of p
127f0 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74  WC->a[] */.  int
12800 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
12810 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
12820 20 6f 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65   of memory neede
12830 64 20 66 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20  d for pIdx */.  
12840 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
12850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
12860 62 6a 65 63 74 20 64 65 73 63 72 69 62 69 6e 67  bject describing
12870 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 69   the transient i
12880 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ndex */.  Vdbe *
12890 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
128a0 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65        /* Prepare
128b0 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65  d statement unde
128c0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
128d0 2f 0a 20 20 69 6e 74 20 61 64 64 72 49 6e 69 74  /.  int addrInit
128e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
128f0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
12900 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
12910 20 62 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f 0a   bypass jump */.
12920 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b    Table *pTable;
12930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12940 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   The table being
12950 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 4b 65   indexed */.  Ke
12960 79 49 6e 66 6f 20 2a 70 4b 65 79 69 6e 66 6f 3b  yInfo *pKeyinfo;
12970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79            /* Key
12980 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
12990 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 20 20 20   the index */   
129a0 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20  .  int addrTop; 
129b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
129c0 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 64  * Top of the ind
129d0 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a  ex fill loop */.
129e0 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b    int regRecord;
129f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12a00 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
12a10 67 20 61 6e 20 69 6e 64 65 78 20 72 65 63 6f 72  g an index recor
12a20 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  d */.  int n;   
12a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a40 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75     /* Column cou
12a50 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  nter */.  int i;
12a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a70 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
12a80 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d  unter */.  int m
12a90 78 42 69 74 43 6f 6c 3b 20 20 20 20 20 20 20 20  xBitCol;        
12aa0 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
12ab0 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63  m column in pSrc
12ac0 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43  ->colUsed */.  C
12ad0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
12ae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
12af0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
12b00 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20   to on a column 
12b10 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 64 78  */.  Bitmask idx
12b20 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20 20  Cols;           
12b30 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 63 6f   /* Bitmap of co
12b40 6c 75 6d 6e 73 20 75 73 65 64 20 66 6f 72 20 69  lumns used for i
12b50 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74  ndexing */.  Bit
12b60 6d 61 73 6b 20 65 78 74 72 61 43 6f 6c 73 3b 20  mask extraCols; 
12b70 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d           /* Bitm
12b80 61 70 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c  ap of additional
12b90 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 2f   columns */..  /
12ba0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
12bb0 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 74 68 65  to skip over the
12bc0 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 69 6e   creation and in
12bd0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
12be0 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 69 65  the.  ** transie
12bf0 6e 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e 64 20  nt index on 2nd 
12c00 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 69  and subsequent i
12c10 74 65 72 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  terations of the
12c20 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d 20   loop. */.  v = 
12c30 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
12c40 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
12c50 0a 20 20 61 64 64 72 49 6e 69 74 20 3d 20 73 71  .  addrInit = sq
12c60 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50  lite3CodeOnce(pP
12c70 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75  arse);..  /* Cou
12c80 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
12c90 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69   columns that wi
12ca0 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  ll be added to t
12cb0 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 61 6e  he index.  ** an
12cc0 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63 68 20  d used to match 
12cd0 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
12ce0 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6e 43  straints */.  nC
12cf0 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 70 54 61  olumn = 0;.  pTa
12d00 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  ble = pSrc->pTab
12d10 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26 70 57  ;.  pWCEnd = &pW
12d20 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d  C->a[pWC->nTerm]
12d30 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b  ;.  idxCols = 0;
12d40 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
12d50 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
12d60 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
12d70 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76   if( termCanDriv
12d80 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53  eIndex(pTerm, pS
12d90 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b  rc, notReady) ){
12da0 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
12db0 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
12dc0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74  olumn;.      Bit
12dd0 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f  mask cMask = iCo
12de0 6c 3e 3d 42 4d 53 20 3f 20 28 28 42 69 74 6d 61  l>=BMS ? ((Bitma
12df0 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 20 3a  sk)1)<<(BMS-1) :
12e00 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69   ((Bitmask)1)<<i
12e10 43 6f 6c 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Col;.      testc
12e20 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29  ase( iCol==BMS )
12e30 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
12e40 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ( iCol==BMS-1 );
12e50 0a 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43  .      if( (idxC
12e60 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20  ols & cMask)==0 
12e70 29 7b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75  ){.        nColu
12e80 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 64  mn++;.        id
12e90 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a  xCols |= cMask;.
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 6e 43 6f 6c  }.  assert( nCol
12ec0 75 6d 6e 3e 30 20 29 3b 0a 20 20 70 4c 65 76 65  umn>0 );.  pLeve
12ed0 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20 6e 43  l->plan.nEq = nC
12ee0 6f 6c 75 6d 6e 3b 0a 0a 20 20 2f 2a 20 43 6f 75  olumn;..  /* Cou
12ef0 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
12f00 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75   additional colu
12f10 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 63 72  mns needed to cr
12f20 65 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f 76 65  eate a.  ** cove
12f30 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 41 20 22  ring index.  A "
12f40 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 22 20  covering index" 
12f50 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74  is an index that
12f60 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 20 20   contains all.  
12f70 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  ** columns that 
12f80 61 72 65 20 6e 65 65 64 65 64 20 62 79 20 74 68  are needed by th
12f90 65 20 71 75 65 72 79 2e 20 20 57 69 74 68 20 61  e query.  With a
12fa0 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c   covering index,
12fb0 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e   the.  ** origin
12fc0 61 6c 20 74 61 62 6c 65 20 6e 65 76 65 72 20 6e  al table never n
12fd0 65 65 64 73 20 74 6f 20 62 65 20 61 63 63 65 73  eeds to be acces
12fe0 73 65 64 2e 20 20 41 75 74 6f 6d 61 74 69 63 20  sed.  Automatic 
12ff0 69 6e 64 69 63 65 73 20 6d 75 73 74 0a 20 20 2a  indices must.  *
13000 2a 20 62 65 20 61 20 63 6f 76 65 72 69 6e 67 20  * be a covering 
13010 69 6e 64 65 78 20 62 65 63 61 75 73 65 20 74 68  index because th
13020 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74  e index will not
13030 20 62 65 20 75 70 64 61 74 65 64 20 69 66 20 74   be updated if t
13040 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c  he.  ** original
13050 20 74 61 62 6c 65 20 63 68 61 6e 67 65 73 20 61   table changes a
13060 6e 64 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  nd the index and
13070 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 6f   table cannot bo
13080 74 68 20 62 65 20 75 73 65 64 0a 20 20 2a 2a 20  th be used.  ** 
13090 69 66 20 74 68 65 79 20 67 6f 20 6f 75 74 20 6f  if they go out o
130a0 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65  f sync..  */.  e
130b0 78 74 72 61 43 6f 6c 73 20 3d 20 70 53 72 63 2d  xtraCols = pSrc-
130c0 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e 69 64 78  >colUsed & (~idx
130d0 43 6f 6c 73 20 7c 20 28 28 28 42 69 74 6d 61 73  Cols | (((Bitmas
130e0 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29 29 3b  k)1)<<(BMS-1)));
130f0 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d 20 28 70  .  mxBitCol = (p
13100 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e 3d 20 42  Table->nCol >= B
13110 4d 53 2d 31 29 20 3f 20 42 4d 53 2d 31 20 3a 20  MS-1) ? BMS-1 : 
13120 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a 20 20  pTable->nCol;.  
13130 74 65 73 74 63 61 73 65 28 20 70 54 61 62 6c 65  testcase( pTable
13140 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ->nCol==BMS-1 );
13150 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61  .  testcase( pTa
13160 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32  ble->nCol==BMS-2
13170 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
13180 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b  <mxBitCol; i++){
13190 0a 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f  .    if( extraCo
131a0 6c 73 20 26 20 28 28 28 42 69 74 6d 61 73 6b 29  ls & (((Bitmask)
131b0 31 29 3c 3c 69 29 20 29 20 6e 43 6f 6c 75 6d 6e  1)<<i) ) nColumn
131c0 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  ++;.  }.  if( pS
131d0 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 28  rc->colUsed & ((
131e0 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d  (Bitmask)1)<<(BM
131f0 53 2d 31 29 29 20 29 7b 0a 20 20 20 20 6e 43 6f  S-1)) ){.    nCo
13200 6c 75 6d 6e 20 2b 3d 20 70 54 61 62 6c 65 2d 3e  lumn += pTable->
13210 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b 0a  nCol - BMS + 1;.
13220 20 20 7d 0a 20 20 70 4c 65 76 65 6c 2d 3e 70 6c    }.  pLevel->pl
13230 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  an.wsFlags |= WH
13240 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20  ERE_COLUMN_EQ | 
13250 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c  WHERE_IDX_ONLY |
13260 20 57 4f 5f 45 51 3b 0a 0a 20 20 2f 2a 20 43 6f   WO_EQ;..  /* Co
13270 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e 64 65  nstruct the Inde
13280 78 20 6f 62 6a 65 63 74 20 74 6f 20 64 65 73 63  x object to desc
13290 72 69 62 65 20 74 68 69 73 20 69 6e 64 65 78 20  ribe this index 
132a0 2a 2f 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  */.  nByte = siz
132b0 65 6f 66 28 49 6e 64 65 78 29 3b 0a 20 20 6e 42  eof(Index);.  nB
132c0 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a 73  yte += nColumn*s
132d0 69 7a 65 6f 66 28 69 6e 74 29 3b 20 20 20 20 20  izeof(int);     
132e0 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d  /* Index.aiColum
132f0 6e 20 2a 2f 0a 20 20 6e 42 79 74 65 20 2b 3d 20  n */.  nByte += 
13300 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66 28 63  nColumn*sizeof(c
13310 68 61 72 2a 29 3b 20 20 20 2f 2a 20 49 6e 64 65  har*);   /* Inde
13320 78 2e 61 7a 43 6f 6c 6c 20 2a 2f 0a 20 20 6e 42  x.azColl */.  nB
13330 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 3b 20  yte += nColumn; 
13340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13350 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72  /* Index.aSortOr
13360 64 65 72 20 2a 2f 0a 20 20 70 49 64 78 20 3d 20  der */.  pIdx = 
13370 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
13380 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ero(pParse->db, 
13390 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 70 49  nByte);.  if( pI
133a0 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  dx==0 ) return;.
133b0 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75    pLevel->plan.u
133c0 2e 70 49 64 78 20 3d 20 70 49 64 78 3b 0a 20 20  .pIdx = pIdx;.  
133d0 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28  pIdx->azColl = (
133e0 63 68 61 72 2a 2a 29 26 70 49 64 78 5b 31 5d 3b  char**)&pIdx[1];
133f0 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  .  pIdx->aiColum
13400 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 64 78 2d  n = (int*)&pIdx-
13410 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c 75 6d 6e 5d  >azColl[nColumn]
13420 3b 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  ;.  pIdx->aSortO
13430 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 49 64  rder = (u8*)&pId
13440 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c  x->aiColumn[nCol
13450 75 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e  umn];.  pIdx->zN
13460 61 6d 65 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65  ame = "auto-inde
13470 78 22 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c  x";.  pIdx->nCol
13480 75 6d 6e 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20  umn = nColumn;. 
13490 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20   pIdx->pTable = 
134a0 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b  pTable;.  n = 0;
134b0 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a  .  idxCols = 0;.
134c0 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
134d0 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64  >a; pTerm<pWCEnd
134e0 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
134f0 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65  if( termCanDrive
13500 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72  Index(pTerm, pSr
13510 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a  c, notReady) ){.
13520 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
13530 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
13540 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d  lumn;.      Bitm
13550 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c  ask cMask = iCol
13560 3e 3d 42 4d 53 20 3f 20 28 28 42 69 74 6d 61 73  >=BMS ? ((Bitmas
13570 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 20 3a 20  k)1)<<(BMS-1) : 
13580 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69 43  ((Bitmask)1)<<iC
13590 6f 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69  ol;.      if( (i
135a0 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d  dxCols & cMask)=
135b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  =0 ){.        Ex
135c0 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e  pr *pX = pTerm->
135d0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
135e0 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b  dxCols |= cMask;
135f0 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
13600 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65  iColumn[n] = pTe
13610 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
13620 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  ;.        pColl 
13630 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
13640 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
13650 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c  arse, pX->pLeft,
13660 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20   pX->pRight);.  
13670 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
13680 6c 6c 5b 6e 5d 20 3d 20 41 4c 57 41 59 53 28 70  ll[n] = ALWAYS(p
13690 43 6f 6c 6c 29 20 3f 20 70 43 6f 6c 6c 2d 3e 7a  Coll) ? pColl->z
136a0 4e 61 6d 65 20 3a 20 22 42 49 4e 41 52 59 22 3b  Name : "BINARY";
136b0 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20  .        n++;.  
136c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
136d0 20 20 61 73 73 65 72 74 28 20 28 75 33 32 29 6e    assert( (u32)n
136e0 3d 3d 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e  ==pLevel->plan.n
136f0 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20  Eq );..  /* Add 
13700 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  additional colum
13710 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b  ns needed to mak
13720 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  e the automatic 
13730 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a 2a 20  index into.  ** 
13740 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
13750 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
13760 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b  <mxBitCol; i++){
13770 0a 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f  .    if( extraCo
13780 6c 73 20 26 20 28 28 28 42 69 74 6d 61 73 6b 29  ls & (((Bitmask)
13790 31 29 3c 3c 69 29 20 29 7b 0a 20 20 20 20 20 20  1)<<i) ){.      
137a0 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
137b0 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64  ] = i;.      pId
137c0 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22  x->azColl[n] = "
137d0 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e  BINARY";.      n
137e0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
137f0 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65  if( pSrc->colUse
13800 64 20 26 20 28 28 28 42 69 74 6d 61 73 6b 29 31  d & (((Bitmask)1
13810 29 3c 3c 28 42 4d 53 2d 31 29 29 20 29 7b 0a 20  )<<(BMS-1)) ){. 
13820 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31 3b 20     for(i=BMS-1; 
13830 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20  i<pTable->nCol; 
13840 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 64 78  i++){.      pIdx
13850 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20  ->aiColumn[n] = 
13860 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  i;.      pIdx->a
13870 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41  zColl[n] = "BINA
13880 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a  RY";.      n++;.
13890 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
138a0 72 74 28 20 6e 3d 3d 6e 43 6f 6c 75 6d 6e 20 29  rt( n==nColumn )
138b0 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74  ;..  /* Create t
138c0 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
138d0 65 78 20 2a 2f 0a 20 20 70 4b 65 79 69 6e 66 6f  ex */.  pKeyinfo
138e0 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b   = sqlite3IndexK
138f0 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyinfo(pParse, p
13900 49 64 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Idx);.  assert( 
13910 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e  pLevel->iIdxCur>
13920 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  =0 );.  sqlite3V
13930 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
13940 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70  OpenAutoindex, p
13950 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20  Level->iIdxCur, 
13960 6e 43 6f 6c 75 6d 6e 2b 31 2c 20 30 2c 0a 20 20  nColumn+1, 0,.  
13970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13980 20 20 28 63 68 61 72 2a 29 70 4b 65 79 69 6e 66    (char*)pKeyinf
13990 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P4_KEYINFO_HA
139a0 4e 44 4f 46 46 29 3b 0a 20 20 56 64 62 65 43 6f  NDOFF);.  VdbeCo
139b0 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f 72 20 25  mment((v, "for %
139c0 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  s", pTable->zNam
139d0 65 29 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  e));..  /* Fill 
139e0 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
139f0 64 65 78 20 77 69 74 68 20 63 6f 6e 74 65 6e 74  dex with content
13a00 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20   */.  addrTop = 
13a10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13a20 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  1(v, OP_Rewind, 
13a30 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 29  pLevel->iTabCur)
13a40 3b 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20  ;.  regRecord = 
13a50 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
13a60 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
13a70 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65  ite3GenerateInde
13a80 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49 64  xKey(pParse, pId
13a90 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  x, pLevel->iTabC
13aa0 75 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 31  ur, regRecord, 1
13ab0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
13ac0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
13ad0 49 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e  Insert, pLevel->
13ae0 69 49 64 78 43 75 72 2c 20 72 65 67 52 65 63 6f  iIdxCur, regReco
13af0 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rd);.  sqlite3Vd
13b00 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
13b10 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55  FLAG_USESEEKRESU
13b20 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  LT);.  sqlite3Vd
13b30 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
13b40 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  ext, pLevel->iTa
13b50 62 43 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29  bCur, addrTop+1)
13b60 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
13b70 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
13b80 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54  E_STMTSTATUS_AUT
13b90 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74  OINDEX);.  sqlit
13ba0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
13bb0 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71  , addrTop);.  sq
13bc0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
13bd0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
13be0 65 63 6f 72 64 29 3b 0a 20 20 0a 20 20 2f 2a 20  ecord);.  .  /* 
13bf0 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73  Jump here when s
13c00 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74  kipping the init
13c10 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20  ialization */.  
13c20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
13c30 65 72 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29  ere(v, addrInit)
13c40 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
13c50 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
13c60 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69  TIC_INDEX */..#i
13c70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13c80 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
13c90 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
13ca0 64 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 73 71  d populate an sq
13cb0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
13cc0 20 73 74 72 75 63 74 75 72 65 2e 20 49 74 20 69   structure. It i
13cd0 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e  s the .** respon
13ce0 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
13cf0 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
13d00 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74 68 65  ally release the
13d10 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 79   structure.** by
13d20 20 70 61 73 73 69 6e 67 20 74 68 65 20 70 6f 69   passing the poi
13d30 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79  nter returned by
13d40 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74   this function t
13d50 6f 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  o sqlite3_free()
13d60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  ..*/.static sqli
13d70 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
13d80 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66  allocateIndexInf
13d90 6f 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  o(.  Parse *pPar
13da0 73 65 2c 20 0a 20 20 57 68 65 72 65 43 6c 61 75  se, .  WhereClau
13db0 73 65 20 2a 70 57 43 2c 0a 20 20 73 74 72 75 63  se *pWC,.  struc
13dc0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
13dd0 70 53 72 63 2c 0a 20 20 45 78 70 72 4c 69 73 74  pSrc,.  ExprList
13de0 20 2a 70 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20   *pOrderBy.){.  
13df0 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  int i, j;.  int 
13e00 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75 63 74 20  nTerm;.  struct 
13e10 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
13e20 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f  nstraint *pIdxCo
13e30 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  ns;.  struct sql
13e40 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72  ite3_index_order
13e50 62 79 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b  by *pIdxOrderBy;
13e60 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
13e70 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
13e80 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65  nt_usage *pUsage
13e90 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
13ea0 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64  Term;.  int nOrd
13eb0 65 72 42 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f  erBy;.  sqlite3_
13ec0 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78  index_info *pIdx
13ed0 49 6e 66 6f 3b 0a 0a 20 20 57 48 45 52 45 54 52  Info;..  WHERETR
13ee0 41 43 45 28 28 22 52 65 63 6f 6d 70 75 74 69 6e  ACE(("Recomputin
13ef0 67 20 69 6e 64 65 78 20 69 6e 66 6f 20 66 6f 72  g index info for
13f00 20 25 73 2e 2e 2e 5c 6e 22 2c 20 70 53 72 63 2d   %s...\n", pSrc-
13f10 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
13f20 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20  .  /* Count the 
13f30 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73 73 69 62  number of possib
13f40 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  le WHERE clause 
13f50 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 66 65  constraints refe
13f60 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68  rring.  ** to th
13f70 69 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  is virtual table
13f80 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54 65 72   */.  for(i=nTer
13f90 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  m=0, pTerm=pWC->
13fa0 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  a; i<pWC->nTerm;
13fb0 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   i++, pTerm++){.
13fc0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
13fd0 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72  eftCursor != pSr
13fe0 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e  c->iCursor ) con
13ff0 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
14000 74 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  t( (pTerm->eOper
14010 61 74 6f 72 26 28 70 54 65 72 6d 2d 3e 65 4f 70  ator&(pTerm->eOp
14020 65 72 61 74 6f 72 2d 31 29 29 3d 3d 30 20 29 3b  erator-1))==0 );
14030 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
14040 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  Term->eOperator=
14050 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65  =WO_IN );.    te
14060 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
14070 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e  Operator==WO_ISN
14080 55 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ULL );.    if( p
14090 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
140a0 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55  & (WO_IN|WO_ISNU
140b0 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  LL) ) continue;.
140c0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
140d0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
140e0 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ULL ) continue;.
140f0 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d      nTerm++;.  }
14100 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52  ..  /* If the OR
14110 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f  DER BY clause co
14120 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75  ntains only colu
14130 6d 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72 65  mns in the curre
14140 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c  nt .  ** virtual
14150 20 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f   table then allo
14160 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
14170 68 65 20 61 4f 72 64 65 72 42 79 20 70 61 72 74  he aOrderBy part
14180 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c   of.  ** the sql
14190 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
141a0 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a  structure..  */.
141b0 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    nOrderBy = 0;.
141c0 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
141d0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
141e0 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
141f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
14200 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64  pr *pExpr = pOrd
14210 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
14220 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
14230 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
14240 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   || pExpr->iTabl
14250 65 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  e!=pSrc->iCursor
14260 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
14270 20 20 20 20 69 66 28 20 69 3d 3d 70 4f 72 64 65      if( i==pOrde
14280 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  rBy->nExpr ){.  
14290 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70      nOrderBy = p
142a0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
142b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
142c0 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c  Allocate the sql
142d0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
142e0 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a 20  structure.  */. 
142f0 20 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69   pIdxInfo = sqli
14300 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
14310 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65  pParse->db, size
14320 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20 20  of(*pIdxInfo).  
14330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14340 20 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a 65           + (size
14350 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20  of(*pIdxCons) + 
14360 73 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29 29  sizeof(*pUsage))
14370 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20  *nTerm.         
14380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14390 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78    + sizeof(*pIdx
143a0 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42  OrderBy)*nOrderB
143b0 79 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49  y );.  if( pIdxI
143c0 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  nfo==0 ){.    sq
143d0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
143e0 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65  arse, "out of me
143f0 6d 6f 72 79 22 29 3b 0a 20 20 20 20 2f 2a 20 28  mory");.    /* (
14400 64 6f 75 62 6c 65 29 30 20 49 6e 20 63 61 73 65  double)0 In case
14410 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   of SQLITE_OMIT_
14420 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e  FLOATING_POINT..
14430 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
14440 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  0;.  }..  /* Ini
14450 74 69 61 6c 69 7a 65 20 74 68 65 20 73 74 72 75  tialize the stru
14460 63 74 75 72 65 2e 20 20 54 68 65 20 73 71 6c 69  cture.  The sqli
14470 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
14480 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
14490 73 0a 20 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c  s.  ** many fiel
144a0 64 73 20 74 68 61 74 20 61 72 65 20 64 65 63 6c  ds that are decl
144b0 61 72 65 64 20 22 63 6f 6e 73 74 22 20 74 6f 20  ared "const" to 
144c0 70 72 65 76 65 6e 74 20 78 42 65 73 74 49 6e 64  prevent xBestInd
144d0 65 78 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 68 61  ex from.  ** cha
144e0 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20 57 65 20  nging them.  We 
144f0 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20  have to do some 
14500 66 75 6e 6b 79 20 63 61 73 74 69 6e 67 20 69 6e  funky casting in
14510 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 69   order to.  ** i
14520 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f 73 65 20  nitialize those 
14530 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 70  fields..  */.  p
14540 49 64 78 43 6f 6e 73 20 3d 20 28 73 74 72 75 63  IdxCons = (struc
14550 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
14560 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70 49 64  constraint*)&pId
14570 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78  xInfo[1];.  pIdx
14580 4f 72 64 65 72 42 79 20 3d 20 28 73 74 72 75 63  OrderBy = (struc
14590 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
145a0 6f 72 64 65 72 62 79 2a 29 26 70 49 64 78 43 6f  orderby*)&pIdxCo
145b0 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70 55 73  ns[nTerm];.  pUs
145c0 61 67 65 20 3d 20 28 73 74 72 75 63 74 20 73 71  age = (struct sq
145d0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
145e0 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 29 26 70  traint_usage*)&p
145f0 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65  IdxOrderBy[nOrde
14600 72 42 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26  rBy];.  *(int*)&
14610 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
14620 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20  raint = nTerm;. 
14630 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66   *(int*)&pIdxInf
14640 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f  o->nOrderBy = nO
14650 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75  rderBy;.  *(stru
14660 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
14670 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70  _constraint**)&p
14680 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
14690 61 69 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b  aint = pIdxCons;
146a0 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69  .  *(struct sqli
146b0 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62  te3_index_orderb
146c0 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  y**)&pIdxInfo->a
146d0 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78 4f 72  OrderBy = pIdxOr
146e0 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63  derBy;.  *(struc
146f0 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
14700 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
14710 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
14720 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 20 3d  onstraintUsage =
14730 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14770 20 20 20 20 70 55 73 61 67 65 3b 0a 0a 20 20 66      pUsage;..  f
14780 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d  or(i=j=0, pTerm=
14790 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e  pWC->a; i<pWC->n
147a0 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d  Term; i++, pTerm
147b0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  ++){.    if( pTe
147c0 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21  rm->leftCursor !
147d0 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  = pSrc->iCursor 
147e0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
147f0 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
14800 65 4f 70 65 72 61 74 6f 72 26 28 70 54 65 72 6d  eOperator&(pTerm
14810 2d 3e 65 4f 70 65 72 61 74 6f 72 2d 31 29 29 3d  ->eOperator-1))=
14820 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =0 );.    testca
14830 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
14840 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20  ator==WO_IN );. 
14850 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
14860 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
14870 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
14880 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
14890 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f  ator & (WO_IN|WO
148a0 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69  _ISNULL) ) conti
148b0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65  nue;.    if( pTe
148c0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
148d0 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69  RM_VNULL ) conti
148e0 6e 75 65 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  nue;.    pIdxCon
148f0 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70  s[j].iColumn = p
14900 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
14910 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  mn;.    pIdxCons
14920 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20  [j].iTermOffset 
14930 3d 20 69 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  = i;.    pIdxCon
14940 73 5b 6a 5d 2e 6f 70 20 3d 20 28 75 38 29 70 54  s[j].op = (u8)pT
14950 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 0a  erm->eOperator;.
14960 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63      /* The direc
14970 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20  t assignment in 
14980 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6e  the previous lin
14990 65 20 69 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e  e is possible on
149a0 6c 79 20 62 65 63 61 75 73 65 0a 20 20 20 20 2a  ly because.    *
149b0 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64 20 53 51  * the WO_ and SQ
149c0 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
149d0 52 41 49 4e 54 5f 20 63 6f 64 65 73 20 61 72 65  RAINT_ codes are
149e0 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 54 68 65   identical.  The
149f0 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  .    ** followin
14a00 67 20 61 73 73 65 72 74 73 20 76 65 72 69 66 79  g asserts verify
14a10 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20   this fact. */. 
14a20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 45 51     assert( WO_EQ
14a30 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
14a40 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 3b 0a  ONSTRAINT_EQ );.
14a50 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c      assert( WO_L
14a60 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  T==SQLITE_INDEX_
14a70 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29 3b  CONSTRAINT_LT );
14a80 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
14a90 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  LE==SQLITE_INDEX
14aa0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29  _CONSTRAINT_LE )
14ab0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
14ac0 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _GT==SQLITE_INDE
14ad0 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20  X_CONSTRAINT_GT 
14ae0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
14af0 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_GE==SQLITE_IND
14b00 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45  EX_CONSTRAINT_GE
14b10 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
14b20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54 45  WO_MATCH==SQLITE
14b30 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
14b40 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20 20 61  T_MATCH );.    a
14b50 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f  ssert( pTerm->eO
14b60 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51  perator & (WO_EQ
14b70 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f  |WO_LT|WO_LE|WO_
14b80 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43  GT|WO_GE|WO_MATC
14b90 48 29 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20  H) );.    j++;. 
14ba0 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
14bb0 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
14bc0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
14bd0 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
14be0 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 49 64 78  .pExpr;.    pIdx
14bf0 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75  OrderBy[i].iColu
14c00 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  mn = pExpr->iCol
14c10 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72 64  umn;.    pIdxOrd
14c20 65 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70  erBy[i].desc = p
14c30 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f  OrderBy->a[i].so
14c40 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20  rtOrder;.  }..  
14c50 72 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f 3b  return pIdxInfo;
14c60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61  .}../*.** The ta
14c70 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 66 65 72  ble object refer
14c80 65 6e 63 65 20 70 61 73 73 65 64 20 61 73 20 74  ence passed as t
14c90 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
14ca0 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
14cb0 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70 72  ion.** must repr
14cc0 65 73 65 6e 74 20 61 20 76 69 72 74 75 61 6c 20  esent a virtual 
14cd0 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63  table. This func
14ce0 74 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65  tion invokes the
14cf0 20 78 42 65 73 74 49 6e 64 65 78 28 29 0a 2a 2a   xBestIndex().**
14d00 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76   method of the v
14d10 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69 74  irtual table wit
14d20 68 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  h the sqlite3_in
14d30 64 65 78 5f 69 6e 66 6f 20 70 6f 69 6e 74 65 72  dex_info pointer
14d40 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
14d50 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  e argument..**.*
14d60 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
14d70 63 75 72 73 2c 20 70 50 61 72 73 65 20 69 73 20  curs, pParse is 
14d80 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61  populated with a
14d90 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
14da0 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  and a.** non-zer
14db0 6f 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72  o value is retur
14dc0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
14dd0 30 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  0 is returned an
14de0 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  d the output.** 
14df0 70 61 72 74 20 6f 66 20 74 68 65 20 73 71 6c 69  part of the sqli
14e00 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
14e10 74 72 75 63 74 75 72 65 20 69 73 20 6c 65 66 74  tructure is left
14e20 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a   populated..**.*
14e30 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * Whether or not
14e40 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   an error is ret
14e50 75 72 6e 65 64 2c 20 69 74 20 69 73 20 74 68 65  urned, it is the
14e60 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
14e70 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72  of the.** caller
14e80 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   to eventually f
14e90 72 65 65 20 70 2d 3e 69 64 78 53 74 72 20 69 66  ree p->idxStr if
14ea0 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64   p->needToFreeId
14eb0 78 53 74 72 20 69 6e 64 69 63 61 74 65 73 0a 2a  xStr indicates.*
14ec0 2a 20 74 68 61 74 20 74 68 69 73 20 69 73 20 72  * that this is r
14ed0 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  equired..*/.stat
14ee0 69 63 20 69 6e 74 20 76 74 61 62 42 65 73 74 49  ic int vtabBestI
14ef0 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
14f00 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  se, Table *pTab,
14f10 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
14f20 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  nfo *p){.  sqlit
14f30 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d  e3_vtab *pVtab =
14f40 20 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c   sqlite3GetVTabl
14f50 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  e(pParse->db, pT
14f60 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20 69 6e  ab)->pVtab;.  in
14f70 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  t i;.  int rc;..
14f80 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 78    WHERETRACE(("x
14f90 42 65 73 74 49 6e 64 65 78 20 66 6f 72 20 25 73  BestIndex for %s
14fa0 5c 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  \n", pTab->zName
14fb0 29 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f  ));.  TRACE_IDX_
14fc0 49 4e 50 55 54 53 28 70 29 3b 0a 20 20 72 63 20  INPUTS(p);.  rc 
14fd0 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  = pVtab->pModule
14fe0 2d 3e 78 42 65 73 74 49 6e 64 65 78 28 70 56 74  ->xBestIndex(pVt
14ff0 61 62 2c 20 70 29 3b 0a 20 20 54 52 41 43 45 5f  ab, p);.  TRACE_
15000 49 44 58 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a  IDX_OUTPUTS(p);.
15010 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
15020 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
15030 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
15040 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
15050 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
15060 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ed = 1;.    }els
15070 65 20 69 66 28 20 21 70 56 74 61 62 2d 3e 7a 45  e if( !pVtab->zE
15080 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73  rrMsg ){.      s
15090 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
150a0 50 61 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c  Parse, "%s", sql
150b0 69 74 65 33 45 72 72 53 74 72 28 72 63 29 29 3b  ite3ErrStr(rc));
150c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
150d0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
150e0 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
150f0 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
15100 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
15110 69 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d  ite3_free(pVtab-
15120 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74  >zErrMsg);.  pVt
15130 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ab->zErrMsg = 0;
15140 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
15150 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
15160 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 70 2d  ++){.    if( !p-
15170 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
15180 75 73 61 62 6c 65 20 26 26 20 70 2d 3e 61 43 6f  usable && p->aCo
15190 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d  nstraintUsage[i]
151a0 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a  .argvIndex>0 ){.
151b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
151c0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
151d0 20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65 20           "table 
151e0 25 73 3a 20 78 42 65 73 74 49 6e 64 65 78 20 72  %s: xBestIndex r
151f0 65 74 75 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c  eturned an inval
15200 69 64 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e  id plan", pTab->
15210 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
15220 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72  }..  return pPar
15230 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 0a 0a 2f 2a  se->nErr;.}.../*
15240 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
15250 62 65 73 74 20 69 6e 64 65 78 20 66 6f 72 20 61  best index for a
15260 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
15270 2a 2a 0a 2a 2a 20 54 68 65 20 62 65 73 74 20 69  **.** The best i
15280 6e 64 65 78 20 69 73 20 63 6f 6d 70 75 74 65 64  ndex is computed
15290 20 62 79 20 74 68 65 20 78 42 65 73 74 49 6e 64   by the xBestInd
152a0 65 78 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  ex method of the
152b0 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62 6c   virtual.** tabl
152c0 65 20 6d 6f 64 75 6c 65 2e 20 20 54 68 69 73 20  e module.  This 
152d0 72 6f 75 74 69 6e 65 20 69 73 20 72 65 61 6c 6c  routine is reall
152e0 79 20 6a 75 73 74 20 61 20 77 72 61 70 70 65 72  y just a wrapper
152f0 20 74 68 61 74 20 73 65 74 73 20 75 70 0a 2a 2a   that sets up.**
15300 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
15310 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
15320 65 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74  e that is used t
15330 6f 20 63 6f 6d 6d 75 6e 69 63 61 74 65 20 77 69  o communicate wi
15340 74 68 0a 2a 2a 20 78 42 65 73 74 49 6e 64 65 78  th.** xBestIndex
15350 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 20 6a 6f 69  ..**.** In a joi
15360 6e 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  n, this routine 
15370 6d 69 67 68 74 20 62 65 20 63 61 6c 6c 65 64 20  might be called 
15380 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 66  multiple times f
15390 6f 72 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 76  or the.** same v
153a0 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54  irtual table.  T
153b0 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
153c0 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
153d0 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
153e0 64 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f 6e  d initialized on
153f0 20 74 68 65 20 66 69 72 73 74 20 69 6e 76 6f 63   the first invoc
15400 61 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64  ation and reused
15410 20 6f 6e 20 61 6c 6c 20 73 75 62 73 65 71 75 65   on all subseque
15420 6e 74 0a 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e  nt.** invocation
15430 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  s.  The sqlite3_
15440 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
15450 74 75 72 65 20 69 73 20 61 6c 73 6f 20 75 73 65  ture is also use
15460 64 20 77 68 65 6e 0a 2a 2a 20 63 6f 64 65 20 69  d when.** code i
15470 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 61  s generated to a
15480 63 63 65 73 73 20 74 68 65 20 76 69 72 74 75 61  ccess the virtua
15490 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 20 77 68  l table.  The wh
154a0 65 72 65 49 6e 66 6f 44 65 6c 65 74 65 28 29 20  ereInfoDelete() 
154b0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 61 6b 65  .** routine take
154c0 73 20 63 61 72 65 20 6f 66 20 66 72 65 65 69 6e  s care of freein
154d0 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  g the sqlite3_in
154e0 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
154f0 72 65 20 61 66 74 65 72 0a 2a 2a 20 65 76 65 72  re after.** ever
15500 79 62 6f 64 79 20 68 61 73 20 66 69 6e 69 73 68  ybody has finish
15510 65 64 20 77 69 74 68 20 69 74 2e 0a 2a 2f 0a 73  ed with it..*/.s
15520 74 61 74 69 63 20 76 6f 69 64 20 62 65 73 74 56  tatic void bestV
15530 69 72 74 75 61 6c 49 6e 64 65 78 28 0a 20 20 50  irtualIndex(.  P
15540 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
15550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15560 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
15570 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
15580 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
15590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
155a0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
155b0 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
155c0 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
155d0 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
155e0 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73  clause term to s
155f0 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61  earch */.  Bitma
15600 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
15610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
15620 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 6e 6f  sk of cursors no
15630 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  t available for 
15640 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61  index */.  Bitma
15650 73 6b 20 6e 6f 74 56 61 6c 69 64 2c 20 20 20 20  sk notValid,    
15660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
15670 72 73 6f 72 73 20 6e 6f 74 20 76 61 6c 69 64 20  rsors not valid 
15680 66 6f 72 20 61 6e 79 20 70 75 72 70 6f 73 65 20  for any purpose 
15690 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
156a0 4f 72 64 65 72 42 79 2c 20 20 20 20 20 20 20 20  OrderBy,        
156b0 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 72 64 65       /* The orde
156c0 72 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20  r by clause */. 
156d0 20 57 68 65 72 65 43 6f 73 74 20 2a 70 43 6f 73   WhereCost *pCos
156e0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
156f0 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74 20   /* Lowest cost 
15700 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 20 20  query plan */.  
15710 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
15720 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66 6f 20 20  fo **ppIdxInfo  
15730 2f 2a 20 49 6e 64 65 78 20 69 6e 66 6f 72 6d 61  /* Index informa
15740 74 69 6f 6e 20 70 61 73 73 65 64 20 74 6f 20 78  tion passed to x
15750 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a 29 7b 0a  BestIndex */.){.
15760 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
15770 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 73 71  pSrc->pTab;.  sq
15780 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
15790 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73 74   *pIdxInfo;.  st
157a0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
157b0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70  ex_constraint *p
157c0 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63  IdxCons;.  struc
157d0 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
157e0 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
157f0 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72   *pUsage;.  Wher
15800 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
15810 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  int i, j;.  int 
15820 6e 4f 72 64 65 72 42 79 3b 0a 20 20 64 6f 75 62  nOrderBy;.  doub
15830 6c 65 20 72 43 6f 73 74 3b 0a 0a 20 20 2f 2a 20  le rCost;..  /* 
15840 4d 61 6b 65 20 73 75 72 65 20 77 73 46 6c 61 67  Make sure wsFlag
15850 73 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  s is initialized
15860 20 74 6f 20 73 6f 6d 65 20 73 61 6e 65 20 76 61   to some sane va
15870 6c 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  lue. Otherwise, 
15880 69 66 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61 6c  if the .  ** mal
15890 6c 6f 63 20 69 6e 20 61 6c 6c 6f 63 61 74 65 49  loc in allocateI
158a0 6e 64 65 78 49 6e 66 6f 28 29 20 66 61 69 6c 73  ndexInfo() fails
158b0 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69   and this functi
158c0 6f 6e 20 72 65 74 75 72 6e 73 20 6c 65 61 76 69  on returns leavi
158d0 6e 67 0a 20 20 2a 2a 20 77 73 46 6c 61 67 73 20  ng.  ** wsFlags 
158e0 69 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69  in an uninitiali
158f0 7a 65 64 20 73 74 61 74 65 2c 20 74 68 65 20 63  zed state, the c
15900 61 6c 6c 65 72 20 6d 61 79 20 62 65 68 61 76 65  aller may behave
15910 20 75 6e 70 72 65 64 69 63 74 61 62 6c 79 2e 0a   unpredictably..
15920 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 70 43    */.  memset(pC
15930 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ost, 0, sizeof(*
15940 70 43 6f 73 74 29 29 3b 0a 20 20 70 43 6f 73 74  pCost));.  pCost
15950 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d  ->plan.wsFlags =
15960 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
15970 42 4c 45 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  BLE;..  /* If th
15980 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
15990 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 68  info structure h
159a0 61 73 20 6e 6f 74 20 62 65 65 6e 20 70 72 65 76  as not been prev
159b0 69 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f  iously.  ** allo
159c0 63 61 74 65 64 20 61 6e 64 20 69 6e 69 74 69 61  cated and initia
159d0 6c 69 7a 65 64 2c 20 74 68 65 6e 20 61 6c 6c 6f  lized, then allo
159e0 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
159f0 69 7a 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f  ize it now..  */
15a00 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 2a 70  .  pIdxInfo = *p
15a10 70 49 64 78 49 6e 66 6f 3b 0a 20 20 69 66 28 20  pIdxInfo;.  if( 
15a20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  pIdxInfo==0 ){. 
15a30 20 20 20 2a 70 70 49 64 78 49 6e 66 6f 20 3d 20     *ppIdxInfo = 
15a40 70 49 64 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63  pIdxInfo = alloc
15a50 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 70 50 61  ateIndexInfo(pPa
15a60 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20  rse, pWC, pSrc, 
15a70 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 0a 20  pOrderBy);.  }. 
15a80 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30   if( pIdxInfo==0
15a90 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
15aa0 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69    }..  /* At thi
15ab0 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 73 71 6c  s point, the sql
15ac0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
15ad0 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 70  structure that p
15ae0 49 64 78 49 6e 66 6f 20 70 6f 69 6e 74 73 0a 20  IdxInfo points. 
15af0 20 2a 2a 20 74 6f 20 77 69 6c 6c 20 68 61 76 65   ** to will have
15b00 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65   been initialize
15b10 64 2c 20 65 69 74 68 65 72 20 64 75 72 69 6e 67  d, either during
15b20 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e 76   the current inv
15b30 6f 63 61 74 69 6f 6e 20 6f 72 0a 20 20 2a 2a 20  ocation or.  ** 
15b40 64 75 72 69 6e 67 20 73 6f 6d 65 20 70 72 69 6f  during some prio
15b50 72 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 20 4e  r invocation.  N
15b60 6f 77 20 77 65 20 6a 75 73 74 20 68 61 76 65 20  ow we just have 
15b70 74 6f 20 63 75 73 74 6f 6d 69 7a 65 20 74 68 65  to customize the
15b80 0a 20 20 2a 2a 20 64 65 74 61 69 6c 73 20 6f 66  .  ** details of
15b90 20 70 49 64 78 49 6e 66 6f 20 66 6f 72 20 74 68   pIdxInfo for th
15ba0 65 20 63 75 72 72 65 6e 74 20 69 6e 76 6f 63 61  e current invoca
15bb0 74 69 6f 6e 20 61 6e 64 20 70 61 73 73 20 69 74  tion and pass it
15bc0 20 74 6f 0a 20 20 2a 2a 20 78 42 65 73 74 49 6e   to.  ** xBestIn
15bd0 64 65 78 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20  dex..  */..  /* 
15be0 54 68 65 20 6d 6f 64 75 6c 65 20 6e 61 6d 65 20  The module name 
15bf0 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65 64 2e  must be defined.
15c00 20 41 6c 73 6f 2c 20 62 79 20 74 68 69 73 20 70   Also, by this p
15c10 6f 69 6e 74 20 74 68 65 72 65 20 6d 75 73 74 0a  oint there must.
15c20 20 20 2a 2a 20 62 65 20 61 20 70 6f 69 6e 74 65    ** be a pointe
15c30 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f  r to an sqlite3_
15c40 76 74 61 62 20 73 74 72 75 63 74 75 72 65 2e 20  vtab structure. 
15c50 4f 74 68 65 72 77 69 73 65 0a 20 20 2a 2a 20 73  Otherwise.  ** s
15c60 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
15c70 75 6d 6e 4e 61 6d 65 73 28 29 20 77 6f 75 6c 64  umnNames() would
15c80 20 68 61 76 65 20 70 69 63 6b 65 64 20 75 70 20   have picked up 
15c90 74 68 65 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2f  the error. .  */
15ca0 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
15cb0 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 20 26 26 20  >azModuleArg && 
15cc0 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72  pTab->azModuleAr
15cd0 67 5b 30 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  g[0] );.  assert
15ce0 28 20 73 71 6c 69 74 65 33 47 65 74 56 54 61 62  ( sqlite3GetVTab
15cf0 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  le(pParse->db, p
15d00 54 61 62 29 20 29 3b 0a 0a 20 20 2f 2a 20 53 65  Tab) );..  /* Se
15d10 74 20 74 68 65 20 61 43 6f 6e 73 74 72 61 69 6e  t the aConstrain
15d20 74 5b 5d 2e 75 73 61 62 6c 65 20 66 69 65 6c 64  t[].usable field
15d30 73 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  s and initialize
15d40 20 61 6c 6c 20 0a 20 20 2a 2a 20 6f 75 74 70 75   all .  ** outpu
15d50 74 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20 7a  t variables to z
15d60 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61  ero..  **.  ** a
15d70 43 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e 75 73 61  Constraint[].usa
15d80 62 6c 65 20 69 73 20 74 72 75 65 20 66 6f 72 20  ble is true for 
15d90 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 68 65 72  constraints wher
15da0 65 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  e the right-hand
15db0 0a 20 20 2a 2a 20 73 69 64 65 20 63 6f 6e 74 61  .  ** side conta
15dc0 69 6e 73 20 6f 6e 6c 79 20 72 65 66 65 72 65 6e  ins only referen
15dd0 63 65 73 20 74 6f 20 74 61 62 6c 65 73 20 74 6f  ces to tables to
15de0 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65   the left of the
15df0 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 74 61   current.  ** ta
15e00 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ble.  In other w
15e10 6f 72 64 73 2c 20 69 66 20 74 68 65 20 63 6f 6e  ords, if the con
15e20 73 74 72 61 69 6e 74 20 69 73 20 6f 66 20 74 68  straint is of th
15e30 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a  e form:.  **.  *
15e40 2a 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75  *           colu
15e50 6d 6e 20 3d 20 65 78 70 72 0a 20 20 2a 2a 0a 20  mn = expr.  **. 
15e60 20 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 65   ** and we are e
15e70 76 61 6c 75 61 74 69 6e 67 20 61 20 6a 6f 69 6e  valuating a join
15e80 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73 74  , then the const
15e90 72 61 69 6e 74 20 6f 6e 20 63 6f 6c 75 6d 6e 20  raint on column 
15ea0 69 73 20 0a 20 20 2a 2a 20 6f 6e 6c 79 20 76 61  is .  ** only va
15eb0 6c 69 64 20 69 66 20 61 6c 6c 20 74 61 62 6c 65  lid if all table
15ec0 73 20 72 65 66 65 72 65 6e 63 65 64 20 69 6e 20  s referenced in 
15ed0 65 78 70 72 20 6f 63 63 75 72 20 74 6f 20 74 68  expr occur to th
15ee0 65 20 6c 65 66 74 0a 20 20 2a 2a 20 6f 66 20 74  e left.  ** of t
15ef0 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  he table contain
15f00 69 6e 67 20 63 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a  ing column..  **
15f10 0a 20 20 2a 2a 20 54 68 65 20 61 43 6f 6e 73 74  .  ** The aConst
15f20 72 61 69 6e 74 73 5b 5d 20 61 72 72 61 79 20 63  raints[] array c
15f30 6f 6e 74 61 69 6e 73 20 65 6e 74 72 69 65 73 20  ontains entries 
15f40 66 6f 72 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69  for all constrai
15f50 6e 74 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  nts.  ** on the 
15f60 63 75 72 72 65 6e 74 20 74 61 62 6c 65 2e 20 20  current table.  
15f70 54 68 61 74 20 77 61 79 20 77 65 20 6f 6e 6c 79  That way we only
15f80 20 68 61 76 65 20 74 6f 20 63 6f 6d 70 75 74 65   have to compute
15f90 20 69 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 65 76   it once.  ** ev
15fa0 65 6e 20 74 68 6f 75 67 68 20 77 65 20 6d 69 67  en though we mig
15fb0 68 74 20 74 72 79 20 74 6f 20 70 69 63 6b 20 74  ht try to pick t
15fc0 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 6d 75  he best index mu
15fd0 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e 0a 20 20  ltiple times..  
15fe0 2a 2a 20 46 6f 72 20 65 61 63 68 20 61 74 74 65  ** For each atte
15ff0 6d 70 74 20 61 74 20 70 69 63 6b 69 6e 67 20 61  mpt at picking a
16000 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f 72 64  n index, the ord
16010 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
16020 74 68 65 0a 20 20 2a 2a 20 6a 6f 69 6e 20 6d 69  the.  ** join mi
16030 67 68 74 20 62 65 20 64 69 66 66 65 72 65 6e 74  ght be different
16040 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 72   so we have to r
16050 65 63 6f 6d 70 75 74 65 20 74 68 65 20 75 73 61  ecompute the usa
16060 62 6c 65 20 66 6c 61 67 0a 20 20 2a 2a 20 65 61  ble flag.  ** ea
16070 63 68 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20  ch time..  */.  
16080 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72  pIdxCons = *(str
16090 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
160a0 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26  x_constraint**)&
160b0 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
160c0 72 61 69 6e 74 3b 0a 20 20 70 55 73 61 67 65 20  raint;.  pUsage 
160d0 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  = pIdxInfo->aCon
160e0 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20  straintUsage;.  
160f0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49  for(i=0; i<pIdxI
16100 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
16110 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b  ; i++, pIdxCons+
16120 2b 29 7b 0a 20 20 20 20 6a 20 3d 20 70 49 64 78  +){.    j = pIdx
16130 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65  Cons->iTermOffse
16140 74 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26  t;.    pTerm = &
16150 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 70  pWC->a[j];.    p
16160 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
16170 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  = (pTerm->prereq
16180 52 69 67 68 74 26 6e 6f 74 52 65 61 64 79 29 20  Right&notReady) 
16190 3f 20 30 20 3a 20 31 3b 0a 20 20 7d 0a 20 20 6d  ? 0 : 1;.  }.  m
161a0 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30 2c  emset(pUsage, 0,
161b0 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b 30   sizeof(pUsage[0
161c0 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f  ])*pIdxInfo->nCo
161d0 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 69 66 28  nstraint);.  if(
161e0 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
161f0 6f 46 72 65 65 49 64 78 53 74 72 20 29 7b 0a 20  oFreeIdxStr ){. 
16200 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
16210 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
16220 29 3b 0a 20 20 7d 0a 20 20 70 49 64 78 49 6e 66  );.  }.  pIdxInf
16230 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20  o->idxStr = 0;. 
16240 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75   pIdxInfo->idxNu
16250 6d 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66  m = 0;.  pIdxInf
16260 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
16270 53 74 72 20 3d 20 30 3b 0a 20 20 70 49 64 78 49  Str = 0;.  pIdxI
16280 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
16290 75 6d 65 64 20 3d 20 30 3b 0a 20 20 2f 2a 20 28  umed = 0;.  /* (
162a0 28 64 6f 75 62 6c 65 29 32 29 20 49 6e 20 63 61  (double)2) In ca
162b0 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49  se of SQLITE_OMI
162c0 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
162d0 2e 2e 2e 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66  ... */.  pIdxInf
162e0 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
162f0 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42   = SQLITE_BIG_DB
16300 4c 20 2f 20 28 28 64 6f 75 62 6c 65 29 32 29 3b  L / ((double)2);
16310 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 49  .  nOrderBy = pI
16320 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
16330 3b 0a 20 20 69 66 28 20 21 70 4f 72 64 65 72 42  ;.  if( !pOrderB
16340 79 20 29 7b 0a 20 20 20 20 70 49 64 78 49 6e 66  y ){.    pIdxInf
16350 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b  o->nOrderBy = 0;
16360 0a 20 20 7d 0a 0a 20 20 69 66 28 20 76 74 61 62  .  }..  if( vtab
16370 42 65 73 74 49 6e 64 65 78 28 70 50 61 72 73 65  BestIndex(pParse
16380 2c 20 70 54 61 62 2c 20 70 49 64 78 49 6e 66 6f  , pTab, pIdxInfo
16390 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
163a0 0a 20 20 7d 0a 0a 20 20 70 49 64 78 43 6f 6e 73  .  }..  pIdxCons
163b0 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69   = *(struct sqli
163c0 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
163d0 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f  aint**)&pIdxInfo
163e0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->aConstraint;. 
163f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
16400 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
16410 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  t; i++){.    if(
16420 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49   pUsage[i].argvI
16430 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20 20 20 20  ndex>0 ){.      
16440 70 43 6f 73 74 2d 3e 75 73 65 64 20 7c 3d 20 70  pCost->used |= p
16450 57 43 2d 3e 61 5b 70 49 64 78 43 6f 6e 73 5b 69  WC->a[pIdxCons[i
16460 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 5d 2e 70  ].iTermOffset].p
16470 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20  rereqRight;.    
16480 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
16490 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
164a0 20 42 59 20 63 6c 61 75 73 65 2c 20 61 6e 64 20   BY clause, and 
164b0 74 68 65 20 73 65 6c 65 63 74 65 64 20 76 69 72  the selected vir
164c0 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 64 65 78  tual table index
164d0 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73  .  ** does not s
164e0 61 74 69 73 66 79 20 69 74 2c 20 69 6e 63 72 65  atisfy it, incre
164f0 61 73 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20  ase the cost of 
16500 74 68 65 20 73 63 61 6e 20 61 63 63 6f 72 64 69  the scan accordi
16510 6e 67 6c 79 2e 20 54 68 69 73 0a 20 20 2a 2a 20  ngly. This.  ** 
16520 6d 61 74 63 68 65 73 20 74 68 65 20 70 72 6f 63  matches the proc
16530 65 73 73 69 6e 67 20 66 6f 72 20 6e 6f 6e 2d 76  essing for non-v
16540 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 69 6e  irtual tables in
16550 20 62 65 73 74 42 74 72 65 65 49 6e 64 65 78 28   bestBtreeIndex(
16560 29 2e 0a 20 20 2a 2f 0a 20 20 72 43 6f 73 74 20  )..  */.  rCost 
16570 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69  = pIdxInfo->esti
16580 6d 61 74 65 64 43 6f 73 74 3b 0a 20 20 69 66 28  matedCost;.  if(
16590 20 70 4f 72 64 65 72 42 79 20 26 26 20 70 49 64   pOrderBy && pId
165a0 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
165b0 6e 73 75 6d 65 64 3d 3d 30 20 29 7b 0a 20 20 20  nsumed==0 ){.   
165c0 20 72 43 6f 73 74 20 2b 3d 20 65 73 74 4c 6f 67   rCost += estLog
165d0 28 72 43 6f 73 74 29 2a 72 43 6f 73 74 3b 0a 20  (rCost)*rCost;. 
165e0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 73   }..  /* The cos
165f0 74 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  t is not allowed
16600 20 74 6f 20 62 65 20 6c 61 72 67 65 72 20 74 68   to be larger th
16610 61 6e 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42  an SQLITE_BIG_DB
16620 4c 20 28 74 68 65 0a 20 20 2a 2a 20 69 6e 69 74  L (the.  ** init
16630 61 6c 20 76 61 6c 75 65 20 6f 66 20 6c 6f 77 65  al value of lowe
16640 73 74 43 6f 73 74 20 69 6e 20 74 68 69 73 20 6c  stCost in this l
16650 6f 6f 70 2e 20 49 66 20 69 74 20 69 73 2c 20 74  oop. If it is, t
16660 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 28 63 6f  hen the.  ** (co
16670 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74 29 20 74  st<lowestCost) t
16680 65 73 74 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e  est below will n
16690 65 76 65 72 20 62 65 20 74 72 75 65 2e 0a 20 20  ever be true..  
166a0 2a 2a 20 0a 20 20 2a 2a 20 55 73 65 20 22 28 64  ** .  ** Use "(d
166b0 6f 75 62 6c 65 29 32 22 20 69 6e 73 74 65 61 64  ouble)2" instead
166c0 20 6f 66 20 22 32 2e 30 22 20 69 6e 20 63 61 73   of "2.0" in cas
166d0 65 20 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  e OMIT_FLOATING_
166e0 50 4f 49 4e 54 20 0a 20 20 2a 2a 20 69 73 20 64  POINT .  ** is d
166f0 65 66 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  efined..  */.  i
16700 66 28 20 28 53 51 4c 49 54 45 5f 42 49 47 5f 44  f( (SQLITE_BIG_D
16710 42 4c 2f 28 28 64 6f 75 62 6c 65 29 32 29 29 3c  BL/((double)2))<
16720 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 70 43 6f  rCost ){.    pCo
16730 73 74 2d 3e 72 43 6f 73 74 20 3d 20 28 53 51 4c  st->rCost = (SQL
16740 49 54 45 5f 42 49 47 5f 44 42 4c 2f 28 28 64 6f  ITE_BIG_DBL/((do
16750 75 62 6c 65 29 32 29 29 3b 0a 20 20 7d 65 6c 73  uble)2));.  }els
16760 65 7b 0a 20 20 20 20 70 43 6f 73 74 2d 3e 72 43  e{.    pCost->rC
16770 6f 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20 20 7d  ost = rCost;.  }
16780 0a 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75  .  pCost->plan.u
16790 2e 70 56 74 61 62 49 64 78 20 3d 20 70 49 64 78  .pVtabIdx = pIdx
167a0 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 49 64 78  Info;.  if( pIdx
167b0 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
167c0 73 75 6d 65 64 20 29 7b 0a 20 20 20 20 70 43 6f  sumed ){.    pCo
167d0 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  st->plan.wsFlags
167e0 20 7c 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42   |= WHERE_ORDERB
167f0 59 3b 0a 20 20 7d 0a 20 20 70 43 6f 73 74 2d 3e  Y;.  }.  pCost->
16800 70 6c 61 6e 2e 6e 45 71 20 3d 20 30 3b 0a 20 20  plan.nEq = 0;.  
16810 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
16820 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 0a  By = nOrderBy;..
16830 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64    /* Try to find
16840 20 61 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e   a more efficien
16850 74 20 61 63 63 65 73 73 20 70 61 74 74 65 72 6e  t access pattern
16860 20 62 79 20 75 73 69 6e 67 20 6d 75 6c 74 69 70   by using multip
16870 6c 65 20 69 6e 64 65 78 65 73 0a 20 20 2a 2a 20  le indexes.  ** 
16880 74 6f 20 6f 70 74 69 6d 69 7a 65 20 61 6e 20 4f  to optimize an O
16890 52 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74  R expression wit
168a0 68 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c  hin the WHERE cl
168b0 61 75 73 65 2e 20 0a 20 20 2a 2f 0a 20 20 62 65  ause. .  */.  be
168c0 73 74 4f 72 43 6c 61 75 73 65 49 6e 64 65 78 28  stOrClauseIndex(
168d0 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72  pParse, pWC, pSr
168e0 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e 6f 74  c, notReady, not
168f0 56 61 6c 69 64 2c 20 70 4f 72 64 65 72 42 79 2c  Valid, pOrderBy,
16900 20 70 43 6f 73 74 29 3b 0a 7d 0a 23 65 6e 64 69   pCost);.}.#endi
16910 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
16920 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
16930 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
16940 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 2f 2a 0a  ENABLE_STAT3./*.
16950 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
16960 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 70 61  location of a pa
16970 72 74 69 63 75 6c 61 72 20 6b 65 79 20 61 6d 6f  rticular key amo
16980 6e 67 20 61 6c 6c 20 6b 65 79 73 20 69 6e 20 61  ng all keys in a
16990 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 53 74 6f  n.** index.  Sto
169a0 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
169b0 6e 20 61 53 74 61 74 20 61 73 20 66 6f 6c 6c 6f  n aStat as follo
169c0 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 53 74  ws:.**.**    aSt
169d0 61 74 5b 30 5d 20 20 20 20 20 20 45 73 74 2e 20  at[0]      Est. 
169e0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6c  number of rows l
169f0 65 73 73 20 74 68 61 6e 20 70 56 61 6c 0a 2a 2a  ess than pVal.**
16a00 20 20 20 20 61 53 74 61 74 5b 31 5d 20 20 20 20      aStat[1]    
16a10 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66    Est. number of
16a20 20 72 6f 77 73 20 65 71 75 61 6c 20 74 6f 20 70   rows equal to p
16a30 56 61 6c 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  Val.**.** Return
16a40 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
16a50 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ccess..*/.static
16a60 20 69 6e 74 20 77 68 65 72 65 4b 65 79 53 74 61   int whereKeySta
16a70 74 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ts(.  Parse *pPa
16a80 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
16a90 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
16aa0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e  nnection */.  In
16ab0 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20  dex *pIdx,      
16ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
16ad0 65 78 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 64  ex to consider d
16ae0 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 73 71  omain of */.  sq
16af0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
16b00 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  l,        /* Val
16b10 75 65 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a  ue to consider *
16b20 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c  /.  int roundUp,
16b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b40 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69 66 20 74  /* Round up if t
16b50 72 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77 6e  rue.  Round down
16b60 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20 74   if false */.  t
16b70 52 6f 77 63 6e 74 20 2a 61 53 74 61 74 20 20 20  Rowcnt *aStat   
16b80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
16b90 54 3a 20 73 74 61 74 73 20 77 72 69 74 74 65 6e  T: stats written
16ba0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 74 52   here */.){.  tR
16bb0 6f 77 63 6e 74 20 6e 3b 0a 20 20 49 6e 64 65 78  owcnt n;.  Index
16bc0 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65 3b  Sample *aSample;
16bd0 0a 20 20 69 6e 74 20 69 2c 20 65 54 79 70 65 3b  .  int i, eType;
16be0 0a 20 20 69 6e 74 20 69 73 45 71 20 3d 20 30 3b  .  int isEq = 0;
16bf0 0a 20 20 69 36 34 20 76 3b 0a 20 20 64 6f 75 62  .  i64 v;.  doub
16c00 6c 65 20 72 2c 20 72 53 3b 0a 0a 20 20 61 73 73  le r, rS;..  ass
16c10 65 72 74 28 20 72 6f 75 6e 64 55 70 3d 3d 30 20  ert( roundUp==0 
16c20 7c 7c 20 72 6f 75 6e 64 55 70 3d 3d 31 20 29 3b  || roundUp==1 );
16c30 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d  .  assert( pIdx-
16c40 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20  >nSample>0 );.  
16c50 69 66 28 20 70 56 61 6c 3d 3d 30 20 29 20 72 65  if( pVal==0 ) re
16c60 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
16c70 52 3b 0a 20 20 6e 20 3d 20 70 49 64 78 2d 3e 61  R;.  n = pIdx->a
16c80 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 61 53  iRowEst[0];.  aS
16c90 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53  ample = pIdx->aS
16ca0 61 6d 70 6c 65 3b 0a 20 20 65 54 79 70 65 20 3d  ample;.  eType =
16cb0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
16cc0 79 70 65 28 70 56 61 6c 29 3b 0a 0a 20 20 69 66  ype(pVal);..  if
16cd0 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
16ce0 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 76  INTEGER ){.    v
16cf0 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
16d00 5f 69 6e 74 36 34 28 70 56 61 6c 29 3b 0a 20 20  _int64(pVal);.  
16d10 20 20 72 20 3d 20 28 69 36 34 29 76 3b 0a 20 20    r = (i64)v;.  
16d20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
16d30 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29  x->nSample; i++)
16d40 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53 61 6d  {.      if( aSam
16d50 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51  ple[i].eType==SQ
16d60 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 63 6f 6e 74  LITE_NULL ) cont
16d70 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
16d80 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65  aSample[i].eType
16d90 3e 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 20  >=SQLITE_TEXT ) 
16da0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28  break;.      if(
16db0 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70   aSample[i].eTyp
16dc0 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  e==SQLITE_INTEGE
16dd0 52 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  R ){.        if(
16de0 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 69 3e   aSample[i].u.i>
16df0 3d 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =v ){.          
16e00 69 73 45 71 20 3d 20 61 53 61 6d 70 6c 65 5b 69  isEq = aSample[i
16e10 5d 2e 75 2e 69 3d 3d 76 3b 0a 20 20 20 20 20 20  ].u.i==v;.      
16e20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
16e30 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
16e40 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
16e50 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79  ( aSample[i].eTy
16e60 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54  pe==SQLITE_FLOAT
16e70 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
16e80 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3e 3d  aSample[i].u.r>=
16e90 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  r ){.          i
16ea0 73 45 71 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d  sEq = aSample[i]
16eb0 2e 75 2e 72 3d 3d 72 3b 0a 20 20 20 20 20 20 20  .u.r==r;.       
16ec0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
16ed0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
16ee0 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 54  }.  }else if( eT
16ef0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41  ype==SQLITE_FLOA
16f00 54 20 29 7b 0a 20 20 20 20 72 20 3d 20 73 71 6c  T ){.    r = sql
16f10 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
16f20 65 28 70 56 61 6c 29 3b 0a 20 20 20 20 66 6f 72  e(pVal);.    for
16f30 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 53  (i=0; i<pIdx->nS
16f40 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  ample; i++){.   
16f50 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69     if( aSample[i
16f60 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ].eType==SQLITE_
16f70 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  NULL ) continue;
16f80 0a 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70  .      if( aSamp
16f90 6c 65 5b 69 5d 2e 65 54 79 70 65 3e 3d 53 51 4c  le[i].eType>=SQL
16fa0 49 54 45 5f 54 45 58 54 20 29 20 62 72 65 61 6b  ITE_TEXT ) break
16fb0 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53 61 6d  ;.      if( aSam
16fc0 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51  ple[i].eType==SQ
16fd0 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20  LITE_FLOAT ){.  
16fe0 20 20 20 20 20 20 72 53 20 3d 20 61 53 61 6d 70        rS = aSamp
16ff0 6c 65 5b 69 5d 2e 75 2e 72 3b 0a 20 20 20 20 20  le[i].u.r;.     
17000 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17010 72 53 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  rS = aSample[i].
17020 75 2e 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  u.i;.      }.   
17030 20 20 20 69 66 28 20 72 53 3e 3d 72 20 29 7b 0a     if( rS>=r ){.
17040 20 20 20 20 20 20 20 20 69 73 45 71 20 3d 20 72          isEq = r
17050 53 3d 3d 72 3b 0a 20 20 20 20 20 20 20 20 62 72  S==r;.        br
17060 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
17070 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65   }.  }else if( e
17080 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  Type==SQLITE_NUL
17090 4c 20 29 7b 0a 20 20 20 20 69 20 3d 20 30 3b 0a  L ){.    i = 0;.
170a0 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b      if( aSample[
170b0 30 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  0].eType==SQLITE
170c0 5f 4e 55 4c 4c 20 29 20 69 73 45 71 20 3d 20 31  _NULL ) isEq = 1
170d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
170e0 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51  ssert( eType==SQ
170f0 4c 49 54 45 5f 54 45 58 54 20 7c 7c 20 65 54 79  LITE_TEXT || eTy
17100 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20  pe==SQLITE_BLOB 
17110 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
17120 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b  i<pIdx->nSample;
17130 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
17140 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70   aSample[i].eTyp
17150 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 7c  e==SQLITE_TEXT |
17160 7c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79  | aSample[i].eTy
17170 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20  pe==SQLITE_BLOB 
17180 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
17190 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
171a0 20 20 20 20 69 66 28 20 69 3c 70 49 64 78 2d 3e      if( i<pIdx->
171b0 6e 53 61 6d 70 6c 65 20 29 7b 20 20 20 20 20 20  nSample ){      
171c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
171d0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
171e0 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
171f0 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 63 6f 6e  pColl;.      con
17200 73 74 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20 20  st u8 *z;.      
17210 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  if( eType==SQLIT
17220 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20  E_BLOB ){.      
17230 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 38 20    z = (const u8 
17240 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
17250 62 6c 6f 62 28 70 56 61 6c 29 3b 0a 20 20 20 20  blob(pVal);.    
17260 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e      pColl = db->
17270 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
17280 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 6c     assert( pColl
17290 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ->enc==SQLITE_UT
172a0 46 38 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  F8 );.      }els
172b0 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  e{.        pColl
172c0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c   = sqlite3GetCol
172d0 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f  lSeq(db, SQLITE_
172e0 55 54 46 38 2c 20 30 2c 20 2a 70 49 64 78 2d 3e  UTF8, 0, *pIdx->
172f0 61 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20  azColl);.       
17300 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 7b   if( pColl==0 ){
17310 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
17320 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
17330 65 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c  e, "no such coll
17340 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20  ation sequence: 
17350 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
17360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
17370 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 20  pIdx->azColl);. 
17380 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
17390 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
173a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
173b0 7a 20 3d 20 28 63 6f 6e 73 74 20 75 38 20 2a 29  z = (const u8 *)
173c0 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
173d0 28 70 56 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e  (pVal, pColl->en
173e0 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
173f0 21 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  !z ){.          
17400 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
17410 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  MEM;.        }. 
17420 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a         assert( z
17430 20 26 26 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f   && pColl && pCo
17440 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 20 20 20 20  ll->xCmp );.    
17450 20 20 7d 0a 20 20 20 20 20 20 6e 20 3d 20 73 71    }.      n = sq
17460 6c 69 74 65 33 56 61 6c 75 65 42 79 74 65 73 28  lite3ValueBytes(
17470 70 56 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63  pVal, pColl->enc
17480 29 3b 0a 20 20 0a 20 20 20 20 20 20 66 6f 72 28  );.  .      for(
17490 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  ; i<pIdx->nSampl
174a0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
174b0 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20   int c;.        
174c0 69 6e 74 20 65 53 61 6d 70 6c 65 74 79 70 65 20  int eSampletype 
174d0 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79  = aSample[i].eTy
174e0 70 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pe;.        if( 
174f0 65 53 61 6d 70 6c 65 74 79 70 65 3c 65 54 79 70  eSampletype<eTyp
17500 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
17510 20 20 20 20 20 20 69 66 28 20 65 53 61 6d 70 6c        if( eSampl
17520 65 74 79 70 65 21 3d 65 54 79 70 65 20 29 20 62  etype!=eType ) b
17530 72 65 61 6b 3b 0a 23 69 66 6e 64 65 66 20 53 51  reak;.#ifndef SQ
17540 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
17550 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
17560 6c 2d 3e 65 6e 63 21 3d 53 51 4c 49 54 45 5f 55  l->enc!=SQLITE_U
17570 54 46 38 20 29 7b 0a 20 20 20 20 20 20 20 20 20  TF8 ){.         
17580 20 69 6e 74 20 6e 53 61 6d 70 6c 65 3b 0a 20 20   int nSample;.  
17590 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53          char *zS
175a0 61 6d 70 6c 65 20 3d 20 73 71 6c 69 74 65 33 55  ample = sqlite3U
175b0 74 66 38 74 6f 31 36 28 0a 20 20 20 20 20 20 20  tf8to16(.       
175c0 20 20 20 20 20 20 20 64 62 2c 20 70 43 6f 6c 6c         db, pColl
175d0 2d 3e 65 6e 63 2c 20 61 53 61 6d 70 6c 65 5b 69  ->enc, aSample[i
175e0 5d 2e 75 2e 7a 2c 20 61 53 61 6d 70 6c 65 5b 69  ].u.z, aSample[i
175f0 5d 2e 6e 42 79 74 65 2c 20 26 6e 53 61 6d 70 6c  ].nByte, &nSampl
17600 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  e.          );. 
17610 20 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 53           if( !zS
17620 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  ample ){.       
17630 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
17640 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
17650 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
17660 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
17670 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
17680 20 20 20 20 20 20 20 20 63 20 3d 20 70 43 6f 6c          c = pCol
17690 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70  l->xCmp(pColl->p
176a0 55 73 65 72 2c 20 6e 53 61 6d 70 6c 65 2c 20 7a  User, nSample, z
176b0 53 61 6d 70 6c 65 2c 20 6e 2c 20 7a 29 3b 0a 20  Sample, n, z);. 
176c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
176d0 44 62 46 72 65 65 28 64 62 2c 20 7a 53 61 6d 70  DbFree(db, zSamp
176e0 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  le);.        }el
176f0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
17700 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20    {.          c 
17710 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43  = pColl->xCmp(pC
17720 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 61 53 61 6d  oll->pUser, aSam
17730 70 6c 65 5b 69 5d 2e 6e 42 79 74 65 2c 20 61 53  ple[i].nByte, aS
17740 61 6d 70 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 6e 2c  ample[i].u.z, n,
17750 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   z);.        }. 
17760 20 20 20 20 20 20 20 69 66 28 20 63 3e 3d 30 20         if( c>=0 
17770 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
17780 20 63 3d 3d 30 20 29 20 69 73 45 71 20 3d 20 31   c==0 ) isEq = 1
17790 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
177a0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
177b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
177c0 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
177d0 6e 74 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69  nt, aSample[i] i
177e0 73 20 74 68 65 20 66 69 72 73 74 20 73 61 6d 70  s the first samp
177f0 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61 74  le that is great
17800 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 6f 72 20  er than.  ** or 
17810 65 71 75 61 6c 20 74 6f 20 70 56 61 6c 2e 20 20  equal to pVal.  
17820 4f 72 20 69 66 20 69 3d 3d 70 49 64 78 2d 3e 6e  Or if i==pIdx->n
17830 53 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61 6c 6c  Sample, then all
17840 20 73 61 6d 70 6c 65 73 20 61 72 65 20 6c 65 73   samples are les
17850 73 0a 20 20 2a 2a 20 74 68 61 6e 20 70 56 61 6c  s.  ** than pVal
17860 2e 20 20 49 66 20 61 53 61 6d 70 6c 65 5b 69 5d  .  If aSample[i]
17870 3d 3d 70 56 61 6c 2c 20 74 68 65 6e 20 69 73 45  ==pVal, then isE
17880 71 3d 3d 31 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  q==1..  */.  if(
17890 20 69 73 45 71 20 29 7b 0a 20 20 20 20 61 73 73   isEq ){.    ass
178a0 65 72 74 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61  ert( i<pIdx->nSa
178b0 6d 70 6c 65 20 29 3b 0a 20 20 20 20 61 53 74 61  mple );.    aSta
178c0 74 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69  t[0] = aSample[i
178d0 5d 2e 6e 4c 74 3b 0a 20 20 20 20 61 53 74 61 74  ].nLt;.    aStat
178e0 5b 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d  [1] = aSample[i]
178f0 2e 6e 45 71 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  .nEq;.  }else{. 
17900 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65     tRowcnt iLowe
17910 72 2c 20 69 55 70 70 65 72 2c 20 69 47 61 70 3b  r, iUpper, iGap;
17920 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b  .    if( i==0 ){
17930 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20  .      iLower = 
17940 30 3b 0a 20 20 20 20 20 20 69 55 70 70 65 72 20  0;.      iUpper 
17950 3d 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 6e 4c 74  = aSample[0].nLt
17960 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17970 20 20 20 69 55 70 70 65 72 20 3d 20 69 3e 3d 70     iUpper = i>=p
17980 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 3f 20 6e  Idx->nSample ? n
17990 20 3a 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 4c   : aSample[i].nL
179a0 74 3b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20  t;.      iLower 
179b0 3d 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e  = aSample[i-1].n
179c0 45 71 20 2b 20 61 53 61 6d 70 6c 65 5b 69 2d 31  Eq + aSample[i-1
179d0 5d 2e 6e 4c 74 3b 0a 20 20 20 20 7d 0a 20 20 20  ].nLt;.    }.   
179e0 20 61 53 74 61 74 5b 31 5d 20 3d 20 70 49 64 78   aStat[1] = pIdx
179f0 2d 3e 61 76 67 45 71 3b 0a 20 20 20 20 69 66 28  ->avgEq;.    if(
17a00 20 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72 20   iLower>=iUpper 
17a10 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20  ){.      iGap = 
17a20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
17a30 20 20 20 20 69 47 61 70 20 3d 20 69 55 70 70 65      iGap = iUppe
17a40 72 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20  r - iLower;.    
17a50 7d 0a 20 20 20 20 69 66 28 20 72 6f 75 6e 64 55  }.    if( roundU
17a60 70 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20  p ){.      iGap 
17a70 3d 20 28 69 47 61 70 2a 32 29 2f 33 3b 0a 20 20  = (iGap*2)/3;.  
17a80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
17a90 47 61 70 20 3d 20 69 47 61 70 2f 33 3b 0a 20 20  Gap = iGap/3;.  
17aa0 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 30 5d    }.    aStat[0]
17ab0 20 3d 20 69 4c 6f 77 65 72 20 2b 20 69 47 61 70   = iLower + iGap
17ac0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
17ad0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
17ae0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
17af0 42 4c 45 5f 53 54 41 54 33 20 2a 2f 0a 0a 2f 2a  BLE_STAT3 */../*
17b00 0a 2a 2a 20 49 66 20 65 78 70 72 65 73 73 69 6f  .** If expressio
17b10 6e 20 70 45 78 70 72 20 72 65 70 72 65 73 65 6e  n pExpr represen
17b20 74 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c  ts a literal val
17b30 75 65 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 70  ue, set *pp to p
17b40 6f 69 6e 74 20 74 6f 0a 2a 2a 20 61 6e 20 73 71  oint to.** an sq
17b50 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75  lite3_value stru
17b60 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67  cture containing
17b70 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2c   the same value,
17b80 20 77 69 74 68 20 61 66 66 69 6e 69 74 79 0a 2a   with affinity.*
17b90 2a 20 61 66 66 20 61 70 70 6c 69 65 64 20 74 6f  * aff applied to
17ba0 20 69 74 2c 20 62 65 66 6f 72 65 20 72 65 74 75   it, before retu
17bb0 72 6e 69 6e 67 2e 20 49 74 20 69 73 20 74 68 65  rning. It is the
17bc0 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
17bd0 6f 66 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65  of the .** calle
17be0 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
17bf0 72 65 6c 65 61 73 65 20 74 68 69 73 20 73 74 72  release this str
17c00 75 63 74 75 72 65 20 62 79 20 70 61 73 73 69 6e  ucture by passin
17c10 67 20 69 74 20 74 6f 20 0a 2a 2a 20 73 71 6c 69  g it to .** sqli
17c20 74 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a  te3ValueFree()..
17c30 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
17c40 72 65 6e 74 20 70 61 72 73 65 20 69 73 20 61 20  rent parse is a 
17c50 72 65 63 6f 6d 70 69 6c 65 20 28 73 71 6c 69 74  recompile (sqlit
17c60 65 33 52 65 70 72 65 70 61 72 65 28 29 29 20 61  e3Reprepare()) a
17c70 6e 64 20 70 45 78 70 72 0a 2a 2a 20 69 73 20 61  nd pExpr.** is a
17c80 6e 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20 74  n SQL variable t
17c90 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 68 61  hat currently ha
17ca0 73 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c  s a non-NULL val
17cb0 75 65 20 62 6f 75 6e 64 20 74 6f 20 69 74 2c 0a  ue bound to it,.
17cc0 2a 2a 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c  ** create an sql
17cd0 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63  ite3_value struc
17ce0 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ture containing 
17cf0 74 68 69 73 20 76 61 6c 75 65 2c 20 61 67 61 69  this value, agai
17d00 6e 20 77 69 74 68 0a 2a 2a 20 61 66 66 69 6e 69  n with.** affini
17d10 74 79 20 61 66 66 20 61 70 70 6c 69 65 64 20 74  ty aff applied t
17d20 6f 20 69 74 2c 20 69 6e 73 74 65 61 64 2e 0a 2a  o it, instead..*
17d30 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20  *.** If neither 
17d40 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 70 70  of the above app
17d50 6c 79 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 4e  ly, set *pp to N
17d60 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ULL..**.** If an
17d70 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
17d80 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
17d90 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ode. Otherwise, 
17da0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 23 69  SQLITE_OK..*/.#i
17db0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
17dc0 4c 45 5f 53 54 41 54 33 0a 73 74 61 74 69 63 20  LE_STAT3.static 
17dd0 69 6e 74 20 76 61 6c 75 65 46 72 6f 6d 45 78 70  int valueFromExp
17de0 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
17df0 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78  se, .  Expr *pEx
17e00 70 72 2c 20 0a 20 20 75 38 20 61 66 66 2c 20 0a  pr, .  u8 aff, .
17e10 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
17e20 2a 2a 70 70 0a 29 7b 0a 20 20 69 66 28 20 70 45  **pp.){.  if( pE
17e30 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49  xpr->op==TK_VARI
17e40 41 42 4c 45 0a 20 20 20 7c 7c 20 28 70 45 78 70  ABLE.   || (pExp
17e50 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  r->op==TK_REGIST
17e60 45 52 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 32  ER && pExpr->op2
17e70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 29 0a 20  ==TK_VARIABLE). 
17e80 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 56 61 72   ){.    int iVar
17e90 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
17ea0 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  n;.    sqlite3Vd
17eb0 62 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61  beSetVarmask(pPa
17ec0 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 56 61 72  rse->pVdbe, iVar
17ed0 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 73 71 6c  );.    *pp = sql
17ee0 69 74 65 33 56 64 62 65 47 65 74 56 61 6c 75 65  ite3VdbeGetValue
17ef0 28 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70  (pParse->pReprep
17f00 61 72 65 2c 20 69 56 61 72 2c 20 61 66 66 29 3b  are, iVar, aff);
17f10 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
17f20 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74  TE_OK;.  }.  ret
17f30 75 72 6e 20 73 71 6c 69 74 65 33 56 61 6c 75 65  urn sqlite3Value
17f40 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2d  FromExpr(pParse-
17f50 3e 64 62 2c 20 70 45 78 70 72 2c 20 53 51 4c 49  >db, pExpr, SQLI
17f60 54 45 5f 55 54 46 38 2c 20 61 66 66 2c 20 70 70  TE_UTF8, aff, pp
17f70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
17f80 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
17f90 20 69 73 20 75 73 65 64 20 74 6f 20 65 73 74 69   is used to esti
17fa0 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
17fb0 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
17fc0 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20  l be visited.** 
17fd0 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69  by scanning an i
17fe0 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65  ndex for a range
17ff0 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20   of values. The 
18000 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61  range may have a
18010 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64  n upper.** bound
18020 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c  , a lower bound,
18030 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48   or both. The WH
18040 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
18050 20 74 68 61 74 20 73 65 74 20 74 68 65 20 75 70   that set the up
18060 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72  per.** and lower
18070 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72   bounds are repr
18080 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65  esented by pLowe
18090 72 20 61 6e 64 20 70 55 70 70 65 72 20 72 65 73  r and pUpper res
180a0 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a  pectively. For.*
180b0 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d  * example, assum
180c0 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20 70  ing that index p
180d0 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a   is on t1(a):.**
180e0 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
180f0 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e  1 WHERE a > ? AN
18100 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20  D a < ? ....**  
18110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18120 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f    |_____|   |___
18130 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  __|.**          
18140 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
18150 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
18160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18170 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70 65 72  pLower    pUpper
18180 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  .**.** If either
18190 20 6f 66 20 74 68 65 20 75 70 70 65 72 20 6f 72   of the upper or
181a0 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20   lower bound is 
181b0 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65  not present, the
181c0 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64  n NULL is passed
181d0 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20   in.** place of 
181e0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
181f0 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a  g WhereTerm..**.
18200 2a 2a 20 54 68 65 20 6e 45 71 20 70 61 72 61 6d  ** The nEq param
18210 65 74 65 72 20 69 73 20 70 61 73 73 65 64 20 74  eter is passed t
18220 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
18230 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 73 75 62  index column sub
18240 6a 65 63 74 20 74 6f 20 74 68 65 0a 2a 2a 20 72  ject to the.** r
18250 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e  ange constraint.
18260 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c   Or, equivalentl
18270 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  y, the number of
18280 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
18290 61 69 6e 74 73 0a 2a 2a 20 6f 70 74 69 6d 69 7a  aints.** optimiz
182a0 65 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f 73  ed by the propos
182b0 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46  ed index scan. F
182c0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75  or example, assu
182d0 6d 69 6e 67 20 69 6e 64 65 78 20 70 20 69 73 0a  ming index p is.
182e0 2a 2a 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20  ** on t1(a, b), 
182f0 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65 72  and the SQL quer
18300 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  y is:.**.**   ..
18310 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
18320 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20  a = ? AND b > ? 
18330 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND b < ? ....**
18340 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 73 68 6f  .** then nEq sho
18350 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 74 68  uld be passed th
18360 65 20 76 61 6c 75 65 20 31 20 28 61 73 20 74 68  e value 1 (as th
18370 65 20 72 61 6e 67 65 20 72 65 73 74 72 69 63 74  e range restrict
18380 65 64 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 62 2c  ed column,.** b,
18390 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 6c   is the second l
183a0 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  eft-most column 
183b0 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20 4f  of the index). O
183c0 72 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 20  r, if the query 
183d0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20  is:.**.**   ... 
183e0 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
183f0 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e  > ? AND a < ? ..
18400 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71  ..**.** then nEq
18410 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65   should be passe
18420 64 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  d 0..**.** The r
18430 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73  eturned value is
18440 20 61 6e 20 69 6e 74 65 67 65 72 20 64 69 76 69   an integer divi
18450 73 6f 72 20 74 6f 20 72 65 64 75 63 65 20 74 68  sor to reduce th
18460 65 20 65 73 74 69 6d 61 74 65 64 0a 2a 2a 20 73  e estimated.** s
18470 65 61 72 63 68 20 73 70 61 63 65 2e 20 20 41 20  earch space.  A 
18480 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
18490 31 20 6d 65 61 6e 73 20 74 68 61 74 20 72 61 6e  1 means that ran
184a0 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  ge constraints a
184b0 72 65 0a 2a 2a 20 6e 6f 20 68 65 6c 70 20 61 74  re.** no help at
184c0 20 61 6c 6c 2e 20 20 41 20 72 65 74 75 72 6e 20   all.  A return 
184d0 76 61 6c 75 65 20 6f 66 20 32 20 6d 65 61 6e 73  value of 2 means
184e0 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
184f0 74 73 20 61 72 65 0a 2a 2a 20 65 78 70 65 63 74  ts are.** expect
18500 65 64 20 74 6f 20 72 65 64 75 63 65 20 74 68 65  ed to reduce the
18510 20 73 65 61 72 63 68 20 73 70 61 63 65 20 62 79   search space by
18520 20 68 61 6c 66 2e 20 20 41 6e 64 20 73 6f 20 66   half.  And so f
18530 6f 72 74 68 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e  orth....**.** In
18540 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20   the absence of 
18550 73 71 6c 69 74 65 5f 73 74 61 74 33 20 41 4e 41  sqlite_stat3 ANA
18560 4c 59 5a 45 20 64 61 74 61 2c 20 65 61 63 68 20  LYZE data, each 
18570 72 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74 79  range inequality
18580 0a 2a 2a 20 72 65 64 75 63 65 73 20 74 68 65 20  .** reduces the 
18590 73 65 61 72 63 68 20 73 70 61 63 65 20 62 79 20  search space by 
185a0 61 20 66 61 63 74 6f 72 20 6f 66 20 34 2e 20 20  a factor of 4.  
185b0 48 65 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 63  Hence a single c
185c0 6f 6e 73 74 72 61 69 6e 74 20 28 78 3e 3f 29 0a  onstraint (x>?).
185d0 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  ** results in a 
185e0 72 65 74 75 72 6e 20 6f 66 20 34 20 61 6e 64 20  return of 4 and 
185f0 61 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  a range constrai
18600 6e 74 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29  nt (x>? AND x<?)
18610 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 20 61   results.** in a
18620 20 72 65 74 75 72 6e 20 6f 66 20 31 36 2e 0a 2a   return of 16..*
18630 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
18640 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 0a  reRangeScanEst(.
18650 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
18660 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
18670 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74  g & code generat
18680 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
18690 20 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20   Index *p,      
186a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
186b0 65 78 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ex containing th
186c0 65 20 72 61 6e 67 65 2d 63 6f 6d 70 61 72 65 64  e range-compared
186d0 20 63 6f 6c 75 6d 6e 3b 20 22 78 22 20 2a 2f 0a   column; "x" */.
186e0 20 20 69 6e 74 20 6e 45 71 2c 20 20 20 20 20 20    int nEq,      
186f0 20 20 20 20 20 20 20 2f 2a 20 69 6e 64 65 78 20         /* index 
18700 69 6e 74 6f 20 70 2d 3e 61 43 6f 6c 5b 5d 20 6f  into p->aCol[] o
18710 66 20 74 68 65 20 72 61 6e 67 65 2d 63 6f 6d 70  f the range-comp
18720 61 72 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  ared column */. 
18730 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77   WhereTerm *pLow
18740 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62  er,   /* Lower b
18750 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67  ound on the rang
18760 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d  e. ex: "x>123" M
18770 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
18780 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70    WhereTerm *pUp
18790 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20  per,   /* Upper 
187a0 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e  bound on the ran
187b0 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20  ge. ex: "x<455" 
187c0 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
187d0 0a 20 20 64 6f 75 62 6c 65 20 2a 70 52 61 6e 67  .  double *pRang
187e0 65 44 69 76 20 20 20 2f 2a 20 4f 55 54 3a 20 52  eDiv   /* OUT: R
187f0 65 64 75 63 65 20 73 65 61 72 63 68 20 73 70 61  educe search spa
18800 63 65 20 62 79 20 74 68 69 73 20 64 69 76 69 73  ce by this divis
18810 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  or */.){.  int r
18820 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
18830 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
18840 41 42 4c 45 5f 53 54 41 54 33 0a 0a 20 20 69 66  ABLE_STAT3..  if
18850 28 20 6e 45 71 3d 3d 30 20 26 26 20 70 2d 3e 6e  ( nEq==0 && p->n
18860 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 73 71  Sample ){.    sq
18870 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 61  lite3_value *pRa
18880 6e 67 65 56 61 6c 3b 0a 20 20 20 20 74 52 6f 77  ngeVal;.    tRow
18890 63 6e 74 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a  cnt iLower = 0;.
188a0 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70 70      tRowcnt iUpp
188b0 65 72 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74  er = p->aiRowEst
188c0 5b 30 5d 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74  [0];.    tRowcnt
188d0 20 61 5b 32 5d 3b 0a 20 20 20 20 75 38 20 61 66   a[2];.    u8 af
188e0 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61  f = p->pTable->a
188f0 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Col[p->aiColumn[
18900 30 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 0a 20  0]].affinity;.. 
18910 20 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b     if( pLower ){
18920 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
18930 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78  pr = pLower->pEx
18940 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
18950 20 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d    rc = valueFrom
18960 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78  Expr(pParse, pEx
18970 70 72 2c 20 61 66 66 2c 20 26 70 52 61 6e 67 65  pr, aff, &pRange
18980 56 61 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Val);.      asse
18990 72 74 28 20 70 4c 6f 77 65 72 2d 3e 65 4f 70 65  rt( pLower->eOpe
189a0 72 61 74 6f 72 3d 3d 57 4f 5f 47 54 20 7c 7c 20  rator==WO_GT || 
189b0 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pLower->eOperato
189c0 72 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20  r==WO_GE );.    
189d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
189e0 5f 4f 4b 0a 20 20 20 20 20 20 20 26 26 20 77 68  _OK.       && wh
189f0 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72  ereKeyStats(pPar
18a00 73 65 2c 20 70 2c 20 70 52 61 6e 67 65 56 61 6c  se, p, pRangeVal
18a10 2c 20 30 2c 20 61 29 3d 3d 53 51 4c 49 54 45 5f  , 0, a)==SQLITE_
18a20 4f 4b 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  OK.      ){.    
18a30 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b 30      iLower = a[0
18a40 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
18a50 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Lower->eOperator
18a60 3d 3d 57 4f 5f 47 54 20 29 20 69 4c 6f 77 65 72  ==WO_GT ) iLower
18a70 20 2b 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20   += a[1];.      
18a80 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
18a90 61 6c 75 65 46 72 65 65 28 70 52 61 6e 67 65 56  alueFree(pRangeV
18aa0 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  al);.    }.    i
18ab0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18ac0 20 26 26 20 70 55 70 70 65 72 20 29 7b 0a 20 20   && pUpper ){.  
18ad0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
18ae0 3d 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d  = pUpper->pExpr-
18af0 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 72  >pRight;.      r
18b00 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78 70  c = valueFromExp
18b10 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  r(pParse, pExpr,
18b20 20 61 66 66 2c 20 26 70 52 61 6e 67 65 56 61 6c   aff, &pRangeVal
18b30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
18b40 20 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74   pUpper->eOperat
18b50 6f 72 3d 3d 57 4f 5f 4c 54 20 7c 7c 20 70 55 70  or==WO_LT || pUp
18b60 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  per->eOperator==
18b70 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 69  WO_LE );.      i
18b80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18b90 0a 20 20 20 20 20 20 20 26 26 20 77 68 65 72 65  .       && where
18ba0 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
18bb0 20 70 2c 20 70 52 61 6e 67 65 56 61 6c 2c 20 31   p, pRangeVal, 1
18bc0 2c 20 61 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  , a)==SQLITE_OK.
18bd0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
18be0 20 69 55 70 70 65 72 20 3d 20 61 5b 30 5d 3b 0a   iUpper = a[0];.
18bf0 20 20 20 20 20 20 20 20 69 66 28 20 70 55 70 70          if( pUpp
18c00 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  er->eOperator==W
18c10 4f 5f 4c 45 20 29 20 69 55 70 70 65 72 20 2b 3d  O_LE ) iUpper +=
18c20 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 20   a[1];.      }. 
18c30 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
18c40 65 46 72 65 65 28 70 52 61 6e 67 65 56 61 6c 29  eFree(pRangeVal)
18c50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18c60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18c70 0a 20 20 20 20 20 20 69 66 28 20 69 55 70 70 65  .      if( iUppe
18c80 72 3c 3d 69 4c 6f 77 65 72 20 29 7b 0a 20 20 20  r<=iLower ){.   
18c90 20 20 20 20 20 2a 70 52 61 6e 67 65 44 69 76 20       *pRangeDiv 
18ca0 3d 20 28 64 6f 75 62 6c 65 29 70 2d 3e 61 69 52  = (double)p->aiR
18cb0 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 20 20  owEst[0];.      
18cc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a  }else{.        *
18cd0 70 52 61 6e 67 65 44 69 76 20 3d 20 28 64 6f 75  pRangeDiv = (dou
18ce0 62 6c 65 29 70 2d 3e 61 69 52 6f 77 45 73 74 5b  ble)p->aiRowEst[
18cf0 30 5d 2f 28 64 6f 75 62 6c 65 29 28 69 55 70 70  0]/(double)(iUpp
18d00 65 72 20 2d 20 69 4c 6f 77 65 72 29 3b 0a 20 20  er - iLower);.  
18d10 20 20 20 20 7d 0a 20 20 20 20 20 20 57 48 45 52      }.      WHER
18d20 45 54 52 41 43 45 28 28 22 72 61 6e 67 65 20 73  ETRACE(("range s
18d30 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 75 2e  can regions: %u.
18d40 2e 25 75 20 20 64 69 76 3d 25 67 5c 6e 22 2c 0a  .%u  div=%g\n",.
18d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d60 20 20 28 75 33 32 29 69 4c 6f 77 65 72 2c 20 28    (u32)iLower, (
18d70 75 33 32 29 69 55 70 70 65 72 2c 20 2a 70 52 61  u32)iUpper, *pRa
18d80 6e 67 65 44 69 76 29 29 3b 0a 20 20 20 20 20 20  ngeDiv));.      
18d90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18da0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73  ;.    }.  }.#els
18db0 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
18dc0 45 54 45 52 28 70 50 61 72 73 65 29 3b 0a 20 20  ETER(pParse);.  
18dd0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
18de0 28 70 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  (p);.  UNUSED_PA
18df0 52 41 4d 45 54 45 52 28 6e 45 71 29 3b 0a 23 65  RAMETER(nEq);.#e
18e00 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
18e10 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72 20  Lower || pUpper 
18e20 29 3b 0a 20 20 2a 70 52 61 6e 67 65 44 69 76 20  );.  *pRangeDiv 
18e30 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20 20 69  = (double)1;.  i
18e40 66 28 20 70 4c 6f 77 65 72 20 26 26 20 28 70 4c  f( pLower && (pL
18e50 6f 77 65 72 2d 3e 77 74 46 6c 61 67 73 20 26 20  ower->wtFlags & 
18e60 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29  TERM_VNULL)==0 )
18e70 20 2a 70 52 61 6e 67 65 44 69 76 20 2a 3d 20 28   *pRangeDiv *= (
18e80 64 6f 75 62 6c 65 29 34 3b 0a 20 20 69 66 28 20  double)4;.  if( 
18e90 70 55 70 70 65 72 20 29 20 2a 70 52 61 6e 67 65  pUpper ) *pRange
18ea0 44 69 76 20 2a 3d 20 28 64 6f 75 62 6c 65 29 34  Div *= (double)4
18eb0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
18ec0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
18ed0 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 2f 2a 0a  ENABLE_STAT3./*.
18ee0 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
18ef0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
18f00 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75  hat will be retu
18f10 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  rned based on.**
18f20 20 61 6e 20 65 71 75 61 6c 69 74 79 20 63 6f 6e   an equality con
18f30 73 74 72 61 69 6e 74 20 78 3d 56 41 4c 55 45 20  straint x=VALUE 
18f40 61 6e 64 20 77 68 65 72 65 20 74 68 61 74 20 56  and where that V
18f50 41 4c 55 45 20 6f 63 63 75 72 73 20 69 6e 0a 2a  ALUE occurs in.*
18f60 2a 20 74 68 65 20 68 69 73 74 6f 67 72 61 6d 20  * the histogram 
18f70 64 61 74 61 2e 20 20 54 68 69 73 20 6f 6e 6c 79  data.  This only
18f80 20 77 6f 72 6b 73 20 77 68 65 6e 20 78 20 69 73   works when x is
18f90 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a   the left-most.*
18fa0 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69  * column of an i
18fb0 6e 64 65 78 20 61 6e 64 20 73 71 6c 69 74 65 5f  ndex and sqlite_
18fc0 73 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20  stat3 histogram 
18fd0 64 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c  data is availabl
18fe0 65 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20 69 6e  e.** for that in
18ff0 64 65 78 2e 20 20 57 68 65 6e 20 70 45 78 70 72  dex.  When pExpr
19000 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e  ==NULL that mean
19010 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  s the constraint
19020 20 69 73 0a 2a 2a 20 22 78 20 49 53 20 4e 55 4c   is.** "x IS NUL
19030 4c 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 78  L" instead of "x
19040 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57  =VALUE"..**.** W
19050 72 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74  rite the estimat
19060 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74  ed row count int
19070 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74  o *pnRow and ret
19080 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a  urn SQLITE_OK. .
19090 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20  ** If unable to 
190a0 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65  make an estimate
190b0 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75  , leave *pnRow u
190c0 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74  nchanged and ret
190d0 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e  urn.** non-zero.
190e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
190f0 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20  ine can fail if 
19100 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20  it is unable to 
19110 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67  load a collating
19120 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71   sequence.** req
19130 75 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67  uired for string
19140 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20   comparison, or 
19150 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c  if unable to all
19160 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20  ocate memory.** 
19170 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72  for a UTF conver
19180 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f  sion required fo
19190 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54  r comparison.  T
191a0 68 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72  he error is stor
191b0 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61  ed.** in the pPa
191c0 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
191d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
191e0 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 0a  reEqualScanEst(.
191f0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
19200 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
19210 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74  g & code generat
19220 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
19230 20 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20   Index *p,      
19240 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
19250 65 78 20 77 68 6f 73 65 20 6c 65 66 74 2d 6d 6f  ex whose left-mo
19260 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 70 54 65  st column is pTe
19270 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  rm */.  Expr *pE
19280 78 70 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  xpr,         /* 
19290 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 56  Expression for V
192a0 41 4c 55 45 20 69 6e 20 74 68 65 20 78 3d 56 41  ALUE in the x=VA
192b0 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  LUE constraint *
192c0 2f 0a 20 20 64 6f 75 62 6c 65 20 2a 70 6e 52 6f  /.  double *pnRo
192d0 77 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  w        /* Writ
192e0 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72 6f  e the revised ro
192f0 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65 20  w estimate here 
19300 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
19310 76 61 6c 75 65 20 2a 70 52 68 73 20 3d 20 30 3b  value *pRhs = 0;
19320 20 20 2f 2a 20 56 41 4c 55 45 20 6f 6e 20 72 69    /* VALUE on ri
19330 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
19340 20 70 54 65 72 6d 20 2a 2f 0a 20 20 75 38 20 61   pTerm */.  u8 a
19350 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
19360 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
19370 61 66 66 69 6e 69 74 79 20 2a 2f 0a 20 20 69 6e  affinity */.  in
19380 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
19390 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 66 75          /* Subfu
193a0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f  nction return co
193b0 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  de */.  tRowcnt 
193c0 61 5b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20  a[2];           
193d0 20 20 2f 2a 20 53 74 61 74 69 73 74 69 63 73 20    /* Statistics 
193e0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  */..  assert( p-
193f0 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20  >aSample!=0 );. 
19400 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 61 6d   assert( p->nSam
19410 70 6c 65 3e 30 20 29 3b 0a 20 20 61 66 66 20 3d  ple>0 );.  aff =
19420 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c   p->pTable->aCol
19430 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 5d  [p->aiColumn[0]]
19440 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66 28  .affinity;.  if(
19450 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20 72 63   pExpr ){.    rc
19460 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72   = valueFromExpr
19470 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
19480 61 66 66 2c 20 26 70 52 68 73 29 3b 0a 20 20 20  aff, &pRhs);.   
19490 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77   if( rc ) goto w
194a0 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
194b0 5f 63 61 6e 63 65 6c 3b 0a 20 20 7d 65 6c 73 65  _cancel;.  }else
194c0 7b 0a 20 20 20 20 70 52 68 73 20 3d 20 73 71 6c  {.    pRhs = sql
194d0 69 74 65 33 56 61 6c 75 65 4e 65 77 28 70 50 61  ite3ValueNew(pPa
194e0 72 73 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20 20  rse->db);.  }.  
194f0 69 66 28 20 70 52 68 73 3d 3d 30 20 29 20 72 65  if( pRhs==0 ) re
19500 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
19510 4f 55 4e 44 3b 0a 20 20 72 63 20 3d 20 77 68 65  OUND;.  rc = whe
19520 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73  reKeyStats(pPars
19530 65 2c 20 70 2c 20 70 52 68 73 2c 20 30 2c 20 61  e, p, pRhs, 0, a
19540 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
19550 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 57 48  ITE_OK ){.    WH
19560 45 52 45 54 52 41 43 45 28 28 22 65 71 75 61 6c  ERETRACE(("equal
19570 69 74 79 20 73 63 61 6e 20 72 65 67 69 6f 6e 73  ity scan regions
19580 3a 20 25 64 5c 6e 22 2c 20 28 69 6e 74 29 61 5b  : %d\n", (int)a[
19590 31 5d 29 29 3b 0a 20 20 20 20 2a 70 6e 52 6f 77  1]));.    *pnRow
195a0 20 3d 20 61 5b 31 5d 3b 0a 20 20 7d 0a 77 68 65   = a[1];.  }.whe
195b0 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 5f 63  reEqualScanEst_c
195c0 61 6e 63 65 6c 3a 0a 20 20 73 71 6c 69 74 65 33  ancel:.  sqlite3
195d0 56 61 6c 75 65 46 72 65 65 28 70 52 68 73 29 3b  ValueFree(pRhs);
195e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
195f0 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
19600 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
19610 53 54 41 54 33 29 20 2a 2f 0a 0a 23 69 66 64 65  STAT3) */..#ifde
19620 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
19630 53 54 41 54 33 0a 2f 2a 0a 2a 2a 20 45 73 74 69  STAT3./*.** Esti
19640 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
19650 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
19660 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 61  l be returned ba
19670 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20  sed on.** an IN 
19680 63 6f 6e 73 74 72 61 69 6e 74 20 77 68 65 72 65  constraint where
19690 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
196a0 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f  side of the IN o
196b0 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 61 20  perator.** is a 
196c0 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 2e 20  list of values. 
196d0 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   Example:.**.** 
196e0 20 20 20 20 20 20 20 57 48 45 52 45 20 78 20 49         WHERE x I
196f0 4e 20 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a  N (1,2,3,4).**.*
19700 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69  * Write the esti
19710 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20  mated row count 
19720 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20  into *pnRow and 
19730 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19740 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20  . .** If unable 
19750 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d  to make an estim
19760 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f  ate, leave *pnRo
19770 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  w unchanged and 
19780 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
19790 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ro..**.** This r
197a0 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20  outine can fail 
197b0 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20  if it is unable 
197c0 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74  to load a collat
197d0 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20  ing sequence.** 
197e0 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72  required for str
197f0 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20  ing comparison, 
19800 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20  or if unable to 
19810 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a  allocate memory.
19820 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e  ** for a UTF con
19830 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64  version required
19840 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   for comparison.
19850 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73    The error is s
19860 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  tored.** in the 
19870 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
19880 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19890 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 0a  whereInScanEst(.
198a0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
198b0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
198c0 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74  g & code generat
198d0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
198e0 20 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20   Index *p,      
198f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
19900 65 78 20 77 68 6f 73 65 20 6c 65 66 74 2d 6d 6f  ex whose left-mo
19910 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 70 54 65  st column is pTe
19920 72 6d 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  rm */.  ExprList
19930 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20   *pList,     /* 
19940 54 68 65 20 76 61 6c 75 65 20 6c 69 73 74 20 6f  The value list o
19950 6e 20 74 68 65 20 52 48 53 20 6f 66 20 22 78 20  n the RHS of "x 
19960 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e  IN (v1,v2,v3,...
19970 29 22 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 2a  )" */.  double *
19980 70 6e 52 6f 77 20 20 20 20 20 20 20 20 2f 2a 20  pnRow        /* 
19990 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65  Write the revise
199a0 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68  d row estimate h
199b0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
199c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
199d0 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 66 75          /* Subfu
199e0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f  nction return co
199f0 64 65 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e  de */.  double n
19a00 45 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Est;            
19a10 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
19a20 20 72 6f 77 73 20 66 6f 72 20 61 20 73 69 6e 67   rows for a sing
19a30 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20 64 6f 75  le term */.  dou
19a40 62 6c 65 20 6e 52 6f 77 45 73 74 20 3d 20 28 64  ble nRowEst = (d
19a50 6f 75 62 6c 65 29 30 3b 20 2f 2a 20 4e 65 77 20  ouble)0; /* New 
19a60 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
19a70 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a  number of rows *
19a80 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
19a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19aa0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
19ab0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  */..  assert( p-
19ac0 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20  >aSample!=0 );. 
19ad0 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
19ae0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c 69  LITE_OK && i<pLi
19af0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
19b00 0a 20 20 20 20 6e 45 73 74 20 3d 20 70 2d 3e 61  .    nEst = p->a
19b10 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20  iRowEst[0];.    
19b20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53  rc = whereEqualS
19b30 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
19b40 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
19b50 78 70 72 2c 20 26 6e 45 73 74 29 3b 0a 20 20 20  xpr, &nEst);.   
19b60 20 6e 52 6f 77 45 73 74 20 2b 3d 20 6e 45 73 74   nRowEst += nEst
19b70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
19b80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19b90 20 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 70   if( nRowEst > p
19ba0 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20 29 20  ->aiRowEst[0] ) 
19bb0 6e 52 6f 77 45 73 74 20 3d 20 70 2d 3e 61 69 52  nRowEst = p->aiR
19bc0 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 2a 70  owEst[0];.    *p
19bd0 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a  nRow = nRowEst;.
19be0 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28      WHERETRACE((
19bf0 22 49 4e 20 72 6f 77 20 65 73 74 69 6d 61 74 65  "IN row estimate
19c00 3a 20 65 73 74 3d 25 67 5c 6e 22 2c 20 6e 52 6f  : est=%g\n", nRo
19c10 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20 72 65  wEst));.  }.  re
19c20 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
19c30 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c  f /* defined(SQL
19c40 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
19c50 29 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  ) */.../*.** Fin
19c60 64 20 74 68 65 20 62 65 73 74 20 71 75 65 72 79  d the best query
19c70 20 70 6c 61 6e 20 66 6f 72 20 61 63 63 65 73 73   plan for access
19c80 69 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61 72  ing a particular
19c90 20 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20 74   table.  Write t
19ca0 68 65 0a 2a 2a 20 62 65 73 74 20 71 75 65 72 79  he.** best query
19cb0 20 70 6c 61 6e 20 61 6e 64 20 69 74 73 20 63 6f   plan and its co
19cc0 73 74 20 69 6e 74 6f 20 74 68 65 20 57 68 65 72  st into the Wher
19cd0 65 43 6f 73 74 20 6f 62 6a 65 63 74 20 73 75 70  eCost object sup
19ce0 70 6c 69 65 64 20 61 73 20 74 68 65 0a 2a 2a 20  plied as the.** 
19cf0 6c 61 73 74 20 70 61 72 61 6d 65 74 65 72 2e 0a  last parameter..
19d00 2a 2a 0a 2a 2a 20 54 68 65 20 6c 6f 77 65 73 74  **.** The lowest
19d10 20 63 6f 73 74 20 70 6c 61 6e 20 77 69 6e 73 2e   cost plan wins.
19d20 20 20 54 68 65 20 63 6f 73 74 20 69 73 20 61 6e    The cost is an
19d30 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
19d40 20 61 6d 6f 75 6e 74 20 6f 66 0a 2a 2a 20 43 50   amount of.** CP
19d50 55 20 61 6e 64 20 64 69 73 6b 20 49 2f 4f 20 6e  U and disk I/O n
19d60 65 65 64 65 64 20 74 6f 20 70 72 6f 63 65 73 73  eeded to process
19d70 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72   the requested r
19d80 65 73 75 6c 74 2e 0a 2a 2a 20 46 61 63 74 6f 72  esult..** Factor
19d90 73 20 74 68 61 74 20 69 6e 66 6c 75 65 6e 63 65  s that influence
19da0 20 63 6f 73 74 20 69 6e 63 6c 75 64 65 3a 0a 2a   cost include:.*
19db0 2a 0a 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 65  *.**    *  The e
19dc0 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20  stimated number 
19dd0 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
19de0 6c 20 62 65 20 72 65 74 72 69 65 76 65 64 2e 20  l be retrieved. 
19df0 20 28 54 68 65 0a 2a 2a 20 20 20 20 20 20 20 66   (The.**       f
19e00 65 77 65 72 20 74 68 65 20 62 65 74 74 65 72 2e  ewer the better.
19e10 29 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68  ).**.**    *  Wh
19e20 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 73 6f 72  ether or not sor
19e30 74 69 6e 67 20 6d 75 73 74 20 6f 63 63 75 72 2e  ting must occur.
19e40 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65  .**.**    *  Whe
19e50 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 72  ther or not ther
19e60 65 20 6d 75 73 74 20 62 65 20 73 65 70 61 72 61  e must be separa
19e70 74 65 20 6c 6f 6f 6b 75 70 73 20 69 6e 20 74 68  te lookups in th
19e80 65 0a 2a 2a 20 20 20 20 20 20 20 69 6e 64 65 78  e.**       index
19e90 20 61 6e 64 20 69 6e 20 74 68 65 20 6d 61 69 6e   and in the main
19ea0 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
19eb0 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e   there was an IN
19ec0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20  DEXED BY clause 
19ed0 28 70 53 72 63 2d 3e 70 49 6e 64 65 78 29 20 61  (pSrc->pIndex) a
19ee0 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74  ttached to the t
19ef0 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 53  able in.** the S
19f00 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  QL statement, th
19f10 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
19f20 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 73 20   only considers 
19f30 70 6c 61 6e 73 20 75 73 69 6e 67 20 74 68 65 20  plans using the 
19f40 0a 2a 2a 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e  .** named index.
19f50 20 49 66 20 6e 6f 20 73 75 63 68 20 70 6c 61 6e   If no such plan
19f60 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20   is found, then 
19f70 74 68 65 20 72 65 74 75 72 6e 65 64 20 63 6f 73  the returned cos
19f80 74 20 69 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  t is.** SQLITE_B
19f90 49 47 5f 44 42 4c 2e 20 49 66 20 61 20 70 6c 61  IG_DBL. If a pla
19fa0 6e 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74 20  n is found that 
19fb0 75 73 65 73 20 74 68 65 20 6e 61 6d 65 64 20 69  uses the named i
19fc0 6e 64 65 78 2c 20 0a 2a 2a 20 74 68 65 6e 20 74  ndex, .** then t
19fd0 68 65 20 63 6f 73 74 20 69 73 20 63 61 6c 63 75  he cost is calcu
19fe0 6c 61 74 65 64 20 69 6e 20 74 68 65 20 75 73 75  lated in the usu
19ff0 61 6c 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  al way..**.** If
1a000 20 61 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63   a NOT INDEXED c
1a010 6c 61 75 73 65 20 28 70 53 72 63 2d 3e 6e 6f 74  lause (pSrc->not
1a020 49 6e 64 65 78 65 64 21 3d 30 29 20 77 61 73 20  Indexed!=0) was 
1a030 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
1a040 74 61 62 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65  table .** in the
1a050 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1a060 74 2c 20 74 68 65 6e 20 6e 6f 20 69 6e 64 65 78  t, then no index
1a070 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  es are considere
1a080 64 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20  d. However, the 
1a090 0a 2a 2a 20 73 65 6c 65 63 74 65 64 20 70 6c 61  .** selected pla
1a0a0 6e 20 6d 61 79 20 73 74 69 6c 6c 20 74 61 6b 65  n may still take
1a0b0 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68   advantage of th
1a0c0 65 20 62 75 69 6c 74 2d 69 6e 20 72 6f 77 69 64  e built-in rowid
1a0d0 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 2a 2a 20   primary key.** 
1a0e0 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  index..*/.static
1a0f0 20 76 6f 69 64 20 62 65 73 74 42 74 72 65 65 49   void bestBtreeI
1a100 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
1a110 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
1a120 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
1a130 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1a140 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
1a150 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
1a160 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1a170 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
1a180 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
1a190 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
1a1a0 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72  use term to sear
1a1b0 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ch */.  Bitmask 
1a1c0 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20  notReady,       
1a1d0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63      /* Mask of c
1a1e0 75 72 73 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c  ursors not avail
1a1f0 61 62 6c 65 20 66 6f 72 20 69 6e 64 65 78 69 6e  able for indexin
1a200 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  g */.  Bitmask n
1a210 6f 74 56 61 6c 69 64 2c 20 20 20 20 20 20 20 20  otValid,        
1a220 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 6e 6f     /* Cursors no
1a230 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  t available for 
1a240 61 6e 79 20 70 75 72 70 6f 73 65 20 2a 2f 0a 20  any purpose */. 
1a250 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
1a260 72 42 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rBy,         /* 
1a270 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
1a280 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
1a290 74 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 20 20  t *pDistinct,   
1a2a0 20 20 20 20 20 2f 2a 20 54 68 65 20 73 65 6c 65       /* The sele
1a2b0 63 74 2d 6c 69 73 74 20 69 66 20 71 75 65 72 79  ct-list if query
1a2c0 20 69 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a   is DISTINCT */.
1a2d0 20 20 57 68 65 72 65 43 6f 73 74 20 2a 70 43 6f    WhereCost *pCo
1a2e0 73 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st            /*
1a2f0 20 4c 6f 77 65 73 74 20 63 6f 73 74 20 71 75 65   Lowest cost que
1a300 72 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 20 20  ry plan */.){.  
1a310 69 6e 74 20 69 43 75 72 20 3d 20 70 53 72 63 2d  int iCur = pSrc-
1a320 3e 69 43 75 72 73 6f 72 3b 20 20 20 2f 2a 20 54  >iCursor;   /* T
1a330 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65  he cursor of the
1a340 20 74 61 62 6c 65 20 74 6f 20 62 65 20 61 63 63   table to be acc
1a350 65 73 73 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  essed */.  Index
1a360 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20 20 20   *pProbe;       
1a370 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
1a380 65 78 20 77 65 20 61 72 65 20 65 76 61 6c 75 61  ex we are evalua
1a390 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ting */.  Index 
1a3a0 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
1a3b0 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66        /* Copy of
1a3c0 20 70 50 72 6f 62 65 2c 20 6f 72 20 7a 65 72 6f   pProbe, or zero
1a3d0 20 66 6f 72 20 49 50 4b 20 69 6e 64 65 78 20 2a   for IPK index *
1a3e0 2f 0a 20 20 69 6e 74 20 65 71 54 65 72 6d 4d 61  /.  int eqTermMa
1a3f0 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
1a400 2f 2a 20 43 75 72 72 65 6e 74 20 6d 61 73 6b 20  /* Current mask 
1a410 6f 66 20 76 61 6c 69 64 20 65 71 75 61 6c 69 74  of valid equalit
1a420 79 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20  y operators */. 
1a430 20 69 6e 74 20 69 64 78 45 71 54 65 72 6d 4d 61   int idxEqTermMa
1a440 73 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  sk;          /* 
1a450 49 6e 64 65 78 20 6d 61 73 6b 20 6f 66 20 76 61  Index mask of va
1a460 6c 69 64 20 65 71 75 61 6c 69 74 79 20 6f 70 65  lid equality ope
1a470 72 61 74 6f 72 73 20 2a 2f 0a 20 20 49 6e 64 65  rators */.  Inde
1a480 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20 20  x sPk;          
1a490 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61 6b          /* A fak
1a4a0 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 66  e index object f
1a4b0 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  or the primary k
1a4c0 65 79 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  ey */.  tRowcnt 
1a4d0 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20  aiRowEstPk[2];  
1a4e0 20 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f 77      /* The aiRow
1a4f0 45 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20  Est[] value for 
1a500 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f  the sPk index */
1a510 0a 20 20 69 6e 74 20 61 69 43 6f 6c 75 6d 6e 50  .  int aiColumnP
1a520 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 2f  k = -1;        /
1a530 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20  * The aColumn[] 
1a540 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50  value for the sP
1a550 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  k index */.  int
1a560 20 77 73 46 6c 61 67 4d 61 73 6b 3b 20 20 20 20   wsFlagMask;    
1a570 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
1a580 77 65 64 20 66 6c 61 67 73 20 69 6e 20 70 43 6f  wed flags in pCo
1a590 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 20  st->plan.wsFlag 
1a5a0 2a 2f 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  */..  /* Initial
1a5b0 69 7a 65 20 74 68 65 20 63 6f 73 74 20 74 6f 20  ize the cost to 
1a5c0 61 20 77 6f 72 73 74 2d 63 61 73 65 20 76 61 6c  a worst-case val
1a5d0 75 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 70  ue */.  memset(p
1a5e0 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Cost, 0, sizeof(
1a5f0 2a 70 43 6f 73 74 29 29 3b 0a 20 20 70 43 6f 73  *pCost));.  pCos
1a600 74 2d 3e 72 43 6f 73 74 20 3d 20 53 51 4c 49 54  t->rCost = SQLIT
1a610 45 5f 42 49 47 5f 44 42 4c 3b 0a 0a 20 20 2f 2a  E_BIG_DBL;..  /*
1a620 20 49 66 20 74 68 65 20 70 53 72 63 20 74 61 62   If the pSrc tab
1a630 6c 65 20 69 73 20 74 68 65 20 72 69 67 68 74 20  le is the right 
1a640 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20  table of a LEFT 
1a650 4a 4f 49 4e 20 74 68 65 6e 20 77 65 20 6d 61 79  JOIN then we may
1a660 20 6e 6f 74 0a 20 20 2a 2a 20 75 73 65 20 61 6e   not.  ** use an
1a670 20 69 6e 64 65 78 20 74 6f 20 73 61 74 69 73 66   index to satisf
1a680 79 20 49 53 20 4e 55 4c 4c 20 63 6f 6e 73 74 72  y IS NULL constr
1a690 61 69 6e 74 73 20 6f 6e 20 74 68 61 74 20 74 61  aints on that ta
1a6a0 62 6c 65 2e 20 20 54 68 69 73 20 69 73 0a 20 20  ble.  This is.  
1a6b0 2a 2a 20 62 65 63 61 75 73 65 20 63 6f 6c 75 6d  ** because colum
1a6c0 6e 73 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20  ns might end up 
1a6d0 62 65 69 6e 67 20 4e 55 4c 4c 20 69 66 20 74 68  being NULL if th
1a6e0 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74  e table does not
1a6f0 20 6d 61 74 63 68 20 2d 0a 20 20 2a 2a 20 61 20   match -.  ** a 
1a700 63 69 72 63 75 6d 73 74 61 6e 63 65 20 77 68 69  circumstance whi
1a710 63 68 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e  ch the index can
1a720 6e 6f 74 20 68 65 6c 70 20 75 73 20 64 69 73 63  not help us disc
1a730 6f 76 65 72 2e 20 20 54 69 63 6b 65 74 20 23 32  over.  Ticket #2
1a740 31 37 37 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  177..  */.  if( 
1a750 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  pSrc->jointype &
1a760 20 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20   JT_LEFT ){.    
1a770 69 64 78 45 71 54 65 72 6d 4d 61 73 6b 20 3d 20  idxEqTermMask = 
1a780 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20 7d  WO_EQ|WO_IN;.  }
1a790 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 45 71 54  else{.    idxEqT
1a7a0 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c  ermMask = WO_EQ|
1a7b0 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 3b  WO_IN|WO_ISNULL;
1a7c0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 72 63  .  }..  if( pSrc
1a7d0 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ->pIndex ){.    
1a7e0 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59  /* An INDEXED BY
1a7f0 20 63 6c 61 75 73 65 20 73 70 65 63 69 66 69 65   clause specifie
1a800 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69  s a particular i
1a810 6e 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20  ndex to use */. 
1a820 20 20 20 70 49 64 78 20 3d 20 70 50 72 6f 62 65     pIdx = pProbe
1a830 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3b   = pSrc->pIndex;
1a840 0a 20 20 20 20 77 73 46 6c 61 67 4d 61 73 6b 20  .    wsFlagMask 
1a850 3d 20 7e 28 57 48 45 52 45 5f 52 4f 57 49 44 5f  = ~(WHERE_ROWID_
1a860 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52  EQ|WHERE_ROWID_R
1a870 41 4e 47 45 29 3b 0a 20 20 20 20 65 71 54 65 72  ANGE);.    eqTer
1a880 6d 4d 61 73 6b 20 3d 20 69 64 78 45 71 54 65 72  mMask = idxEqTer
1a890 6d 4d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  mMask;.  }else{.
1a8a0 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
1a8b0 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  no INDEXED BY cl
1a8c0 61 75 73 65 2e 20 20 43 72 65 61 74 65 20 61 20  ause.  Create a 
1a8d0 66 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63  fake Index objec
1a8e0 74 20 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a  t in local.    *
1a8f0 2a 20 76 61 72 69 61 62 6c 65 20 73 50 6b 20 74  * variable sPk t
1a900 6f 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20  o represent the 
1a910 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65  rowid primary ke
1a920 79 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74  y index.  Make t
1a930 68 69 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20  his.    ** fake 
1a940 69 6e 64 65 78 20 74 68 65 20 66 69 72 73 74 20  index the first 
1a950 69 6e 20 61 20 63 68 61 69 6e 20 6f 66 20 49 6e  in a chain of In
1a960 64 65 78 20 6f 62 6a 65 63 74 73 20 77 69 74 68  dex objects with
1a970 20 61 6c 6c 20 6f 66 20 74 68 65 20 72 65 61 6c   all of the real
1a980 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 20  .    ** indices 
1a990 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20  to follow */.   
1a9a0 20 49 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20   Index *pFirst; 
1a9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9c0 20 2f 2a 20 46 69 72 73 74 20 6f 66 20 72 65 61   /* First of rea
1a9d0 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65  l indices on the
1a9e0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65   table */.    me
1a9f0 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69  mset(&sPk, 0, si
1aa00 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20  zeof(Index));.  
1aa10 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20    sPk.nColumn = 
1aa20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c  1;.    sPk.aiCol
1aa30 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50  umn = &aiColumnP
1aa40 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77  k;.    sPk.aiRow
1aa50 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b  Est = aiRowEstPk
1aa60 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f  ;.    sPk.onErro
1aa70 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a  r = OE_Replace;.
1aa80 20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d      sPk.pTable =
1aa90 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 20   pSrc->pTab;.   
1aaa0 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d   aiRowEstPk[0] =
1aab0 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 6e 52 6f   pSrc->pTab->nRo
1aac0 77 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45  wEst;.    aiRowE
1aad0 73 74 50 6b 5b 31 5d 20 3d 20 31 3b 0a 20 20 20  stPk[1] = 1;.   
1aae0 20 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e   pFirst = pSrc->
1aaf0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
1ab00 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49    if( pSrc->notI
1ab10 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20  ndexed==0 ){.   
1ab20 20 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69     /* The real i
1ab30 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20 74 61  ndices of the ta
1ab40 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e  ble are only con
1ab50 73 69 64 65 72 65 64 20 69 66 20 74 68 65 0a 20  sidered if the. 
1ab60 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45       ** NOT INDE
1ab70 58 45 44 20 71 75 61 6c 69 66 69 65 72 20 69 73  XED qualifier is
1ab80 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68   omitted from th
1ab90 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
1aba0 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74  .      sPk.pNext
1abb0 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d   = pFirst;.    }
1abc0 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73  .    pProbe = &s
1abd0 50 6b 3b 0a 20 20 20 20 77 73 46 6c 61 67 4d 61  Pk;.    wsFlagMa
1abe0 73 6b 20 3d 20 7e 28 0a 20 20 20 20 20 20 20 20  sk = ~(.        
1abf0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c  WHERE_COLUMN_IN|
1ac00 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c  WHERE_COLUMN_EQ|
1ac10 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c  WHERE_COLUMN_NUL
1ac20 4c 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  L|WHERE_COLUMN_R
1ac30 41 4e 47 45 0a 20 20 20 20 29 3b 0a 20 20 20 20  ANGE.    );.    
1ac40 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f  eqTermMask = WO_
1ac50 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20 20 20 70 49  EQ|WO_IN;.    pI
1ac60 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  dx = 0;.  }..  /
1ac70 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20  * Loop over all 
1ac80 69 6e 64 69 63 65 73 20 6c 6f 6f 6b 69 6e 67 20  indices looking 
1ac90 66 6f 72 20 74 68 65 20 62 65 73 74 20 6f 6e 65  for the best one
1aca0 20 74 6f 20 75 73 65 0a 20 20 2a 2f 0a 20 20 66   to use.  */.  f
1acb0 6f 72 28 3b 20 70 50 72 6f 62 65 3b 20 70 49 64  or(; pProbe; pId
1acc0 78 3d 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d  x=pProbe=pProbe-
1acd0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 63 6f 6e  >pNext){.    con
1ace0 73 74 20 74 52 6f 77 63 6e 74 20 2a 20 63 6f 6e  st tRowcnt * con
1acf0 73 74 20 61 69 52 6f 77 45 73 74 20 3d 20 70 50  st aiRowEst = pP
1ad00 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 3b 0a  robe->aiRowEst;.
1ad10 20 20 20 20 64 6f 75 62 6c 65 20 63 6f 73 74 3b      double cost;
1ad20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad30 2f 2a 20 43 6f 73 74 20 6f 66 20 75 73 69 6e 67  /* Cost of using
1ad40 20 70 50 72 6f 62 65 20 2a 2f 0a 20 20 20 20 64   pProbe */.    d
1ad50 6f 75 62 6c 65 20 6e 52 6f 77 3b 20 20 20 20 20  ouble nRow;     
1ad60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73             /* Es
1ad70 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
1ad80 66 20 72 6f 77 73 20 69 6e 20 72 65 73 75 6c 74  f rows in result
1ad90 20 73 65 74 20 2a 2f 0a 20 20 20 20 64 6f 75 62   set */.    doub
1ada0 6c 65 20 6c 6f 67 31 30 4e 20 3d 20 28 64 6f 75  le log10N = (dou
1adb0 62 6c 65 29 31 3b 20 20 2f 2a 20 62 61 73 65 2d  ble)1;  /* base-
1adc0 31 30 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20  10 logarithm of 
1add0 6e 52 6f 77 20 28 69 6e 65 78 61 63 74 29 20 2a  nRow (inexact) *
1ade0 2f 0a 20 20 20 20 69 6e 74 20 72 65 76 3b 20 20  /.    int rev;  
1adf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae00 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 63 61    /* True to sca
1ae10 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  n in reverse ord
1ae20 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 77 73  er */.    int ws
1ae30 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 42  Flags = 0;.    B
1ae40 69 74 6d 61 73 6b 20 75 73 65 64 20 3d 20 30 3b  itmask used = 0;
1ae50 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c  ..    /* The fol
1ae60 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73  lowing variables
1ae70 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 62   are populated b
1ae80 61 73 65 64 20 6f 6e 20 74 68 65 20 70 72 6f 70  ased on the prop
1ae90 65 72 74 69 65 73 20 6f 66 0a 20 20 20 20 2a 2a  erties of.    **
1aea0 20 69 6e 64 65 78 20 62 65 69 6e 67 20 65 76 61   index being eva
1aeb0 6c 75 61 74 65 64 2e 20 54 68 65 79 20 61 72 65  luated. They are
1aec0 20 74 68 65 6e 20 75 73 65 64 20 74 6f 20 64 65   then used to de
1aed0 74 65 72 6d 69 6e 65 20 74 68 65 20 65 78 70 65  termine the expe
1aee0 63 74 65 64 0a 20 20 20 20 2a 2a 20 63 6f 73 74  cted.    ** cost
1aef0 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72   and number of r
1af00 6f 77 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20  ows returned..  
1af10 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 6e 45 71    **.    **  nEq
1af20 3a 20 0a 20 20 20 20 2a 2a 20 20 20 20 4e 75 6d  : .    **    Num
1af30 62 65 72 20 6f 66 20 65 71 75 61 6c 69 74 79 20  ber of equality 
1af40 74 65 72 6d 73 20 74 68 61 74 20 63 61 6e 20 62  terms that can b
1af50 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73  e implemented us
1af60 69 6e 67 20 74 68 65 20 69 6e 64 65 78 2e 0a 20  ing the index.. 
1af70 20 20 20 2a 2a 20 20 20 20 49 6e 20 6f 74 68 65     **    In othe
1af80 72 20 77 6f 72 64 73 2c 20 74 68 65 20 6e 75 6d  r words, the num
1af90 62 65 72 20 6f 66 20 69 6e 69 74 69 61 6c 20 66  ber of initial f
1afa0 69 65 6c 64 73 20 69 6e 20 74 68 65 20 69 6e 64  ields in the ind
1afb0 65 78 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 20  ex that.    **  
1afc0 20 20 61 72 65 20 75 73 65 64 20 69 6e 20 3d 3d    are used in ==
1afd0 20 6f 72 20 49 4e 20 6f 72 20 4e 4f 54 20 4e 55   or IN or NOT NU
1afe0 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  LL constraints o
1aff0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
1b000 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  se..    **.    *
1b010 2a 20 20 6e 49 6e 4d 75 6c 3a 20 20 0a 20 20 20  *  nInMul:  .   
1b020 20 2a 2a 20 20 20 20 54 68 65 20 22 69 6e 2d 6d   **    The "in-m
1b030 75 6c 74 69 70 6c 69 65 72 22 2e 20 54 68 69 73  ultiplier". This
1b040 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20   is an estimate 
1b050 6f 66 20 68 6f 77 20 6d 61 6e 79 20 73 65 65 6b  of how many seek
1b060 20 6f 70 65 72 61 74 69 6f 6e 73 20 0a 20 20 20   operations .   
1b070 20 2a 2a 20 20 20 20 53 51 4c 69 74 65 20 6d 75   **    SQLite mu
1b080 73 74 20 70 65 72 66 6f 72 6d 20 6f 6e 20 74 68  st perform on th
1b090 65 20 69 6e 64 65 78 20 69 6e 20 71 75 65 73 74  e index in quest
1b0a0 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ion. For example
1b0b0 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20 2a 2a  , if the .    **
1b0c0 20 20 20 20 57 48 45 52 45 20 63 6c 61 75 73 65      WHERE clause
1b0d0 20 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   is:.    **.    
1b0e0 2a 2a 20 20 20 20 20 20 57 48 45 52 45 20 61 20  **      WHERE a 
1b0f0 49 4e 20 28 31 2c 20 32 2c 20 33 29 20 41 4e 44  IN (1, 2, 3) AND
1b100 20 62 20 49 4e 20 28 34 2c 20 35 2c 20 36 29 0a   b IN (4, 5, 6).
1b110 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1b120 20 53 51 4c 69 74 65 20 6d 75 73 74 20 70 65 72   SQLite must per
1b130 66 6f 72 6d 20 39 20 6c 6f 6f 6b 75 70 73 20 6f  form 9 lookups o
1b140 6e 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28 61  n an index on (a
1b150 2c 20 62 29 2c 20 73 6f 20 6e 49 6e 4d 75 6c 20  , b), so nInMul 
1b160 69 73 20 0a 20 20 20 20 2a 2a 20 20 20 20 73 65  is .    **    se
1b170 74 20 74 6f 20 39 2e 20 47 69 76 65 6e 20 74 68  t to 9. Given th
1b180 65 20 73 61 6d 65 20 73 63 68 65 6d 61 20 61 6e  e same schema an
1b190 64 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  d either of the 
1b1a0 66 6f 6c 6c 6f 77 69 6e 67 20 57 48 45 52 45 20  following WHERE 
1b1b0 0a 20 20 20 20 2a 2a 20 20 20 20 63 6c 61 75 73  .    **    claus
1b1c0 65 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  es:.    **.    *
1b1d0 2a 20 20 20 20 20 20 57 48 45 52 45 20 61 20 3d  *      WHERE a =
1b1e0 20 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20 20    1.    **      
1b1f0 57 48 45 52 45 20 61 20 3e 3d 20 32 0a 20 20 20  WHERE a >= 2.   
1b200 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 6e 49   **.    **    nI
1b210 6e 4d 75 6c 20 69 73 20 73 65 74 20 74 6f 20 31  nMul is set to 1
1b220 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1b230 20 20 20 49 66 20 74 68 65 72 65 20 65 78 69 73     If there exis
1b240 74 73 20 61 20 57 48 45 52 45 20 74 65 72 6d 20  ts a WHERE term 
1b250 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20 49  of the form "x I
1b260 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 2c  N (SELECT ...)",
1b270 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 20 20   then .    **   
1b280 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20   the sub-select 
1b290 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 72 65  is assumed to re
1b2a0 74 75 72 6e 20 32 35 20 72 6f 77 73 20 66 6f 72  turn 25 rows for
1b2b0 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66   the purposes of
1b2c0 20 0a 20 20 20 20 2a 2a 20 20 20 20 64 65 74 65   .    **    dete
1b2d0 72 6d 69 6e 69 6e 67 20 6e 49 6e 4d 75 6c 2e 0a  rmining nInMul..
1b2e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 62      **.    **  b
1b2f0 49 6e 45 73 74 3a 20 20 0a 20 20 20 20 2a 2a 20  InEst:  .    ** 
1b300 20 20 20 53 65 74 20 74 6f 20 74 72 75 65 20 69     Set to true i
1b310 66 20 74 68 65 72 65 20 77 61 73 20 61 74 20 6c  f there was at l
1b320 65 61 73 74 20 6f 6e 65 20 22 78 20 49 4e 20 28  east one "x IN (
1b330 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 74 65 72  SELECT ...)" ter
1b340 6d 20 75 73 65 64 20 0a 20 20 20 20 2a 2a 20 20  m used .    **  
1b350 20 20 69 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67    in determining
1b360 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 49   the value of nI
1b370 6e 4d 75 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74  nMul.  Note that
1b380 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 0a   the RHS of the.
1b390 20 20 20 20 2a 2a 20 20 20 20 49 4e 20 6f 70 65      **    IN ope
1b3a0 72 61 74 6f 72 20 6d 75 73 74 20 62 65 20 61 20  rator must be a 
1b3b0 53 45 4c 45 43 54 2c 20 6e 6f 74 20 61 20 76 61  SELECT, not a va
1b3c0 6c 75 65 20 6c 69 73 74 2c 20 66 6f 72 20 74 68  lue list, for th
1b3d0 69 73 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  is variable.    
1b3e0 2a 2a 20 20 20 20 74 6f 20 62 65 20 74 72 75 65  **    to be true
1b3f0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1b400 20 72 61 6e 67 65 44 69 76 3a 0a 20 20 20 20 2a   rangeDiv:.    *
1b410 2a 20 20 20 20 41 6e 20 65 73 74 69 6d 61 74 65  *    An estimate
1b420 20 6f 66 20 61 20 64 69 76 69 73 6f 72 20 62 79   of a divisor by
1b430 20 77 68 69 63 68 20 74 6f 20 72 65 64 75 63 65   which to reduce
1b440 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
1b450 65 20 64 75 65 0a 20 20 20 20 2a 2a 20 20 20 20  e due.    **    
1b460 74 6f 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  to inequality co
1b470 6e 73 74 72 61 69 6e 74 73 2e 20 20 49 6e 20 74  nstraints.  In t
1b480 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73 71  he absence of sq
1b490 6c 69 74 65 5f 73 74 61 74 33 20 41 4e 41 4c 59  lite_stat3 ANALY
1b4a0 5a 45 0a 20 20 20 20 2a 2a 20 20 20 20 64 61 74  ZE.    **    dat
1b4b0 61 2c 20 61 20 73 69 6e 67 6c 65 20 69 6e 65 71  a, a single ineq
1b4c0 75 61 6c 69 74 79 20 72 65 64 75 63 65 73 20 74  uality reduces t
1b4d0 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20  he search space 
1b4e0 74 6f 20 31 2f 34 72 64 20 69 74 73 0a 20 20 20  to 1/4rd its.   
1b4f0 20 2a 2a 20 20 20 20 6f 72 69 67 69 6e 61 6c 20   **    original 
1b500 73 69 7a 65 20 28 72 61 6e 67 65 44 69 76 3d 3d  size (rangeDiv==
1b510 34 29 2e 20 20 54 77 6f 20 69 6e 65 71 75 61 6c  4).  Two inequal
1b520 69 74 69 65 73 20 72 65 64 75 63 65 20 74 68 65  ities reduce the
1b530 20 73 65 61 72 63 68 0a 20 20 20 20 2a 2a 20 20   search.    **  
1b540 20 20 73 70 61 63 65 20 74 6f 20 31 2f 31 36 74    space to 1/16t
1b550 68 20 6f 66 20 69 74 73 20 6f 72 69 67 69 6e 61  h of its origina
1b560 6c 20 73 69 7a 65 20 28 72 61 6e 67 65 44 69 76  l size (rangeDiv
1b570 3d 3d 31 36 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ==16)..    **.  
1b580 20 20 2a 2a 20 20 62 53 6f 72 74 3a 20 20 20 0a    **  bSort:   .
1b590 20 20 20 20 2a 2a 20 20 20 20 42 6f 6f 6c 65 61      **    Boolea
1b5a0 6e 2e 20 54 72 75 65 20 69 66 20 74 68 65 72 65  n. True if there
1b5b0 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
1b5c0 63 6c 61 75 73 65 20 74 68 61 74 20 77 69 6c 6c  clause that will
1b5d0 20 72 65 71 75 69 72 65 20 61 6e 20 0a 20 20 20   require an .   
1b5e0 20 2a 2a 20 20 20 20 65 78 74 65 72 6e 61 6c 20   **    external 
1b5f0 73 6f 72 74 20 28 69 2e 65 2e 20 73 63 61 6e 6e  sort (i.e. scann
1b600 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 62 65  ing the index be
1b610 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20 77 69  ing evaluated wi
1b620 6c 6c 20 6e 6f 74 20 0a 20 20 20 20 2a 2a 20 20  ll not .    **  
1b630 20 20 63 6f 72 72 65 63 74 6c 79 20 6f 72 64 65    correctly orde
1b640 72 20 72 65 63 6f 72 64 73 29 2e 0a 20 20 20 20  r records)..    
1b650 2a 2a 0a 20 20 20 20 2a 2a 20 20 62 4c 6f 6f 6b  **.    **  bLook
1b660 75 70 3a 20 0a 20 20 20 20 2a 2a 20 20 20 20 42  up: .    **    B
1b670 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20  oolean. True if 
1b680 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 20 69  a table lookup i
1b690 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 65  s required for e
1b6a0 61 63 68 20 69 6e 64 65 78 20 65 6e 74 72 79 0a  ach index entry.
1b6b0 20 20 20 20 2a 2a 20 20 20 20 76 69 73 69 74 65      **    visite
1b6c0 64 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  d.  In other wor
1b6d0 64 73 2c 20 74 72 75 65 20 69 66 20 74 68 69 73  ds, true if this
1b6e0 20 69 73 20 6e 6f 74 20 61 20 63 6f 76 65 72 69   is not a coveri
1b6f0 6e 67 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a  ng index..    **
1b700 20 20 20 20 54 68 69 73 20 69 73 20 61 6c 77 61      This is alwa
1b710 79 73 20 66 61 6c 73 65 20 66 6f 72 20 74 68 65  ys false for the
1b720 20 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b   rowid primary k
1b730 65 79 20 69 6e 64 65 78 20 6f 66 20 61 20 74 61  ey index of a ta
1b740 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 20 20 20 46  ble..    **    F
1b750 6f 72 20 6f 74 68 65 72 20 69 6e 64 65 78 65 73  or other indexes
1b760 2c 20 69 74 20 69 73 20 74 72 75 65 20 75 6e 6c  , it is true unl
1b770 65 73 73 20 61 6c 6c 20 74 68 65 20 63 6f 6c 75  ess all the colu
1b780 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  mns of the table
1b790 0a 20 20 20 20 2a 2a 20 20 20 20 75 73 65 64 20  .    **    used 
1b7a0 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  by the SELECT st
1b7b0 61 74 65 6d 65 6e 74 20 61 72 65 20 70 72 65 73  atement are pres
1b7c0 65 6e 74 20 69 6e 20 74 68 65 20 69 6e 64 65 78  ent in the index
1b7d0 20 28 73 75 63 68 20 61 6e 0a 20 20 20 20 2a 2a   (such an.    **
1b7e0 20 20 20 20 69 6e 64 65 78 20 69 73 20 73 6f 6d      index is som
1b7f0 65 74 69 6d 65 73 20 64 65 73 63 72 69 62 65 64  etimes described
1b800 20 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69   as a covering i
1b810 6e 64 65 78 29 2e 0a 20 20 20 20 2a 2a 20 20 20  ndex)..    **   
1b820 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 67 69   For example, gi
1b830 76 65 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 6e  ven the index on
1b840 20 28 61 2c 20 62 29 2c 20 74 68 65 20 73 65 63   (a, b), the sec
1b850 6f 6e 64 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ond of the follo
1b860 77 69 6e 67 20 0a 20 20 20 20 2a 2a 20 20 20 20  wing .    **    
1b870 74 77 6f 20 71 75 65 72 69 65 73 20 72 65 71 75  two queries requ
1b880 69 72 65 73 20 74 61 62 6c 65 20 62 2d 74 72 65  ires table b-tre
1b890 65 20 6c 6f 6f 6b 75 70 73 20 69 6e 20 6f 72 64  e lookups in ord
1b8a0 65 72 20 74 6f 20 66 69 6e 64 20 74 68 65 20 76  er to find the v
1b8b0 61 6c 75 65 0a 20 20 20 20 2a 2a 20 20 20 20 6f  alue.    **    o
1b8c0 66 20 63 6f 6c 75 6d 6e 20 63 2c 20 62 75 74 20  f column c, but 
1b8d0 74 68 65 20 66 69 72 73 74 20 64 6f 65 73 20 6e  the first does n
1b8e0 6f 74 20 62 65 63 61 75 73 65 20 63 6f 6c 75 6d  ot because colum
1b8f0 6e 73 20 61 20 61 6e 64 20 62 20 61 72 65 0a 20  ns a and b are. 
1b900 20 20 20 2a 2a 20 20 20 20 62 6f 74 68 20 61 76     **    both av
1b910 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 20 69  ailable in the i
1b920 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ndex..    **.   
1b930 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
1b940 53 45 4c 45 43 54 20 61 2c 20 62 20 20 20 20 46  SELECT a, b    F
1b950 52 4f 4d 20 74 62 6c 20 57 48 45 52 45 20 61 20  ROM tbl WHERE a 
1b960 3d 20 31 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20  = 1;.    **     
1b970 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61          SELECT a
1b980 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74 62 6c 20  , b, c FROM tbl 
1b990 57 48 45 52 45 20 61 20 3d 20 31 3b 0a 20 20 20  WHERE a = 1;.   
1b9a0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 71 3b   */.    int nEq;
1b9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1b9d0 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72 6d  of == or IN term
1b9e0 73 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78  s matching index
1b9f0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 49 6e 45   */.    int bInE
1ba00 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
1ba10 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1ba20 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 2e 2e   "x IN (SELECT..
1ba30 2e 29 22 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20  .)" seen */.    
1ba40 69 6e 74 20 6e 49 6e 4d 75 6c 20 3d 20 31 3b 20  int nInMul = 1; 
1ba50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ba60 20 4e 75 6d 62 65 72 20 6f 66 20 64 69 73 74 69   Number of disti
1ba70 6e 63 74 20 65 71 75 61 6c 69 74 69 65 73 20 74  nct equalities t
1ba80 6f 20 6c 6f 6f 6b 75 70 20 2a 2f 0a 20 20 20 20  o lookup */.    
1ba90 64 6f 75 62 6c 65 20 72 61 6e 67 65 44 69 76 20  double rangeDiv 
1baa0 3d 20 28 64 6f 75 62 6c 65 29 31 3b 20 20 2f 2a  = (double)1;  /*
1bab0 20 45 73 74 69 6d 61 74 65 64 20 72 65 64 75 63   Estimated reduc
1bac0 74 69 6f 6e 20 69 6e 20 73 65 61 72 63 68 20 73  tion in search s
1bad0 70 61 63 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  pace */.    int 
1bae0 6e 42 6f 75 6e 64 20 3d 20 30 3b 20 20 20 20 20  nBound = 0;     
1baf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1bb00 62 65 72 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e  ber of range con
1bb10 73 74 72 61 69 6e 74 73 20 73 65 65 6e 20 2a 2f  straints seen */
1bb20 0a 20 20 20 20 69 6e 74 20 62 53 6f 72 74 20 3d  .    int bSort =
1bb30 20 21 21 70 4f 72 64 65 72 42 79 3b 20 20 20 20   !!pOrderBy;    
1bb40 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 65 78     /* True if ex
1bb50 74 65 72 6e 61 6c 20 73 6f 72 74 20 72 65 71 75  ternal sort requ
1bb60 69 72 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ired */.    int 
1bb70 62 44 69 73 74 20 3d 20 21 21 70 44 69 73 74 69  bDist = !!pDisti
1bb80 6e 63 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  nct;      /* Tru
1bb90 65 20 69 66 20 69 6e 64 65 78 20 63 61 6e 6e 6f  e if index canno
1bba0 74 20 68 65 6c 70 20 77 69 74 68 20 44 49 53 54  t help with DIST
1bbb0 49 4e 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20  INCT */.    int 
1bbc0 62 4c 6f 6f 6b 75 70 20 3d 20 30 3b 20 20 20 20  bLookup = 0;    
1bbd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1bbe0 65 20 69 66 20 6e 6f 74 20 61 20 63 6f 76 65 72  e if not a cover
1bbf0 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ing index */.   
1bc00 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
1bc10 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;             /
1bc20 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  * A single term 
1bc30 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
1bc40 75 73 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  use */.#ifdef SQ
1bc50 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
1bc60 33 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  3.    WhereTerm 
1bc70 2a 70 46 69 72 73 74 54 65 72 6d 20 3d 20 30 3b  *pFirstTerm = 0;
1bc80 20 20 20 20 2f 2a 20 46 69 72 73 74 20 74 65 72      /* First ter
1bc90 6d 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20 69  m matching the i
1bca0 6e 64 65 78 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  ndex */.#endif..
1bcb0 20 20 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65      /* Determine
1bcc0 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 6e   the values of n
1bcd0 45 71 20 61 6e 64 20 6e 49 6e 4d 75 6c 20 2a 2f  Eq and nInMul */
1bce0 0a 20 20 20 20 66 6f 72 28 6e 45 71 3d 30 3b 20  .    for(nEq=0; 
1bcf0 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  nEq<pProbe->nCol
1bd00 75 6d 6e 3b 20 6e 45 71 2b 2b 29 7b 0a 20 20 20  umn; nEq++){.   
1bd10 20 20 20 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62     int j = pProb
1bd20 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d  e->aiColumn[nEq]
1bd30 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
1bd40 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
1bd50 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c  ur, j, notReady,
1bd60 20 65 71 54 65 72 6d 4d 61 73 6b 2c 20 70 49 64   eqTermMask, pId
1bd70 78 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  x);.      if( pT
1bd80 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  erm==0 ) break;.
1bd90 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d        wsFlags |=
1bda0 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45   (WHERE_COLUMN_E
1bdb0 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51  Q|WHERE_ROWID_EQ
1bdc0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1bdd0 65 28 20 70 54 65 72 6d 2d 3e 70 57 43 21 3d 70  e( pTerm->pWC!=p
1bde0 57 43 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  WC );.      if( 
1bdf0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1be00 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20   & WO_IN ){.    
1be10 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
1be20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
1be30 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20          wsFlags 
1be40 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
1be50 49 4e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  IN;.        if( 
1be60 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1be70 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
1be80 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
1be90 20 20 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45    /* "x IN (SELE
1bea0 43 54 20 2e 2e 2e 29 22 3a 20 20 41 73 73 75 6d  CT ...)":  Assum
1beb0 65 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 74  e the SELECT ret
1bec0 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a  urns 25 rows */.
1bed0 20 20 20 20 20 20 20 20 20 20 6e 49 6e 4d 75 6c            nInMul
1bee0 20 2a 3d 20 32 35 3b 0a 20 20 20 20 20 20 20 20   *= 25;.        
1bef0 20 20 62 49 6e 45 73 74 20 3d 20 31 3b 0a 20 20    bInEst = 1;.  
1bf00 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1bf10 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e  ALWAYS(pExpr->x.
1bf20 70 4c 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e  pList && pExpr->
1bf30 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20  x.pList->nExpr) 
1bf40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1bf50 22 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61  "x IN (value, va
1bf60 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20  lue, ...)" */.  
1bf70 20 20 20 20 20 20 20 20 6e 49 6e 4d 75 6c 20 2a          nInMul *
1bf80 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
1bf90 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
1bfa0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
1bfb0 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
1bfc0 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  tor & WO_ISNULL 
1bfd0 29 7b 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61  ){.        wsFla
1bfe0 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
1bff0 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d  MN_NULL;.      }
1c000 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1c010 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20 20 20 20  NABLE_STAT3.    
1c020 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 26 26 20    if( nEq==0 && 
1c030 70 50 72 6f 62 65 2d 3e 61 53 61 6d 70 6c 65 20  pProbe->aSample 
1c040 29 20 70 46 69 72 73 74 54 65 72 6d 20 3d 20 70  ) pFirstTerm = p
1c050 54 65 72 6d 3b 0a 23 65 6e 64 69 66 0a 20 20 20  Term;.#endif.   
1c060 20 20 20 75 73 65 64 20 7c 3d 20 70 54 65 72 6d     used |= pTerm
1c070 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20  ->prereqRight;. 
1c080 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 49 66     }. .    /* If
1c090 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   the index being
1c0a0 20 63 6f 6e 73 69 64 65 72 65 64 20 69 73 20 55   considered is U
1c0b0 4e 49 51 55 45 2c 20 61 6e 64 20 74 68 65 72 65  NIQUE, and there
1c0c0 20 69 73 20 61 6e 20 65 71 75 61 6c 69 74 79 20   is an equality 
1c0d0 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69  .    ** constrai
1c0e0 6e 74 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d  nt for all colum
1c0f0 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c  ns in the index,
1c100 20 74 68 65 6e 20 74 68 69 73 20 73 65 61 72 63   then this searc
1c110 68 20 77 69 6c 6c 20 66 69 6e 64 0a 20 20 20 20  h will find.    
1c120 2a 2a 20 61 74 20 6d 6f 73 74 20 61 20 73 69 6e  ** at most a sin
1c130 67 6c 65 20 72 6f 77 2e 20 49 6e 20 74 68 69 73  gle row. In this
1c140 20 63 61 73 65 20 73 65 74 20 74 68 65 20 57 48   case set the WH
1c150 45 52 45 5f 55 4e 49 51 55 45 20 66 6c 61 67 20  ERE_UNIQUE flag 
1c160 74 6f 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63  to .    ** indic
1c170 61 74 65 20 74 68 69 73 20 74 6f 20 74 68 65 20  ate this to the 
1c180 63 61 6c 6c 65 72 2e 0a 20 20 20 20 2a 2a 0a 20  caller..    **. 
1c190 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c     ** Otherwise,
1c1a0 20 69 66 20 74 68 65 20 73 65 61 72 63 68 20 6d   if the search m
1c1b0 61 79 20 66 69 6e 64 20 6d 6f 72 65 20 74 68 61  ay find more tha
1c1c0 6e 20 6f 6e 65 20 72 6f 77 2c 20 74 65 73 74 20  n one row, test 
1c1d0 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 2a 2a  to see if.    **
1c1e0 20 74 68 65 72 65 20 69 73 20 61 20 72 61 6e 67   there is a rang
1c1f0 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  e constraint on 
1c200 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20 28  indexed column (
1c210 6e 45 71 2b 31 29 20 74 68 61 74 20 63 61 6e 20  nEq+1) that can 
1c220 62 65 20 0a 20 20 20 20 2a 2a 20 6f 70 74 69 6d  be .    ** optim
1c230 69 7a 65 64 20 75 73 69 6e 67 20 74 68 65 20 69  ized using the i
1c240 6e 64 65 78 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  ndex. .    */.  
1c250 20 20 69 66 28 20 6e 45 71 3d 3d 70 50 72 6f 62    if( nEq==pProb
1c260 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 70 50  e->nColumn && pP
1c270 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  robe->onError!=O
1c280 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20  E_None ){.      
1c290 74 65 73 74 63 61 73 65 28 20 77 73 46 6c 61 67  testcase( wsFlag
1c2a0 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
1c2b0 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _IN );.      tes
1c2c0 74 63 61 73 65 28 20 77 73 46 6c 61 67 73 20 26  tcase( wsFlags &
1c2d0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55   WHERE_COLUMN_NU
1c2e0 4c 4c 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  LL );.      if( 
1c2f0 28 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  (wsFlags & (WHER
1c300 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52  E_COLUMN_IN|WHER
1c310 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 29 3d  E_COLUMN_NULL))=
1c320 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 73  =0 ){.        ws
1c330 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55  Flags |= WHERE_U
1c340 4e 49 51 55 45 3b 0a 20 20 20 20 20 20 7d 0a 20  NIQUE;.      }. 
1c350 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 72     }else if( pPr
1c360 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d  obe->bUnordered=
1c370 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
1c380 6a 20 3d 20 28 6e 45 71 3d 3d 70 50 72 6f 62 65  j = (nEq==pProbe
1c390 2d 3e 6e 43 6f 6c 75 6d 6e 20 3f 20 2d 31 20 3a  ->nColumn ? -1 :
1c3a0 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d   pProbe->aiColum
1c3b0 6e 5b 6e 45 71 5d 29 3b 0a 20 20 20 20 20 20 69  n[nEq]);.      i
1c3c0 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c  f( findTerm(pWC,
1c3d0 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61   iCur, j, notRea
1c3e0 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c  dy, WO_LT|WO_LE|
1c3f0 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 49 64  WO_GT|WO_GE, pId
1c400 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68  x) ){.        Wh
1c410 65 72 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20  ereTerm *pTop = 
1c420 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
1c430 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c  ur, j, notReady,
1c440 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 70 49   WO_LT|WO_LE, pI
1c450 64 78 29 3b 0a 20 20 20 20 20 20 20 20 57 68 65  dx);.        Whe
1c460 72 65 54 65 72 6d 20 2a 70 42 74 6d 20 3d 20 66  reTerm *pBtm = f
1c470 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
1c480 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20  r, j, notReady, 
1c490 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 49 64  WO_GT|WO_GE, pId
1c4a0 78 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  x);.        wher
1c4b0 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 70 50  eRangeScanEst(pP
1c4c0 61 72 73 65 2c 20 70 50 72 6f 62 65 2c 20 6e 45  arse, pProbe, nE
1c4d0 71 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 26  q, pBtm, pTop, &
1c4e0 72 61 6e 67 65 44 69 76 29 3b 0a 20 20 20 20 20  rangeDiv);.     
1c4f0 20 20 20 69 66 28 20 70 54 6f 70 20 29 7b 0a 20     if( pTop ){. 
1c500 20 20 20 20 20 20 20 20 20 6e 42 6f 75 6e 64 20           nBound 
1c510 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 77  = 1;.          w
1c520 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
1c530 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  TOP_LIMIT;.     
1c540 20 20 20 20 20 75 73 65 64 20 7c 3d 20 70 54 6f       used |= pTo
1c550 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  p->prereqRight;.
1c560 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
1c570 73 65 28 20 70 54 6f 70 2d 3e 70 57 43 21 3d 70  se( pTop->pWC!=p
1c580 57 43 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  WC );.        }.
1c590 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74 6d          if( pBtm
1c5a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 42   ){.          nB
1c5b0 6f 75 6e 64 2b 2b 3b 0a 20 20 20 20 20 20 20 20  ound++;.        
1c5c0 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45    wsFlags |= WHE
1c5d0 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20  RE_BTM_LIMIT;.  
1c5e0 20 20 20 20 20 20 20 20 75 73 65 64 20 7c 3d 20          used |= 
1c5f0 70 42 74 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  pBtm->prereqRigh
1c600 74 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  t;.          tes
1c610 74 63 61 73 65 28 20 70 42 74 6d 2d 3e 70 57 43  tcase( pBtm->pWC
1c620 21 3d 70 57 43 20 29 3b 0a 20 20 20 20 20 20 20  !=pWC );.       
1c630 20 7d 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61   }.        wsFla
1c640 67 73 20 7c 3d 20 28 57 48 45 52 45 5f 43 4f 4c  gs |= (WHERE_COL
1c650 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f  UMN_RANGE|WHERE_
1c660 52 4f 57 49 44 5f 52 41 4e 47 45 29 3b 0a 20 20  ROWID_RANGE);.  
1c670 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1c680 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
1c690 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
1c6a0 73 65 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  se and the index
1c6b0 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65   being considere
1c6c0 64 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 6e 61  d will.    ** na
1c6d0 74 75 72 61 6c 6c 79 20 73 63 61 6e 20 72 6f 77  turally scan row
1c6e0 73 20 69 6e 20 74 68 65 20 72 65 71 75 69 72 65  s in the require
1c6f0 64 20 6f 72 64 65 72 2c 20 73 65 74 20 74 68 65  d order, set the
1c700 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6c 61   appropriate fla
1c710 67 73 0a 20 20 20 20 2a 2a 20 69 6e 20 77 73 46  gs.    ** in wsF
1c720 6c 61 67 73 2e 20 4f 74 68 65 72 77 69 73 65 2c  lags. Otherwise,
1c730 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
1c740 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1c750 62 75 74 20 74 68 65 20 69 6e 64 65 78 0a 20 20  but the index.  
1c760 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 72    ** will scan r
1c770 6f 77 73 20 69 6e 20 61 20 64 69 66 66 65 72 65  ows in a differe
1c780 6e 74 20 6f 72 64 65 72 2c 20 73 65 74 20 74 68  nt order, set th
1c790 65 20 62 53 6f 72 74 20 76 61 72 69 61 62 6c 65  e bSort variable
1c7a0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73  .  */.    if( is
1c7b0 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 0a 20 20  SortingIndex(.  
1c7c0 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
1c7d0 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 70  pWC->pMaskSet, p
1c7e0 50 72 6f 62 65 2c 20 69 43 75 72 2c 20 70 4f 72  Probe, iCur, pOr
1c7f0 64 65 72 42 79 2c 20 6e 45 71 2c 20 77 73 46 6c  derBy, nEq, wsFl
1c800 61 67 73 2c 20 26 72 65 76 29 0a 20 20 20 20 29  ags, &rev).    )
1c810 7b 0a 20 20 20 20 20 20 62 53 6f 72 74 20 3d 20  {.      bSort = 
1c820 30 3b 0a 20 20 20 20 20 20 77 73 46 6c 61 67 73  0;.      wsFlags
1c830 20 7c 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f   |= WHERE_ROWID_
1c840 52 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55  RANGE|WHERE_COLU
1c850 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 4f  MN_RANGE|WHERE_O
1c860 52 44 45 52 42 59 3b 0a 20 20 20 20 20 20 77 73  RDERBY;.      ws
1c870 46 6c 61 67 73 20 7c 3d 20 28 72 65 76 20 3f 20  Flags |= (rev ? 
1c880 57 48 45 52 45 5f 52 45 56 45 52 53 45 20 3a 20  WHERE_REVERSE : 
1c890 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  0);.    }..    /
1c8a0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
1c8b0 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69  DISTINCT qualifi
1c8c0 65 72 20 61 6e 64 20 74 68 69 73 20 69 6e 64 65  er and this inde
1c8d0 78 20 77 69 6c 6c 20 73 63 61 6e 20 72 6f 77 73  x will scan rows
1c8e0 20 69 6e 0a 20 20 20 20 2a 2a 20 6f 72 64 65 72   in.    ** order
1c8f0 20 6f 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   of the DISTINCT
1c900 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 63 6c   expressions, cl
1c910 65 61 72 20 62 44 69 73 74 20 61 6e 64 20 73 65  ear bDist and se
1c920 74 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  t the appropriat
1c930 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 73 20 69  e.    ** flags i
1c940 6e 20 77 73 46 6c 61 67 73 2e 20 2a 2f 0a 20 20  n wsFlags. */.  
1c950 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63 74    if( isDistinct
1c960 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 57  Index(pParse, pW
1c970 43 2c 20 70 50 72 6f 62 65 2c 20 69 43 75 72 2c  C, pProbe, iCur,
1c980 20 70 44 69 73 74 69 6e 63 74 2c 20 6e 45 71 29   pDistinct, nEq)
1c990 0a 20 20 20 20 20 26 26 20 28 77 73 46 6c 61 67  .     && (wsFlag
1c9a0 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
1c9b0 5f 49 4e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20  _IN)==0.    ){. 
1c9c0 20 20 20 20 20 62 44 69 73 74 20 3d 20 30 3b 0a       bDist = 0;.
1c9d0 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d        wsFlags |=
1c9e0 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e   WHERE_ROWID_RAN
1c9f0 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  GE|WHERE_COLUMN_
1ca00 52 41 4e 47 45 7c 57 48 45 52 45 5f 44 49 53 54  RANGE|WHERE_DIST
1ca10 49 4e 43 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  INCT;.    }..   
1ca20 20 2f 2a 20 49 66 20 63 75 72 72 65 6e 74 6c 79   /* If currently
1ca30 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 74 68 65   calculating the
1ca40 20 63 6f 73 74 20 6f 66 20 75 73 69 6e 67 20 61   cost of using a
1ca50 6e 20 69 6e 64 65 78 20 28 6e 6f 74 20 74 68 65  n index (not the
1ca60 20 49 50 4b 0a 20 20 20 20 2a 2a 20 69 6e 64 65   IPK.    ** inde
1ca70 78 29 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66  x), determine if
1ca80 20 61 6c 6c 20 72 65 71 75 69 72 65 64 20 63 6f   all required co
1ca90 6c 75 6d 6e 20 64 61 74 61 20 6d 61 79 20 62 65  lumn data may be
1caa0 20 6f 62 74 61 69 6e 65 64 20 77 69 74 68 6f 75   obtained withou
1cab0 74 20 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20  t .    ** using 
1cac0 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 20 28  the main table (
1cad0 69 2e 65 2e 20 69 66 20 74 68 65 20 69 6e 64 65  i.e. if the inde
1cae0 78 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67 0a  x is a covering.
1caf0 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 66 6f 72      ** index for
1cb00 20 74 68 69 73 20 71 75 65 72 79 29 2e 20 49 66   this query). If
1cb10 20 69 74 20 69 73 2c 20 73 65 74 20 74 68 65 20   it is, set the 
1cb20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 66  WHERE_IDX_ONLY f
1cb30 6c 61 67 20 69 6e 0a 20 20 20 20 2a 2a 20 77 73  lag in.    ** ws
1cb40 46 6c 61 67 73 2e 20 4f 74 68 65 72 77 69 73 65  Flags. Otherwise
1cb50 2c 20 73 65 74 20 74 68 65 20 62 4c 6f 6f 6b 75  , set the bLooku
1cb60 70 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 72  p variable to tr
1cb70 75 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ue.  */.    if( 
1cb80 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 42 69  pIdx ){.      Bi
1cb90 74 6d 61 73 6b 20 6d 20 3d 20 70 53 72 63 2d 3e  tmask m = pSrc->
1cba0 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 69  colUsed;.      i
1cbb0 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
1cbc0 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f  j=0; j<pIdx->nCo
1cbd0 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  lumn; j++){.    
1cbe0 20 20 20 20 69 6e 74 20 78 20 3d 20 70 49 64 78      int x = pIdx
1cbf0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
1cc00 20 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53         if( x<BMS
1cc10 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
1cc20 6d 20 26 3d 20 7e 28 28 28 42 69 74 6d 61 73 6b  m &= ~(((Bitmask
1cc30 29 31 29 3c 3c 78 29 3b 0a 20 20 20 20 20 20 20  )1)<<x);.       
1cc40 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1cc50 20 69 66 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20   if( m==0 ){.   
1cc60 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20       wsFlags |= 
1cc70 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a  WHERE_IDX_ONLY;.
1cc80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1cc90 20 20 20 20 20 62 4c 6f 6f 6b 75 70 20 3d 20 31       bLookup = 1
1cca0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ccb0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 45  .    /*.    ** E
1ccc0 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
1ccd0 65 72 20 6f 66 20 72 6f 77 73 20 6f 66 20 6f 75  er of rows of ou
1cce0 74 70 75 74 2e 20 20 46 6f 72 20 61 6e 20 22 78  tput.  For an "x
1ccf0 20 49 4e 20 28 53 45 4c 45 43 54 2e 2e 2e 29 22   IN (SELECT...)"
1cd00 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69  .    ** constrai
1cd10 6e 74 2c 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74  nt, do not let t
1cd20 68 65 20 65 73 74 69 6d 61 74 65 20 65 78 63 65  he estimate exce
1cd30 65 64 20 68 61 6c 66 20 74 68 65 20 72 6f 77 73  ed half the rows
1cd40 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 20   in the table.. 
1cd50 20 20 20 2a 2f 0a 20 20 20 20 6e 52 6f 77 20 3d     */.    nRow =
1cd60 20 28 64 6f 75 62 6c 65 29 28 61 69 52 6f 77 45   (double)(aiRowE
1cd70 73 74 5b 6e 45 71 5d 20 2a 20 6e 49 6e 4d 75 6c  st[nEq] * nInMul
1cd80 29 3b 0a 20 20 20 20 69 66 28 20 62 49 6e 45 73  );.    if( bInEs
1cd90 74 20 26 26 20 6e 52 6f 77 2a 32 3e 61 69 52 6f  t && nRow*2>aiRo
1cda0 77 45 73 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20  wEst[0] ){.     
1cdb0 20 6e 52 6f 77 20 3d 20 61 69 52 6f 77 45 73 74   nRow = aiRowEst
1cdc0 5b 30 5d 2f 32 3b 0a 20 20 20 20 20 20 6e 49 6e  [0]/2;.      nIn
1cdd0 4d 75 6c 20 3d 20 28 69 6e 74 29 28 6e 52 6f 77  Mul = (int)(nRow
1cde0 20 2f 20 61 69 52 6f 77 45 73 74 5b 6e 45 71 5d   / aiRowEst[nEq]
1cdf0 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66  );.    }..#ifdef
1ce00 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
1ce10 54 41 54 33 0a 20 20 20 20 2f 2a 20 49 66 20 74  TAT3.    /* If t
1ce20 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  he constraint is
1ce30 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 78 3d 56   of the form x=V
1ce40 41 4c 55 45 20 6f 72 20 78 20 49 4e 20 28 45 31  ALUE or x IN (E1
1ce50 2c 45 32 2c 2e 2e 2e 29 0a 20 20 20 20 2a 2a 20  ,E2,...).    ** 
1ce60 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74 20 74 68  and we do not th
1ce70 69 6e 6b 20 74 68 61 74 20 76 61 6c 75 65 73 20  ink that values 
1ce80 6f 66 20 78 20 61 72 65 20 75 6e 69 71 75 65 20  of x are unique 
1ce90 61 6e 64 20 69 66 20 68 69 73 74 6f 67 72 61 6d  and if histogram
1cea0 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20  .    ** data is 
1ceb0 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 63 6f  available for co
1cec0 6c 75 6d 6e 20 78 2c 20 74 68 65 6e 20 69 74 20  lumn x, then it 
1ced0 6d 69 67 68 74 20 62 65 20 70 6f 73 73 69 62 6c  might be possibl
1cee0 65 0a 20 20 20 20 2a 2a 20 74 6f 20 67 65 74 20  e.    ** to get 
1cef0 61 20 62 65 74 74 65 72 20 65 73 74 69 6d 61 74  a better estimat
1cf00 65 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  e on the number 
1cf10 6f 66 20 72 6f 77 73 20 62 61 73 65 64 20 6f 6e  of rows based on
1cf20 0a 20 20 20 20 2a 2a 20 56 41 4c 55 45 20 61 6e  .    ** VALUE an
1cf30 64 20 68 6f 77 20 63 6f 6d 6d 6f 6e 20 74 68 61  d how common tha
1cf40 74 20 76 61 6c 75 65 20 69 73 20 61 63 63 6f 72  t value is accor
1cf50 64 69 6e 67 20 74 6f 20 74 68 65 20 68 69 73 74  ding to the hist
1cf60 6f 67 72 61 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20  ogram..    */.  
1cf70 20 20 69 66 28 20 6e 52 6f 77 3e 28 64 6f 75 62    if( nRow>(doub
1cf80 6c 65 29 31 20 26 26 20 6e 45 71 3d 3d 31 20 26  le)1 && nEq==1 &
1cf90 26 20 70 46 69 72 73 74 54 65 72 6d 21 3d 30 20  & pFirstTerm!=0 
1cfa0 26 26 20 61 69 52 6f 77 45 73 74 5b 31 5d 3e 31  && aiRowEst[1]>1
1cfb0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1cfc0 28 20 28 70 46 69 72 73 74 54 65 72 6d 2d 3e 65  ( (pFirstTerm->e
1cfd0 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45  Operator & (WO_E
1cfe0 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49  Q|WO_ISNULL|WO_I
1cff0 4e 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  N))!=0 );.      
1d000 69 66 28 20 70 46 69 72 73 74 54 65 72 6d 2d 3e  if( pFirstTerm->
1d010 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
1d020 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 7b  EQ|WO_ISNULL) ){
1d030 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1d040 65 28 20 70 46 69 72 73 74 54 65 72 6d 2d 3e 65  e( pFirstTerm->e
1d050 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20  Operator==WO_EQ 
1d060 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1d070 61 73 65 28 20 70 46 69 72 73 74 54 65 72 6d 2d  ase( pFirstTerm-
1d080 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49  >eOperator==WO_I
1d090 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20  SNULL );.       
1d0a0 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
1d0b0 73 74 28 70 50 61 72 73 65 2c 20 70 50 72 6f 62  st(pParse, pProb
1d0c0 65 2c 20 70 46 69 72 73 74 54 65 72 6d 2d 3e 70  e, pFirstTerm->p
1d0d0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e  Expr->pRight, &n
1d0e0 52 6f 77 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Row);.      }els
1d0f0 65 20 69 66 28 20 62 49 6e 45 73 74 3d 3d 30 20  e if( bInEst==0 
1d100 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1d110 74 28 20 70 46 69 72 73 74 54 65 72 6d 2d 3e 65  t( pFirstTerm->e
1d120 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20  Operator==WO_IN 
1d130 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  );.        where
1d140 49 6e 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  InScanEst(pParse
1d150 2c 20 70 50 72 6f 62 65 2c 20 70 46 69 72 73 74  , pProbe, pFirst
1d160 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 78 2e 70  Term->pExpr->x.p
1d170 4c 69 73 74 2c 20 26 6e 52 6f 77 29 3b 0a 20 20  List, &nRow);.  
1d180 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
1d190 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
1d1a0 42 4c 45 5f 53 54 41 54 33 20 2a 2f 0a 0a 20 20  BLE_STAT3 */..  
1d1b0 20 20 2f 2a 20 41 64 6a 75 73 74 20 74 68 65 20    /* Adjust the 
1d1c0 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
1d1d0 20 72 6f 77 73 20 61 6e 64 20 64 6f 77 6e 77 61   rows and downwa
1d1e0 72 64 20 74 6f 20 72 65 66 6c 65 63 74 20 72 6f  rd to reflect ro
1d1f0 77 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 61  ws.    ** that a
1d200 72 65 20 65 78 63 6c 75 64 65 64 20 62 79 20 72  re excluded by r
1d210 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
1d220 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 52 6f  ..    */.    nRo
1d230 77 20 3d 20 6e 52 6f 77 2f 72 61 6e 67 65 44 69  w = nRow/rangeDi
1d240 76 3b 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 3c  v;.    if( nRow<
1d250 31 20 29 20 6e 52 6f 77 20 3d 20 31 3b 0a 0a 20  1 ) nRow = 1;.. 
1d260 20 20 20 2f 2a 20 45 78 70 65 72 69 6d 65 6e 74     /* Experiment
1d270 73 20 72 75 6e 20 6f 6e 20 72 65 61 6c 20 53 51  s run on real SQ
1d280 4c 69 74 65 20 64 61 74 61 62 61 73 65 73 20 73  Lite databases s
1d290 68 6f 77 20 74 68 61 74 20 74 68 65 20 74 69 6d  how that the tim
1d2a0 65 20 6e 65 65 64 65 64 0a 20 20 20 20 2a 2a 20  e needed.    ** 
1d2b0 74 6f 20 64 6f 20 61 20 62 69 6e 61 72 79 20 73  to do a binary s
1d2c0 65 61 72 63 68 20 74 6f 20 6c 6f 63 61 74 65 20  earch to locate 
1d2d0 61 20 72 6f 77 20 69 6e 20 61 20 74 61 62 6c 65  a row in a table
1d2e0 20 6f 72 20 69 6e 64 65 78 20 69 73 20 72 6f 75   or index is rou
1d2f0 67 68 6c 79 0a 20 20 20 20 2a 2a 20 6c 6f 67 31  ghly.    ** log1
1d300 30 28 4e 29 20 74 69 6d 65 73 20 74 68 65 20 74  0(N) times the t
1d310 69 6d 65 20 74 6f 20 6d 6f 76 65 20 66 72 6f 6d  ime to move from
1d320 20 6f 6e 65 20 72 6f 77 20 74 6f 20 74 68 65 20   one row to the 
1d330 6e 65 78 74 20 72 6f 77 20 77 69 74 68 69 6e 0a  next row within.
1d340 20 20 20 20 2a 2a 20 61 20 74 61 62 6c 65 20 6f      ** a table o
1d350 72 20 69 6e 64 65 78 2e 20 20 54 68 65 20 61 63  r index.  The ac
1d360 74 75 61 6c 20 74 69 6d 65 73 20 63 61 6e 20 76  tual times can v
1d370 61 72 79 2c 20 77 69 74 68 20 74 68 65 20 73 69  ary, with the si
1d380 7a 65 20 6f 66 0a 20 20 20 20 2a 2a 20 72 65 63  ze of.    ** rec
1d390 6f 72 64 73 20 62 65 69 6e 67 20 61 6e 20 69 6d  ords being an im
1d3a0 70 6f 72 74 61 6e 74 20 66 61 63 74 6f 72 2e 20  portant factor. 
1d3b0 20 42 6f 74 68 20 6d 6f 76 65 73 20 61 6e 64 20   Both moves and 
1d3c0 73 65 61 72 63 68 65 73 20 61 72 65 0a 20 20 20  searches are.   
1d3d0 20 2a 2a 20 73 6c 6f 77 65 72 20 77 69 74 68 20   ** slower with 
1d3e0 6c 61 72 67 65 72 20 72 65 63 6f 72 64 73 2c 20  larger records, 
1d3f0 70 72 65 73 75 6d 61 62 6c 79 20 62 65 63 61 75  presumably becau
1d400 73 65 20 66 65 77 65 72 20 72 65 63 6f 72 64 73  se fewer records
1d410 20 66 69 74 0a 20 20 20 20 2a 2a 20 6f 6e 20 6f   fit.    ** on o
1d420 6e 65 20 70 61 67 65 20 61 6e 64 20 68 65 6e 63  ne page and henc
1d430 65 20 6d 6f 72 65 20 70 61 67 65 73 20 68 61 76  e more pages hav
1d440 65 20 74 6f 20 62 65 20 66 65 74 63 68 65 64 2e  e to be fetched.
1d450 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1d460 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61  he ANALYZE comma
1d470 6e 64 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74  nd and the sqlit
1d480 65 5f 73 74 61 74 31 20 61 6e 64 20 73 71 6c 69  e_stat1 and sqli
1d490 74 65 5f 73 74 61 74 33 20 74 61 62 6c 65 73 20  te_stat3 tables 
1d4a0 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 67 69  do.    ** not gi
1d4b0 76 65 20 75 73 20 64 61 74 61 20 6f 6e 20 74 68  ve us data on th
1d4c0 65 20 72 65 6c 61 74 69 76 65 20 73 69 7a 65 73  e relative sizes
1d4d0 20 6f 66 20 74 61 62 6c 65 20 61 6e 64 20 69 6e   of table and in
1d4e0 64 65 78 20 72 65 63 6f 72 64 73 2e 0a 20 20 20  dex records..   
1d4f0 20 2a 2a 20 53 6f 20 74 68 69 73 20 63 6f 6d 70   ** So this comp
1d500 75 74 61 74 69 6f 6e 20 61 73 73 75 6d 65 73 20  utation assumes 
1d510 74 61 62 6c 65 20 72 65 63 6f 72 64 73 20 61 72  table records ar
1d520 65 20 61 62 6f 75 74 20 74 77 69 63 65 20 61 73  e about twice as
1d530 20 62 69 67 0a 20 20 20 20 2a 2a 20 61 73 20 69   big.    ** as i
1d540 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 20 20 20  ndex records.   
1d550 20 2a 2f 0a 20 20 20 20 69 66 28 20 77 73 46 6c   */.    if( wsFl
1d560 61 67 73 3d 3d 57 48 45 52 45 5f 49 44 58 5f 4f  ags==WHERE_IDX_O
1d570 4e 4c 59 0a 20 20 20 20 20 26 26 20 28 70 57 43  NLY.     && (pWC
1d580 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
1d590 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
1d5a0 49 52 45 44 29 3d 3d 30 0a 20 20 20 20 20 26 26  IRED)==0.     &&
1d5b0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1d5c0 6e 66 69 67 2e 62 55 73 65 43 69 73 0a 23 69 66  nfig.bUseCis.#if
1d5d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1d5e0 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 0a 20 20  _BUILTIN_TEST.  
1d5f0 20 20 20 26 26 20 28 70 50 61 72 73 65 2d 3e 64     && (pParse->d
1d600 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
1d610 45 5f 43 6f 76 65 72 49 64 78 53 63 61 6e 29 3d  E_CoverIdxScan)=
1d620 3d 30 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 7b  =0.#endif.    ){
1d630 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69  .      /* This i
1d640 6e 64 65 78 20 69 73 20 6e 6f 74 20 75 73 65 66  ndex is not usef
1d650 75 6c 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 2c  ul for indexing,
1d660 20 62 75 74 20 69 74 20 69 73 20 61 20 63 6f 76   but it is a cov
1d670 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20 20  ering index..   
1d680 20 20 20 2a 2a 20 41 20 66 75 6c 6c 2d 73 63 61     ** A full-sca
1d690 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6d  n of the index m
1d6a0 69 67 68 74 20 62 65 20 61 20 6c 69 74 74 6c 65  ight be a little
1d6b0 20 66 61 73 74 65 72 20 74 68 61 6e 20 61 20 66   faster than a f
1d6c0 75 6c 6c 2d 73 63 61 6e 0a 20 20 20 20 20 20 2a  ull-scan.      *
1d6d0 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2c 20  * of the table, 
1d6e0 73 6f 20 67 69 76 65 20 74 68 69 73 20 63 61 73  so give this cas
1d6f0 65 20 61 20 63 6f 73 74 20 73 6c 69 67 68 74 6c  e a cost slightl
1d700 79 20 6c 65 73 73 20 74 68 61 6e 20 61 20 74 61  y less than a ta
1d710 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 63 61  ble.      ** sca
1d720 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 63 6f 73 74  n. */.      cost
1d730 20 3d 20 61 69 52 6f 77 45 73 74 5b 30 5d 2a 33   = aiRowEst[0]*3
1d740 20 2b 20 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75   + pProbe->nColu
1d750 6d 6e 3b 0a 20 20 20 20 20 20 77 73 46 6c 61 67  mn;.      wsFlag
1d760 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 56 45 52  s |= WHERE_COVER
1d770 5f 53 43 41 4e 7c 57 48 45 52 45 5f 43 4f 4c 55  _SCAN|WHERE_COLU
1d780 4d 4e 5f 52 41 4e 47 45 3b 0a 20 20 20 20 7d 65  MN_RANGE;.    }e
1d790 6c 73 65 20 69 66 28 20 28 77 73 46 6c 61 67 73  lse if( (wsFlags
1d7a0 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c   & WHERE_NOT_FUL
1d7b0 4c 53 43 41 4e 29 3d 3d 30 20 29 7b 0a 20 20 20  LSCAN)==0 ){.   
1d7c0 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f     /* The cost o
1d7d0 66 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73  f a full table s
1d7e0 63 61 6e 20 69 73 20 61 20 6e 75 6d 62 65 72 20  can is a number 
1d7f0 6f 66 20 6d 6f 76 65 20 6f 70 65 72 61 74 69 6f  of move operatio
1d800 6e 73 20 65 71 75 61 6c 0a 20 20 20 20 20 20 2a  ns equal.      *
1d810 2a 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  * to the number 
1d820 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
1d830 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  able..      **. 
1d840 20 20 20 20 20 2a 2a 20 57 65 20 61 64 64 20 61       ** We add a
1d850 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 34 78 20  n additional 4x 
1d860 70 65 6e 61 6c 74 79 20 74 6f 20 66 75 6c 6c 20  penalty to full 
1d870 74 61 62 6c 65 20 73 63 61 6e 73 2e 20 20 54 68  table scans.  Th
1d880 69 73 20 63 61 75 73 65 73 0a 20 20 20 20 20 20  is causes.      
1d890 2a 2a 20 74 68 65 20 63 6f 73 74 20 66 75 6e 63  ** the cost func
1d8a0 74 69 6f 6e 20 74 6f 20 65 72 72 20 6f 6e 20 74  tion to err on t
1d8b0 68 65 20 73 69 64 65 20 6f 66 20 63 68 6f 6f 73  he side of choos
1d8c0 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 6f 76 65  ing an index ove
1d8d0 72 0a 20 20 20 20 20 20 2a 2a 20 63 68 6f 6f 73  r.      ** choos
1d8e0 69 6e 67 20 61 20 66 75 6c 6c 20 73 63 61 6e 2e  ing a full scan.
1d8f0 20 20 54 68 69 73 20 34 78 20 66 75 6c 6c 2d 73    This 4x full-s
1d900 63 61 6e 20 70 65 6e 61 6c 74 79 20 69 73 20 61  can penalty is a
1d910 6e 20 61 72 67 75 61 62 6c 65 0a 20 20 20 20 20  n arguable.     
1d920 20 2a 2a 20 64 65 63 69 73 69 6f 6e 20 61 6e 64   ** decision and
1d930 20 6f 6e 65 20 77 68 69 63 68 20 77 65 20 65 78   one which we ex
1d940 70 65 63 74 20 74 6f 20 72 65 76 69 73 69 74 20  pect to revisit 
1d950 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20 20  in the future.  
1d960 42 75 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  But.      ** it 
1d970 73 65 65 6d 73 20 74 6f 20 62 65 20 77 6f 72 6b  seems to be work
1d980 69 6e 67 20 77 65 6c 6c 20 65 6e 6f 75 67 68 20  ing well enough 
1d990 61 74 20 74 68 65 20 6d 6f 6d 65 6e 74 2e 0a 20  at the moment.. 
1d9a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
1d9b0 73 74 20 3d 20 61 69 52 6f 77 45 73 74 5b 30 5d  st = aiRowEst[0]
1d9c0 2a 34 3b 0a 20 20 20 20 20 20 77 73 46 6c 61 67  *4;.      wsFlag
1d9d0 73 20 26 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f  s &= ~WHERE_IDX_
1d9e0 4f 4e 4c 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ONLY;.    }else{
1d9f0 0a 20 20 20 20 20 20 6c 6f 67 31 30 4e 20 3d 20  .      log10N = 
1da00 65 73 74 4c 6f 67 28 61 69 52 6f 77 45 73 74 5b  estLog(aiRowEst[
1da10 30 5d 29 3b 0a 20 20 20 20 20 20 63 6f 73 74 20  0]);.      cost 
1da20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 20 20 69 66  = nRow;.      if
1da30 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ( pIdx ){.      
1da40 20 20 69 66 28 20 62 4c 6f 6f 6b 75 70 20 29 7b    if( bLookup ){
1da50 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  .          /* Fo
1da60 72 20 61 6e 20 69 6e 64 65 78 20 6c 6f 6f 6b 75  r an index looku
1da70 70 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20  p followed by a 
1da80 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 3a 0a 20 20  table lookup:.  
1da90 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 6e 49          **    nI
1daa0 6e 4d 75 6c 20 69 6e 64 65 78 20 73 65 61 72 63  nMul index searc
1dab0 68 65 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20  hes to find the 
1dac0 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 69 6e  start of each in
1dad0 64 65 78 20 72 61 6e 67 65 0a 20 20 20 20 20 20  dex range.      
1dae0 20 20 20 20 2a 2a 20 20 2b 20 6e 52 6f 77 20 73      **  + nRow s
1daf0 74 65 70 73 20 74 68 72 6f 75 67 68 20 74 68 65  teps through the
1db00 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 20   index.         
1db10 20 2a 2a 20 20 2b 20 6e 52 6f 77 20 74 61 62 6c   **  + nRow tabl
1db20 65 20 73 65 61 72 63 68 65 73 20 74 6f 20 6c 6f  e searches to lo
1db30 6f 6b 75 70 20 74 68 65 20 74 61 62 6c 65 20 65  okup the table e
1db40 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65 20 72  ntry using the r
1db50 6f 77 69 64 0a 20 20 20 20 20 20 20 20 20 20 2a  owid.          *
1db60 2f 0a 20 20 20 20 20 20 20 20 20 20 63 6f 73 74  /.          cost
1db70 20 2b 3d 20 28 6e 49 6e 4d 75 6c 20 2b 20 6e 52   += (nInMul + nR
1db80 6f 77 29 2a 6c 6f 67 31 30 4e 3b 0a 20 20 20 20  ow)*log10N;.    
1db90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1dba0 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 63 6f       /* For a co
1dbb0 76 65 72 69 6e 67 20 69 6e 64 65 78 3a 0a 20 20  vering index:.  
1dbc0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 6e          **     n
1dbd0 49 6e 4d 75 6c 20 69 6e 64 65 78 20 73 65 61 72  InMul index sear
1dbe0 63 68 65 73 20 74 6f 20 66 69 6e 64 20 74 68 65  ches to find the
1dbf0 20 69 6e 69 74 69 61 6c 20 65 6e 74 72 79 20 0a   initial entry .
1dc00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b            **   +
1dc10 20 6e 52 6f 77 20 73 74 65 70 73 20 74 68 72 6f   nRow steps thro
1dc20 75 67 68 20 74 68 65 20 69 6e 64 65 78 0a 20 20  ugh the index.  
1dc30 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1dc40 20 20 20 20 20 63 6f 73 74 20 2b 3d 20 6e 49 6e       cost += nIn
1dc50 4d 75 6c 2a 6c 6f 67 31 30 4e 3b 0a 20 20 20 20  Mul*log10N;.    
1dc60 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
1dc70 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  e{.        /* Fo
1dc80 72 20 61 20 72 6f 77 69 64 20 70 72 69 6d 61 72  r a rowid primar
1dc90 79 20 6b 65 79 20 6c 6f 6f 6b 75 70 3a 0a 20 20  y key lookup:.  
1dca0 20 20 20 20 20 20 2a 2a 20 20 20 20 6e 49 6e 4d        **    nInM
1dcb0 75 6c 74 20 74 61 62 6c 65 20 73 65 61 72 63 68  ult table search
1dcc0 65 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20 69  es to find the i
1dcd0 6e 69 74 69 61 6c 20 65 6e 74 72 79 20 66 6f 72  nitial entry for
1dce0 20 65 61 63 68 20 72 61 6e 67 65 0a 20 20 20 20   each range.    
1dcf0 20 20 20 20 2a 2a 20 20 2b 20 6e 52 6f 77 20 73      **  + nRow s
1dd00 74 65 70 73 20 74 68 72 6f 75 67 68 20 74 68 65  teps through the
1dd10 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 2a   table.        *
1dd20 2f 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20 2b  /.        cost +
1dd30 3d 20 6e 49 6e 4d 75 6c 2a 6c 6f 67 31 30 4e 3b  = nInMul*log10N;
1dd40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1dd50 20 20 20 20 2f 2a 20 41 64 64 20 69 6e 20 74 68      /* Add in th
1dd60 65 20 65 73 74 69 6d 61 74 65 64 20 63 6f 73 74  e estimated cost
1dd70 20 6f 66 20 73 6f 72 74 69 6e 67 20 74 68 65 20   of sorting the 
1dd80 72 65 73 75 6c 74 2e 20 20 41 63 74 75 61 6c 20  result.  Actual 
1dd90 65 78 70 65 72 69 6d 65 6e 74 61 6c 0a 20 20 20  experimental.   
1dda0 20 2a 2a 20 6d 65 61 73 75 72 65 6d 65 6e 74 73   ** measurements
1ddb0 20 6f 66 20 73 6f 72 74 69 6e 67 20 70 65 72 66   of sorting perf
1ddc0 6f 72 6d 61 6e 63 65 20 69 6e 20 53 51 4c 69 74  ormance in SQLit
1ddd0 65 20 73 68 6f 77 20 74 68 61 74 20 73 6f 72 74  e show that sort
1dde0 69 6e 67 20 74 69 6d 65 0a 20 20 20 20 2a 2a 20  ing time.    ** 
1ddf0 61 64 64 73 20 43 2a 4e 2a 6c 6f 67 31 30 28 4e  adds C*N*log10(N
1de00 29 20 74 6f 20 74 68 65 20 63 6f 73 74 2c 20 77  ) to the cost, w
1de10 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75  here N is the nu
1de20 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 6f 20  mber of rows to 
1de30 62 65 20 0a 20 20 20 20 2a 2a 20 73 6f 72 74 65  be .    ** sorte
1de40 64 20 61 6e 64 20 43 20 69 73 20 61 20 66 61 63  d and C is a fac
1de50 74 6f 72 20 62 65 74 77 65 65 6e 20 31 2e 39 35  tor between 1.95
1de60 20 61 6e 64 20 34 2e 33 2e 20 20 57 65 20 77 69   and 4.3.  We wi
1de70 6c 6c 20 73 70 6c 69 74 20 74 68 65 0a 20 20 20  ll split the.   
1de80 20 2a 2a 20 64 69 66 66 65 72 65 6e 63 65 20 61   ** difference a
1de90 6e 64 20 73 65 6c 65 63 74 20 43 20 6f 66 20 33  nd select C of 3
1dea0 2e 30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  .0..    */.    i
1deb0 66 28 20 62 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( bSort ){.    
1dec0 20 20 63 6f 73 74 20 2b 3d 20 6e 52 6f 77 2a 65    cost += nRow*e
1ded0 73 74 4c 6f 67 28 6e 52 6f 77 29 2a 33 3b 0a 20  stLog(nRow)*3;. 
1dee0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 44 69     }.    if( bDi
1def0 73 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 73 74  st ){.      cost
1df00 20 2b 3d 20 6e 52 6f 77 2a 65 73 74 4c 6f 67 28   += nRow*estLog(
1df10 6e 52 6f 77 29 2a 33 3b 0a 20 20 20 20 7d 0a 0a  nRow)*3;.    }..
1df20 20 20 20 20 2f 2a 2a 2a 2a 20 43 6f 73 74 20 6f      /**** Cost o
1df30 66 20 75 73 69 6e 67 20 74 68 69 73 20 69 6e 64  f using this ind
1df40 65 78 20 68 61 73 20 6e 6f 77 20 62 65 65 6e 20  ex has now been 
1df50 63 6f 6d 70 75 74 65 64 20 2a 2a 2a 2a 2f 0a 0a  computed ****/..
1df60 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1df70 61 72 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63  are additional c
1df80 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 74 68  onstraints on th
1df90 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 63 61  is table that ca
1dfa0 6e 6e 6f 74 0a 20 20 20 20 2a 2a 20 62 65 20 75  nnot.    ** be u
1dfb0 73 65 64 20 77 69 74 68 20 74 68 65 20 63 75 72  sed with the cur
1dfc0 72 65 6e 74 20 69 6e 64 65 78 2c 20 62 75 74 20  rent index, but 
1dfd0 77 68 69 63 68 20 6d 69 67 68 74 20 6c 6f 77 65  which might lowe
1dfe0 72 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20  r the number.   
1dff0 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 20 72 6f   ** of output ro
1e000 77 73 2c 20 61 64 6a 75 73 74 20 74 68 65 20 6e  ws, adjust the n
1e010 52 6f 77 20 76 61 6c 75 65 20 61 63 63 6f 72 64  Row value accord
1e020 69 6e 67 6c 79 2e 20 20 54 68 69 73 20 6f 6e 6c  ingly.  This onl
1e030 79 20 0a 20 20 20 20 2a 2a 20 6d 61 74 74 65 72  y .    ** matter
1e040 73 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74  s if the current
1e050 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 6c 65   index is the le
1e060 61 73 74 20 63 6f 73 74 6c 79 2c 20 73 6f 20 64  ast costly, so d
1e070 6f 20 6e 6f 74 20 62 6f 74 68 65 72 0a 20 20 20  o not bother.   
1e080 20 2a 2a 20 77 69 74 68 20 74 68 69 73 20 73 74   ** with this st
1e090 65 70 20 69 66 20 77 65 20 61 6c 72 65 61 64 79  ep if we already
1e0a0 20 6b 6e 6f 77 20 74 68 69 73 20 69 6e 64 65 78   know this index
1e0b0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 68 6f   will not be cho
1e0c0 73 65 6e 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f  sen..    ** Also
1e0d0 2c 20 6e 65 76 65 72 20 72 65 64 75 63 65 20 74  , never reduce t
1e0e0 68 65 20 6f 75 74 70 75 74 20 72 6f 77 20 63 6f  he output row co
1e0f0 75 6e 74 20 62 65 6c 6f 77 20 32 20 75 73 69 6e  unt below 2 usin
1e100 67 20 74 68 69 73 20 73 74 65 70 2e 0a 20 20 20  g this step..   
1e110 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 74 20 69 73   **.    ** It is
1e120 20 63 72 69 74 69 63 61 6c 20 74 68 61 74 20 74   critical that t
1e130 68 65 20 6e 6f 74 56 61 6c 69 64 20 6d 61 73 6b  he notValid mask
1e140 20 62 65 20 75 73 65 64 20 68 65 72 65 20 69 6e   be used here in
1e150 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20  stead of.    ** 
1e160 74 68 65 20 6e 6f 74 52 65 61 64 79 20 6d 61 73  the notReady mas
1e170 6b 2e 20 20 57 68 65 6e 20 63 6f 6d 70 75 74 69  k.  When computi
1e180 6e 67 20 61 6e 20 22 6f 70 74 69 6d 61 6c 22 20  ng an "optimal" 
1e190 69 6e 64 65 78 2c 20 74 68 65 20 6e 6f 74 52 65  index, the notRe
1e1a0 61 64 79 0a 20 20 20 20 2a 2a 20 6d 61 73 6b 20  ady.    ** mask 
1e1b0 77 69 6c 6c 20 6f 6e 6c 79 20 68 61 76 65 20 6f  will only have o
1e1c0 6e 65 20 62 69 74 20 73 65 74 20 2d 20 74 68 65  ne bit set - the
1e1d0 20 62 69 74 20 66 6f 72 20 74 68 65 20 63 75 72   bit for the cur
1e1e0 72 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20 20 20  rent table..    
1e1f0 2a 2a 20 54 68 65 20 6e 6f 74 56 61 6c 69 64 20  ** The notValid 
1e200 6d 61 73 6b 2c 20 6f 6e 20 74 68 65 20 6f 74 68  mask, on the oth
1e210 65 72 20 68 61 6e 64 2c 20 61 6c 77 61 79 73 20  er hand, always 
1e220 68 61 73 20 61 6c 6c 20 62 69 74 73 20 73 65 74  has all bits set
1e230 20 66 6f 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c   for.    ** tabl
1e240 65 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  es that are not 
1e250 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 2e 20  in outer loops. 
1e260 20 49 66 20 6e 6f 74 52 65 61 64 79 20 69 73 20   If notReady is 
1e270 75 73 65 64 20 68 65 72 65 20 69 6e 73 74 65 61  used here instea
1e280 64 0a 20 20 20 20 2a 2a 20 6f 66 20 6e 6f 74 56  d.    ** of notV
1e290 61 6c 69 64 2c 20 74 68 65 6e 20 61 20 6f 70 74  alid, then a opt
1e2a0 69 6d 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20  imal index that 
1e2b0 64 65 70 65 6e 64 73 20 6f 6e 20 69 6e 6e 65 72  depends on inner
1e2c0 20 6a 6f 69 6e 73 20 6c 6f 6f 70 73 0a 20 20 20   joins loops.   
1e2d0 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 73 65 6c   ** might be sel
1e2e0 65 63 74 65 64 20 65 76 65 6e 20 77 68 65 6e 20  ected even when 
1e2f0 74 68 65 72 65 20 65 78 69 73 74 73 20 61 6e 20  there exists an 
1e300 6f 70 74 69 6d 61 6c 20 69 6e 64 65 78 20 74 68  optimal index th
1e310 61 74 20 68 61 73 0a 20 20 20 20 2a 2a 20 6e 6f  at has.    ** no
1e320 20 73 75 63 68 20 64 65 70 65 6e 64 65 6e 63 79   such dependency
1e330 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1e340 20 6e 52 6f 77 3e 32 20 26 26 20 63 6f 73 74 3c   nRow>2 && cost<
1e350 3d 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 29 7b  =pCost->rCost ){
1e360 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20  .      int k;   
1e370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e380 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
1e390 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ter */.      int
1e3a0 20 6e 53 6b 69 70 45 71 20 3d 20 6e 45 71 3b 20   nSkipEq = nEq; 
1e3b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1e3c0 62 65 72 20 6f 66 20 3d 3d 20 63 6f 6e 73 74 72  ber of == constr
1e3d0 61 69 6e 74 73 20 74 6f 20 73 6b 69 70 20 2a 2f  aints to skip */
1e3e0 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 6b 69 70  .      int nSkip
1e3f0 52 61 6e 67 65 20 3d 20 6e 42 6f 75 6e 64 3b 20  Range = nBound; 
1e400 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1e410 20 3c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74   < constraints t
1e420 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 20 20 20 20  o skip */.      
1e430 42 69 74 6d 61 73 6b 20 74 68 69 73 54 61 62 3b  Bitmask thisTab;
1e440 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e450 42 69 74 6d 61 70 20 66 6f 72 20 70 53 72 63 20  Bitmap for pSrc 
1e460 2a 2f 0a 0a 20 20 20 20 20 20 74 68 69 73 54 61  */..      thisTa
1e470 62 20 3d 20 67 65 74 4d 61 73 6b 28 70 57 43 2d  b = getMask(pWC-
1e480 3e 70 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29  >pMaskSet, iCur)
1e490 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65 72  ;.      for(pTer
1e4a0 6d 3d 70 57 43 2d 3e 61 2c 20 6b 3d 70 57 43 2d  m=pWC->a, k=pWC-
1e4b0 3e 6e 54 65 72 6d 3b 20 6e 52 6f 77 3e 32 20 26  >nTerm; nRow>2 &
1e4c0 26 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b  & k; k--, pTerm+
1e4d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1e4e0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
1e4f0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 20   TERM_VIRTUAL ) 
1e500 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1e510 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
1e520 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 56 61 6c  ereqAll & notVal
1e530 69 64 29 21 3d 74 68 69 73 54 61 62 20 29 20 63  id)!=thisTab ) c
1e540 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1e550 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
1e560 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57  rator & (WO_EQ|W
1e570 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20  O_IN|WO_ISNULL) 
1e580 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1e590 20 6e 53 6b 69 70 45 71 20 29 7b 0a 20 20 20 20   nSkipEq ){.    
1e5a0 20 20 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72          /* Ignor
1e5b0 65 20 74 68 65 20 66 69 72 73 74 20 6e 45 71 20  e the first nEq 
1e5c0 65 71 75 61 6c 69 74 79 20 6d 61 74 63 68 65 73  equality matches
1e5d0 20 73 69 6e 63 65 20 74 68 65 20 69 6e 64 65 78   since the index
1e5e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1e5f0 68 61 73 20 61 6c 72 65 61 64 79 20 61 63 63 6f  has already acco
1e600 75 6e 74 65 64 20 66 6f 72 20 74 68 65 73 65 20  unted for these 
1e610 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  */.            n
1e620 53 6b 69 70 45 71 2d 2d 3b 0a 20 20 20 20 20 20  SkipEq--;.      
1e630 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e640 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
1e650 20 65 61 63 68 20 61 64 64 69 74 69 6f 6e 61 6c   each additional
1e660 20 65 71 75 61 6c 69 74 79 20 6d 61 74 63 68 20   equality match 
1e670 72 65 64 75 63 65 73 20 74 68 65 20 72 65 73 75  reduces the resu
1e680 6c 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  lt.            *
1e690 2a 20 73 65 74 20 73 69 7a 65 20 62 79 20 61 20  * set size by a 
1e6a0 66 61 63 74 6f 72 20 6f 66 20 31 30 20 2a 2f 0a  factor of 10 */.
1e6b0 20 20 20 20 20 20 20 20 20 20 20 20 6e 52 6f 77              nRow
1e6c0 20 2f 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20   /= 10;.        
1e6d0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
1e6e0 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70  e if( pTerm->eOp
1e6f0 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c  erator & (WO_LT|
1e700 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
1e710 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  E) ){.          
1e720 69 66 28 20 6e 53 6b 69 70 52 61 6e 67 65 20 29  if( nSkipRange )
1e730 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
1e740 20 49 67 6e 6f 72 65 20 74 68 65 20 66 69 72 73   Ignore the firs
1e750 74 20 6e 53 6b 69 70 52 61 6e 67 65 20 72 61 6e  t nSkipRange ran
1e760 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 73  ge constraints s
1e770 69 6e 63 65 20 74 68 65 20 69 6e 64 65 78 0a 20  ince the index. 
1e780 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61             ** ha
1e790 73 20 61 6c 72 65 61 64 79 20 61 63 63 6f 75 6e  s already accoun
1e7a0 74 65 64 20 66 6f 72 20 74 68 65 73 65 20 2a 2f  ted for these */
1e7b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 53 6b  .            nSk
1e7c0 69 70 52 61 6e 67 65 2d 2d 3b 0a 20 20 20 20 20  ipRange--;.     
1e7d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e7e0 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d          /* Assum
1e7f0 65 20 65 61 63 68 20 61 64 64 69 74 69 6f 6e 61  e each additiona
1e800 6c 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  l range constrai
1e810 6e 74 20 72 65 64 75 63 65 73 20 74 68 65 20 72  nt reduces the r
1e820 65 73 75 6c 74 0a 20 20 20 20 20 20 20 20 20 20  esult.          
1e830 20 20 2a 2a 20 73 65 74 20 73 69 7a 65 20 62 79    ** set size by
1e840 20 61 20 66 61 63 74 6f 72 20 6f 66 20 33 2e 20   a factor of 3. 
1e850 20 49 6e 64 65 78 65 64 20 72 61 6e 67 65 20 63   Indexed range c
1e860 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 64 75 63  onstraints reduc
1e870 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
1e880 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
1e890 65 20 62 79 20 61 20 6c 61 72 67 65 72 20 66 61  e by a larger fa
1e8a0 63 74 6f 72 3a 20 34 2e 20 20 57 65 20 6d 61 6b  ctor: 4.  We mak
1e8b0 65 20 69 6e 64 65 78 65 64 20 72 61 6e 67 65 0a  e indexed range.
1e8c0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d              ** m
1e8d0 6f 72 65 20 73 65 6c 65 63 74 69 76 65 20 69 6e  ore selective in
1e8e0 74 65 6e 74 69 6f 6e 61 6c 6c 79 20 62 65 63 61  tentionally beca
1e8f0 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 6a 65  use of the subje
1e900 63 74 69 76 65 20 0a 20 20 20 20 20 20 20 20 20  ctive .         
1e910 20 20 20 2a 2a 20 6f 62 73 65 72 76 61 74 69 6f     ** observatio
1e920 6e 20 74 68 61 74 20 69 6e 64 65 78 65 64 20 72  n that indexed r
1e930 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
1e940 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 6f 72 65   really are more
1e950 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1e960 73 65 6c 65 63 74 69 76 65 20 69 6e 20 70 72 61  selective in pra
1e970 63 74 69 63 65 2c 20 6f 6e 20 61 76 65 72 61 67  ctice, on averag
1e980 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
1e990 20 20 6e 52 6f 77 20 2f 3d 20 33 3b 0a 20 20 20    nRow /= 3;.   
1e9a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e9b0 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d   }else if( pTerm
1e9c0 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57 4f 5f  ->eOperator!=WO_
1e9d0 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20 20 20  NOOP ){.        
1e9e0 20 20 2f 2a 20 41 6e 79 20 6f 74 68 65 72 20 65    /* Any other e
1e9f0 78 70 72 65 73 73 69 6f 6e 20 6c 6f 77 65 72 73  xpression lowers
1ea00 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f 77 20   the output row 
1ea10 63 6f 75 6e 74 20 62 79 20 68 61 6c 66 20 2a 2f  count by half */
1ea20 0a 20 20 20 20 20 20 20 20 20 20 6e 52 6f 77 20  .          nRow 
1ea30 2f 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a  /= 2;.        }.
1ea40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1ea50 28 20 6e 52 6f 77 3c 32 20 29 20 6e 52 6f 77 20  ( nRow<2 ) nRow 
1ea60 3d 20 32 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20  = 2;.    }...   
1ea70 20 57 48 45 52 45 54 52 41 43 45 28 28 0a 20 20   WHERETRACE((.  
1ea80 20 20 20 20 22 25 73 28 25 73 29 3a 20 6e 45 71      "%s(%s): nEq
1ea90 3d 25 64 20 6e 49 6e 4d 75 6c 3d 25 64 20 72 61  =%d nInMul=%d ra
1eaa0 6e 67 65 44 69 76 3d 25 64 20 62 53 6f 72 74 3d  ngeDiv=%d bSort=
1eab0 25 64 20 62 4c 6f 6f 6b 75 70 3d 25 64 20 77 73  %d bLookup=%d ws
1eac0 46 6c 61 67 73 3d 30 78 25 78 5c 6e 22 0a 20 20  Flags=0x%x\n".  
1ead0 20 20 20 20 22 20 20 20 20 20 20 20 20 20 6e 6f      "         no
1eae0 74 52 65 61 64 79 3d 30 78 25 6c 6c 78 20 6c 6f  tReady=0x%llx lo
1eaf0 67 31 30 4e 3d 25 2e 31 66 20 6e 52 6f 77 3d 25  g10N=%.1f nRow=%
1eb00 2e 31 66 20 63 6f 73 74 3d 25 2e 31 66 20 75 73  .1f cost=%.1f us
1eb10 65 64 3d 30 78 25 6c 6c 78 5c 6e 22 2c 0a 20 20  ed=0x%llx\n",.  
1eb20 20 20 20 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e      pSrc->pTab->
1eb30 7a 4e 61 6d 65 2c 20 28 70 49 64 78 20 3f 20 70  zName, (pIdx ? p
1eb40 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 69 70  Idx->zName : "ip
1eb50 6b 22 29 2c 20 0a 20 20 20 20 20 20 6e 45 71 2c  k"), .      nEq,
1eb60 20 6e 49 6e 4d 75 6c 2c 20 28 69 6e 74 29 72 61   nInMul, (int)ra
1eb70 6e 67 65 44 69 76 2c 20 62 53 6f 72 74 2c 20 62  ngeDiv, bSort, b
1eb80 4c 6f 6f 6b 75 70 2c 20 77 73 46 6c 61 67 73 2c  Lookup, wsFlags,
1eb90 0a 20 20 20 20 20 20 6e 6f 74 52 65 61 64 79 2c  .      notReady,
1eba0 20 6c 6f 67 31 30 4e 2c 20 6e 52 6f 77 2c 20 63   log10N, nRow, c
1ebb0 6f 73 74 2c 20 75 73 65 64 0a 20 20 20 20 29 29  ost, used.    ))
1ebc0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
1ebd0 73 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 62  s index is the b
1ebe0 65 73 74 20 77 65 20 68 61 76 65 20 73 65 65 6e  est we have seen
1ebf0 20 73 6f 20 66 61 72 2c 20 74 68 65 6e 20 72 65   so far, then re
1ec00 63 6f 72 64 20 74 68 69 73 0a 20 20 20 20 2a 2a  cord this.    **
1ec10 20 69 6e 64 65 78 20 61 6e 64 20 69 74 73 20 63   index and its c
1ec20 6f 73 74 20 69 6e 20 74 68 65 20 70 43 6f 73 74  ost in the pCost
1ec30 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 20 20   structure..    
1ec40 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70 49 64  */.    if( (!pId
1ec50 78 20 7c 7c 20 77 73 46 6c 61 67 73 29 0a 20 20  x || wsFlags).  
1ec60 20 20 20 26 26 20 28 63 6f 73 74 3c 70 43 6f 73     && (cost<pCos
1ec70 74 2d 3e 72 43 6f 73 74 20 7c 7c 20 28 63 6f 73  t->rCost || (cos
1ec80 74 3c 3d 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20  t<=pCost->rCost 
1ec90 26 26 20 6e 52 6f 77 3c 70 43 6f 73 74 2d 3e 70  && nRow<pCost->p
1eca0 6c 61 6e 2e 6e 52 6f 77 29 29 0a 20 20 20 20 29  lan.nRow)).    )
1ecb0 7b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 72  {.      pCost->r
1ecc0 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20  Cost = cost;.   
1ecd0 20 20 20 70 43 6f 73 74 2d 3e 75 73 65 64 20 3d     pCost->used =
1ece0 20 75 73 65 64 3b 0a 20 20 20 20 20 20 70 43 6f   used;.      pCo
1ecf0 73 74 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20  st->plan.nRow = 
1ed00 6e 52 6f 77 3b 0a 20 20 20 20 20 20 70 43 6f 73  nRow;.      pCos
1ed10 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  t->plan.wsFlags 
1ed20 3d 20 28 77 73 46 6c 61 67 73 26 77 73 46 6c 61  = (wsFlags&wsFla
1ed30 67 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 70 43  gMask);.      pC
1ed40 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20  ost->plan.nEq = 
1ed50 6e 45 71 3b 0a 20 20 20 20 20 20 70 43 6f 73 74  nEq;.      pCost
1ed60 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 20 3d 20  ->plan.u.pIdx = 
1ed70 70 49 64 78 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  pIdx;.    }..   
1ed80 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73   /* If there was
1ed90 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   an INDEXED BY c
1eda0 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79  lause, then only
1edb0 20 74 68 61 74 20 6f 6e 65 20 69 6e 64 65 78 20   that one index 
1edc0 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64  is.    ** consid
1edd0 65 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ered. */.    if(
1ede0 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 20   pSrc->pIndex ) 
1edf0 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 52  break;..    /* R
1ee00 65 73 65 74 20 6d 61 73 6b 73 20 66 6f 72 20 74  eset masks for t
1ee10 68 65 20 6e 65 78 74 20 69 6e 64 65 78 20 69 6e  he next index in
1ee20 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20   the loop */.   
1ee30 20 77 73 46 6c 61 67 4d 61 73 6b 20 3d 20 7e 28   wsFlagMask = ~(
1ee40 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57  WHERE_ROWID_EQ|W
1ee50 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
1ee60 29 3b 0a 20 20 20 20 65 71 54 65 72 6d 4d 61 73  );.    eqTermMas
1ee70 6b 20 3d 20 69 64 78 45 71 54 65 72 6d 4d 61 73  k = idxEqTermMas
1ee80 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  k;.  }..  /* If 
1ee90 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45  there is no ORDE
1eea0 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20  R BY clause and 
1eeb0 74 68 65 20 53 51 4c 49 54 45 5f 52 65 76 65 72  the SQLITE_Rever
1eec0 73 65 4f 72 64 65 72 20 66 6c 61 67 0a 20 20 2a  seOrder flag.  *
1eed0 2a 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 72  * is set, then r
1eee0 65 76 65 72 73 65 20 74 68 65 20 6f 72 64 65 72  everse the order
1eef0 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20   that the index 
1ef00 77 69 6c 6c 20 62 65 20 73 63 61 6e 6e 65 64 0a  will be scanned.
1ef10 20 20 2a 2a 20 69 6e 2e 20 54 68 69 73 20 69 73    ** in. This is
1ef20 20 75 73 65 64 20 66 6f 72 20 61 70 70 6c 69 63   used for applic
1ef30 61 74 69 6f 6e 20 74 65 73 74 69 6e 67 2c 20 74  ation testing, t
1ef40 6f 20 68 65 6c 70 20 66 69 6e 64 20 63 61 73 65  o help find case
1ef50 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 61 70 70  s.  ** where app
1ef60 6c 69 63 61 74 69 6f 6e 20 62 65 68 61 76 69 6f  lication behavio
1ef70 75 72 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  ur depends on th
1ef80 65 20 28 75 6e 64 65 66 69 6e 65 64 29 20 6f 72  e (undefined) or
1ef90 64 65 72 20 74 68 61 74 0a 20 20 2a 2a 20 53 51  der that.  ** SQ
1efa0 4c 69 74 65 20 6f 75 74 70 75 74 73 20 72 6f 77  Lite outputs row
1efb0 73 20 69 6e 20 69 6e 20 74 68 65 20 61 62 73 65  s in in the abse
1efc0 6e 63 65 20 6f 66 20 61 6e 20 4f 52 44 45 52 20  nce of an ORDER 
1efd0 42 59 20 63 6c 61 75 73 65 2e 20 20 2a 2f 0a 20  BY clause.  */. 
1efe0 20 69 66 28 20 21 70 4f 72 64 65 72 42 79 20 26   if( !pOrderBy &
1eff0 26 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  & pParse->db->fl
1f000 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 76  ags & SQLITE_Rev
1f010 65 72 73 65 4f 72 64 65 72 20 29 7b 0a 20 20 20  erseOrder ){.   
1f020 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46   pCost->plan.wsF
1f030 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45  lags |= WHERE_RE
1f040 56 45 52 53 45 3b 0a 20 20 7d 0a 0a 20 20 61 73  VERSE;.  }..  as
1f050 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 20 7c  sert( pOrderBy |
1f060 7c 20 28 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77  | (pCost->plan.w
1f070 73 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44  sFlags&WHERE_ORD
1f080 45 52 42 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ERBY)==0 );.  as
1f090 73 65 72 74 28 20 70 43 6f 73 74 2d 3e 70 6c 61  sert( pCost->pla
1f0a0 6e 2e 75 2e 70 49 64 78 3d 3d 30 20 7c 7c 20 28  n.u.pIdx==0 || (
1f0b0 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c  pCost->plan.wsFl
1f0c0 61 67 73 26 57 48 45 52 45 5f 52 4f 57 49 44 5f  ags&WHERE_ROWID_
1f0d0 45 51 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  EQ)==0 );.  asse
1f0e0 72 74 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78  rt( pSrc->pIndex
1f0f0 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  ==0 .       || p
1f100 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64  Cost->plan.u.pId
1f110 78 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20  x==0 .       || 
1f120 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49  pCost->plan.u.pI
1f130 64 78 3d 3d 70 53 72 63 2d 3e 70 49 6e 64 65 78  dx==pSrc->pIndex
1f140 20 0a 20 20 29 3b 0a 0a 20 20 57 48 45 52 45 54   .  );..  WHERET
1f150 52 41 43 45 28 28 22 62 65 73 74 20 69 6e 64 65  RACE(("best inde
1f160 78 20 69 73 3a 20 25 73 5c 6e 22 2c 20 0a 20 20  x is: %s\n", .  
1f170 20 20 28 28 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e    ((pCost->plan.
1f180 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1f190 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d 30  NOT_FULLSCAN)==0
1f1a0 20 3f 20 22 6e 6f 6e 65 22 20 3a 20 0a 20 20 20   ? "none" : .   
1f1b0 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61        pCost->pla
1f1c0 6e 2e 75 2e 70 49 64 78 20 3f 20 70 43 6f 73 74  n.u.pIdx ? pCost
1f1d0 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a  ->plan.u.pIdx->z
1f1e0 4e 61 6d 65 20 3a 20 22 69 70 6b 22 29 0a 20 20  Name : "ipk").  
1f1f0 29 29 3b 0a 20 20 0a 20 20 62 65 73 74 4f 72 43  ));.  .  bestOrC
1f200 6c 61 75 73 65 49 6e 64 65 78 28 70 50 61 72 73  lauseIndex(pPars
1f210 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f  e, pWC, pSrc, no
1f220 74 52 65 61 64 79 2c 20 6e 6f 74 56 61 6c 69 64  tReady, notValid
1f230 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 43 6f 73  , pOrderBy, pCos
1f240 74 29 3b 0a 20 20 62 65 73 74 41 75 74 6f 6d 61  t);.  bestAutoma
1f250 74 69 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ticIndex(pParse,
1f260 20 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52   pWC, pSrc, notR
1f270 65 61 64 79 2c 20 70 43 6f 73 74 29 3b 0a 20 20  eady, pCost);.  
1f280 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c  pCost->plan.wsFl
1f290 61 67 73 20 7c 3d 20 65 71 54 65 72 6d 4d 61 73  ags |= eqTermMas
1f2a0 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  k;.}../*.** Find
1f2b0 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20   the query plan 
1f2c0 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20 74 61  for accessing ta
1f2d0 62 6c 65 20 70 53 72 63 2d 3e 70 54 61 62 2e 20  ble pSrc->pTab. 
1f2e0 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 62 65 73  Write the.** bes
1f2f0 74 20 71 75 65 72 79 20 70 6c 61 6e 20 61 6e 64  t query plan and
1f300 20 69 74 73 20 63 6f 73 74 20 69 6e 74 6f 20 74   its cost into t
1f310 68 65 20 57 68 65 72 65 43 6f 73 74 20 6f 62 6a  he WhereCost obj
1f320 65 63 74 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a  ect supplied .**
1f330 20 61 73 20 74 68 65 20 6c 61 73 74 20 70 61 72   as the last par
1f340 61 6d 65 74 65 72 2e 20 54 68 69 73 20 66 75 6e  ameter. This fun
1f350 63 74 69 6f 6e 20 6d 61 79 20 63 61 6c 63 75 6c  ction may calcul
1f360 61 74 65 20 74 68 65 20 63 6f 73 74 20 6f 66 0a  ate the cost of.
1f370 2a 2a 20 62 6f 74 68 20 72 65 61 6c 20 61 6e 64  ** both real and
1f380 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 73   virtual table s
1f390 63 61 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  cans..**.** This
1f3a0 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
1f3b0 6f 74 20 74 61 6b 65 20 4f 52 44 45 52 20 42 59  ot take ORDER BY
1f3c0 20 6f 72 20 44 49 53 54 49 4e 43 54 20 69 6e 74   or DISTINCT int
1f3d0 6f 20 61 63 63 6f 75 6e 74 2e 20 20 4e 6f 72 0a  o account.  Nor.
1f3e0 2a 2a 20 64 6f 65 73 20 69 74 20 72 65 6d 65 6d  ** does it remem
1f3f0 62 65 72 20 74 68 65 20 76 69 72 74 75 61 6c 20  ber the virtual 
1f400 74 61 62 6c 65 20 71 75 65 72 79 20 70 6c 61 6e  table query plan
1f410 2e 20 20 41 6c 6c 20 69 74 20 64 6f 65 73 20 69  .  All it does i
1f420 73 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65  s compute.** the
1f430 20 63 6f 73 74 20 77 68 69 6c 65 20 64 65 74 65   cost while dete
1f440 72 6d 69 6e 69 6e 67 20 69 66 20 61 6e 20 4f 52  rmining if an OR
1f450 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
1f460 20 61 70 70 6c 69 63 61 62 6c 65 2e 20 20 54 68   applicable.  Th
1f470 65 0a 2a 2a 20 64 65 74 61 69 6c 73 20 77 69 6c  e.** details wil
1f480 6c 20 62 65 20 72 65 63 6f 6e 73 69 64 65 72 65  l be reconsidere
1f490 64 20 6c 61 74 65 72 20 69 66 20 74 68 65 20 6f  d later if the o
1f4a0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 66  ptimization is f
1f4b0 6f 75 6e 64 20 74 6f 20 62 65 0a 2a 2a 20 61 70  ound to be.** ap
1f4c0 70 6c 69 63 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  plicable..*/.sta
1f4d0 74 69 63 20 76 6f 69 64 20 62 65 73 74 49 6e 64  tic void bestInd
1f4e0 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
1f4f0 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
1f500 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
1f510 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
1f520 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
1f530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1f540 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
1f550 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1f560 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f  t_item *pSrc,  /
1f570 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
1f580 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68  e term to search
1f590 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
1f5a0 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20  tReady,         
1f5b0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72    /* Mask of cur
1f5c0 73 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  sors not availab
1f5d0 6c 65 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20  le for indexing 
1f5e0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
1f5f0 56 61 6c 69 64 2c 20 20 20 20 20 20 20 20 20 20  Valid,          
1f600 20 2f 2a 20 43 75 72 73 6f 72 73 20 6e 6f 74 20   /* Cursors not 
1f610 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6e  available for an
1f620 79 20 70 75 72 70 6f 73 65 20 2a 2f 0a 20 20 57  y purpose */.  W
1f630 68 65 72 65 43 6f 73 74 20 2a 70 43 6f 73 74 20  hereCost *pCost 
1f640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1f650 77 65 73 74 20 63 6f 73 74 20 71 75 65 72 79 20  west cost query 
1f660 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64  plan */.){.#ifnd
1f670 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1f680 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
1f690 28 20 49 73 56 69 72 74 75 61 6c 28 70 53 72 63  ( IsVirtual(pSrc
1f6a0 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73  ->pTab) ){.    s
1f6b0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
1f6c0 6f 20 2a 70 20 3d 20 30 3b 0a 20 20 20 20 62 65  o *p = 0;.    be
1f6d0 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28 70  stVirtualIndex(p
1f6e0 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63  Parse, pWC, pSrc
1f6f0 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e 6f 74 56  , notReady, notV
1f700 61 6c 69 64 2c 20 30 2c 20 70 43 6f 73 74 2c 20  alid, 0, pCost, 
1f710 26 70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  &p);.    if( p->
1f720 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
1f730 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1f740 33 5f 66 72 65 65 28 70 2d 3e 69 64 78 53 74 72  3_free(p->idxStr
1f750 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1f760 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
1f770 65 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 65 6c  e->db, p);.  }el
1f780 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20  se.#endif.  {.  
1f790 20 20 62 65 73 74 42 74 72 65 65 49 6e 64 65 78    bestBtreeIndex
1f7a0 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53  (pParse, pWC, pS
1f7b0 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e 6f  rc, notReady, no
1f7c0 74 56 61 6c 69 64 2c 20 30 2c 20 30 2c 20 70 43  tValid, 0, 0, pC
1f7d0 6f 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ost);.  }.}../*.
1f7e0 2a 2a 20 44 69 73 61 62 6c 65 20 61 20 74 65 72  ** Disable a ter
1f7f0 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  m in the WHERE c
1f800 6c 61 75 73 65 2e 20 20 45 78 63 65 70 74 2c 20  lause.  Except, 
1f810 64 6f 20 6e 6f 74 20 64 69 73 61 62 6c 65 20 74  do not disable t
1f820 68 65 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74  he term.** if it
1f830 20 63 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54   controls a LEFT
1f840 20 4f 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20   OUTER JOIN and 
1f850 69 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69  it did not origi
1f860 6e 61 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a  nate in the ON.*
1f870 2a 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  * or USING claus
1f880 65 20 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a  e of that join..
1f890 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74  **.** Consider t
1f8a0 68 65 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b  he term t2.z='ok
1f8b0 27 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ' in the followi
1f8c0 6e 67 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a  ng queries:.**.*
1f8d0 2a 20 20 20 28 31 29 20 20 53 45 4c 45 43 54 20  *   (1)  SELECT 
1f8e0 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a  * FROM t1 LEFT J
1f8f0 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74  OIN t2 ON t1.a=t
1f900 32 2e 78 20 57 48 45 52 45 20 74 32 2e 7a 3d 27  2.x WHERE t2.z='
1f910 6f 6b 27 0a 2a 2a 20 20 20 28 32 29 20 20 53 45  ok'.**   (2)  SE
1f920 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
1f930 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74  EFT JOIN t2 ON t
1f940 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e  1.a=t2.x AND t2.
1f950 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20  z='ok'.**   (3) 
1f960 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1f970 31 2c 20 74 32 20 57 48 45 52 45 20 74 31 2e 61  1, t2 WHERE t1.a
1f980 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27  =t2.x AND t2.z='
1f990 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32  ok'.**.** The t2
1f9a0 2e 7a 3d 27 6f 6b 27 20 69 73 20 64 69 73 61 62  .z='ok' is disab
1f9b0 6c 65 64 20 69 6e 20 74 68 65 20 69 6e 20 28 32  led in the in (2
1f9c0 29 20 62 65 63 61 75 73 65 20 69 74 20 6f 72 69  ) because it ori
1f9d0 67 69 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68  ginates.** in th
1f9e0 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54 68  e ON clause.  Th
1f9f0 65 20 74 65 72 6d 20 69 73 20 64 69 73 61 62 6c  e term is disabl
1fa00 65 64 20 69 6e 20 28 33 29 20 62 65 63 61 75 73  ed in (3) becaus
1fa10 65 20 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74  e it is not part
1fa20 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f 55  .** of a LEFT OU
1fa30 54 45 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31  TER JOIN.  In (1
1fa40 29 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e  ), the term is n
1fa50 6f 74 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a  ot disabled..**.
1fa60 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  ** IMPLEMENTATIO
1fa70 4e 2d 4f 46 3a 20 52 2d 32 34 35 39 37 2d 35 38  N-OF: R-24597-58
1fa80 36 35 35 20 4e 6f 20 74 65 73 74 73 20 61 72 65  655 No tests are
1fa90 20 64 6f 6e 65 20 66 6f 72 20 74 65 72 6d 73 20   done for terms 
1faa0 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 6f 6d 70  that are.** comp
1fab0 6c 65 74 65 6c 79 20 73 61 74 69 73 66 69 65 64  letely satisfied
1fac0 20 62 79 20 69 6e 64 69 63 65 73 2e 0a 2a 2a 0a   by indices..**.
1fad0 2a 2a 20 44 69 73 61 62 6c 69 6e 67 20 61 20 74  ** Disabling a t
1fae0 65 72 6d 20 63 61 75 73 65 73 20 74 68 61 74 20  erm causes that 
1faf0 74 65 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74  term to not be t
1fb00 65 73 74 65 64 20 69 6e 20 74 68 65 20 69 6e 6e  ested in the inn
1fb10 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68  er loop.** of th
1fb20 65 20 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69  e join.  Disabli
1fb30 6e 67 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ng is an optimiz
1fb40 61 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72  ation.  When ter
1fb50 6d 73 20 61 72 65 20 73 61 74 69 73 66 69 65 64  ms are satisfied
1fb60 0a 2a 2a 20 62 79 20 69 6e 64 69 63 65 73 2c 20  .** by indices, 
1fb70 77 65 20 64 69 73 61 62 6c 65 20 74 68 65 6d 20  we disable them 
1fb80 74 6f 20 70 72 65 76 65 6e 74 20 72 65 64 75 6e  to prevent redun
1fb90 64 61 6e 74 20 74 65 73 74 73 20 69 6e 20 74 68  dant tests in th
1fba0 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e  e inner.** loop.
1fbb0 20 20 57 65 20 77 6f 75 6c 64 20 67 65 74 20 74    We would get t
1fbc0 68 65 20 63 6f 72 72 65 63 74 20 72 65 73 75 6c  he correct resul
1fbd0 74 73 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 65  ts if nothing we
1fbe0 72 65 20 65 76 65 72 20 64 69 73 61 62 6c 65 64  re ever disabled
1fbf0 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d  ,.** but joins m
1fc00 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c  ight run a littl
1fc10 65 20 73 6c 6f 77 65 72 2e 20 20 54 68 65 20 74  e slower.  The t
1fc20 72 69 63 6b 20 69 73 20 74 6f 20 64 69 73 61 62  rick is to disab
1fc30 6c 65 20 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73  le as much.** as
1fc40 20 77 65 20 63 61 6e 20 77 69 74 68 6f 75 74 20   we can without 
1fc50 64 69 73 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75  disabling too mu
1fc60 63 68 2e 20 20 49 66 20 77 65 20 64 69 73 61 62  ch.  If we disab
1fc70 6c 65 64 20 69 6e 20 28 31 29 2c 20 77 65 27 64  led in (1), we'd
1fc80 20 67 65 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e   get.** the wron
1fc90 67 20 61 6e 73 77 65 72 2e 20 20 53 65 65 20 74  g answer.  See t
1fca0 69 63 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73  icket #813..*/.s
1fcb0 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 61 62  tatic void disab
1fcc0 6c 65 54 65 72 6d 28 57 68 65 72 65 4c 65 76 65  leTerm(WhereLeve
1fcd0 6c 20 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72 65  l *pLevel, Where
1fce0 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20  Term *pTerm){.  
1fcf0 69 66 28 20 70 54 65 72 6d 0a 20 20 20 20 20 20  if( pTerm.      
1fd00 26 26 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  && (pTerm->wtFla
1fd10 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29  gs & TERM_CODED)
1fd20 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 28 70 4c  ==0.      && (pL
1fd30 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d  evel->iLeftJoin=
1fd40 3d 30 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f  =0 || ExprHasPro
1fd50 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
1fd60 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
1fd70 29 0a 20 20 29 7b 0a 20 20 20 20 70 54 65 72 6d  ).  ){.    pTerm
1fd80 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
1fd90 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 69 66 28  M_CODED;.    if(
1fda0 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e   pTerm->iParent>
1fdb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  =0 ){.      Wher
1fdc0 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20  eTerm *pOther = 
1fdd0 26 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70  &pTerm->pWC->a[p
1fde0 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a  Term->iParent];.
1fdf0 20 20 20 20 20 20 69 66 28 20 28 2d 2d 70 4f 74        if( (--pOt
1fe00 68 65 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20  her->nChild)==0 
1fe10 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62  ){.        disab
1fe20 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
1fe30 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Other);.      }.
1fe40 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1fe50 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 41 66  ** Code an OP_Af
1fe60 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 74 6f  finity opcode to
1fe70 20 61 70 70 6c 79 20 74 68 65 20 63 6f 6c 75 6d   apply the colum
1fe80 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  n affinity strin
1fe90 67 20 7a 41 66 66 0a 2a 2a 20 74 6f 20 74 68 65  g zAff.** to the
1fea0 20 6e 20 72 65 67 69 73 74 65 72 73 20 73 74 61   n registers sta
1feb0 72 74 69 6e 67 20 61 74 20 62 61 73 65 2e 20 0a  rting at base. .
1fec0 2a 2a 0a 2a 2a 20 41 73 20 61 6e 20 6f 70 74 69  **.** As an opti
1fed0 6d 69 7a 61 74 69 6f 6e 2c 20 53 51 4c 49 54 45  mization, SQLITE
1fee0 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65  _AFF_NONE entrie
1fef0 73 20 28 77 68 69 63 68 20 61 72 65 20 6e 6f 2d  s (which are no-
1ff00 6f 70 73 29 20 61 74 20 74 68 65 0a 2a 2a 20 62  ops) at the.** b
1ff10 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 65 6e 64  eginning and end
1ff20 20 6f 66 20 7a 41 66 66 20 61 72 65 20 69 67 6e   of zAff are ign
1ff30 6f 72 65 64 2e 20 20 49 66 20 61 6c 6c 20 65 6e  ored.  If all en
1ff40 74 72 69 65 73 20 69 6e 20 7a 41 66 66 20 61 72  tries in zAff ar
1ff50 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f  e.** SQLITE_AFF_
1ff60 4e 4f 4e 45 2c 20 74 68 65 6e 20 6e 6f 20 63 6f  NONE, then no co
1ff70 64 65 20 67 65 74 73 20 67 65 6e 65 72 61 74 65  de gets generate
1ff80 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
1ff90 75 74 69 6e 65 20 6d 61 6b 65 73 20 69 74 73 20  utine makes its 
1ffa0 6f 77 6e 20 63 6f 70 79 20 6f 66 20 7a 41 66 66  own copy of zAff
1ffb0 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 6c   so that the cal
1ffc0 6c 65 72 20 69 73 20 66 72 65 65 0a 2a 2a 20 74  ler is free.** t
1ffd0 6f 20 6d 6f 64 69 66 79 20 7a 41 66 66 20 61 66  o modify zAff af
1ffe0 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
1fff0 20 72 65 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61   returns..*/.sta
20000 74 69 63 20 76 6f 69 64 20 63 6f 64 65 41 70 70  tic void codeApp
20010 6c 79 41 66 66 69 6e 69 74 79 28 50 61 72 73 65  lyAffinity(Parse
20020 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 62 61   *pParse, int ba
20030 73 65 2c 20 69 6e 74 20 6e 2c 20 63 68 61 72 20  se, int n, char 
20040 2a 7a 41 66 66 29 7b 0a 20 20 56 64 62 65 20 2a  *zAff){.  Vdbe *
20050 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
20060 65 3b 0a 20 20 69 66 28 20 7a 41 66 66 3d 3d 30  e;.  if( zAff==0
20070 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
20080 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
20090 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
200a0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
200b0 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20  sert( v!=0 );.. 
200c0 20 2f 2a 20 41 64 6a 75 73 74 20 62 61 73 65 20   /* Adjust base 
200d0 61 6e 64 20 6e 20 74 6f 20 73 6b 69 70 20 6f 76  and n to skip ov
200e0 65 72 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  er SQLITE_AFF_NO
200f0 4e 45 20 65 6e 74 72 69 65 73 20 61 74 20 74 68  NE entries at th
20100 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a  e beginning.  **
20110 20 61 6e 64 20 65 6e 64 20 6f 66 20 74 68 65 20   and end of the 
20120 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e  affinity string.
20130 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e  .  */.  while( n
20140 3e 30 20 26 26 20 7a 41 66 66 5b 30 5d 3d 3d 53  >0 && zAff[0]==S
20150 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29  QLITE_AFF_NONE )
20160 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 62  {.    n--;.    b
20170 61 73 65 2b 2b 3b 0a 20 20 20 20 7a 41 66 66 2b  ase++;.    zAff+
20180 2b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  +;.  }.  while( 
20190 6e 3e 31 20 26 26 20 7a 41 66 66 5b 6e 2d 31 5d  n>1 && zAff[n-1]
201a0 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
201b0 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20  E ){.    n--;.  
201c0 7d 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65  }..  /* Code the
201d0 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63   OP_Affinity opc
201e0 6f 64 65 20 69 66 20 74 68 65 72 65 20 69 73 20  ode if there is 
201f0 61 6e 79 74 68 69 6e 67 20 6c 65 66 74 20 74 6f  anything left to
20200 20 64 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 3e   do. */.  if( n>
20210 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
20220 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
20230 5f 41 66 66 69 6e 69 74 79 2c 20 62 61 73 65 2c  _Affinity, base,
20240 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   n);.    sqlite3
20250 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
20260 2d 31 2c 20 7a 41 66 66 2c 20 6e 29 3b 0a 20 20  -1, zAff, n);.  
20270 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
20280 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
20290 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20 6e  (pParse, base, n
202a0 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
202b0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
202c0 6f 72 20 61 20 73 69 6e 67 6c 65 20 65 71 75 61  or a single equa
202d0 6c 69 74 79 20 74 65 72 6d 20 6f 66 20 74 68 65  lity term of the
202e0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
202f0 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74  An equality.** t
20300 65 72 6d 20 63 61 6e 20 62 65 20 65 69 74 68 65  erm can be eithe
20310 72 20 58 3d 65 78 70 72 20 6f 72 20 58 20 49 4e  r X=expr or X IN
20320 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20   (...).   pTerm 
20330 69 73 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62  is the term to b
20340 65 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a  e .** coded..**.
20350 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 76  ** The current v
20360 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6e  alue for the con
20370 73 74 72 61 69 6e 74 20 69 73 20 6c 65 66 74 20  straint is left 
20380 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67  in register iReg
20390 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f  ..**.** For a co
203a0 6e 73 74 72 61 69 6e 74 20 6f 66 20 74 68 65 20  nstraint of the 
203b0 66 6f 72 6d 20 58 3d 65 78 70 72 2c 20 74 68 65  form X=expr, the
203c0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65   expression is e
203d0 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 74 73  valuated and its
203e0 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6c 65  .** result is le
203f0 66 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  ft on the stack.
20400 20 20 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74    For constraint
20410 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20  s of the form X 
20420 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73  IN (...).** this
20430 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70   routine sets up
20440 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c   a loop that wil
20450 6c 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 61  l iterate over a
20460 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a  ll values of X..
20470 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
20480 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 0a  deEqualityTerm(.
20490 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
204a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
204b0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
204c0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
204d0 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20 74 65 72  rm,   /* The ter
204e0 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
204f0 6c 61 75 73 65 20 74 6f 20 62 65 20 63 6f 64 65  lause to be code
20500 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  d */.  WhereLeve
20510 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20 57 68  l *pLevel, /* Wh
20520 65 6e 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  en level of the 
20530 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 65 20 61  FROM clause we a
20540 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f  re working on */
20550 0a 20 20 69 6e 74 20 69 54 61 72 67 65 74 20 20  .  int iTarget  
20560 20 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70         /* Attemp
20570 74 20 74 6f 20 6c 65 61 76 65 20 72 65 73 75 6c  t to leave resul
20580 74 73 20 69 6e 20 74 68 69 73 20 72 65 67 69 73  ts in this regis
20590 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ter */.){.  Expr
205a0 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45   *pX = pTerm->pE
205b0 78 70 72 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  xpr;.  Vdbe *v =
205c0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
205d0 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20 20 20    int iReg;     
205e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
205f0 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
20600 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 61   results */..  a
20610 73 73 65 72 74 28 20 69 54 61 72 67 65 74 3e 30  ssert( iTarget>0
20620 20 29 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6f 70   );.  if( pX->op
20630 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20 69  ==TK_EQ ){.    i
20640 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
20650 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
20660 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20  se, pX->pRight, 
20670 69 54 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73  iTarget);.  }els
20680 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  e if( pX->op==TK
20690 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69  _ISNULL ){.    i
206a0 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a 20  Reg = iTarget;. 
206b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
206c0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
206d0 20 30 2c 20 69 52 65 67 29 3b 0a 23 69 66 6e 64   0, iReg);.#ifnd
206e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
206f0 55 42 51 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b  UBQUERY.  }else{
20700 0a 20 20 20 20 69 6e 74 20 65 54 79 70 65 3b 0a  .    int eType;.
20710 20 20 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20      int iTab;.  
20720 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20    struct InLoop 
20730 2a 70 49 6e 3b 0a 0a 20 20 20 20 61 73 73 65 72  *pIn;..    asser
20740 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  t( pX->op==TK_IN
20750 20 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 69   );.    iReg = i
20760 54 61 72 67 65 74 3b 0a 20 20 20 20 65 54 79 70  Target;.    eTyp
20770 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  e = sqlite3FindI
20780 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  nIndex(pParse, p
20790 58 2c 20 30 29 3b 0a 20 20 20 20 69 54 61 62 20  X, 0);.    iTab 
207a0 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  = pX->iTable;.  
207b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
207c0 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
207d0 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  , iTab, 0);.    
207e0 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
207f0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
20800 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 29 3b 0a  HERE_IN_ABLE );.
20810 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
20820 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20  u.in.nIn==0 ){. 
20830 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64       pLevel->add
20840 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  rNxt = sqlite3Vd
20850 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
20860 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c      }.    pLevel
20870 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20  ->u.in.nIn++;.  
20880 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61    pLevel->u.in.a
20890 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20 20 20 20 20  InLoop =.       
208a0 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
208b0 4f 72 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  OrFree(pParse->d
208c0 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  b, pLevel->u.in.
208d0 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20  aInLoop,.       
208e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208f0 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c         sizeof(pL
20900 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
20910 6f 70 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75  op[0])*pLevel->u
20920 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20 20 20 70 49  .in.nIn);.    pI
20930 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  n = pLevel->u.in
20940 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66  .aInLoop;.    if
20950 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 20 20 70  ( pIn ){.      p
20960 49 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e  In += pLevel->u.
20970 69 6e 2e 6e 49 6e 20 2d 20 31 3b 0a 20 20 20 20  in.nIn - 1;.    
20980 20 20 70 49 6e 2d 3e 69 43 75 72 20 3d 20 69 54    pIn->iCur = iT
20990 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  ab;.      if( eT
209a0 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f  ype==IN_INDEX_RO
209b0 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70  WID ){.        p
209c0 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20  In->addrInTop = 
209d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
209e0 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69  2(v, OP_Rowid, i
209f0 54 61 62 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  Tab, iReg);.    
20a00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20a10 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20   pIn->addrInTop 
20a20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
20a30 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
20a40 2c 20 69 54 61 62 2c 20 30 2c 20 69 52 65 67 29  , iTab, 0, iReg)
20a50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20a60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
20a70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  1(v, OP_IsNull, 
20a80 69 52 65 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  iReg);.    }else
20a90 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
20aa0 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a 20 20  u.in.nIn = 0;.  
20ab0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
20ac0 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
20ad0 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 72  vel, pTerm);.  r
20ae0 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f  eturn iReg;.}../
20af0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
20b00 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61  de that will eva
20b10 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e 64  luate all == and
20b20 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IN constraints 
20b30 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e  for an.** index.
20b40 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
20b50 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 61 62  le, consider tab
20b60 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c  le t1(a,b,c,d,e,
20b70 66 29 20 77 69 74 68 20 69 6e 64 65 78 20 69 31  f) with index i1
20b80 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70  (a,b,c)..** Supp
20b90 6f 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  ose the WHERE cl
20ba0 61 75 73 65 20 69 73 20 74 68 69 73 3a 20 20 61  ause is this:  a
20bb0 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20 28 31 2c  ==5 AND b IN (1,
20bc0 32 2c 33 29 20 41 4e 44 20 63 3e 35 20 41 4e 44  2,3) AND c>5 AND
20bd0 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64   c<10.** The ind
20be0 65 78 20 68 61 73 20 61 73 20 6d 61 6e 79 20 61  ex has as many a
20bf0 73 20 74 68 72 65 65 20 65 71 75 61 6c 69 74 79  s three equality
20c00 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62 75   constraints, bu
20c10 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61  t in this.** exa
20c20 6d 70 6c 65 2c 20 74 68 65 20 74 68 69 72 64 20  mple, the third 
20c30 22 63 22 20 76 61 6c 75 65 20 69 73 20 61 6e 20  "c" value is an 
20c40 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 53 6f 20  inequality.  So 
20c50 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e  only two .** con
20c60 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 64  straints are cod
20c70 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ed.  This routin
20c80 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20  e will generate 
20c90 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
20ca0 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20 49  .** a==5 and b I
20cb0 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54 68 65 20  N (1,2,3).  The 
20cc0 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66  current values f
20cd0 6f 72 20 61 20 61 6e 64 20 62 20 77 69 6c 6c 20  or a and b will 
20ce0 62 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  be stored.** in 
20cf0 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69  consecutive regi
20d00 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 69 6e  sters and the in
20d10 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73 74  dex of the first
20d20 20 72 65 67 69 73 74 65 72 20 69 73 20 72 65 74   register is ret
20d30 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  urned..**.** In 
20d40 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76  the example abov
20d50 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74  e nEq==2.  But t
20d60 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77  his subroutine w
20d70 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c  orks for any val
20d80 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63  ue.** of nEq inc
20d90 6c 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45  luding 0.  If nE
20da0 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69  q==0, this routi
20db0 6e 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e  ne is nearly a n
20dc0 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c  o-op..** The onl
20dd0 79 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20  y thing it does 
20de0 69 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  is allocate the 
20df0 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d  pLevel->iMem mem
20e00 6f 72 79 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20  ory cell and.** 
20e10 63 6f 6d 70 75 74 65 20 74 68 65 20 61 66 66 69  compute the affi
20e20 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a  nity string..**.
20e30 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
20e40 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61 74 65 73  always allocates
20e50 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6d 65   at least one me
20e60 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65  mory cell and re
20e70 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 69 6e 64  turns.** the ind
20e80 65 78 20 6f 66 20 74 68 61 74 20 6d 65 6d 6f 72  ex of that memor
20e90 79 20 63 65 6c 6c 2e 20 54 68 65 20 63 6f 64 65  y cell. The code
20ea0 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74   that.** calls t
20eb0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
20ec0 20 75 73 65 20 74 68 61 74 20 6d 65 6d 6f 72 79   use that memory
20ed0 20 63 65 6c 6c 20 74 6f 20 73 74 6f 72 65 20 74   cell to store t
20ee0 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a  he termination.*
20ef0 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f 66 20 74  * key value of t
20f00 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65  he loop.  If one
20f10 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72   or more IN oper
20f20 61 74 6f 72 73 20 61 70 70 65 61 72 2c 20 74 68  ators appear, th
20f30 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
20f40 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20  ne allocates an 
20f50 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d  additional nEq m
20f60 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20  emory cells for 
20f70 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e  internal.** use.
20f80 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
20f90 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 41 66 66 20  turning, *pzAff 
20fa0 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
20fb0 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
20fc0 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f 70 79  aining a.** copy
20fd0 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61   of the column a
20fe0 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 6f  ffinity string o
20ff0 66 20 74 68 65 20 69 6e 64 65 78 20 61 6c 6c 6f  f the index allo
21000 63 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73  cated using.** s
21010 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29  qlite3DbMalloc()
21020 2e 20 45 78 63 65 70 74 2c 20 65 6e 74 72 69 65  . Except, entrie
21030 73 20 69 6e 20 74 68 65 20 63 6f 70 79 20 6f 66  s in the copy of
21040 20 74 68 65 20 73 74 72 69 6e 67 20 61 73 73 6f   the string asso
21050 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 65  ciated.** with e
21060 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
21070 6e 74 73 20 74 68 61 74 20 75 73 65 20 4e 4f 4e  nts that use NON
21080 45 20 61 66 66 69 6e 69 74 79 20 61 72 65 20 73  E affinity are s
21090 65 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f  et to.** SQLITE_
210a0 41 46 46 5f 4e 4f 4e 45 2e 20 54 68 69 73 20 69  AFF_NONE. This i
210b0 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53  s to deal with S
210c0 51 4c 20 73 75 63 68 20 61 73 20 74 68 65 20 66  QL such as the f
210d0 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
210e0 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
210f0 31 28 61 20 54 45 58 54 20 50 52 49 4d 41 52 59  1(a TEXT PRIMARY
21100 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20 20 20 53   KEY, b);.**   S
21110 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
21120 31 20 41 53 20 74 32 2c 20 74 31 20 57 48 45 52  1 AS t2, t1 WHER
21130 45 20 74 31 2e 61 20 3d 20 74 32 2e 62 3b 0a 2a  E t1.a = t2.b;.*
21140 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d  *.** In the exam
21150 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20 69  ple above, the i
21160 6e 64 65 78 20 6f 6e 20 74 31 28 61 29 20 68 61  ndex on t1(a) ha
21170 73 20 54 45 58 54 20 61 66 66 69 6e 69 74 79 2e  s TEXT affinity.
21180 20 42 75 74 20 73 69 6e 63 65 0a 2a 2a 20 74 68   But since.** th
21190 65 20 72 69 67 68 74 20 68 61 6e 64 20 73 69 64  e right hand sid
211a0 65 20 6f 66 20 74 68 65 20 65 71 75 61 6c 69 74  e of the equalit
211b0 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 74 32  y constraint (t2
211c0 2e 62 29 20 68 61 73 20 4e 4f 4e 45 20 61 66 66  .b) has NONE aff
211d0 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e  inity,.** no con
211e0 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c 64 20 62  version should b
211f0 65 20 61 74 74 65 6d 70 74 65 64 20 62 65 66 6f  e attempted befo
21200 72 65 20 75 73 69 6e 67 20 61 20 74 32 2e 62 20  re using a t2.b 
21210 76 61 6c 75 65 20 61 73 20 70 61 72 74 20 6f 66  value as part of
21220 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20 73 65 61  .** a key to sea
21230 72 63 68 20 74 68 65 20 69 6e 64 65 78 2e 20 48  rch the index. H
21240 65 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 62  ence the first b
21250 79 74 65 20 69 6e 20 74 68 65 20 72 65 74 75 72  yte in the retur
21260 6e 65 64 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20  ned affinity.** 
21270 73 74 72 69 6e 67 20 69 6e 20 74 68 69 73 20 65  string in this e
21280 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20 62 65 20  xample would be 
21290 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 41 46  set to SQLITE_AF
212a0 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74 69  F_NONE..*/.stati
212b0 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45 71 75  c int codeAllEqu
212c0 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 50 61  alityTerms(.  Pa
212d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
212e0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
212f0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
21300 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
21310 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73 74 65    /* Which neste
21320 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46 52  d loop of the FR
21330 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67  OM we are coding
21340 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
21350 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54  e *pWC,     /* T
21360 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
21370 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
21380 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 57 68  Ready,     /* Wh
21390 69 63 68 20 70 61 72 74 73 20 6f 66 20 46 52 4f  ich parts of FRO
213a0 4d 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62  M have not yet b
213b0 65 65 6e 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69  een coded */.  i
213c0 6e 74 20 6e 45 78 74 72 61 52 65 67 2c 20 20 20  nt nExtraReg,   
213d0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
213e0 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  f extra register
213f0 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
21400 0a 20 20 63 68 61 72 20 2a 2a 70 7a 41 66 66 20  .  char **pzAff 
21410 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
21420 20 53 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   Set to point to
21430 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
21440 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 71   */.){.  int nEq
21450 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
21460 6e 45 71 3b 20 20 20 2f 2a 20 54 68 65 20 6e 75  nEq;   /* The nu
21470 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e  mber of == or IN
21480 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
21490 63 6f 64 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a  code */.  Vdbe *
214a0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
214b0 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  e;      /* The v
214c0 6d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  m under construc
214d0 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20  tion */.  Index 
214e0 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
214f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
21500 6e 64 65 78 20 62 65 69 6e 67 20 75 73 65 64 20  ndex being used 
21510 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f  for this loop */
21520 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 4c  .  int iCur = pL
21530 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b 20 20  evel->iTabCur;  
21540 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f   /* The cursor o
21550 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  f the table */. 
21560 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
21570 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;             /
21580 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74  * A single const
21590 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20  raint term */.  
215a0 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
215b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
215c0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
215d0 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20  .  int regBase; 
215e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215f0 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65   /* Base registe
21600 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b  r */.  int nReg;
21610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21620 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
21630 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61  f registers to a
21640 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61  llocate */.  cha
21650 72 20 2a 7a 41 66 66 3b 20 20 20 20 20 20 20 20  r *zAff;        
21660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
21670 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 74 6f  finity string to
21680 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a   return */..  /*
21690 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20   This module is 
216a0 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f 6e 20 71  only called on q
216b0 75 65 72 79 20 70 6c 61 6e 73 20 74 68 61 74 20  uery plans that 
216c0 75 73 65 20 61 6e 20 69 6e 64 65 78 2e 20 2a 2f  use an index. */
216d0 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65  .  assert( pLeve
216e0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
216f0 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20  & WHERE_INDEXED 
21700 29 3b 0a 20 20 70 49 64 78 20 3d 20 70 4c 65 76  );.  pIdx = pLev
21710 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b  el->plan.u.pIdx;
21720 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
21730 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72  t how many memor
21740 79 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20  y cells we will 
21750 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61  need then alloca
21760 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20  te them..  */.  
21770 72 65 67 42 61 73 65 20 3d 20 70 50 61 72 73 65  regBase = pParse
21780 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e 52  ->nMem + 1;.  nR
21790 65 67 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  eg = pLevel->pla
217a0 6e 2e 6e 45 71 20 2b 20 6e 45 78 74 72 61 52 65  n.nEq + nExtraRe
217b0 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  g;.  pParse->nMe
217c0 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20 20 7a 41  m += nReg;..  zA
217d0 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  ff = sqlite3DbSt
217e0 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
217f0 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66   sqlite3IndexAff
21800 69 6e 69 74 79 53 74 72 28 76 2c 20 70 49 64 78  inityStr(v, pIdx
21810 29 29 3b 0a 20 20 69 66 28 20 21 7a 41 66 66 20  ));.  if( !zAff 
21820 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64  ){.    pParse->d
21830 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
21840 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45  = 1;.  }..  /* E
21850 76 61 6c 75 61 74 65 20 74 68 65 20 65 71 75 61  valuate the equa
21860 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
21870 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
21880 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6e  pIdx->nColumn>=n
21890 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b  Eq );.  for(j=0;
218a0 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20   j<nEq; j++){.  
218b0 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 69 6e    int r1;.    in
218c0 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  t k = pIdx->aiCo
218d0 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 70 54 65  lumn[j];.    pTe
218e0 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  rm = findTerm(pW
218f0 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52  C, iCur, k, notR
21900 65 61 64 79 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c  eady, pLevel->pl
21910 61 6e 2e 77 73 46 6c 61 67 73 2c 20 70 49 64 78  an.wsFlags, pIdx
21920 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  );.    if( pTerm
21930 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
21940 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
21950 67 20 74 72 75 65 20 66 6f 72 20 69 6e 64 69 63  g true for indic
21960 65 73 20 77 69 74 68 20 72 65 64 75 6e 64 61 6e  es with redundan
21970 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a 20 20 20 20  t columns. .    
21980 2a 2a 20 45 78 3a 20 43 52 45 41 54 45 20 49 4e  ** Ex: CREATE IN
21990 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 62  DEX i1 ON t1(a,b
219a0 2c 61 29 3b 20 53 45 4c 45 43 54 20 2a 20 46 52  ,a); SELECT * FR
219b0 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 30 20  OM t1 WHERE a=0 
219c0 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a 20 20 20 20  AND b=0; */.    
219d0 74 65 73 74 63 61 73 65 28 20 28 70 54 65 72 6d  testcase( (pTerm
219e0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
219f0 5f 43 4f 44 45 44 29 21 3d 30 20 29 3b 0a 20 20  _CODED)!=0 );.  
21a00 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
21a10 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
21a20 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20  M_VIRTUAL ); /* 
21a30 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36  EV: R-30575-1166
21a40 32 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20 63 6f  2 */.    r1 = co
21a50 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70  deEqualityTerm(p
21a60 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c  Parse, pTerm, pL
21a70 65 76 65 6c 2c 20 72 65 67 42 61 73 65 2b 6a 29  evel, regBase+j)
21a80 3b 0a 20 20 20 20 69 66 28 20 72 31 21 3d 72 65  ;.    if( r1!=re
21a90 67 42 61 73 65 2b 6a 20 29 7b 0a 20 20 20 20 20  gBase+j ){.     
21aa0 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a   if( nReg==1 ){.
21ab0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
21ac0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
21ad0 61 72 73 65 2c 20 72 65 67 42 61 73 65 29 3b 0a  arse, regBase);.
21ae0 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20          regBase 
21af0 3d 20 72 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = r1;.      }els
21b00 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
21b10 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
21b20 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20 72 65  OP_SCopy, r1, re
21b30 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20  gBase+j);.      
21b40 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74  }.    }.    test
21b50 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
21b60 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55  erator & WO_ISNU
21b70 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  LL );.    testca
21b80 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
21b90 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a  ator & WO_IN );.
21ba0 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
21bb0 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
21bc0 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29 3d 3d  ISNULL|WO_IN))==
21bd0 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  0 ){.      Expr 
21be0 2a 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d 2d  *pRight = pTerm-
21bf0 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
21c00 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
21c10 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28  rCodeIsNullJump(
21c20 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61  v, pRight, regBa
21c30 73 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  se+j, pLevel->ad
21c40 64 72 42 72 6b 29 3b 0a 20 20 20 20 20 20 69 66  drBrk);.      if
21c50 28 20 7a 41 66 66 20 29 7b 0a 20 20 20 20 20 20  ( zAff ){.      
21c60 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d    if( sqlite3Com
21c70 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69  pareAffinity(pRi
21c80 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53  ght, zAff[j])==S
21c90 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29  QLITE_AFF_NONE )
21ca0 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66 66  {.          zAff
21cb0 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  [j] = SQLITE_AFF
21cc0 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
21cd0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
21ce0 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41  ite3ExprNeedsNoA
21cf0 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52  ffinityChange(pR
21d00 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 20 29  ight, zAff[j]) )
21d10 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66 66  {.          zAff
21d20 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  [j] = SQLITE_AFF
21d30 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
21d40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21d50 20 7d 0a 20 20 2a 70 7a 41 66 66 20 3d 20 7a 41   }.  *pzAff = zA
21d60 66 66 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67  ff;.  return reg
21d70 42 61 73 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  Base;.}..#ifndef
21d80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
21d90 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  LAIN./*.** This 
21da0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 65 6c  routine is a hel
21db0 70 65 72 20 66 6f 72 20 65 78 70 6c 61 69 6e 49  per for explainI
21dc0 6e 64 65 78 52 61 6e 67 65 28 29 20 62 65 6c 6f  ndexRange() belo
21dd0 77 0a 2a 2a 0a 2a 2a 20 70 53 74 72 20 68 6f 6c  w.**.** pStr hol
21de0 64 73 20 74 68 65 20 74 65 78 74 20 6f 66 20 61  ds the text of a
21df0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  n expression tha
21e00 74 20 77 65 20 61 72 65 20 62 75 69 6c 64 69 6e  t we are buildin
21e10 67 20 75 70 20 6f 6e 65 20 74 65 72 6d 0a 2a 2a  g up one term.**
21e20 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54 68 69   at a time.  Thi
21e30 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20 61  s routine adds a
21e40 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68 65   new term to the
21e50 20 65 6e 64 20 6f 66 20 74 68 65 20 65 78 70 72   end of the expr
21e60 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54 65 72 6d 73  ession..** Terms
21e70 20 61 72 65 20 73 65 70 61 72 61 74 65 64 20 62   are separated b
21e80 79 20 41 4e 44 20 73 6f 20 61 64 64 20 74 68 65  y AND so add the
21e90 20 22 41 4e 44 22 20 74 65 78 74 20 66 6f 72 20   "AND" text for 
21ea0 73 65 63 6f 6e 64 20 61 6e 64 20 73 75 62 73 65  second and subse
21eb0 71 75 65 6e 74 0a 2a 2a 20 74 65 72 6d 73 20 6f  quent.** terms o
21ec0 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nly..*/.static v
21ed0 6f 69 64 20 65 78 70 6c 61 69 6e 41 70 70 65 6e  oid explainAppen
21ee0 64 54 65 72 6d 28 0a 20 20 53 74 72 41 63 63 75  dTerm(.  StrAccu
21ef0 6d 20 2a 70 53 74 72 2c 20 20 20 20 20 20 20 20  m *pStr,        
21f00 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74       /* The text
21f10 20 65 78 70 72 65 73 73 69 6f 6e 20 62 65 69 6e   expression bein
21f20 67 20 62 75 69 6c 74 20 2a 2f 0a 20 20 69 6e 74  g built */.  int
21f30 20 69 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20   iTerm,         
21f40 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
21f50 78 20 6f 66 20 74 68 69 73 20 74 65 72 6d 2e 20  x of this term. 
21f60 20 46 69 72 73 74 20 69 73 20 7a 65 72 6f 20 2a   First is zero *
21f70 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
21f80 7a 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20  zColumn,        
21f90 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
21fa0 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  olumn */.  const
21fb0 20 63 68 61 72 20 2a 7a 4f 70 20 20 20 20 20 20   char *zOp      
21fc0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
21fd0 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 2a  f the operator *
21fe0 2f 0a 29 7b 0a 20 20 69 66 28 20 69 54 65 72 6d  /.){.  if( iTerm
21ff0 20 29 20 73 71 6c 69 74 65 33 53 74 72 41 63 63   ) sqlite3StrAcc
22000 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22  umAppend(pStr, "
22010 20 41 4e 44 20 22 2c 20 35 29 3b 0a 20 20 73 71   AND ", 5);.  sq
22020 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
22030 65 6e 64 28 70 53 74 72 2c 20 7a 43 6f 6c 75 6d  end(pStr, zColum
22040 6e 2c 20 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65  n, -1);.  sqlite
22050 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
22060 70 53 74 72 2c 20 7a 4f 70 2c 20 31 29 3b 0a 20  pStr, zOp, 1);. 
22070 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
22080 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22 3f 22  Append(pStr, "?"
22090 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  , 1);.}../*.** A
220a0 72 67 75 6d 65 6e 74 20 70 4c 65 76 65 6c 20 64  rgument pLevel d
220b0 65 73 63 72 69 62 65 73 20 61 20 73 74 72 61 74  escribes a strat
220c0 65 67 79 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67  egy for scanning
220d0 20 74 61 62 6c 65 20 70 54 61 62 2e 20 54 68 69   table pTab. Thi
220e0 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  s .** function r
220f0 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
22100 20 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66   to a string buf
22110 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  fer containing a
22120 20 64 65 73 63 72 69 70 74 69 6f 6e 0a 2a 2a 20   description.** 
22130 6f 66 20 74 68 65 20 73 75 62 73 65 74 20 6f 66  of the subset of
22140 20 74 61 62 6c 65 20 72 6f 77 73 20 73 63 61 6e   table rows scan
22150 6e 65 64 20 62 79 20 74 68 65 20 73 74 72 61 74  ned by the strat
22160 65 67 79 20 69 6e 20 74 68 65 20 66 6f 72 6d 20  egy in the form 
22170 6f 66 20 61 6e 0a 2a 2a 20 53 51 4c 20 65 78 70  of an.** SQL exp
22180 72 65 73 73 69 6f 6e 2e 20 4f 72 2c 20 69 66 20  ression. Or, if 
22190 61 6c 6c 20 72 6f 77 73 20 61 72 65 20 73 63 61  all rows are sca
221a0 6e 6e 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65  nned, NULL is re
221b0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  turned..**.** Fo
221c0 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  r example, if th
221d0 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  e query:.**.**  
221e0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
221f0 31 20 57 48 45 52 45 20 61 3d 31 20 41 4e 44 20  1 WHERE a=1 AND 
22200 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20 69 73 20 72 75  b>2;.**.** is ru
22210 6e 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 61  n and there is a
22220 6e 20 69 6e 64 65 78 20 6f 6e 20 28 61 2c 20 62  n index on (a, b
22230 29 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  ), then this fun
22240 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 0a  ction returns a.
22250 2a 2a 20 73 74 72 69 6e 67 20 73 69 6d 69 6c 61  ** string simila
22260 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 61  r to:.**.**   "a
22270 3d 3f 20 41 4e 44 20 62 3e 3f 22 0a 2a 2a 0a 2a  =? AND b>?".**.*
22280 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 70  * The returned p
22290 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  ointer points to
222a0 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
222b0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d   from sqlite3DbM
222c0 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74 20 69  alloc()..** It i
222d0 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
222e0 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
222f0 65 72 20 74 6f 20 66 72 65 65 20 74 68 65 20 62  er to free the b
22300 75 66 66 65 72 20 77 68 65 6e 20 69 74 20 69 73  uffer when it is
22310 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65  .** no longer re
22320 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  quired..*/.stati
22330 63 20 63 68 61 72 20 2a 65 78 70 6c 61 69 6e 49  c char *explainI
22340 6e 64 65 78 52 61 6e 67 65 28 73 71 6c 69 74 65  ndexRange(sqlite
22350 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 65 76 65  3 *db, WhereLeve
22360 6c 20 2a 70 4c 65 76 65 6c 2c 20 54 61 62 6c 65  l *pLevel, Table
22370 20 2a 70 54 61 62 29 7b 0a 20 20 57 68 65 72 65   *pTab){.  Where
22380 50 6c 61 6e 20 2a 70 50 6c 61 6e 20 3d 20 26 70  Plan *pPlan = &p
22390 4c 65 76 65 6c 2d 3e 70 6c 61 6e 3b 0a 20 20 49  Level->plan;.  I
223a0 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70  ndex *pIndex = p
223b0 50 6c 61 6e 2d 3e 75 2e 70 49 64 78 3b 0a 20 20  Plan->u.pIdx;.  
223c0 69 6e 74 20 6e 45 71 20 3d 20 70 50 6c 61 6e 2d  int nEq = pPlan-
223d0 3e 6e 45 71 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  >nEq;.  int i, j
223e0 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c  ;.  Column *aCol
223f0 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20   = pTab->aCol;. 
22400 20 69 6e 74 20 2a 61 69 43 6f 6c 75 6d 6e 20 3d   int *aiColumn =
22410 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
22420 6e 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 74 78  n;.  StrAccum tx
22430 74 3b 0a 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30  t;..  if( nEq==0
22440 20 26 26 20 28 70 50 6c 61 6e 2d 3e 77 73 46 6c   && (pPlan->wsFl
22450 61 67 73 20 26 20 28 57 48 45 52 45 5f 42 54 4d  ags & (WHERE_BTM
22460 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50  _LIMIT|WHERE_TOP
22470 5f 4c 49 4d 49 54 29 29 3d 3d 30 20 29 7b 0a 20  _LIMIT))==0 ){. 
22480 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
22490 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
224a0 75 6d 49 6e 69 74 28 26 74 78 74 2c 20 30 2c 20  umInit(&txt, 0, 
224b0 30 2c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  0, SQLITE_MAX_LE
224c0 4e 47 54 48 29 3b 0a 20 20 74 78 74 2e 64 62 20  NGTH);.  txt.db 
224d0 3d 20 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 53  = db;.  sqlite3S
224e0 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74  trAccumAppend(&t
224f0 78 74 2c 20 22 20 28 22 2c 20 32 29 3b 0a 20 20  xt, " (", 2);.  
22500 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 71 3b 20  for(i=0; i<nEq; 
22510 69 2b 2b 29 7b 0a 20 20 20 20 65 78 70 6c 61 69  i++){.    explai
22520 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74  nAppendTerm(&txt
22530 2c 20 69 2c 20 61 43 6f 6c 5b 61 69 43 6f 6c 75  , i, aCol[aiColu
22540 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65 2c 20 22 3d  mn[i]].zName, "=
22550 22 29 3b 0a 20 20 7d 0a 0a 20 20 6a 20 3d 20 69  ");.  }..  j = i
22560 3b 0a 20 20 69 66 28 20 70 50 6c 61 6e 2d 3e 77  ;.  if( pPlan->w
22570 73 46 6c 61 67 73 26 57 48 45 52 45 5f 42 54 4d  sFlags&WHERE_BTM
22580 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 63 68  _LIMIT ){.    ch
22590 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64  ar *z = (j==pInd
225a0 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 3f 20  ex->nColumn ) ? 
225b0 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61  "rowid" : aCol[a
225c0 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d  iColumn[j]].zNam
225d0 65 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70  e;.    explainAp
225e0 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69  pendTerm(&txt, i
225f0 2b 2b 2c 20 7a 2c 20 22 3e 22 29 3b 0a 20 20 7d  ++, z, ">");.  }
22600 0a 20 20 69 66 28 20 70 50 6c 61 6e 2d 3e 77 73  .  if( pPlan->ws
22610 46 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50 5f  Flags&WHERE_TOP_
22620 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 63 68 61  LIMIT ){.    cha
22630 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64 65  r *z = (j==pInde
22640 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 3f 20 22  x->nColumn ) ? "
22650 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69  rowid" : aCol[ai
22660 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65  Column[j]].zName
22670 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70  ;.    explainApp
22680 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2c  endTerm(&txt, i,
22690 20 7a 2c 20 22 3c 22 29 3b 0a 20 20 7d 0a 20 20   z, "<");.  }.  
226a0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
226b0 70 70 65 6e 64 28 26 74 78 74 2c 20 22 29 22 2c  ppend(&txt, ")",
226c0 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71   1);.  return sq
226d0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e  lite3StrAccumFin
226e0 69 73 68 28 26 74 78 74 29 3b 0a 7d 0a 0a 2f 2a  ish(&txt);.}../*
226f0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
22700 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c  n is a no-op unl
22710 65 73 73 20 63 75 72 72 65 6e 74 6c 79 20 70 72  ess currently pr
22720 6f 63 65 73 73 69 6e 67 20 61 6e 20 45 58 50 4c  ocessing an EXPL
22730 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 2a  AIN QUERY PLAN.*
22740 2a 20 63 6f 6d 6d 61 6e 64 2e 20 49 66 20 74 68  * command. If th
22750 65 20 71 75 65 72 79 20 62 65 69 6e 67 20 63 6f  e query being co
22760 6d 70 69 6c 65 64 20 69 73 20 61 6e 20 45 58 50  mpiled is an EXP
22770 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2c  LAIN QUERY PLAN,
22780 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72 65 63   a single.** rec
22790 6f 72 64 20 69 73 20 61 64 64 65 64 20 74 6f 20  ord is added to 
227a0 74 68 65 20 6f 75 74 70 75 74 20 74 6f 20 64 65  the output to de
227b0 73 63 72 69 62 65 20 74 68 65 20 74 61 62 6c 65  scribe the table
227c0 20 73 63 61 6e 20 73 74 72 61 74 65 67 79 20 69   scan strategy i
227d0 6e 20 0a 2a 2a 20 70 4c 65 76 65 6c 2e 0a 2a 2f  n .** pLevel..*/
227e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
227f0 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 50  lainOneScan(.  P
22800 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
22810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22820 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
22830 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
22840 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  abList,         
22850 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6c 69       /* Table li
22860 73 74 20 74 68 69 73 20 6c 6f 6f 70 20 72 65 66  st this loop ref
22870 65 72 73 20 74 6f 20 2a 2f 0a 20 20 57 68 65 72  ers to */.  Wher
22880 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
22890 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
228a0 63 61 6e 20 74 6f 20 77 72 69 74 65 20 4f 50 5f  can to write OP_
228b0 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65 20 66  Explain opcode f
228c0 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76  or */.  int iLev
228d0 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  el,             
228e0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
228f0 20 66 6f 72 20 22 6c 65 76 65 6c 22 20 63 6f 6c   for "level" col
22900 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f  umn of output */
22910 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20  .  int iFrom,   
22920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22930 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20     /* Value for 
22940 22 66 72 6f 6d 22 20 63 6f 6c 75 6d 6e 20 6f 66  "from" column of
22950 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 75 31 36   output */.  u16
22960 20 77 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20   wctrlFlags     
22970 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22980 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20  Flags passed to 
22990 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
229a0 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  n() */.){.  if( 
229b0 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
229c0 3d 32 20 29 7b 0a 20 20 20 20 75 33 32 20 66 6c  =2 ){.    u32 fl
229d0 61 67 73 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c  ags = pLevel->pl
229e0 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  an.wsFlags;.    
229f0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
22a00 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54  tem *pItem = &pT
22a10 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
22a20 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 56 64  ->iFrom];.    Vd
22a30 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
22a40 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 56  pVdbe;      /* V
22a50 4d 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63  M being construc
22a60 74 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ted */.    sqlit
22a70 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
22a80 3e 64 62 3b 20 20 20 20 20 2f 2a 20 44 61 74 61  >db;     /* Data
22a90 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
22aa0 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 20 20     char *zMsg;  
22ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ac0 20 2f 2a 20 54 65 78 74 20 74 6f 20 61 64 64 20   /* Text to add 
22ad0 74 6f 20 45 51 50 20 6f 75 74 70 75 74 20 2a 2f  to EQP output */
22ae0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
22af0 36 34 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20  64 nRow;        
22b00 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20 6e     /* Expected n
22b10 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 76 69  umber of rows vi
22b20 73 69 74 65 64 20 62 79 20 73 63 61 6e 20 2a 2f  sited by scan */
22b30 0a 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70  .    int iId = p
22b40 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
22b50 3b 20 20 2f 2a 20 53 65 6c 65 63 74 20 69 64 20  ;  /* Select id 
22b60 28 6c 65 66 74 2d 6d 6f 73 74 20 6f 75 74 70 75  (left-most outpu
22b70 74 20 63 6f 6c 75 6d 6e 29 20 2a 2f 0a 20 20 20  t column) */.   
22b80 20 69 6e 74 20 69 73 53 65 61 72 63 68 3b 20 20   int isSearch;  
22b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22ba0 2a 20 54 72 75 65 20 66 6f 72 20 61 20 53 45 41  * True for a SEA
22bb0 52 43 48 2e 20 46 61 6c 73 65 20 66 6f 72 20 53  RCH. False for S
22bc0 43 41 4e 2e 20 2a 2f 0a 0a 20 20 20 20 69 66 28  CAN. */..    if(
22bd0 20 28 66 6c 61 67 73 26 57 48 45 52 45 5f 4d 55   (flags&WHERE_MU
22be0 4c 54 49 5f 4f 52 29 20 7c 7c 20 28 77 63 74 72  LTI_OR) || (wctr
22bf0 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 4e 45  lFlags&WHERE_ONE
22c00 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 29 20 72 65  TABLE_ONLY) ) re
22c10 74 75 72 6e 3b 0a 0a 20 20 20 20 69 73 53 65 61  turn;..    isSea
22c20 72 63 68 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 70  rch = (pLevel->p
22c30 6c 61 6e 2e 6e 45 71 3e 30 29 0a 20 20 20 20 20  lan.nEq>0).     
22c40 20 20 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67          || (flag
22c50 73 26 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  s&(WHERE_BTM_LIM
22c60 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  IT|WHERE_TOP_LIM
22c70 49 54 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20  IT))!=0.        
22c80 20 20 20 20 20 7c 7c 20 28 77 63 74 72 6c 46 6c       || (wctrlFl
22c90 61 67 73 26 28 57 48 45 52 45 5f 4f 52 44 45 52  ags&(WHERE_ORDER
22ca0 42 59 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f 52 44  BY_MIN|WHERE_ORD
22cb0 45 52 42 59 5f 4d 41 58 29 29 3b 0a 0a 20 20 20  ERBY_MAX));..   
22cc0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
22cd0 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c  Printf(db, "%s",
22ce0 20 69 73 53 65 61 72 63 68 3f 22 53 45 41 52 43   isSearch?"SEARC
22cf0 48 22 3a 22 53 43 41 4e 22 29 3b 0a 20 20 20 20  H":"SCAN");.    
22d00 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  if( pItem->pSele
22d10 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67  ct ){.      zMsg
22d20 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
22d30 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
22d40 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 20 7a   SUBQUERY %d", z
22d50 4d 73 67 2c 70 49 74 65 6d 2d 3e 69 53 65 6c 65  Msg,pItem->iSele
22d60 63 74 49 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ctId);.    }else
22d70 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73  {.      zMsg = s
22d80 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
22d90 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 54 41 42  b, zMsg, "%s TAB
22da0 4c 45 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49  LE %s", zMsg, pI
22db0 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
22dc0 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 74 65   }..    if( pIte
22dd0 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20  m->zAlias ){.   
22de0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
22df0 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
22e00 73 67 2c 20 22 25 73 20 41 53 20 25 73 22 2c 20  sg, "%s AS %s", 
22e10 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c  zMsg, pItem->zAl
22e20 69 61 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ias);.    }.    
22e30 69 66 28 20 28 66 6c 61 67 73 20 26 20 57 48 45  if( (flags & WHE
22e40 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29  RE_INDEXED)!=0 )
22e50 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 57  {.      char *zW
22e60 68 65 72 65 20 3d 20 65 78 70 6c 61 69 6e 49 6e  here = explainIn
22e70 64 65 78 52 61 6e 67 65 28 64 62 2c 20 70 4c 65  dexRange(db, pLe
22e80 76 65 6c 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  vel, pItem->pTab
22e90 29 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  );.      zMsg = 
22ea0 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
22eb0 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 55 53  db, zMsg, "%s US
22ec0 49 4e 47 20 25 73 25 73 49 4e 44 45 58 25 73 25  ING %s%sINDEX%s%
22ed0 73 25 73 22 2c 20 7a 4d 73 67 2c 20 0a 20 20 20  s%s", zMsg, .   
22ee0 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 20 26         ((flags &
22ef0 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45   WHERE_TEMP_INDE
22f00 58 29 3f 22 41 55 54 4f 4d 41 54 49 43 20 22 3a  X)?"AUTOMATIC ":
22f10 22 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20 28  ""),.          (
22f20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  (flags & WHERE_I
22f30 44 58 5f 4f 4e 4c 59 29 3f 22 43 4f 56 45 52 49  DX_ONLY)?"COVERI
22f40 4e 47 20 22 3a 22 22 29 2c 0a 20 20 20 20 20 20  NG ":""),.      
22f50 20 20 20 20 28 28 66 6c 61 67 73 20 26 20 57 48      ((flags & WH
22f60 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3f  ERE_TEMP_INDEX)?
22f70 22 22 3a 22 20 22 29 2c 0a 20 20 20 20 20 20 20  "":" "),.       
22f80 20 20 20 28 28 66 6c 61 67 73 20 26 20 57 48 45     ((flags & WHE
22f90 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3f 22  RE_TEMP_INDEX)?"
22fa0 22 3a 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ": pLevel->plan.
22fb0 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 2c 0a  u.pIdx->zName),.
22fc0 20 20 20 20 20 20 20 20 20 20 7a 57 68 65 72 65            zWhere
22fd0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
22fe0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
22ff0 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 7d  , zWhere);.    }
23000 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
23010 20 28 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51   (WHERE_ROWID_EQ
23020 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e  |WHERE_ROWID_RAN
23030 47 45 29 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73  GE) ){.      zMs
23040 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
23050 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
23060 73 20 55 53 49 4e 47 20 49 4e 54 45 47 45 52 20  s USING INTEGER 
23070 50 52 49 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d  PRIMARY KEY", zM
23080 73 67 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  sg);..      if( 
23090 66 6c 61 67 73 26 57 48 45 52 45 5f 52 4f 57 49  flags&WHERE_ROWI
230a0 44 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 20 20  D_EQ ){.        
230b0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
230c0 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
230d0 20 22 25 73 20 28 72 6f 77 69 64 3d 3f 29 22 2c   "%s (rowid=?)",
230e0 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65   zMsg);.      }e
230f0 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 26 57  lse if( (flags&W
23100 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 29  HERE_BOTH_LIMIT)
23110 3d 3d 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d  ==WHERE_BOTH_LIM
23120 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d  IT ){.        zM
23130 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
23140 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
23150 25 73 20 28 72 6f 77 69 64 3e 3f 20 41 4e 44 20  %s (rowid>? AND 
23160 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29  rowid<?)", zMsg)
23170 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
23180 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f 42 54  ( flags&WHERE_BT
23190 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20  M_LIMIT ){.     
231a0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
231b0 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
231c0 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3e 3f  sg, "%s (rowid>?
231d0 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20  )", zMsg);.     
231e0 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
231f0 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  &WHERE_TOP_LIMIT
23200 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67   ){.        zMsg
23210 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
23220 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
23230 20 28 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73   (rowid<?)", zMs
23240 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
23250 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
23260 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
23270 4c 45 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  LE.    else if( 
23280 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  (flags & WHERE_V
23290 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20  IRTUALTABLE)!=0 
232a0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
232b0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 56 74  _index_info *pVt
232c0 61 62 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e  abIdx = pLevel->
232d0 70 6c 61 6e 2e 75 2e 70 56 74 61 62 49 64 78 3b  plan.u.pVtabIdx;
232e0 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  .      zMsg = sq
232f0 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
23300 2c 20 7a 4d 73 67 2c 20 22 25 73 20 56 49 52 54  , zMsg, "%s VIRT
23310 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20  UAL TABLE INDEX 
23320 25 64 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a 20 20  %d:%s", zMsg,.  
23330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23340 70 56 74 61 62 49 64 78 2d 3e 69 64 78 4e 75 6d  pVtabIdx->idxNum
23350 2c 20 70 56 74 61 62 49 64 78 2d 3e 69 64 78 53  , pVtabIdx->idxS
23360 74 72 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  tr);.    }.#endi
23370 66 0a 20 20 20 20 69 66 28 20 77 63 74 72 6c 46  f.    if( wctrlF
23380 6c 61 67 73 26 28 57 48 45 52 45 5f 4f 52 44 45  lags&(WHERE_ORDE
23390 52 42 59 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f 52  RBY_MIN|WHERE_OR
233a0 44 45 52 42 59 5f 4d 41 58 29 20 29 7b 0a 20 20  DERBY_MAX) ){.  
233b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77 63      testcase( wc
233c0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
233d0 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 29 3b 0a  _ORDERBY_MIN );.
233e0 20 20 20 20 20 20 6e 52 6f 77 20 3d 20 31 3b 0a        nRow = 1;.
233f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23400 20 6e 52 6f 77 20 3d 20 28 73 71 6c 69 74 65 33   nRow = (sqlite3
23410 5f 69 6e 74 36 34 29 70 4c 65 76 65 6c 2d 3e 70  _int64)pLevel->p
23420 6c 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20 7d 0a  lan.nRow;.    }.
23430 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
23440 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
23450 4d 73 67 2c 20 22 25 73 20 28 7e 25 6c 6c 64 20  Msg, "%s (~%lld 
23460 72 6f 77 73 29 22 2c 20 7a 4d 73 67 2c 20 6e 52  rows)", zMsg, nR
23470 6f 77 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ow);.    sqlite3
23480 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
23490 5f 45 78 70 6c 61 69 6e 2c 20 69 49 64 2c 20 69  _Explain, iId, i
234a0 4c 65 76 65 6c 2c 20 69 46 72 6f 6d 2c 20 7a 4d  Level, iFrom, zM
234b0 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  sg, P4_DYNAMIC);
234c0 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
234d0 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 4f 6e 65  efine explainOne
234e0 53 63 61 6e 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a  Scan(u,v,w,x,y,z
234f0 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
23500 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
23510 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  */.../*.** Gener
23520 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
23530 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 69 4c   start of the iL
23540 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e 20  evel-th loop in 
23550 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
23560 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
23570 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62 79 20  on described by 
23580 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69  pWInfo..*/.stati
23590 63 20 42 69 74 6d 61 73 6b 20 63 6f 64 65 4f 6e  c Bitmask codeOn
235a0 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20 20 57 68  eLoopStart(.  Wh
235b0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
235c0 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 69     /* Complete i
235d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
235e0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
235f0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65  e */.  int iLeve
23600 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  l,          /* W
23610 68 69 63 68 20 6c 65 76 65 6c 20 6f 66 20 70 57  hich level of pW
23620 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64  Info->a[] should
23630 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 75   be coded */.  u
23640 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20  16 wctrlFlags,  
23650 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
23660 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20  e WHERE_* flags 
23670 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74  defined in sqlit
23680 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 42 69 74 6d  eInt.h */.  Bitm
23690 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20  ask notReady    
236a0 20 2f 2a 20 57 68 69 63 68 20 74 61 62 6c 65 73   /* Which tables
236b0 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 61   are currently a
236c0 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  vailable */.){. 
236d0 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20 20 20 20   int j, k;      
236e0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
236f0 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
23700 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20  iCur;           
23710 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72   /* The VDBE cur
23720 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  sor for the tabl
23730 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e  e */.  int addrN
23740 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57  xt;         /* W
23750 68 65 72 65 20 74 6f 20 6a 75 6d 70 20 74 6f 20  here to jump to 
23760 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68  continue with th
23770 65 20 6e 65 78 74 20 49 4e 20 63 61 73 65 20 2a  e next IN case *
23780 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c  /.  int omitTabl
23790 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  e;       /* True
237a0 20 69 66 20 77 65 20 75 73 65 20 74 68 65 20 69   if we use the i
237b0 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69  ndex only */.  i
237c0 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20 20 20  nt bRev;        
237d0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77      /* True if w
237e0 65 20 6e 65 65 64 20 74 6f 20 73 63 61 6e 20 69  e need to scan i
237f0 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
23800 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
23810 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a 20 54 68 65  *pLevel;  /* The
23820 20 77 68 65 72 65 20 6c 65 76 65 6c 20 74 6f 20   where level to 
23830 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68  be coded */.  Wh
23840 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
23850 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74     /* Decomposit
23860 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72  ion of the entir
23870 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
23880 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
23890 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
238a0 20 20 20 20 2f 2a 20 41 20 57 48 45 52 45 20 63      /* A WHERE c
238b0 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20  lause term */.  
238c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
238d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238e0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
238f0 78 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  xt */.  Vdbe *v;
23900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23910 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
23920 72 65 70 61 72 65 64 20 73 74 6d 74 20 75 6e 64  repared stmt und
23930 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 73  er constructions
23940 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
23950 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
23960 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  tem;  /* FROM cl
23970 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20  ause term being 
23980 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61  coded */.  int a
23990 64 64 72 42 72 6b 3b 20 20 20 20 20 20 20 20 20  ddrBrk;         
239a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
239b0 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b  mp here to break
239c0 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
239d0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f   */.  int addrCo
239e0 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
239f0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
23a00 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
23a10 69 74 68 20 6e 65 78 74 20 63 79 63 6c 65 20 2a  ith next cycle *
23a20 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 52 65  /.  int iRowidRe
23a30 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  g = 0;        /*
23a40 20 52 6f 77 69 64 20 69 73 20 73 74 6f 72 65 64   Rowid is stored
23a50 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
23a60 72 2c 20 69 66 20 6e 6f 74 20 7a 65 72 6f 20 2a  r, if not zero *
23a70 2f 0a 20 20 69 6e 74 20 69 52 65 6c 65 61 73 65  /.  int iRelease
23a80 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  Reg = 0;      /*
23a90 20 54 65 6d 70 20 72 65 67 69 73 74 65 72 20 74   Temp register t
23aa0 6f 20 66 72 65 65 20 62 65 66 6f 72 65 20 72 65  o free before re
23ab0 74 75 72 6e 69 6e 67 20 2a 2f 0a 0a 20 20 70 50  turning */..  pP
23ac0 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
23ad0 50 61 72 73 65 3b 0a 20 20 76 20 3d 20 70 50 61  Parse;.  v = pPa
23ae0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57  rse->pVdbe;.  pW
23af0 43 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 57 43 3b  C = pWInfo->pWC;
23b00 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49  .  pLevel = &pWI
23b10 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b 0a  nfo->a[iLevel];.
23b20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 57    pTabItem = &pW
23b30 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
23b40 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
23b50 3b 0a 20 20 69 43 75 72 20 3d 20 70 54 61 62 49  ;.  iCur = pTabI
23b60 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
23b70 62 52 65 76 20 3d 20 28 70 4c 65 76 65 6c 2d 3e  bRev = (pLevel->
23b80 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
23b90 48 45 52 45 5f 52 45 56 45 52 53 45 29 21 3d 30  HERE_REVERSE)!=0
23ba0 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20  ;.  omitTable = 
23bb0 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
23bc0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
23bd0 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20 20 20 20  X_ONLY)!=0 .    
23be0 20 20 20 20 20 20 20 26 26 20 28 77 63 74 72 6c         && (wctrl
23bf0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f  Flags & WHERE_FO
23c00 52 43 45 5f 54 41 42 4c 45 29 3d 3d 30 3b 0a 0a  RCE_TABLE)==0;..
23c10 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65    /* Create labe
23c20 6c 73 20 66 6f 72 20 74 68 65 20 22 62 72 65 61  ls for the "brea
23c30 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65  k" and "continue
23c40 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20  " instructions. 
23c50 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72   ** for the curr
23c60 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20  ent loop.  Jump 
23c70 74 6f 20 61 64 64 72 42 72 6b 20 74 6f 20 62 72  to addrBrk to br
23c80 65 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f  eak out of a loo
23c90 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20  p..  ** Jump to 
23ca0 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64  cont to go immed
23cb0 69 61 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65  iately to the ne
23cc0 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  xt iteration of 
23cd0 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20  the.  ** loop.. 
23ce0 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68   **.  ** When th
23cf0 65 72 65 20 69 73 20 61 6e 20 49 4e 20 6f 70 65  ere is an IN ope
23d00 72 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68  rator, we also h
23d10 61 76 65 20 61 20 22 61 64 64 72 4e 78 74 22 20  ave a "addrNxt" 
23d20 6c 61 62 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20  label that.  ** 
23d30 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75  means to continu
23d40 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  e with the next 
23d50 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61  IN value combina
23d60 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a  tion.  When.  **
23d70 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 49 4e   there are no IN
23d80 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20 74 68   operators in th
23d90 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74  e constraints, t
23da0 68 65 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62  he "addrNxt" lab
23db0 65 6c 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 73  el.  ** is the s
23dc0 61 6d 65 20 61 73 20 22 61 64 64 72 42 72 6b 22  ame as "addrBrk"
23dd0 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b  ..  */.  addrBrk
23de0 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42   = pLevel->addrB
23df0 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  rk = pLevel->add
23e00 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  rNxt = sqlite3Vd
23e10 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
23e20 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65    addrCont = pLe
23e30 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20  vel->addrCont = 
23e40 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
23e50 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49  abel(v);..  /* I
23e60 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72 69  f this is the ri
23e70 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c  ght table of a L
23e80 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20  EFT OUTER JOIN, 
23e90 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a  allocate and.  *
23ea0 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d  * initialize a m
23eb0 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20  emory cell that 
23ec0 72 65 63 6f 72 64 73 20 69 66 20 74 68 69 73 20  records if this 
23ed0 74 61 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e  table matches an
23ee0 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68  y.  ** row of th
23ef0 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20  e left table of 
23f00 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20  the join..  */. 
23f10 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72   if( pLevel->iFr
23f20 6f 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74 65  om>0 && (pTabIte
23f30 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20  m[0].jointype & 
23f40 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20  JT_LEFT)!=0 ){. 
23f50 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74     pLevel->iLeft
23f60 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Join = ++pParse-
23f70 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
23f80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
23f90 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
23fa0 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
23fb0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
23fc0 6e 74 28 28 76 2c 20 22 69 6e 69 74 20 4c 45 46  nt((v, "init LEF
23fd0 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20  T JOIN no-match 
23fe0 66 6c 61 67 22 29 29 3b 0a 20 20 7d 0a 0a 23 69  flag"));.  }..#i
23ff0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
24000 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
24010 20 69 66 28 20 20 28 70 4c 65 76 65 6c 2d 3e 70   if(  (pLevel->p
24020 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
24030 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
24040 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43  )!=0 ){.    /* C
24050 61 73 65 20 30 3a 20 20 54 68 65 20 74 61 62 6c  ase 0:  The tabl
24060 65 20 69 73 20 61 20 76 69 72 74 75 61 6c 2d 74  e is a virtual-t
24070 61 62 6c 65 2e 20 20 55 73 65 20 74 68 65 20 56  able.  Use the V
24080 46 69 6c 74 65 72 20 61 6e 64 20 56 4e 65 78 74  Filter and VNext
24090 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
240a0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
240b0 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
240c0 69 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a 20 50  int iReg;   /* P
240d0 33 20 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56  3 Value for OP_V
240e0 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20 73 71  Filter */.    sq
240f0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
24100 20 2a 70 56 74 61 62 49 64 78 20 3d 20 70 4c 65   *pVtabIdx = pLe
24110 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61  vel->plan.u.pVta
24120 62 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 6e 43  bIdx;.    int nC
24130 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 56 74 61  onstraint = pVta
24140 62 49 64 78 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  bIdx->nConstrain
24150 74 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 71  t;.    struct sq
24160 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
24170 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 61 55  traint_usage *aU
24180 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20  sage =.         
24190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241b0 20 20 20 20 20 20 20 70 56 74 61 62 49 64 78 2d         pVtabIdx-
241c0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
241d0 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 74 72  e;.    const str
241e0 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
241f0 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 61 43  x_constraint *aC
24200 6f 6e 73 74 72 61 69 6e 74 20 3d 0a 20 20 20 20  onstraint =.    
24210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24230 20 20 20 20 20 20 20 20 20 20 20 20 70 56 74 61              pVta
24240 62 49 64 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  bIdx->aConstrain
24250 74 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t;..    sqlite3E
24260 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
24270 72 73 65 29 3b 0a 20 20 20 20 69 52 65 67 20 3d  rse);.    iReg =
24280 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
24290 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f  ange(pParse, nCo
242a0 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20  nstraint+2);.   
242b0 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 6e 43 6f   for(j=1; j<=nCo
242c0 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a  nstraint; j++){.
242d0 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
242e0 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6b 2b  <nConstraint; k+
242f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
24300 61 55 73 61 67 65 5b 6b 5d 2e 61 72 67 76 49 6e  aUsage[k].argvIn
24310 64 65 78 3d 3d 6a 20 29 7b 0a 20 20 20 20 20 20  dex==j ){.      
24320 20 20 20 20 69 6e 74 20 69 54 65 72 6d 20 3d 20      int iTerm = 
24330 61 43 6f 6e 73 74 72 61 69 6e 74 5b 6b 5d 2e 69  aConstraint[k].i
24340 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20  TermOffset;.    
24350 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
24360 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 57  rCode(pParse, pW
24370 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70  C->a[iTerm].pExp
24380 72 2d 3e 70 52 69 67 68 74 2c 20 69 52 65 67 2b  r->pRight, iReg+
24390 6a 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  j+1);.          
243a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
243b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
243c0 66 28 20 6b 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e  f( k==nConstrain
243d0 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  t ) break;.    }
243e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
243f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
24400 65 67 65 72 2c 20 70 56 74 61 62 49 64 78 2d 3e  eger, pVtabIdx->
24410 69 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20  idxNum, iReg);. 
24420 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
24430 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
24440 65 72 2c 20 6a 2d 31 2c 20 69 52 65 67 2b 31 29  er, j-1, iReg+1)
24450 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
24460 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 46  eAddOp4(v, OP_VF
24470 69 6c 74 65 72 2c 20 69 43 75 72 2c 20 61 64 64  ilter, iCur, add
24480 72 42 72 6b 2c 20 69 52 65 67 2c 20 70 56 74 61  rBrk, iReg, pVta
24490 62 49 64 78 2d 3e 69 64 78 53 74 72 2c 0a 20 20  bIdx->idxStr,.  
244a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
244b0 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e 6e 65      pVtabIdx->ne
244c0 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3f  edToFreeIdxStr ?
244d0 20 50 34 5f 4d 50 52 49 4e 54 46 20 3a 20 50 34   P4_MPRINTF : P4
244e0 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 70 56  _STATIC);.    pV
244f0 74 61 62 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72  tabIdx->needToFr
24500 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  eeIdxStr = 0;.  
24510 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f    for(j=0; j<nCo
24520 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a  nstraint; j++){.
24530 20 20 20 20 20 20 69 66 28 20 61 55 73 61 67 65        if( aUsage
24540 5b 6a 5d 2e 6f 6d 69 74 20 29 7b 0a 20 20 20 20  [j].omit ){.    
24550 20 20 20 20 69 6e 74 20 69 54 65 72 6d 20 3d 20      int iTerm = 
24560 61 43 6f 6e 73 74 72 61 69 6e 74 5b 6a 5d 2e 69  aConstraint[j].i
24570 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20  TermOffset;.    
24580 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
24590 70 4c 65 76 65 6c 2c 20 26 70 57 43 2d 3e 61 5b  pLevel, &pWC->a[
245a0 69 54 65 72 6d 5d 29 3b 0a 20 20 20 20 20 20 7d  iTerm]);.      }
245b0 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65  .    }.    pLeve
245c0 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74  l->op = OP_VNext
245d0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  ;.    pLevel->p1
245e0 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65   = iCur;.    pLe
245f0 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65  vel->p2 = sqlite
24600 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
24610 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
24620 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
24630 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e  (pParse, iReg, n
24640 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20  Constraint+2);. 
24650 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
24660 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31  chePop(pParse, 1
24670 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
24680 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
24690 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
246a0 0a 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  ..  if( pLevel->
246b0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
246c0 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 7b  HERE_ROWID_EQ ){
246d0 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20  .    /* Case 1: 
246e0 20 57 65 20 63 61 6e 20 64 69 72 65 63 74 6c 79   We can directly
246f0 20 72 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e   reference a sin
24700 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20 61 6e  gle row using an
24710 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
24720 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72   equality compar
24730 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65  ison against the
24740 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 20 20 4f   ROWID field.  O
24750 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  r.    **        
24760 20 20 77 65 20 72 65 66 65 72 65 6e 63 65 20 6d    we reference m
24770 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 75 73 69  ultiple rows usi
24780 6e 67 20 61 20 22 72 6f 77 69 64 20 49 4e 20 28  ng a "rowid IN (
24790 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 20 20 20  ...)".    **    
247a0 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 2e        construct.
247b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 52 65 6c  .    */.    iRel
247c0 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65  easeReg = sqlite
247d0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
247e0 73 65 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  se);.    pTerm =
247f0 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
24800 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64  Cur, -1, notRead
24810 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20  y, WO_EQ|WO_IN, 
24820 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
24830 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20  pTerm!=0 );.    
24840 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70  assert( pTerm->p
24850 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 61  Expr!=0 );.    a
24860 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 6c 65  ssert( pTerm->le
24870 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29  ftCursor==iCur )
24880 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d  ;.    assert( om
24890 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  itTable==0 );.  
248a0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
248b0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
248c0 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20  M_VIRTUAL ); /* 
248d0 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36  EV: R-30575-1166
248e0 32 20 2a 2f 0a 20 20 20 20 69 52 6f 77 69 64 52  2 */.    iRowidR
248f0 65 67 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74  eg = codeEqualit
24900 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54  yTerm(pParse, pT
24910 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 69 52 65  erm, pLevel, iRe
24920 6c 65 61 73 65 52 65 67 29 3b 0a 20 20 20 20 61  leaseReg);.    a
24930 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d  ddrNxt = pLevel-
24940 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20 20 73 71  >addrNxt;.    sq
24950 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
24960 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
24970 20 69 52 6f 77 69 64 52 65 67 2c 20 61 64 64 72   iRowidReg, addr
24980 4e 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Nxt);.    sqlite
24990 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
249a0 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 43 75  P_NotExists, iCu
249b0 72 2c 20 61 64 64 72 4e 78 74 2c 20 69 52 6f 77  r, addrNxt, iRow
249c0 69 64 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69  idReg);.    sqli
249d0 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
249e0 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20  e(pParse, iCur, 
249f0 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  -1, iRowidReg);.
24a00 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
24a10 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20  (v, "pk"));.    
24a20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
24a30 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Noop;.  }else if
24a40 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
24a50 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52  sFlags & WHERE_R
24a60 4f 57 49 44 5f 52 41 4e 47 45 20 29 7b 0a 20 20  OWID_RANGE ){.  
24a70 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 57 65    /* Case 2:  We
24a80 20 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c   have an inequal
24a90 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61  ity comparison a
24aa0 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44  gainst the ROWID
24ab0 20 66 69 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20   field..    */. 
24ac0 20 20 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20     int testOp = 
24ad0 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74  OP_Noop;.    int
24ae0 20 73 74 61 72 74 3b 0a 20 20 20 20 69 6e 74 20   start;.    int 
24af0 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b  memEndValue = 0;
24b00 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
24b10 70 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a  pStart, *pEnd;..
24b20 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74      assert( omit
24b30 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Table==0 );.    
24b40 70 53 74 61 72 74 20 3d 20 66 69 6e 64 54 65 72  pStart = findTer
24b50 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c  m(pWC, iCur, -1,
24b60 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54   notReady, WO_GT
24b70 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a 20 20 20 20  |WO_GE, 0);.    
24b80 70 45 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d 28  pEnd = findTerm(
24b90 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e  pWC, iCur, -1, n
24ba0 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57  otReady, WO_LT|W
24bb0 4f 5f 4c 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  O_LE, 0);.    if
24bc0 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20  ( bRev ){.      
24bd0 70 54 65 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a  pTerm = pStart;.
24be0 20 20 20 20 20 20 70 53 74 61 72 74 20 3d 20 70        pStart = p
24bf0 45 6e 64 3b 0a 20 20 20 20 20 20 70 45 6e 64 20  End;.      pEnd 
24c00 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20  = pTerm;.    }. 
24c10 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b     if( pStart ){
24c20 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b  .      Expr *pX;
24c30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24c40 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
24c50 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
24c60 73 74 61 72 74 20 62 6f 75 6e 64 20 2a 2f 0a 20  start bound */. 
24c70 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 54 65       int r1, rTe
24c80 6d 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65  mp;        /* Re
24c90 67 69 73 74 65 72 73 20 66 6f 72 20 68 6f 6c 64  gisters for hold
24ca0 69 6e 67 20 74 68 65 20 73 74 61 72 74 20 62 6f  ing the start bo
24cb0 75 6e 64 61 72 79 20 2a 2f 0a 0a 20 20 20 20 20  undary */..     
24cc0 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
24cd0 67 20 63 6f 6e 73 74 61 6e 74 20 6d 61 70 73 20  g constant maps 
24ce0 54 4b 5f 78 78 20 63 6f 64 65 73 20 69 6e 74 6f  TK_xx codes into
24cf0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a   corresponding .
24d00 20 20 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 70        ** seek op
24d10 63 6f 64 65 73 2e 20 20 49 74 20 64 65 70 65 6e  codes.  It depen
24d20 64 73 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c  ds on a particul
24d30 61 72 20 6f 72 64 65 72 69 6e 67 20 6f 66 20 54  ar ordering of T
24d40 4b 5f 78 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20  K_xx.      */.  
24d50 20 20 20 20 63 6f 6e 73 74 20 75 38 20 61 4d 6f      const u8 aMo
24d60 76 65 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  veOp[] = {.     
24d70 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 54 20 2a        /* TK_GT *
24d80 2f 20 20 4f 50 5f 53 65 65 6b 47 74 2c 0a 20 20  /  OP_SeekGt,.  
24d90 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c           /* TK_L
24da0 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 65 2c  E */  OP_SeekLe,
24db0 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  .           /* T
24dc0 4b 5f 4c 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b  K_LT */  OP_Seek
24dd0 4c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f  Lt,.           /
24de0 2a 20 54 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f 53  * TK_GE */  OP_S
24df0 65 65 6b 47 65 0a 20 20 20 20 20 20 7d 3b 0a 20  eekGe.      };. 
24e00 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
24e10 4c 45 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b 20 20  LE==TK_GT+1 );  
24e20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
24e30 20 74 68 65 20 6f 72 64 65 72 69 6e 67 2e 2e 20   the ordering.. 
24e40 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
24e50 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20   TK_LT==TK_GT+2 
24e60 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20  );      /*  ... 
24e70 6f 66 20 74 68 65 20 54 4b 5f 78 78 20 76 61 6c  of the TK_xx val
24e80 75 65 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20  ues... */.      
24e90 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54  assert( TK_GE==T
24ea0 4b 5f 47 54 2b 33 20 29 3b 20 20 20 20 20 20 2f  K_GT+3 );      /
24eb0 2a 20 20 2e 2e 2e 20 69 73 20 63 6f 72 72 65 63  *  ... is correc
24ec0 63 74 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65  ct. */..      te
24ed0 73 74 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e  stcase( pStart->
24ee0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
24ef0 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a  IRTUAL ); /* EV:
24f00 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a   R-30575-11662 *
24f10 2f 0a 20 20 20 20 20 20 70 58 20 3d 20 70 53 74  /.      pX = pSt
24f20 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  art->pExpr;.    
24f30 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20    assert( pX!=0 
24f40 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
24f50 20 70 53 74 61 72 74 2d 3e 6c 65 66 74 43 75 72   pStart->leftCur
24f60 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20  sor==iCur );.   
24f70 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
24f80 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
24f90 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20  se, pX->pRight, 
24fa0 26 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73  &rTemp);.      s
24fb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
24fc0 28 76 2c 20 61 4d 6f 76 65 4f 70 5b 70 58 2d 3e  (v, aMoveOp[pX->
24fd0 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69 43 75 72 2c  op-TK_GT], iCur,
24fe0 20 61 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20   addrBrk, r1);. 
24ff0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
25000 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20  ((v, "pk"));.   
25010 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
25020 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
25030 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29  e(pParse, r1, 1)
25040 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
25050 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
25060 61 72 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20  arse, rTemp);.  
25070 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
25080 70 4c 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b  pLevel, pStart);
25090 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
250a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
250b0 4f 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50  Op2(v, bRev ? OP
250c0 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e  _Last : OP_Rewin
250d0 64 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b  d, iCur, addrBrk
250e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
250f0 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45   pEnd ){.      E
25100 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 70  xpr *pX;.      p
25110 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b  X = pEnd->pExpr;
25120 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
25130 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  X!=0 );.      as
25140 73 65 72 74 28 20 70 45 6e 64 2d 3e 6c 65 66 74  sert( pEnd->left
25150 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a  Cursor==iCur );.
25160 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
25170 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20  pEnd->wtFlags & 
25180 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20  TERM_VIRTUAL ); 
25190 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31  /* EV: R-30575-1
251a0 31 36 36 32 20 2a 2f 0a 20 20 20 20 20 20 6d 65  1662 */.      me
251b0 6d 45 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50  mEndValue = ++pP
251c0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
251d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
251e0 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  e(pParse, pX->pR
251f0 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75  ight, memEndValu
25200 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58  e);.      if( pX
25210 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70  ->op==TK_LT || p
25220 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a  X->op==TK_GT ){.
25230 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d          testOp =
25240 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20   bRev ? OP_Le : 
25250 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c  OP_Ge;.      }el
25260 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
25270 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c  Op = bRev ? OP_L
25280 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20  t : OP_Gt;.     
25290 20 7d 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65   }.      disable
252a0 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e  Term(pLevel, pEn
252b0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74  d);.    }.    st
252c0 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
252d0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
252e0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
252f0 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76  = bRev ? OP_Prev
25300 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   : OP_Next;.    
25310 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75  pLevel->p1 = iCu
25320 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  r;.    pLevel->p
25330 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 69  2 = start;.    i
25340 66 28 20 70 53 74 61 72 74 3d 3d 30 20 26 26 20  f( pStart==0 && 
25350 70 45 6e 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pEnd==0 ){.     
25360 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51   pLevel->p5 = SQ
25370 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
25380 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20  FULLSCAN_STEP;. 
25390 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
253a0 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
253b0 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  p5==0 );.    }. 
253c0 20 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f     if( testOp!=O
253d0 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
253e0 69 52 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c  iRowidReg = iRel
253f0 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65  easeReg = sqlite
25400 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
25410 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
25420 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
25430 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20  OP_Rowid, iCur, 
25440 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
25450 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
25460 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
25470 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64  iCur, -1, iRowid
25480 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
25490 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
254a0 20 74 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56   testOp, memEndV
254b0 61 6c 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 69  alue, addrBrk, i
254c0 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
254d0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
254e0 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41  geP5(v, SQLITE_A
254f0 46 46 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c  FF_NUMERIC | SQL
25500 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
25510 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
25520 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  f( pLevel->plan.
25530 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
25540 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48  _COLUMN_RANGE|WH
25550 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 20 29  ERE_COLUMN_EQ) )
25560 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a  {.    /* Case 3:
25570 20 41 20 73 63 61 6e 20 75 73 69 6e 67 20 61 6e   A scan using an
25580 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20   index..    **. 
25590 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68     **         Th
255a0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6d  e WHERE clause m
255b0 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20  ay contain zero 
255c0 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c 69 74 79  or more equality
255d0 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20   .    **        
255e0 20 74 65 72 6d 73 20 28 22 3d 3d 22 20 6f 72 20   terms ("==" or 
255f0 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 29 20  "IN" operators) 
25600 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68  that refer to th
25610 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  e N.    **      
25620 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c     left-most col
25630 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65  umns of the inde
25640 78 2e 20 49 74 20 6d 61 79 20 61 6c 73 6f 20 63  x. It may also c
25650 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20 20 20  ontain.    **   
25660 20 20 20 20 20 20 69 6e 65 71 75 61 6c 69 74 79        inequality
25670 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 3e 2c   constraints (>,
25680 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e   <, >= or <=) on
25690 20 74 68 65 20 69 6e 64 65 78 65 64 0a 20 20 20   the indexed.   
256a0 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75   **         colu
256b0 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64 69 61 74  mn that immediat
256c0 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20  ely follows the 
256d0 4e 20 65 71 75 61 6c 69 74 69 65 73 2e 20 4f 6e  N equalities. On
256e0 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ly .    **      
256f0 20 20 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73     the right-mos
25700 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20  t column can be 
25710 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 2d 20  an inequality - 
25720 74 68 65 20 72 65 73 74 20 6d 75 73 74 0a 20 20  the rest must.  
25730 20 20 2a 2a 20 20 20 20 20 20 20 20 20 75 73 65    **         use
25740 20 74 68 65 20 22 3d 3d 22 20 61 6e 64 20 22 49   the "==" and "I
25750 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 20 46 6f  N" operators. Fo
25760 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  r example, if th
25770 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  e .    **       
25780 20 20 69 6e 64 65 78 20 69 73 20 6f 6e 20 28 78    index is on (x
25790 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74 68 65 20  ,y,z), then the 
257a0 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61 75 73 65  following clause
257b0 73 20 61 72 65 20 61 6c 6c 20 0a 20 20 20 20 2a  s are all .    *
257c0 2a 20 20 20 20 20 20 20 20 20 6f 70 74 69 6d 69  *         optimi
257d0 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  zed:.    **.    
257e0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
257f0 35 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  5.    **        
25800 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 31 30      x=5 AND y=10
25810 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
25820 20 20 20 78 3d 35 20 41 4e 44 20 79 3c 31 30 0a     x=5 AND y<10.
25830 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
25840 20 20 78 3d 35 20 41 4e 44 20 79 3e 35 20 41 4e    x=5 AND y>5 AN
25850 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20  D y<10.    **   
25860 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44           x=5 AND
25870 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31 30 0a 20   y=5 AND z<=10. 
25880 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
25890 20 20 20 20 20 54 68 65 20 7a 3c 31 30 20 74 65       The z<10 te
258a0 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  rm of the follow
258b0 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  ing cannot be us
258c0 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20  ed, only.    ** 
258d0 20 20 20 20 20 20 20 20 74 68 65 20 78 3d 35 20          the x=5 
258e0 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  term:.    **.   
258f0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
25900 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20 20 20 20  =5 AND z<10.    
25910 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
25920 20 20 4e 20 6d 61 79 20 62 65 20 7a 65 72 6f 20    N may be zero 
25930 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 65  if there are ine
25940 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
25950 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20  nts..    **     
25960 20 20 20 20 49 66 20 74 68 65 72 65 20 61 72 65      If there are
25970 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74 79 20 63   no inequality c
25980 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65 6e  onstraints, then
25990 20 4e 20 69 73 20 61 74 0a 20 20 20 20 2a 2a 20   N is at.    ** 
259a0 20 20 20 20 20 20 20 20 6c 65 61 73 74 20 6f 6e          least on
259b0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
259c0 20 20 20 20 20 20 20 20 20 54 68 69 73 20 63 61           This ca
259d0 73 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20  se is also used 
259e0 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e  when there are n
259f0 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 20  o WHERE clause. 
25a00 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f     **         co
25a10 6e 73 74 72 61 69 6e 74 73 20 62 75 74 20 61 6e  nstraints but an
25a20 20 69 6e 64 65 78 20 69 73 20 73 65 6c 65 63 74   index is select
25a30 65 64 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72  ed anyway, in or
25a40 64 65 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  der.    **      
25a50 20 20 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20     to force the 
25a60 6f 75 74 70 75 74 20 6f 72 64 65 72 20 74 6f 20  output order to 
25a70 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52  conform to an OR
25a80 44 45 52 20 42 59 2e 0a 20 20 20 20 2a 2f 20 20  DER BY..    */  
25a90 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
25aa0 74 20 75 38 20 61 53 74 61 72 74 4f 70 5b 5d 20  t u8 aStartOp[] 
25ab0 3d 20 7b 0a 20 20 20 20 20 20 30 2c 0a 20 20 20  = {.      0,.   
25ac0 20 20 20 30 2c 0a 20 20 20 20 20 20 4f 50 5f 52     0,.      OP_R
25ad0 65 77 69 6e 64 2c 20 20 20 20 20 20 20 20 20 20  ewind,          
25ae0 20 2f 2a 20 32 3a 20 28 21 73 74 61 72 74 5f 63   /* 2: (!start_c
25af0 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73 74  onstraints && st
25b00 61 72 74 45 71 20 26 26 20 20 21 62 52 65 76 29  artEq &&  !bRev)
25b10 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 4c 61 73   */.      OP_Las
25b20 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t,             /
25b30 2a 20 33 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e  * 3: (!start_con
25b40 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61 72  straints && star
25b50 74 45 71 20 26 26 20 20 20 62 52 65 76 29 20 2a  tEq &&   bRev) *
25b60 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47  /.      OP_SeekG
25b70 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
25b80 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  4: (start_constr
25b90 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72 74  aints  && !start
25ba0 45 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a  Eq && !bRev) */.
25bb0 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 74 2c        OP_SeekLt,
25bc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 35 3a             /* 5:
25bd0 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69   (start_constrai
25be0 6e 74 73 20 20 26 26 20 21 73 74 61 72 74 45 71  nts  && !startEq
25bf0 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20   &&  bRev) */.  
25c00 20 20 20 20 4f 50 5f 53 65 65 6b 47 65 2c 20 20      OP_SeekGe,  
25c10 20 20 20 20 20 20 20 20 20 2f 2a 20 36 3a 20 28           /* 6: (
25c20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
25c30 73 20 20 26 26 20 20 73 74 61 72 74 45 71 20 26  s  &&  startEq &
25c40 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  & !bRev) */.    
25c50 20 20 4f 50 5f 53 65 65 6b 4c 65 20 20 20 20 20    OP_SeekLe     
25c60 20 20 20 20 20 20 20 2f 2a 20 37 3a 20 28 73 74         /* 7: (st
25c70 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
25c80 20 26 26 20 20 73 74 61 72 74 45 71 20 26 26 20   &&  startEq && 
25c90 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b   bRev) */.    };
25ca0 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
25cb0 74 20 75 38 20 61 45 6e 64 4f 70 5b 5d 20 3d 20  t u8 aEndOp[] = 
25cc0 7b 0a 20 20 20 20 20 20 4f 50 5f 4e 6f 6f 70 2c  {.      OP_Noop,
25cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25ce0 30 3a 20 28 21 65 6e 64 5f 63 6f 6e 73 74 72 61  0: (!end_constra
25cf0 69 6e 74 73 29 20 2a 2f 0a 20 20 20 20 20 20 4f  ints) */.      O
25d00 50 5f 49 64 78 47 45 2c 20 20 20 20 20 20 20 20  P_IdxGE,        
25d10 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e 64 5f 63      /* 1: (end_c
25d20 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 21 62  onstraints && !b
25d30 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
25d40 5f 49 64 78 4c 54 20 20 20 20 20 20 20 20 20 20  _IdxLT          
25d50 20 20 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f     /* 2: (end_co
25d60 6e 73 74 72 61 69 6e 74 73 20 26 26 20 62 52 65  nstraints && bRe
25d70 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20  v) */.    };.   
25d80 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65   int nEq = pLeve
25d90 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3b 20 20 2f 2a  l->plan.nEq;  /*
25da0 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72   Number of == or
25db0 20 49 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20   IN terms */.   
25dc0 20 69 6e 74 20 69 73 4d 69 6e 51 75 65 72 79 20   int isMinQuery 
25dd0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
25de0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 6f   If this is an o
25df0 70 74 69 6d 69 7a 65 64 20 53 45 4c 45 43 54 20  ptimized SELECT 
25e00 6d 69 6e 28 78 29 2e 2e 20 2a 2f 0a 20 20 20 20  min(x).. */.    
25e10 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20  int regBase;    
25e20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25e30 42 61 73 65 20 72 65 67 69 73 74 65 72 20 68 6f  Base register ho
25e40 6c 64 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74  lding constraint
25e50 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 69   values */.    i
25e60 6e 74 20 72 31 3b 20 20 20 20 20 20 20 20 20 20  nt r1;          
25e70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
25e80 65 6d 70 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  emp register */.
25e90 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
25ea0 52 61 6e 67 65 53 74 61 72 74 20 3d 20 30 3b 20  RangeStart = 0; 
25eb0 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63   /* Inequality c
25ec0 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e  onstraint at ran
25ed0 67 65 20 73 74 61 72 74 20 2a 2f 0a 20 20 20 20  ge start */.    
25ee0 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67  WhereTerm *pRang
25ef0 65 45 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20  eEnd = 0;    /* 
25f00 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  Inequality const
25f10 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20 65  raint at range e
25f20 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74  nd */.    int st
25f30 61 72 74 45 71 3b 20 20 20 20 20 20 20 20 20 20  artEq;          
25f40 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
25f50 66 20 72 61 6e 67 65 20 73 74 61 72 74 20 75 73  f range start us
25f60 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20  es ==, >= or <= 
25f70 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e 64 45 71  */.    int endEq
25f80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25f90 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
25fa0 61 6e 67 65 20 65 6e 64 20 75 73 65 73 20 3d 3d  ange end uses ==
25fb0 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20  , >= or <= */.  
25fc0 20 20 69 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73    int start_cons
25fd0 74 72 61 69 6e 74 73 3b 20 20 20 20 20 20 20 2f  traints;       /
25fe0 2a 20 53 74 61 72 74 20 6f 66 20 72 61 6e 67 65  * Start of range
25ff0 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20   is constrained 
26000 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73  */.    int nCons
26010 74 72 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20  traint;         
26020 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
26030 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d   constraint term
26040 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  s */.    Index *
26050 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
26060 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
26070 65 78 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73  ex we will be us
26080 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ing */.    int i
26090 49 64 78 43 75 72 3b 20 20 20 20 20 20 20 20 20  IdxCur;         
260a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
260b0 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
260c0 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  he index */.    
260d0 69 6e 74 20 6e 45 78 74 72 61 52 65 67 20 3d 20  int nExtraReg = 
260e0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
260f0 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
26100 72 65 67 69 73 74 65 72 73 20 6e 65 65 64 65 64  registers needed
26110 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70 3b 20   */.    int op; 
26120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26130 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74       /* Instruct
26140 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ion opcode */.  
26150 20 20 63 68 61 72 20 2a 7a 53 74 61 72 74 41 66    char *zStartAf
26160 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
26170 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20 73  * Affinity for s
26180 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20 63 6f  tart of range co
26190 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20  nstraint */.    
261a0 63 68 61 72 20 2a 7a 45 6e 64 41 66 66 3b 20 20  char *zEndAff;  
261b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
261c0 41 66 66 69 6e 69 74 79 20 66 6f 72 20 65 6e 64  Affinity for end
261d0 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72   of range constr
261e0 61 69 6e 74 20 2a 2f 0a 0a 20 20 20 20 70 49 64  aint */..    pId
261f0 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  x = pLevel->plan
26200 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20 69 49 64  .u.pIdx;.    iId
26210 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  xCur = pLevel->i
26220 49 64 78 43 75 72 3b 0a 20 20 20 20 6b 20 3d 20  IdxCur;.    k = 
26230 28 6e 45 71 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c  (nEq==pIdx->nCol
26240 75 6d 6e 20 3f 20 2d 31 20 3a 20 70 49 64 78 2d  umn ? -1 : pIdx-
26250 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 29 3b  >aiColumn[nEq]);
26260 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
26270 20 6c 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20   loop satisfies 
26280 61 20 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f  a sort order (pO
26290 72 64 65 72 42 79 29 20 72 65 71 75 65 73 74 20  rderBy) request 
262a0 74 68 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73  that .    ** was
262b0 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
262c0 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c  function to impl
262d0 65 6d 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20  ement a "SELECT 
262e0 6d 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20  min(x) ..." .   
262f0 20 2a 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20   ** query, then 
26300 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
26310 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c  only allow the l
26320 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20  oop to run for. 
26330 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69     ** a single i
26340 74 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d  teration. This m
26350 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 69  eans that the fi
26360 72 73 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64  rst row returned
26370 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e  .    ** should n
26380 6f 74 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76  ot have a NULL v
26390 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27  alue stored in '
263a0 78 27 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78  x'. If column 'x
263b0 27 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  ' is.    ** the 
263c0 66 69 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20  first one after 
263d0 74 68 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79  the nEq equality
263e0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20   constraints in 
263f0 74 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a  the index,.    *
26400 2a 20 74 68 69 73 20 72 65 71 75 69 72 65 73 20  * this requires 
26410 73 6f 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e  some special han
26420 64 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20  dling..    */.  
26430 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
26440 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  s&WHERE_ORDERBY_
26450 4d 49 4e 29 21 3d 30 0a 20 20 20 20 20 26 26 20  MIN)!=0.     && 
26460 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
26470 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45  Flags&WHERE_ORDE
26480 52 42 59 29 0a 20 20 20 20 20 26 26 20 28 70 49  RBY).     && (pI
26490 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 71 29  dx->nColumn>nEq)
264a0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
264b0 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
264c0 79 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 20 2a  y->nExpr==1 ); *
264d0 2f 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72  /.      /* asser
264e0 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30  t( pOrderBy->a[0
264f0 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ].pExpr->iColumn
26500 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ==pIdx->aiColumn
26510 5b 6e 45 71 5d 20 29 3b 20 2a 2f 0a 20 20 20 20  [nEq] ); */.    
26520 20 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 31    isMinQuery = 1
26530 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65  ;.      nExtraRe
26540 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  g = 1;.    }..  
26550 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79 20 69 6e    /* Find any in
26560 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
26570 69 6e 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68  int terms for th
26580 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20  e start and end 
26590 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 72  .    ** of the r
265a0 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  ange. .    */.  
265b0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c    if( pLevel->pl
265c0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
265d0 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a  RE_TOP_LIMIT ){.
265e0 20 20 20 20 20 20 70 52 61 6e 67 65 45 6e 64 20        pRangeEnd 
265f0 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
26600 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64  iCur, k, notRead
26610 79 2c 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29  y, (WO_LT|WO_LE)
26620 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 6e  , pIdx);.      n
26630 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20  ExtraReg = 1;.  
26640 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76    }.    if( pLev
26650 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
26660 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d   & WHERE_BTM_LIM
26670 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e  IT ){.      pRan
26680 67 65 53 74 61 72 74 20 3d 20 66 69 6e 64 54 65  geStart = findTe
26690 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c  rm(pWC, iCur, k,
266a0 20 6e 6f 74 52 65 61 64 79 2c 20 28 57 4f 5f 47   notReady, (WO_G
266b0 54 7c 57 4f 5f 47 45 29 2c 20 70 49 64 78 29 3b  T|WO_GE), pIdx);
266c0 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67  .      nExtraReg
266d0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
266e0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
266f0 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c  e to evaluate al
26700 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72  l constraint ter
26710 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49  ms using == or I
26720 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73 74 6f  N.    ** and sto
26730 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  re the values of
26740 20 74 68 6f 73 65 20 74 65 72 6d 73 20 69 6e 20   those terms in 
26750 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69  an array of regi
26760 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61  sters.    ** sta
26770 72 74 69 6e 67 20 61 74 20 72 65 67 42 61 73 65  rting at regBase
26780 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67  ..    */.    reg
26790 42 61 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45 71  Base = codeAllEq
267a0 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 20  ualityTerms(.   
267b0 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 4c 65       pParse, pLe
267c0 76 65 6c 2c 20 70 57 43 2c 20 6e 6f 74 52 65 61  vel, pWC, notRea
267d0 64 79 2c 20 6e 45 78 74 72 61 52 65 67 2c 20 26  dy, nExtraReg, &
267e0 7a 53 74 61 72 74 41 66 66 0a 20 20 20 20 29 3b  zStartAff.    );
267f0 0a 20 20 20 20 7a 45 6e 64 41 66 66 20 3d 20 73  .    zEndAff = s
26800 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70  qlite3DbStrDup(p
26810 50 61 72 73 65 2d 3e 64 62 2c 20 7a 53 74 61 72  Parse->db, zStar
26820 74 41 66 66 29 3b 0a 20 20 20 20 61 64 64 72 4e  tAff);.    addrN
26830 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  xt = pLevel->add
26840 72 4e 78 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  rNxt;..    /* If
26850 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20   we are doing a 
26860 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 73 63  reverse order sc
26870 61 6e 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69  an on an ascendi
26880 6e 67 20 69 6e 64 65 78 2c 20 6f 72 0a 20 20 20  ng index, or.   
26890 20 2a 2a 20 61 20 66 6f 72 77 61 72 64 20 6f 72   ** a forward or
268a0 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 20 64 65  der scan on a de
268b0 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20  scending index, 
268c0 69 6e 74 65 72 63 68 61 6e 67 65 20 74 68 65 20  interchange the 
268d0 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 20 61 6e  .    ** start an
268e0 64 20 65 6e 64 20 74 65 72 6d 73 20 28 70 52 61  d end terms (pRa
268f0 6e 67 65 53 74 61 72 74 20 61 6e 64 20 70 52 61  ngeStart and pRa
26900 6e 67 65 45 6e 64 29 2e 0a 20 20 20 20 2a 2f 0a  ngeEnd)..    */.
26910 20 20 20 20 69 66 28 20 28 6e 45 71 3c 70 49 64      if( (nEq<pId
26920 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 62 52  x->nColumn && bR
26930 65 76 3d 3d 28 70 49 64 78 2d 3e 61 53 6f 72 74  ev==(pIdx->aSort
26940 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49  Order[nEq]==SQLI
26950 54 45 5f 53 4f 5f 41 53 43 29 29 0a 20 20 20 20  TE_SO_ASC)).    
26960 20 7c 7c 20 28 62 52 65 76 20 26 26 20 70 49 64   || (bRev && pId
26970 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6e 45 71 29  x->nColumn==nEq)
26980 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 53 57  .    ){.      SW
26990 41 50 28 57 68 65 72 65 54 65 72 6d 20 2a 2c 20  AP(WhereTerm *, 
269a0 70 52 61 6e 67 65 45 6e 64 2c 20 70 52 61 6e 67  pRangeEnd, pRang
269b0 65 53 74 61 72 74 29 3b 0a 20 20 20 20 7d 0a 0a  eStart);.    }..
269c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
269d0 61 6e 67 65 53 74 61 72 74 20 26 26 20 70 52 61  angeStart && pRa
269e0 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61  ngeStart->eOpera
269f0 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20  tor & WO_LE );. 
26a00 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
26a10 6e 67 65 53 74 61 72 74 20 26 26 20 70 52 61 6e  ngeStart && pRan
26a20 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74  geStart->eOperat
26a30 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20  or & WO_GE );.  
26a40 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
26a50 67 65 45 6e 64 20 26 26 20 70 52 61 6e 67 65 45  geEnd && pRangeE
26a60 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  nd->eOperator & 
26a70 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 74 65 73  WO_LE );.    tes
26a80 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64  tcase( pRangeEnd
26a90 20 26 26 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65   && pRangeEnd->e
26aa0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45  Operator & WO_GE
26ab0 20 29 3b 0a 20 20 20 20 73 74 61 72 74 45 71 20   );.    startEq 
26ac0 3d 20 21 70 52 61 6e 67 65 53 74 61 72 74 20 7c  = !pRangeStart |
26ad0 7c 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65  | pRangeStart->e
26ae0 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c  Operator & (WO_L
26af0 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 65 6e  E|WO_GE);.    en
26b00 64 45 71 20 3d 20 20 20 21 70 52 61 6e 67 65 45  dEq =   !pRangeE
26b10 6e 64 20 7c 7c 20 70 52 61 6e 67 65 45 6e 64 2d  nd || pRangeEnd-
26b20 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
26b30 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20  _LE|WO_GE);.    
26b40 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
26b50 73 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74 20  s = pRangeStart 
26b60 7c 7c 20 6e 45 71 3e 30 3b 0a 0a 20 20 20 20 2f  || nEq>0;..    /
26b70 2a 20 53 65 65 6b 20 74 68 65 20 69 6e 64 65 78  * Seek the index
26b80 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 73   cursor to the s
26b90 74 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67  tart of the rang
26ba0 65 2e 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74  e. */.    nConst
26bb0 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20  raint = nEq;.   
26bc0 20 69 66 28 20 70 52 61 6e 67 65 53 74 61 72 74   if( pRangeStart
26bd0 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
26be0 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65 53  pRight = pRangeS
26bf0 74 61 72 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69  tart->pExpr->pRi
26c00 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ght;.      sqlit
26c10 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
26c20 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61  e, pRight, regBa
26c30 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 69  se+nEq);.      i
26c40 66 28 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d  f( (pRangeStart-
26c50 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
26c60 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  VNULL)==0 ){.   
26c70 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26c80 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76  CodeIsNullJump(v
26c90 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73  , pRight, regBas
26ca0 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b  e+nEq, addrNxt);
26cb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
26cc0 66 28 20 7a 53 74 61 72 74 41 66 66 20 29 7b 0a  f( zStartAff ){.
26cd0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
26ce0 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
26cf0 74 79 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72  ty(pRight, zStar
26d00 74 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49  tAff[nEq])==SQLI
26d10 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20  TE_AFF_NONE){.  
26d20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65          /* Since
26d30 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
26d40 69 73 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d  is to be perform
26d50 65 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65  ed with no conve
26d60 72 73 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20  rsions.         
26d70 20 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74   ** applied to t
26d80 68 65 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74  he operands, set
26d90 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f   the affinity to
26da0 20 61 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74   apply to pRight
26db0 20 74 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a   to .          *
26dc0 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
26dd0 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  E.  */.         
26de0 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20   zStartAff[nEq] 
26df0 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
26e00 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
26e10 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
26e20 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e  ExprNeedsNoAffin
26e30 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74  ityChange(pRight
26e40 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d  , zStartAff[nEq]
26e50 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ) ){.          z
26e60 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20  StartAff[nEq] = 
26e70 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
26e80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
26e90 20 7d 20 20 0a 20 20 20 20 20 20 6e 43 6f 6e 73   }  .      nCons
26ea0 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  traint++;.      
26eb0 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65  testcase( pRange
26ec0 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26  Start->wtFlags &
26ed0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
26ee0 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d   /* EV: R-30575-
26ef0 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 7d 65 6c  11662 */.    }el
26f00 73 65 20 69 66 28 20 69 73 4d 69 6e 51 75 65 72  se if( isMinQuer
26f10 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  y ){.      sqlit
26f20 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
26f30 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42  OP_Null, 0, regB
26f40 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20  ase+nEq);.      
26f50 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20  nConstraint++;. 
26f60 20 20 20 20 20 73 74 61 72 74 45 71 20 3d 20 30       startEq = 0
26f70 3b 0a 20 20 20 20 20 20 73 74 61 72 74 5f 63 6f  ;.      start_co
26f80 6e 73 74 72 61 69 6e 74 73 20 3d 20 31 3b 0a 20  nstraints = 1;. 
26f90 20 20 20 7d 0a 20 20 20 20 63 6f 64 65 41 70 70     }.    codeApp
26fa0 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61 72 73  lyAffinity(pPars
26fb0 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e  e, regBase, nCon
26fc0 73 74 72 61 69 6e 74 2c 20 7a 53 74 61 72 74 41  straint, zStartA
26fd0 66 66 29 3b 0a 20 20 20 20 6f 70 20 3d 20 61 53  ff);.    op = aS
26fe0 74 61 72 74 4f 70 5b 28 73 74 61 72 74 5f 63 6f  tartOp[(start_co
26ff0 6e 73 74 72 61 69 6e 74 73 3c 3c 32 29 20 2b 20  nstraints<<2) + 
27000 28 73 74 61 72 74 45 71 3c 3c 31 29 20 2b 20 62  (startEq<<1) + b
27010 52 65 76 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  Rev];.    assert
27020 28 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20 20 74  ( op!=0 );.    t
27030 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
27040 52 65 77 69 6e 64 20 29 3b 0a 20 20 20 20 74 65  Rewind );.    te
27050 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4c  stcase( op==OP_L
27060 61 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ast );.    testc
27070 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  ase( op==OP_Seek
27080 47 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  Gt );.    testca
27090 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47  se( op==OP_SeekG
270a0 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  e );.    testcas
270b0 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 65  e( op==OP_SeekLe
270c0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
270d0 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 74 20  ( op==OP_SeekLt 
270e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
270f0 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f  beAddOp4Int(v, o
27100 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64 72  p, iIdxCur, addr
27110 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  Nxt, regBase, nC
27120 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 0a 20 20 20  onstraint);..   
27130 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 76 61 6c   /* Load the val
27140 75 65 20 66 6f 72 20 74 68 65 20 69 6e 65 71 75  ue for the inequ
27150 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
27160 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
27170 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20  he.    ** range 
27180 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f  (if any)..    */
27190 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74  .    nConstraint
271a0 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20   = nEq;.    if( 
271b0 70 52 61 6e 67 65 45 6e 64 20 29 7b 0a 20 20 20  pRangeEnd ){.   
271c0 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
271d0 3d 20 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45 78  = pRangeEnd->pEx
271e0 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
271f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
27200 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c  heRemove(pParse,
27210 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 31 29   regBase+nEq, 1)
27220 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
27230 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
27240 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b  pRight, regBase+
27250 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nEq);.      if( 
27260 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c  (pRangeEnd->wtFl
27270 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
27280 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
27290 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
272a0 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69  sNullJump(v, pRi
272b0 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  ght, regBase+nEq
272c0 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20  , addrNxt);.    
272d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 45    }.      if( zE
272e0 6e 64 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20  ndAff ){.       
272f0 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70   if( sqlite3Comp
27300 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67  areAffinity(pRig
27310 68 74 2c 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d  ht, zEndAff[nEq]
27320 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  )==SQLITE_AFF_NO
27330 4e 45 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  NE){.          /
27340 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70  * Since the comp
27350 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20  arison is to be 
27360 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e  performed with n
27370 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20  o conversions.  
27380 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69          ** appli
27390 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e  ed to the operan
273a0 64 73 2c 20 73 65 74 20 74 68 65 20 61 66 66 69  ds, set the affi
273b0 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f  nity to apply to
273c0 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20   pRight to .    
273d0 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
273e0 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20  AFF_NONE.  */.  
273f0 20 20 20 20 20 20 20 20 7a 45 6e 64 41 66 66 5b          zEndAff[
27400 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46  nEq] = SQLITE_AF
27410 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
27420 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  }.        if( sq
27430 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f  lite3ExprNeedsNo
27440 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
27450 52 69 67 68 74 2c 20 7a 45 6e 64 41 66 66 5b 6e  Right, zEndAff[n
27460 45 71 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Eq]) ){.        
27470 20 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 20 3d    zEndAff[nEq] =
27480 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
27490 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
274a0 20 20 7d 20 20 0a 20 20 20 20 20 20 63 6f 64 65    }  .      code
274b0 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50  ApplyAffinity(pP
274c0 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e  arse, regBase, n
274d0 45 71 2b 31 2c 20 7a 45 6e 64 41 66 66 29 3b 0a  Eq+1, zEndAff);.
274e0 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e        nConstrain
274f0 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t++;.      testc
27500 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 2d 3e  ase( pRangeEnd->
27510 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
27520 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a  IRTUAL ); /* EV:
27530 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a   R-30575-11662 *
27540 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  /.    }.    sqli
27550 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
27560 2d 3e 64 62 2c 20 7a 53 74 61 72 74 41 66 66 29  ->db, zStartAff)
27570 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
27580 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
27590 7a 45 6e 64 41 66 66 29 3b 0a 0a 20 20 20 20 2f  zEndAff);..    /
275a0 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  * Top of the loo
275b0 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 70 4c  p body */.    pL
275c0 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74  evel->p2 = sqlit
275d0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
275e0 72 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  r(v);..    /* Ch
275f0 65 63 6b 20 69 66 20 74 68 65 20 69 6e 64 65 78  eck if the index
27600 20 63 75 72 73 6f 72 20 69 73 20 70 61 73 74 20   cursor is past 
27610 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72  the end of the r
27620 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6f 70 20  ange. */.    op 
27630 3d 20 61 45 6e 64 4f 70 5b 28 70 52 61 6e 67 65  = aEndOp[(pRange
27640 45 6e 64 20 7c 7c 20 6e 45 71 29 20 2a 20 28 31  End || nEq) * (1
27650 20 2b 20 62 52 65 76 29 5d 3b 0a 20 20 20 20 74   + bRev)];.    t
27660 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
27670 4e 6f 6f 70 20 29 3b 0a 20 20 20 20 74 65 73 74  Noop );.    test
27680 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78  case( op==OP_Idx
27690 47 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  GE );.    testca
276a0 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54  se( op==OP_IdxLT
276b0 20 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d   );.    if( op!=
276c0 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
276d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
276e0 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64  p4Int(v, op, iId
276f0 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72  xCur, addrNxt, r
27700 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61  egBase, nConstra
27710 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
27720 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
27730 76 2c 20 65 6e 64 45 71 21 3d 62 52 65 76 20 3f  v, endEq!=bRev ?
27740 31 3a 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  1:0);.    }..   
27750 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
27760 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
27770 74 72 61 69 6e 74 73 2c 20 63 68 65 63 6b 20 74  traints, check t
27780 68 61 74 20 74 68 65 20 76 61 6c 75 65 0a 20 20  hat the value.  
27790 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c    ** of the tabl
277a0 65 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68  e column that th
277b0 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  e inequality con
277c0 74 72 61 69 6e 73 20 69 73 20 6e 6f 74 20 4e 55  trains is not NU
277d0 4c 4c 2e 0a 20 20 20 20 2a 2a 20 49 66 20 69 74  LL..    ** If it
277e0 20 69 73 2c 20 6a 75 6d 70 20 74 6f 20 74 68 65   is, jump to the
277f0 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
27800 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 20  of the loop..   
27810 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20 73 71 6c   */.    r1 = sql
27820 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
27830 50 61 72 73 65 29 3b 0a 20 20 20 20 74 65 73 74  Parse);.    test
27840 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c  case( pLevel->pl
27850 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
27860 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 3b 0a  RE_BTM_LIMIT );.
27870 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c      testcase( pL
27880 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
27890 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
278a0 49 4d 49 54 20 29 3b 0a 20 20 20 20 69 66 28 20  IMIT );.    if( 
278b0 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
278c0 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 42  Flags & (WHERE_B
278d0 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54  TM_LIMIT|WHERE_T
278e0 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30 20 29 7b  OP_LIMIT))!=0 ){
278f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
27900 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
27910 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20  olumn, iIdxCur, 
27920 6e 45 71 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  nEq, r1);.      
27930 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
27940 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
27950 72 31 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20  r1, addrCont);. 
27960 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
27970 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
27980 50 61 72 73 65 2c 20 72 31 29 3b 0a 0a 20 20 20  Parse, r1);..   
27990 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 74 61 62   /* Seek the tab
279a0 6c 65 20 63 75 72 73 6f 72 2c 20 69 66 20 72 65  le cursor, if re
279b0 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 64 69  quired */.    di
279c0 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
279d0 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a  , pRangeStart);.
279e0 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
279f0 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e  pLevel, pRangeEn
27a00 64 29 3b 0a 20 20 20 20 69 66 28 20 21 6f 6d 69  d);.    if( !omi
27a10 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  tTable ){.      
27a20 69 52 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c  iRowidReg = iRel
27a30 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65  easeReg = sqlite
27a40 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
27a50 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
27a60 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
27a70 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64  OP_IdxRowid, iId
27a80 78 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29  xCur, iRowidReg)
27a90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
27aa0 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50  xprCacheStore(pP
27ab0 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20  arse, iCur, -1, 
27ac0 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
27ad0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
27ae0 4f 70 32 28 76 2c 20 4f 50 5f 53 65 65 6b 2c 20  Op2(v, OP_Seek, 
27af0 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29  iCur, iRowidReg)
27b00 3b 20 20 2f 2a 20 44 65 66 65 72 72 65 64 20 73  ;  /* Deferred s
27b10 65 65 6b 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20  eek */.    }..  
27b20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
27b30 69 6e 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64  instruction used
27b40 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68   to terminate th
27b50 65 20 6c 6f 6f 70 2e 20 44 69 73 61 62 6c 65 20  e loop. Disable 
27b60 0a 20 20 20 20 2a 2a 20 57 48 45 52 45 20 63 6c  .    ** WHERE cl
27b70 61 75 73 65 20 74 65 72 6d 73 20 6d 61 64 65 20  ause terms made 
27b80 72 65 64 75 6e 64 61 6e 74 20 62 79 20 74 68 65  redundant by the
27b90 20 69 6e 64 65 78 20 72 61 6e 67 65 20 73 63 61   index range sca
27ba0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
27bb0 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
27bc0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55  sFlags & WHERE_U
27bd0 4e 49 51 55 45 20 29 7b 0a 20 20 20 20 20 20 70  NIQUE ){.      p
27be0 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e  Level->op = OP_N
27bf0 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  oop;.    }else i
27c00 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20  f( bRev ){.     
27c10 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
27c20 5f 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65  _Prev;.    }else
27c30 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
27c40 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  op = OP_Next;.  
27c50 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
27c60 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20  p1 = iIdxCur;.  
27c70 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c    if( pLevel->pl
27c80 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
27c90 52 45 5f 43 4f 56 45 52 5f 53 43 41 4e 20 29 7b  RE_COVER_SCAN ){
27ca0 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
27cb0 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  5 = SQLITE_STMTS
27cc0 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53  TATUS_FULLSCAN_S
27cd0 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  TEP;.    }else{.
27ce0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
27cf0 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20  evel->p5==0 );. 
27d00 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69     }.  }else..#i
27d10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
27d20 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
27d30 4e 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  N.  if( pLevel->
27d40 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
27d50 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b  HERE_MULTI_OR ){
27d60 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 34 3a 20  .    /* Case 4: 
27d70 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70   Two or more sep
27d80 61 72 61 74 65 6c 79 20 69 6e 64 65 78 65 64 20  arately indexed 
27d90 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20  terms connected 
27da0 62 79 20 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20  by OR.    **.   
27db0 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20   ** Example:.   
27dc0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52 45   **.    **   CRE
27dd0 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62  ATE TABLE t1(a,b
27de0 2c 63 2c 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20  ,c,d);.    **   
27df0 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
27e00 4f 4e 20 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a  ON t1(a);.    **
27e10 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
27e20 69 32 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20  i2 ON t1(b);.   
27e30 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44   **   CREATE IND
27e40 45 58 20 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a  EX i3 ON t1(c);.
27e50 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
27e60 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
27e70 20 57 48 45 52 45 20 61 3d 35 20 4f 52 20 62 3d   WHERE a=5 OR b=
27e80 37 20 4f 52 20 28 63 3d 31 31 20 41 4e 44 20 64  7 OR (c=11 AND d
27e90 3d 31 33 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  =13).    **.    
27ea0 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c  ** In the exampl
27eb0 65 2c 20 74 68 65 72 65 20 61 72 65 20 74 68 72  e, there are thr
27ec0 65 65 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73  ee indexed terms
27ed0 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52   connected by OR
27ee0 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 6f 70  ..    ** The top
27ef0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f   of the loop loo
27f00 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20  ks like this:.  
27f10 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
27f20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20       Null       
27f30 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
27f40 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73   # Zero the rows
27f50 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20  et in reg 1.    
27f60 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 6e 2c 20  **.    ** Then, 
27f70 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78 65 64  for each indexed
27f80 20 74 65 72 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f   term, the follo
27f90 77 69 6e 67 2e 20 54 68 65 20 61 72 67 75 6d 65  wing. The argume
27fa0 6e 74 73 20 74 6f 0a 20 20 20 20 2a 2a 20 52 6f  nts to.    ** Ro
27fb0 77 53 65 74 54 65 73 74 20 61 72 65 20 73 75 63  wSetTest are suc
27fc0 68 20 74 68 61 74 20 74 68 65 20 72 6f 77 69 64  h that the rowid
27fd0 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
27fe0 72 6f 77 20 69 73 20 69 6e 73 65 72 74 65 64 0a  row is inserted.
27ff0 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
28000 52 6f 77 53 65 74 2e 20 49 66 20 69 74 20 69 73  RowSet. If it is
28010 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74   already present
28020 2c 20 63 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20  , control skips 
28030 74 68 65 0a 20 20 20 20 2a 2a 20 47 6f 73 75 62  the.    ** Gosub
28040 20 6f 70 63 6f 64 65 20 61 6e 64 20 6a 75 6d 70   opcode and jump
28050 73 20 73 74 72 61 69 67 68 74 20 74 6f 20 74 68  s straight to th
28060 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
28070 20 62 79 20 57 68 65 72 65 45 6e 64 28 29 2e 0a   by WhereEnd()..
28080 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
28090 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
280a0 65 42 65 67 69 6e 28 3c 74 65 72 6d 3e 29 0a 20  eBegin(<term>). 
280b0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52     **          R
280c0 6f 77 53 65 74 54 65 73 74 20 20 20 20 20 20 20  owSetTest       
280d0 20 20 20 20 20 20 20 20 20 20 20 23 20 49 6e 73             # Ins
280e0 65 72 74 20 72 6f 77 69 64 20 69 6e 74 6f 20 72  ert rowid into r
280f0 6f 77 73 65 74 0a 20 20 20 20 2a 2a 20 20 20 20  owset.    **    
28100 20 20 20 20 20 20 47 6f 73 75 62 20 20 20 20 20        Gosub     
28110 20 32 20 41 0a 20 20 20 20 2a 2a 20 20 20 20 20   2 A.    **     
28120 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
28130 6e 64 28 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nd().    **.    
28140 2a 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** Following the
28150 20 61 62 6f 76 65 2c 20 63 6f 64 65 20 74 6f 20   above, code to 
28160 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
28170 6f 70 2e 20 4c 61 62 65 6c 20 41 2c 20 74 68 65  op. Label A, the
28180 20 74 61 72 67 65 74 0a 20 20 20 20 2a 2a 20 6f   target.    ** o
28190 66 20 74 68 65 20 47 6f 73 75 62 20 61 62 6f 76  f the Gosub abov
281a0 65 2c 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20  e, jumps to the 
281b0 69 6e 73 74 72 75 63 74 69 6f 6e 20 72 69 67 68  instruction righ
281c0 74 20 61 66 74 65 72 20 74 68 65 20 47 6f 74 6f  t after the Goto
281d0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
281e0 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20           Null   
281f0 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
28200 20 20 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20       # Zero the 
28210 72 6f 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a  rowset in reg 1.
28220 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
28230 47 6f 74 6f 20 20 20 20 20 20 20 42 20 20 20 20  Goto       B    
28240 20 20 20 20 20 20 20 20 20 20 20 20 23 20 54 68              # Th
28250 65 20 6c 6f 6f 70 20 69 73 20 66 69 6e 69 73 68  e loop is finish
28260 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
28270 2a 20 20 20 20 20 20 20 41 3a 20 3c 6c 6f 6f 70  *       A: <loop
28280 20 62 6f 64 79 3e 20 20 20 20 20 20 20 20 20 20   body>          
28290 20 20 20 20 20 20 20 23 20 52 65 74 75 72 6e 20         # Return 
282a0 64 61 74 61 2c 20 77 68 61 74 65 76 65 72 2e 0a  data, whatever..
282b0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
282c0 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 20 20         Return   
282d0 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
282e0 20 20 20 23 20 4a 75 6d 70 20 62 61 63 6b 20 74     # Jump back t
282f0 6f 20 74 68 65 20 47 6f 73 75 62 0a 20 20 20 20  o the Gosub.    
28300 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
28310 42 3a 20 3c 61 66 74 65 72 20 74 68 65 20 6c 6f  B: <after the lo
28320 6f 70 3e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  op>.    **.    *
28330 2f 0a 20 20 20 20 57 68 65 72 65 43 6c 61 75 73  /.    WhereClaus
28340 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20  e *pOrWc;    /* 
28350 54 68 65 20 4f 52 2d 63 6c 61 75 73 65 20 62 72  The OR-clause br
28360 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75  oken out into su
28370 62 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 53 72  bterms */.    Sr
28380 63 4c 69 73 74 20 2a 70 4f 72 54 61 62 3b 20 20  cList *pOrTab;  
28390 20 20 20 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65       /* Shortene
283a0 64 20 74 61 62 6c 65 20 6c 69 73 74 20 6f 72 20  d table list or 
283b0 4f 52 2d 63 6c 61 75 73 65 20 67 65 6e 65 72 61  OR-clause genera
283c0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65  tion */.    Inde
283d0 78 20 2a 70 43 6f 76 20 3d 20 30 3b 20 20 20 20  x *pCov = 0;    
283e0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 74 65           /* Pote
283f0 6e 74 69 61 6c 20 63 6f 76 65 72 69 6e 67 20 69  ntial covering i
28400 6e 64 65 78 20 28 6f 72 20 4e 55 4c 4c 29 20 2a  ndex (or NULL) *
28410 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 76 43 75  /.    int iCovCu
28420 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
28430 2b 2b 3b 20 20 2f 2a 20 43 75 72 73 6f 72 20 75  ++;  /* Cursor u
28440 73 65 64 20 66 6f 72 20 69 6e 64 65 78 20 73 63  sed for index sc
28450 61 6e 73 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a  ans (if any) */.
28460 0a 20 20 20 20 69 6e 74 20 72 65 67 52 65 74 75  .    int regRetu
28470 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rn = ++pParse->n
28480 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Mem;           /
28490 2a 20 52 65 67 69 73 74 65 72 20 75 73 65 64 20  * Register used 
284a0 77 69 74 68 20 4f 50 5f 47 6f 73 75 62 20 2a 2f  with OP_Gosub */
284b0 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 73  .    int regRows
284c0 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  et = 0;         
284d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
284e0 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 52  * Register for R
284f0 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a  owSet object */.
28500 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64      int regRowid
28510 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
28520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28530 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
28540 67 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69  g rowid */.    i
28550 6e 74 20 69 4c 6f 6f 70 42 6f 64 79 20 3d 20 73  nt iLoopBody = s
28560 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
28570 62 65 6c 28 76 29 3b 20 20 2f 2a 20 53 74 61 72  bel(v);  /* Star
28580 74 20 6f 66 20 6c 6f 6f 70 20 62 6f 64 79 20 2a  t of loop body *
28590 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 74 49 6e  /.    int iRetIn
285a0 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
285b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285c0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 72 65  /* Address of re
285d0 67 52 65 74 75 72 6e 20 69 6e 69 74 20 2a 2f 0a  gReturn init */.
285e0 20 20 20 20 69 6e 74 20 75 6e 74 65 73 74 65 64      int untested
285f0 54 65 72 6d 73 20 3d 20 30 3b 20 20 20 20 20 20  Terms = 0;      
28600 20 20 20 20 20 20 20 2f 2a 20 53 6f 6d 65 20 74         /* Some t
28610 65 72 6d 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  erms not complet
28620 65 6c 79 20 74 65 73 74 65 64 20 2a 2f 0a 20 20  ely tested */.  
28630 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
28640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28650 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
28660 6e 74 65 72 20 2a 2f 0a 20 20 20 20 45 78 70 72  nter */.    Expr
28670 20 2a 70 41 6e 64 45 78 70 72 20 3d 20 30 3b 20   *pAndExpr = 0; 
28680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28690 2a 20 41 6e 20 22 2e 2e 20 41 4e 44 20 28 2e 2e  * An ".. AND (..
286a0 2e 29 22 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  .)" expression *
286b0 2f 0a 20 20 20 0a 20 20 20 20 70 54 65 72 6d 20  /.   .    pTerm 
286c0 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75  = pLevel->plan.u
286d0 2e 70 54 65 72 6d 3b 0a 20 20 20 20 61 73 73 65  .pTerm;.    asse
286e0 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a  rt( pTerm!=0 );.
286f0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
28700 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
28710 5f 4f 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _OR );.    asser
28720 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  t( (pTerm->wtFla
28730 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f  gs & TERM_ORINFO
28740 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72 57  )!=0 );.    pOrW
28750 63 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f  c = &pTerm->u.pO
28760 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 70  rInfo->wc;.    p
28770 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 52  Level->op = OP_R
28780 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65 76 65  eturn;.    pLeve
28790 6c 2d 3e 70 31 20 3d 20 72 65 67 52 65 74 75 72  l->p1 = regRetur
287a0 6e 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75  n;..    /* Set u
287b0 70 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  p a new SrcList 
287c0 69 6e 20 70 4f 72 54 61 62 20 63 6f 6e 74 61 69  in pOrTab contai
287d0 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20 62  ning the table b
287e0 65 69 6e 67 20 73 63 61 6e 6e 65 64 0a 20 20 20  eing scanned.   
287f0 20 2a 2a 20 62 79 20 74 68 69 73 20 6c 6f 6f 70   ** by this loop
28800 20 69 6e 20 74 68 65 20 61 5b 30 5d 20 73 6c 6f   in the a[0] slo
28810 74 20 61 6e 64 20 61 6c 6c 20 6e 6f 74 52 65 61  t and all notRea
28820 64 79 20 74 61 62 6c 65 73 20 69 6e 20 61 5b 31  dy tables in a[1
28830 2e 2e 5d 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a  ..] slots..    *
28840 2a 20 54 68 69 73 20 62 65 63 6f 6d 65 73 20 74  * This becomes t
28850 68 65 20 53 72 63 4c 69 73 74 20 69 6e 20 74 68  he SrcList in th
28860 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c  e recursive call
28870 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
28880 42 65 67 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a  Begin()..    */.
28890 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
288a0 6e 4c 65 76 65 6c 3e 31 20 29 7b 0a 20 20 20 20  nLevel>1 ){.    
288b0 20 20 69 6e 74 20 6e 4e 6f 74 52 65 61 64 79 3b    int nNotReady;
288c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288d0 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
288e0 66 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65  f notReady table
288f0 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63  s */.      struc
28900 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
28910 6f 72 69 67 53 72 63 3b 20 20 20 20 20 2f 2a 20  origSrc;     /* 
28920 4f 72 69 67 69 6e 61 6c 20 6c 69 73 74 20 6f 66  Original list of
28930 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20   tables */.     
28940 20 6e 4e 6f 74 52 65 61 64 79 20 3d 20 70 57 49   nNotReady = pWI
28950 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 2d 20 69 4c  nfo->nLevel - iL
28960 65 76 65 6c 20 2d 20 31 3b 0a 20 20 20 20 20 20  evel - 1;.      
28970 70 4f 72 54 61 62 20 3d 20 73 71 6c 69 74 65 33  pOrTab = sqlite3
28980 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28 70 50  StackAllocRaw(pP
28990 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20  arse->db,.      
289a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289b0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4f        sizeof(*pO
289c0 72 54 61 62 29 2b 20 6e 4e 6f 74 52 65 61 64 79  rTab)+ nNotReady
289d0 2a 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e  *sizeof(pOrTab->
289e0 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  a[0]));.      if
289f0 28 20 70 4f 72 54 61 62 3d 3d 30 20 29 20 72 65  ( pOrTab==0 ) re
28a00 74 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 20  turn notReady;. 
28a10 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 41 6c       pOrTab->nAl
28a20 6c 6f 63 20 3d 20 28 69 31 36 29 28 6e 4e 6f 74  loc = (i16)(nNot
28a30 52 65 61 64 79 20 2b 20 31 29 3b 0a 20 20 20 20  Ready + 1);.    
28a40 20 20 70 4f 72 54 61 62 2d 3e 6e 53 72 63 20 3d    pOrTab->nSrc =
28a50 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 3b   pOrTab->nAlloc;
28a60 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f  .      memcpy(pO
28a70 72 54 61 62 2d 3e 61 2c 20 70 54 61 62 49 74 65  rTab->a, pTabIte
28a80 6d 2c 20 73 69 7a 65 6f 66 28 2a 70 54 61 62 49  m, sizeof(*pTabI
28a90 74 65 6d 29 29 3b 0a 20 20 20 20 20 20 6f 72 69  tem));.      ori
28aa0 67 53 72 63 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  gSrc = pWInfo->p
28ab0 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20  TabList->a;.    
28ac0 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 6e 4e    for(k=1; k<=nN
28ad0 6f 74 52 65 61 64 79 3b 20 6b 2b 2b 29 7b 0a 20  otReady; k++){. 
28ae0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
28af0 4f 72 54 61 62 2d 3e 61 5b 6b 5d 2c 20 26 6f 72  OrTab->a[k], &or
28b00 69 67 53 72 63 5b 70 4c 65 76 65 6c 5b 6b 5d 2e  igSrc[pLevel[k].
28b10 69 46 72 6f 6d 5d 2c 20 73 69 7a 65 6f 66 28 70  iFrom], sizeof(p
28b20 4f 72 54 61 62 2d 3e 61 5b 6b 5d 29 29 3b 0a 20  OrTab->a[k]));. 
28b30 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
28b40 7b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d  {.      pOrTab =
28b50 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
28b60 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  t;.    }..    /*
28b70 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
28b80 72 6f 77 73 65 74 20 72 65 67 69 73 74 65 72 20  rowset register 
28b90 74 6f 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 2e  to contain NULL.
28ba0 20 41 6e 20 53 51 4c 20 4e 55 4c 4c 20 69 73 20   An SQL NULL is 
28bb0 0a 20 20 20 20 2a 2a 20 65 71 75 69 76 61 6c 65  .    ** equivale
28bc0 6e 74 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 72  nt to an empty r
28bd0 6f 77 73 65 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  owset..    **.  
28be0 20 20 2a 2a 20 41 6c 73 6f 20 69 6e 69 74 69 61    ** Also initia
28bf0 6c 69 7a 65 20 72 65 67 52 65 74 75 72 6e 20 74  lize regReturn t
28c00 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 61 64  o contain the ad
28c10 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e 73  dress of the ins
28c20 74 72 75 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a  truction .    **
28c30 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
28c40 6c 6f 77 69 6e 67 20 74 68 65 20 4f 50 5f 52 65  lowing the OP_Re
28c50 74 75 72 6e 20 61 74 20 74 68 65 20 62 6f 74 74  turn at the bott
28c60 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  om of the loop. 
28c70 54 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 72  This.    ** is r
28c80 65 71 75 69 72 65 64 20 69 6e 20 61 20 66 65 77  equired in a few
28c90 20 6f 62 73 63 75 72 65 20 4c 45 46 54 20 4a 4f   obscure LEFT JO
28ca0 49 4e 20 63 61 73 65 73 20 77 68 65 72 65 20 63  IN cases where c
28cb0 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 0a 20 20 20  ontrol jumps.   
28cc0 20 2a 2a 20 6f 76 65 72 20 74 68 65 20 74 6f 70   ** over the top
28cd0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 6e 74   of the loop int
28ce0 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 69 74  o the body of it
28cf0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
28d00 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65  he .    ** corre
28d10 63 74 20 72 65 73 70 6f 6e 73 65 20 66 6f 72 20  ct response for 
28d20 74 68 65 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20  the end-of-loop 
28d30 63 6f 64 65 20 28 74 68 65 20 4f 50 5f 52 65 74  code (the OP_Ret
28d40 75 72 6e 29 20 69 73 20 74 6f 20 0a 20 20 20 20  urn) is to .    
28d50 2a 2a 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  ** fall through 
28d60 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  to the next inst
28d70 72 75 63 74 69 6f 6e 2c 20 6a 75 73 74 20 61 73  ruction, just as
28d80 20 61 6e 20 4f 50 5f 4e 65 78 74 20 64 6f 65 73   an OP_Next does
28d90 20 69 66 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65   if.    ** calle
28da0 64 20 6f 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61  d on an uninitia
28db0 6c 69 7a 65 64 20 63 75 72 73 6f 72 2e 0a 20 20  lized cursor..  
28dc0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 63    */.    if( (wc
28dd0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
28de0 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d  _DUPLICATES_OK)=
28df0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 67 52  =0 ){.      regR
28e00 6f 77 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65  owset = ++pParse
28e10 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65  ->nMem;.      re
28e20 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73  gRowid = ++pPars
28e30 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
28e40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
28e50 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
28e60 72 65 67 52 6f 77 73 65 74 29 3b 0a 20 20 20 20  regRowset);.    
28e70 7d 0a 20 20 20 20 69 52 65 74 49 6e 69 74 20 3d  }.    iRetInit =
28e80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
28e90 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
28ea0 2c 20 30 2c 20 72 65 67 52 65 74 75 72 6e 29 3b  , 0, regReturn);
28eb0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
28ec0 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63  original WHERE c
28ed0 6c 61 75 73 65 20 69 73 20 7a 20 6f 66 20 74 68  lause is z of th
28ee0 65 20 66 6f 72 6d 3a 20 20 28 78 31 20 4f 52 20  e form:  (x1 OR 
28ef0 78 32 20 4f 52 20 2e 2e 2e 29 20 41 4e 44 20 79  x2 OR ...) AND y
28f00 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 66 6f 72  .    ** Then for
28f10 20 65 76 65 72 79 20 74 65 72 6d 20 78 4e 2c 20   every term xN, 
28f20 65 76 61 6c 75 61 74 65 20 61 73 20 74 68 65 20  evaluate as the 
28f30 73 75 62 65 78 70 72 65 73 73 69 6f 6e 3a 20 78  subexpression: x
28f40 4e 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 20 54  N AND z.    ** T
28f50 68 61 74 20 77 61 79 2c 20 74 65 72 6d 73 20 69  hat way, terms i
28f60 6e 20 79 20 74 68 61 74 20 61 72 65 20 66 61 63  n y that are fac
28f70 74 6f 72 65 64 20 69 6e 74 6f 20 74 68 65 20 64  tored into the d
28f80 69 73 6a 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 0a  isjunction will.
28f90 20 20 20 20 2a 2a 20 62 65 20 70 69 63 6b 65 64      ** be picked
28fa0 20 75 70 20 62 79 20 74 68 65 20 72 65 63 75 72   up by the recur
28fb0 73 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 73 71  sive calls to sq
28fc0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
28fd0 29 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 0a  ) below..    **.
28fe0 20 20 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c      ** Actually,
28ff0 20 65 61 63 68 20 73 75 62 65 78 70 72 65 73 73   each subexpress
29000 69 6f 6e 20 69 73 20 63 6f 6e 76 65 72 74 65 64  ion is converted
29010 20 74 6f 20 22 78 4e 20 41 4e 44 20 77 22 20 77   to "xN AND w" w
29020 68 65 72 65 20 77 20 69 73 0a 20 20 20 20 2a 2a  here w is.    **
29030 20 74 68 65 20 22 69 6e 74 65 72 65 73 74 69 6e   the "interestin
29040 67 22 20 74 65 72 6d 73 20 6f 66 20 7a 20 2d 20  g" terms of z - 
29050 74 65 72 6d 73 20 74 68 61 74 20 64 69 64 20 6e  terms that did n
29060 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20  ot originate in 
29070 74 68 65 0a 20 20 20 20 2a 2a 20 4f 4e 20 6f 72  the.    ** ON or
29080 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
29090 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61 6e   a LEFT JOIN, an
290a0 64 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65  d terms that are
290b0 20 75 73 61 62 6c 65 20 61 73 20 0a 20 20 20 20   usable as .    
290c0 2a 2a 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20  ** indices..    
290d0 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e  */.    if( pWC->
290e0 6e 54 65 72 6d 3e 31 20 29 7b 0a 20 20 20 20 20  nTerm>1 ){.     
290f0 20 69 6e 74 20 69 54 65 72 6d 3b 0a 20 20 20 20   int iTerm;.    
29100 20 20 66 6f 72 28 69 54 65 72 6d 3d 30 3b 20 69    for(iTerm=0; i
29110 54 65 72 6d 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  Term<pWC->nTerm;
29120 20 69 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   iTerm++){.     
29130 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
29140 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70   pWC->a[iTerm].p
29150 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66  Expr;.        if
29160 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
29170 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
29180 4a 6f 69 6e 29 20 29 20 63 6f 6e 74 69 6e 75 65  Join) ) continue
29190 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57  ;.        if( pW
291a0 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c  C->a[iTerm].wtFl
291b0 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54  ags & (TERM_VIRT
291c0 55 41 4c 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 29  UAL|TERM_ORINFO)
291d0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
291e0 20 20 20 20 20 69 66 28 20 28 70 57 43 2d 3e 61       if( (pWC->a
291f0 5b 69 54 65 72 6d 5d 2e 65 4f 70 65 72 61 74 6f  [iTerm].eOperato
29200 72 20 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30 20 29  r & WO_ALL)==0 )
29210 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
29220 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74     pExpr = sqlit
29230 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65  e3ExprDup(pParse
29240 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  ->db, pExpr, 0);
29250 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70  .        pAndExp
29260 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  r = sqlite3ExprA
29270 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  nd(pParse->db, p
29280 41 6e 64 45 78 70 72 2c 20 70 45 78 70 72 29 3b  AndExpr, pExpr);
29290 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
292a0 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20  f( pAndExpr ){. 
292b0 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 20         pAndExpr 
292c0 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
292d0 50 61 72 73 65 2c 20 54 4b 5f 41 4e 44 2c 20 30  Parse, TK_AND, 0
292e0 2c 20 70 41 6e 64 45 78 70 72 2c 20 30 29 3b 0a  , pAndExpr, 0);.
292f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
29300 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
29310 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b 20 69 69  pOrWc->nTerm; ii
29320 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  ++){.      Where
29330 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 20 3d 20  Term *pOrTerm = 
29340 26 70 4f 72 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20  &pOrWc->a[ii];. 
29350 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d       if( pOrTerm
29360 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
29370 75 72 20 7c 7c 20 70 4f 72 54 65 72 6d 2d 3e 65  ur || pOrTerm->e
29380 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44  Operator==WO_AND
29390 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72   ){.        Wher
293a0 65 49 6e 66 6f 20 2a 70 53 75 62 57 49 6e 66 6f  eInfo *pSubWInfo
293b0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ;          /* In
293c0 66 6f 20 66 6f 72 20 73 69 6e 67 6c 65 20 4f 52  fo for single OR
293d0 2d 74 65 72 6d 20 73 63 61 6e 20 2a 2f 0a 20 20  -term scan */.  
293e0 20 20 20 20 20 20 45 78 70 72 20 2a 70 4f 72 45        Expr *pOrE
293f0 78 70 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70  xpr = pOrTerm->p
29400 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66  Expr;.        if
29410 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20  ( pAndExpr ){.  
29420 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72          pAndExpr
29430 2d 3e 70 4c 65 66 74 20 3d 20 70 4f 72 45 78 70  ->pLeft = pOrExp
29440 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72  r;.          pOr
29450 45 78 70 72 20 3d 20 70 41 6e 64 45 78 70 72 3b  Expr = pAndExpr;
29460 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29470 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
29480 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  gh table entries
29490 20 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d   that match term
294a0 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20   pOrTerm. */.   
294b0 20 20 20 20 20 70 53 75 62 57 49 6e 66 6f 20 3d       pSubWInfo =
294c0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
294d0 69 6e 28 70 50 61 72 73 65 2c 20 70 4f 72 54 61  in(pParse, pOrTa
294e0 62 2c 20 70 4f 72 45 78 70 72 2c 20 30 2c 20 30  b, pOrExpr, 0, 0
294f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
29500 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f            WHERE_
29510 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 20  OMIT_OPEN_CLOSE 
29520 7c 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59  | WHERE_AND_ONLY
29530 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
29540 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45             WHERE
29550 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20 7c 20 57  _FORCE_TABLE | W
29560 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
29570 4c 59 2c 20 69 43 6f 76 43 75 72 29 3b 0a 20 20  LY, iCovCur);.  
29580 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
29590 75 62 57 49 6e 66 6f 20 7c 7c 20 70 50 61 72 73  ubWInfo || pPars
295a0 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73  e->nErr || pPars
295b0 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
295c0 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 69  led );.        i
295d0 66 28 20 70 53 75 62 57 49 6e 66 6f 20 29 7b 0a  f( pSubWInfo ){.
295e0 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 4c            WhereL
295f0 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 20 20  evel *pLvl;.    
29600 20 20 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65        explainOne
29610 53 63 61 6e 28 0a 20 20 20 20 20 20 20 20 20 20  Scan(.          
29620 20 20 20 20 70 50 61 72 73 65 2c 20 70 4f 72 54      pParse, pOrT
29630 61 62 2c 20 26 70 53 75 62 57 49 6e 66 6f 2d 3e  ab, &pSubWInfo->
29640 61 5b 30 5d 2c 20 69 4c 65 76 65 6c 2c 20 70 4c  a[0], iLevel, pL
29650 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 30 0a 20  evel->iFrom, 0. 
29660 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
29670 20 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c        if( (wctrl
29680 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 55  Flags & WHERE_DU
29690 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20  PLICATES_OK)==0 
296a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
296b0 6e 74 20 69 53 65 74 20 3d 20 28 28 69 69 3d 3d  nt iSet = ((ii==
296c0 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f  pOrWc->nTerm-1)?
296d0 2d 31 3a 69 69 29 3b 0a 20 20 20 20 20 20 20 20  -1:ii);.        
296e0 20 20 20 20 69 6e 74 20 72 3b 0a 20 20 20 20 20      int r;.     
296f0 20 20 20 20 20 20 20 72 20 3d 20 73 71 6c 69 74         r = sqlit
29700 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
29710 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  umn(pParse, pTab
29720 49 74 65 6d 2d 3e 70 54 61 62 2c 20 2d 31 2c 20  Item->pTab, -1, 
29730 69 43 75 72 2c 20 0a 20 20 20 20 20 20 20 20 20  iCur, .         
29740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29760 72 65 67 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20  regRowid, 0);.  
29770 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
29780 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
29790 2c 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 2c  , OP_RowSetTest,
297a0 20 72 65 67 52 6f 77 73 65 74 2c 0a 20 20 20 20   regRowset,.    
297b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297c0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
297d0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
297e0 64 64 72 28 76 29 2b 32 2c 20 72 2c 20 69 53 65  ddr(v)+2, r, iSe
297f0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  t);.          }.
29800 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
29810 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
29820 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 74 75  P_Gosub, regRetu
29830 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a  rn, iLoopBody);.
29840 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
29850 65 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74  e pSubWInfo->unt
29860 65 73 74 65 64 54 65 72 6d 73 20 66 6c 61 67 20  estedTerms flag 
29870 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20  means that this 
29880 4f 52 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20  OR term.        
29890 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 6f    ** contained o
298a0 6e 65 20 6f 72 20 6d 6f 72 65 20 41 4e 44 20 74  ne or more AND t
298b0 65 72 6d 20 66 72 6f 6d 20 61 20 6e 6f 74 52 65  erm from a notRe
298c0 61 64 79 20 74 61 62 6c 65 2e 20 20 54 68 65 0a  ady table.  The.
298d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72            ** ter
298e0 6d 73 20 66 72 6f 6d 20 74 68 65 20 6e 6f 74 52  ms from the notR
298f0 65 61 64 79 20 74 61 62 6c 65 20 63 6f 75 6c 64  eady table could
29900 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20 61   not be tested a
29910 6e 64 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20  nd will.        
29920 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20    ** need to be 
29930 74 65 73 74 65 64 20 6c 61 74 65 72 2e 0a 20 20  tested later..  
29940 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
29950 20 20 20 20 20 69 66 28 20 70 53 75 62 57 49 6e       if( pSubWIn
29960 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d  fo->untestedTerm
29970 73 20 29 20 75 6e 74 65 73 74 65 64 54 65 72 6d  s ) untestedTerm
29980 73 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20  s = 1;..        
29990 20 20 2f 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74    /* If all of t
299a0 68 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20  he OR-connected 
299b0 74 65 72 6d 73 20 61 72 65 20 6f 70 74 69 6d 69  terms are optimi
299c0 7a 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61  zed using the sa
299d0 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  me.          ** 
299e0 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 65 20 69  index, and the i
299f0 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64 20 75  ndex is opened u
29a00 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 75  sing the same cu
29a10 72 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20 20  rsor number.    
29a20 20 20 20 20 20 20 2a 2a 20 62 79 20 65 61 63 68        ** by each
29a30 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
29a40 57 68 65 72 65 42 65 67 69 6e 28 29 20 6d 61 64  WhereBegin() mad
29a50 65 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 2c 20  e by this loop, 
29a60 69 74 20 6d 61 79 0a 20 20 20 20 20 20 20 20 20  it may.         
29a70 20 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c 65 20   ** be possible 
29a80 74 6f 20 75 73 65 20 74 68 61 74 20 69 6e 64 65  to use that inde
29a90 78 20 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20  x as a covering 
29aa0 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20  index..         
29ab0 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   **.          **
29ac0 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20   If the call to 
29ad0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
29ae0 6e 28 29 20 61 62 6f 76 65 20 72 65 73 75 6c 74  n() above result
29af0 65 64 20 69 6e 20 61 20 73 63 61 6e 20 74 68 61  ed in a scan tha
29b00 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  t.          ** u
29b10 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 61 6e  ses an index, an
29b20 64 20 74 68 69 73 20 69 73 20 65 69 74 68 65 72  d this is either
29b30 20 74 68 65 20 66 69 72 73 74 20 4f 52 2d 63 6f   the first OR-co
29b40 6e 6e 65 63 74 65 64 20 74 65 72 6d 0a 20 20 20  nnected term.   
29b50 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
29b60 73 65 64 20 6f 72 20 74 68 65 20 69 6e 64 65 78  sed or the index
29b70 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
29b80 74 68 61 74 20 75 73 65 64 20 62 79 20 61 6c 6c  that used by all
29b90 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
29ba0 20 20 20 20 2a 2a 20 74 65 72 6d 73 2c 20 73 65      ** terms, se
29bb0 74 20 70 43 6f 76 20 74 6f 20 74 68 65 20 63 61  t pCov to the ca
29bc0 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69 6e 67  ndidate covering
29bd0 20 69 6e 64 65 78 2e 20 4f 74 68 65 72 77 69 73   index. Otherwis
29be0 65 2c 20 73 65 74 20 0a 20 20 20 20 20 20 20 20  e, set .        
29bf0 20 20 2a 2a 20 70 43 6f 76 20 74 6f 20 4e 55 4c    ** pCov to NUL
29c00 4c 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  L to indicate th
29c10 61 74 20 6e 6f 20 63 61 6e 64 69 64 61 74 65 20  at no candidate 
29c20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 77  covering index w
29c30 69 6c 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ill .          *
29c40 2a 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a  * be available..
29c50 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
29c60 20 20 20 20 20 20 20 70 4c 76 6c 20 3d 20 26 70         pLvl = &p
29c70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 3b 0a  SubWInfo->a[0];.
29c80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
29c90 4c 76 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  Lvl->plan.wsFlag
29ca0 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
29cb0 44 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  D)!=0.          
29cc0 20 26 26 20 28 70 4c 76 6c 2d 3e 70 6c 61 6e 2e   && (pLvl->plan.
29cd0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
29ce0 54 45 4d 50 5f 49 4e 44 45 58 29 3d 3d 30 0a 20  TEMP_INDEX)==0. 
29cf0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 69 69            && (ii
29d00 3d 3d 30 20 7c 7c 20 70 4c 76 6c 2d 3e 70 6c 61  ==0 || pLvl->pla
29d10 6e 2e 75 2e 70 49 64 78 3d 3d 70 43 6f 76 29 0a  n.u.pIdx==pCov).
29d20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
29d30 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
29d40 20 70 4c 76 6c 2d 3e 69 49 64 78 43 75 72 3d 3d   pLvl->iIdxCur==
29d50 69 43 6f 76 43 75 72 20 29 3b 0a 20 20 20 20 20  iCovCur );.     
29d60 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20 70 4c         pCov = pL
29d70 76 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b  vl->plan.u.pIdx;
29d80 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
29d90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  {.            pC
29da0 6f 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ov = 0;.        
29db0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f    }..          /
29dc0 2a 20 46 69 6e 69 73 68 20 74 68 65 20 6c 6f 6f  * Finish the loo
29dd0 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20  p through table 
29de0 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61 74  entries that mat
29df0 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e  ch term pOrTerm.
29e00 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
29e10 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 53  lite3WhereEnd(pS
29e20 75 62 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  ubWInfo);.      
29e30 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
29e40 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e  }.    pLevel->u.
29e50 70 43 6f 76 69 64 78 20 3d 20 70 43 6f 76 3b 0a  pCovidx = pCov;.
29e60 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78      pLevel->iIdx
29e70 43 75 72 20 3d 20 69 43 6f 76 43 75 72 3b 0a 20  Cur = iCovCur;. 
29e80 20 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20     if( pAndExpr 
29e90 29 7b 0a 20 20 20 20 20 20 70 41 6e 64 45 78 70  ){.      pAndExp
29ea0 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20  r->pLeft = 0;.  
29eb0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
29ec0 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
29ed0 2c 20 70 41 6e 64 45 78 70 72 29 3b 0a 20 20 20  , pAndExpr);.   
29ee0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
29ef0 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 69 52  beChangeP1(v, iR
29f00 65 74 49 6e 69 74 2c 20 73 71 6c 69 74 65 33 56  etInit, sqlite3V
29f10 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
29f20 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
29f30 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
29f40 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d  Goto, 0, pLevel-
29f50 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 73  >addrBrk);.    s
29f60 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
29f70 65 4c 61 62 65 6c 28 76 2c 20 69 4c 6f 6f 70 42  eLabel(v, iLoopB
29f80 6f 64 79 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  ody);..    if( p
29f90 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20  WInfo->nLevel>1 
29fa0 29 20 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72  ) sqlite3StackFr
29fb0 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ee(pParse->db, p
29fc0 4f 72 54 61 62 29 3b 0a 20 20 20 20 69 66 28 20  OrTab);.    if( 
29fd0 21 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29  !untestedTerms )
29fe0 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
29ff0 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 7d  vel, pTerm);.  }
2a000 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  else.#endif /* S
2a010 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
2a020 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20  TIMIZATION */.. 
2a030 20 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 35   {.    /* Case 5
2a040 3a 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 75  :  There is no u
2a050 73 61 62 6c 65 20 69 6e 64 65 78 2e 20 20 57 65  sable index.  We
2a060 20 6d 75 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c   must do a compl
2a070 65 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ete.    **      
2a080 20 20 20 20 73 63 61 6e 20 6f 66 20 74 68 65 20      scan of the 
2a090 65 6e 74 69 72 65 20 74 61 62 6c 65 2e 0a 20 20  entire table..  
2a0a0 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20    */.    static 
2a0b0 63 6f 6e 73 74 20 75 38 20 61 53 74 65 70 5b 5d  const u8 aStep[]
2a0c0 20 3d 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 4f 50   = { OP_Next, OP
2a0d0 5f 50 72 65 76 20 7d 3b 0a 20 20 20 20 73 74 61  _Prev };.    sta
2a0e0 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74  tic const u8 aSt
2a0f0 61 72 74 5b 5d 20 3d 20 7b 20 4f 50 5f 52 65 77  art[] = { OP_Rew
2a100 69 6e 64 2c 20 4f 50 5f 4c 61 73 74 20 7d 3b 0a  ind, OP_Last };.
2a110 20 20 20 20 61 73 73 65 72 74 28 20 62 52 65 76      assert( bRev
2a120 3d 3d 30 20 7c 7c 20 62 52 65 76 3d 3d 31 20 29  ==0 || bRev==1 )
2a130 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d  ;.    assert( om
2a140 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  itTable==0 );.  
2a150 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 61    pLevel->op = a
2a160 53 74 65 70 5b 62 52 65 76 5d 3b 0a 20 20 20 20  Step[bRev];.    
2a170 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75  pLevel->p1 = iCu
2a180 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  r;.    pLevel->p
2a190 32 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56  2 = 1 + sqlite3V
2a1a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 61 53 74  dbeAddOp2(v, aSt
2a1b0 61 72 74 5b 62 52 65 76 5d 2c 20 69 43 75 72 2c  art[bRev], iCur,
2a1c0 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 70   addrBrk);.    p
2a1d0 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49  Level->p5 = SQLI
2a1e0 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55  TE_STMTSTATUS_FU
2a1f0 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 7d  LLSCAN_STEP;.  }
2a200 0a 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e  .  notReady &= ~
2a210 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61  getMask(pWC->pMa
2a220 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 0a 20  skSet, iCur);.. 
2a230 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20   /* Insert code 
2a240 74 6f 20 74 65 73 74 20 65 76 65 72 79 20 73 75  to test every su
2a250 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74  bexpression that
2a260 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65   can be complete
2a270 6c 79 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64  ly.  ** computed
2a280 20 75 73 69 6e 67 20 74 68 65 20 63 75 72 72 65   using the curre
2a290 6e 74 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73  nt set of tables
2a2a0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c  ..  **.  ** IMPL
2a2b0 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
2a2c0 2d 34 39 35 32 35 2d 35 30 39 33 35 20 54 65 72  -49525-50935 Ter
2a2d0 6d 73 20 74 68 61 74 20 63 61 6e 6e 6f 74 20 62  ms that cannot b
2a2e0 65 20 73 61 74 69 73 66 69 65 64 20 74 68 72 6f  e satisfied thro
2a2f0 75 67 68 0a 20 20 2a 2a 20 74 68 65 20 75 73 65  ugh.  ** the use
2a300 20 6f 66 20 69 6e 64 69 63 65 73 20 62 65 63 6f   of indices beco
2a310 6d 65 20 74 65 73 74 73 20 74 68 61 74 20 61 72  me tests that ar
2a320 65 20 65 76 61 6c 75 61 74 65 64 20 61 67 61 69  e evaluated agai
2a330 6e 73 74 20 65 61 63 68 20 72 6f 77 20 6f 66 0a  nst each row of.
2a340 20 20 2a 2a 20 74 68 65 20 72 65 6c 65 76 61 6e    ** the relevan
2a350 74 20 69 6e 70 75 74 20 74 61 62 6c 65 73 2e 0a  t input tables..
2a360 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d    */.  for(pTerm
2a370 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e  =pWC->a, j=pWC->
2a380 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c  nTerm; j>0; j--,
2a390 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45   pTerm++){.    E
2a3a0 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 74 65 73  xpr *pE;.    tes
2a3b0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
2a3c0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
2a3d0 54 55 41 4c 20 29 3b 20 2f 2a 20 49 4d 50 3a 20  TUAL ); /* IMP: 
2a3e0 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f  R-30575-11662 */
2a3f0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
2a400 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
2a410 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20  TERM_CODED );.  
2a420 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
2a430 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
2a440 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
2a450 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2a460 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
2a470 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64  reqAll & notRead
2a480 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 74  y)!=0 ){.      t
2a490 65 73 74 63 61 73 65 28 20 70 57 49 6e 66 6f 2d  estcase( pWInfo-
2a4a0 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 3d 3d  >untestedTerms==
2a4b0 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
2a4c0 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
2a4d0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2a4e0 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d  ONETABLE_ONLY)!=
2a4f0 30 20 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  0 );.      pWInf
2a500 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73  o->untestedTerms
2a510 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74   = 1;.      cont
2a520 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
2a530 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pE = pTerm->pExp
2a540 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
2a550 45 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  E!=0 );.    if( 
2a560 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
2a570 6e 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f  n && !ExprHasPro
2a580 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f  perty(pE, EP_Fro
2a590 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20  mJoin) ){.      
2a5a0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
2a5b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
2a5c0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
2a5d0 45 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c  E, addrCont, SQL
2a5e0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
2a5f0 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c  .    pTerm->wtFl
2a600 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
2a610 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72  D;.  }..  /* For
2a620 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
2a630 49 4e 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64  IN, generate cod
2a640 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 63 6f  e that will reco
2a650 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rd the fact that
2a660 0a 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f  .  ** at least o
2a670 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 69  ne row of the ri
2a680 67 68 74 20 74 61 62 6c 65 20 68 61 73 20 6d 61  ght table has ma
2a690 74 63 68 65 64 20 74 68 65 20 6c 65 66 74 20 74  tched the left t
2a6a0 61 62 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20 20 69  able.  .  */.  i
2a6b0 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  f( pLevel->iLeft
2a6c0 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 70 4c 65 76  Join ){.    pLev
2a6d0 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 20 3d 20  el->addrFirst = 
2a6e0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2a6f0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73  ntAddr(v);.    s
2a700 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2a710 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
2a720 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  1, pLevel->iLeft
2a730 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43  Join);.    VdbeC
2a740 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 63 6f  omment((v, "reco
2a750 72 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74  rd LEFT JOIN hit
2a760 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
2a770 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
2a780 50 61 72 73 65 29 3b 0a 20 20 20 20 66 6f 72 28  Parse);.    for(
2a790 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d  pTerm=pWC->a, j=
2a7a0 30 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  0; j<pWC->nTerm;
2a7b0 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   j++, pTerm++){.
2a7c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2a7d0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
2a7e0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
2a7f0 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 30 35 37    /* IMP: R-3057
2a800 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 20  5-11662 */.     
2a810 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
2a820 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
2a830 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 20 20  _CODED );.      
2a840 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
2a850 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55  gs & (TERM_VIRTU
2a860 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29  AL|TERM_CODED) )
2a870 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2a880 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
2a890 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64  reqAll & notRead
2a8a0 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  y)!=0 ){.       
2a8b0 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
2a8c0 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29  >untestedTerms )
2a8d0 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
2a8e0 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
2a8f0 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
2a900 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >pExpr );.      
2a910 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
2a920 73 65 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  se(pParse, pTerm
2a930 2d 3e 70 45 78 70 72 2c 20 61 64 64 72 43 6f 6e  ->pExpr, addrCon
2a940 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  t, SQLITE_JUMPIF
2a950 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70 54 65  NULL);.      pTe
2a960 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
2a970 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d  ERM_CODED;.    }
2a980 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
2a990 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
2a9a0 72 73 65 2c 20 69 52 65 6c 65 61 73 65 52 65 67  rse, iReleaseReg
2a9b0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 6e 6f 74  );..  return not
2a9c0 52 65 61 64 79 3b 0a 7d 0a 0a 23 69 66 20 64 65  Ready;.}..#if de
2a9d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
2a9e0 54 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  T)./*.** The fol
2a9f0 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20  lowing variable 
2aa00 68 6f 6c 64 73 20 61 20 74 65 78 74 20 64 65 73  holds a text des
2aa10 63 72 69 70 74 69 6f 6e 20 6f 66 20 71 75 65 72  cription of quer
2aa20 79 20 70 6c 61 6e 20 67 65 6e 65 72 61 74 65 64  y plan generated
2aa30 0a 2a 2a 20 62 79 20 74 68 65 20 6d 6f 73 74 20  .** by the most 
2aa40 72 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73  recent call to s
2aa50 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2aa60 28 29 2e 20 20 45 61 63 68 20 63 61 6c 6c 20 74  ().  Each call t
2aa70 6f 20 57 68 65 72 65 42 65 67 69 6e 0a 2a 2a 20  o WhereBegin.** 
2aa80 6f 76 65 72 77 72 69 74 65 73 20 74 68 65 20 70  overwrites the p
2aa90 72 65 76 69 6f 75 73 2e 20 20 54 68 69 73 20 69  revious.  This i
2aaa0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
2aab0 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
2aac0 6e 64 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 20 6f  nd.** analysis o
2aad0 6e 6c 79 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c  nly..*/.char sql
2aae0 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
2aaf0 42 4d 53 2a 32 2a 34 30 5d 3b 20 20 2f 2a 20 54  BMS*2*40];  /* T
2ab00 65 78 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ext of the join 
2ab10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 51  */.static int nQ
2ab20 50 6c 61 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  Plan = 0;       
2ab30 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66         /* Next f
2ab40 72 65 65 20 73 6c 6f 77 20 69 6e 20 5f 71 75 65  ree slow in _que
2ab50 72 79 5f 70 6c 61 6e 5b 5d 20 2a 2f 0a 0a 23 65  ry_plan[] */..#e
2ab60 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54  ndif /* SQLITE_T
2ab70 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 46  EST */.../*.** F
2ab80 72 65 65 20 61 20 57 68 65 72 65 49 6e 66 6f 20  ree a WhereInfo 
2ab90 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61  structure.*/.sta
2aba0 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e  tic void whereIn
2abb0 66 6f 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a  foFree(sqlite3 *
2abc0 64 62 2c 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  db, WhereInfo *p
2abd0 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20 41 4c  WInfo){.  if( AL
2abe0 57 41 59 53 28 70 57 49 6e 66 6f 29 20 29 7b 0a  WAYS(pWInfo) ){.
2abf0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
2ac00 6f 72 28 69 3d 30 3b 20 69 3c 70 57 49 6e 66 6f  or(i=0; i<pWInfo
2ac10 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a  ->nLevel; i++){.
2ac20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
2ac30 64 65 78 5f 69 6e 66 6f 20 2a 70 49 6e 66 6f 20  dex_info *pInfo 
2ac40 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70  = pWInfo->a[i].p
2ac50 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69  IdxInfo;.      i
2ac60 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20  f( pInfo ){.    
2ac70 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70      /* assert( p
2ac80 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
2ac90 49 64 78 53 74 72 3d 3d 30 20 7c 7c 20 64 62 2d  IdxStr==0 || db-
2aca0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
2acb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
2acc0 70 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  pInfo->needToFre
2acd0 65 49 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20  eIdxStr ){.     
2ace0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2acf0 65 28 70 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29  e(pInfo->idxStr)
2ad00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2ad10 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2ad20 65 28 64 62 2c 20 70 49 6e 66 6f 29 3b 0a 20 20  e(db, pInfo);.  
2ad30 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2ad40 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 6c 61  pWInfo->a[i].pla
2ad50 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
2ad60 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20 29 7b 0a  E_TEMP_INDEX ){.
2ad70 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
2ad80 49 64 78 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b  Idx = pWInfo->a[
2ad90 69 5d 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a  i].plan.u.pIdx;.
2ada0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
2adb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2adc0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2add0 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a  pIdx->zColAff);.
2ade0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2adf0 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 64 78  3DbFree(db, pIdx
2ae00 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2ae10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 77     }.    }.    w
2ae20 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
2ae30 70 57 49 6e 66 6f 2d 3e 70 57 43 29 3b 0a 20 20  pWInfo->pWC);.  
2ae40 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2ae50 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  db, pWInfo);.  }
2ae60 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .}.../*.** Gener
2ae70 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  ate the beginnin
2ae80 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73  g of the loop us
2ae90 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61  ed for WHERE cla
2aea0 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
2aeb0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
2aec0 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  lue is a pointer
2aed0 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74   to an opaque st
2aee0 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e  ructure that con
2aef0 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61  tains.** informa
2af00 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74  tion needed to t
2af10 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
2af20 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63  p.  Later, the c
2af30 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a  alling routine.*
2af40 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20  * should invoke 
2af50 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
2af60 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72  ) with the retur
2af70 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  n value of this 
2af80 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f  function.** in o
2af90 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65  rder to complete
2afa0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2afb0 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
2afc0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
2afd0 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75  occurs, this rou
2afe0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c  tine returns NUL
2aff0 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73  L..**.** The bas
2b000 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f  ic idea is to do
2b010 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20   a nested loop, 
2b020 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63  one loop for eac
2b030 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68  h table in.** th
2b040 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
2b050 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53   a select.  (INS
2b060 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 73  ERT and UPDATE s
2b070 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68  tatements are th
2b080 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53  e.** same as a S
2b090 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20  ELECT with only 
2b0a0 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69  a single table i
2b0b0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2b0c0 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d  e.)  For.** exam
2b0d0 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20  ple, if the SQL 
2b0e0 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  is this:.**.**  
2b0f0 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
2b100 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48  OM t1, t2, t3 WH
2b110 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54  ERE ...;.**.** T
2b120 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e  hen the code gen
2b130 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70  erated is concep
2b140 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20  tually like the 
2b150 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
2b160 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
2b170 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20  w1 in t1 do     
2b180 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
2b190 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
2b1a0 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20  foreach row2 in 
2b1b0 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62  t2 do      |-- b
2b1c0 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
2b1d0 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20  gin().**        
2b1e0 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69    foreach row3 i
2b1f0 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20  n t3 do   /.**  
2b200 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a            ....**
2b210 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20 20            end   
2b220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b230 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
2b240 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
2b250 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
2b260 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62             |-- b
2b270 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  y sqlite3WhereEn
2b280 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20  d().**      end 
2b290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2a0 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20          /.**.** 
2b2b0 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f  Note that the lo
2b2c0 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  ops might not be
2b2d0 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f   nested in the o
2b2e0 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68  rder in which th
2b2f0 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20  ey.** appear in 
2b300 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
2b310 69 66 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f  if a different o
2b320 72 64 65 72 20 69 73 20 62 65 74 74 65 72 20 61  rder is better a
2b330 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75  ble to make.** u
2b340 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20  se of indices.  
2b350 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77  Note also that w
2b360 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61  hen the IN opera
2b370 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a  tor appears in.*
2b380 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
2b390 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73  se, it might res
2b3a0 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61  ult in additiona
2b3b0 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66  l nested loops f
2b3c0 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74  or.** scanning t
2b3d0 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65  hrough all value
2b3e0 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68  s on the right-h
2b3f0 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
2b400 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  IN..**.** There 
2b410 61 72 65 20 42 74 72 65 65 20 63 75 72 73 6f 72  are Btree cursor
2b420 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
2b430 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74  h each table.  t
2b440 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a  1 uses cursor.**
2b450 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74   number pTabList
2b460 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20  ->a[0].iCursor. 
2b470 20 74 32 20 75 73 65 73 20 74 68 65 20 63 75 72   t2 uses the cur
2b480 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  sor pTabList->a[
2b490 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41  1].iCursor..** A
2b4a0 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68  nd so forth.  Th
2b4b0 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
2b4c0 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65  ates code to ope
2b4d0 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63 75 72  n those VDBE cur
2b4e0 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  sors.** and sqli
2b4f0 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 67 65  te3WhereEnd() ge
2b500 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
2b510 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a   to close them..
2b520 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74  **.** The code t
2b530 68 61 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  hat sqlite3Where
2b540 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65  Begin() generate
2b550 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72  s leaves the cur
2b560 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e  sors named.** in
2b570 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69   pTabList pointi
2b580 6e 67 20 61 74 20 74 68 65 69 72 20 61 70 70 72  ng at their appr
2b590 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e  opriate entries.
2b5a0 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65    The [...] code
2b5b0 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43  .** can use OP_C
2b5c0 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77  olumn and OP_Row
2b5d0 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68  id opcodes on th
2b5e0 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65  ese cursors to e
2b5f0 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66  xtract.** data f
2b600 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20  rom the various 
2b610 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f  tables of the lo
2b620 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
2b630 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
2b640 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65   empty, the fore
2b650 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65  ach loops must e
2b660 61 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a  ach scan their.*
2b670 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e  * entire tables.
2b680 20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d 77    Thus a three-w
2b690 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28  ay join is an O(
2b6a0 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20  N^3) operation. 
2b6b0 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74   But if.** the t
2b6c0 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63  ables have indic
2b6d0 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  es and there are
2b6e0 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48   terms in the WH
2b6f0 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a  ERE clause that.
2b700 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73  ** refer to thos
2b710 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d  e indices, a com
2b720 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e  plete table scan
2b730 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20   can be avoided 
2b740 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20  and the.** code 
2b750 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61  will run much fa
2b760 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74  ster.  Most of t
2b770 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20  he work of this 
2b780 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b  routine is check
2b790 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66  ing.** to see if
2b7a0 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69 63   there are indic
2b7b0 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  es that can be u
2b7c0 73 65 64 20 74 6f 20 73 70 65 65 64 20 75 70 20  sed to speed up 
2b7d0 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20  the loop..**.** 
2b7e0 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  Terms of the WHE
2b7f0 52 45 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c  RE clause are al
2b800 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74  so used to limit
2b810 20 77 68 69 63 68 20 72 6f 77 73 20 61 63 74 75   which rows actu
2b820 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20  ally.** make it 
2b830 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20  to the "..." in 
2b840 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68  the middle of th
2b850 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65  e loop.  After e
2b860 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a  ach "foreach",.*
2b870 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  * terms of the W
2b880 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
2b890 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20   use only terms 
2b8a0 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64  in that loop and
2b8b0 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20   outer.** loops 
2b8c0 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e  are evaluated an
2b8d0 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d  d if false a jum
2b8e0 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64  p is made around
2b8f0 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a   all subsequent.
2b900 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28  ** inner loops (
2b910 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e  or around the ".
2b920 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73 74 20  .." if the test 
2b930 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
2b940 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74  e inner-.** most
2b950 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54   loop).**.** OUT
2b960 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41  ER JOINS.**.** A
2b970 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20  n outer join of 
2b980 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32  tables t1 and t2
2b990 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20   is conceptally 
2b9a0 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  coded as follows
2b9b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61  :.**.**    forea
2b9c0 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f  ch row1 in t1 do
2b9d0 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20  .**      flag = 
2b9e0 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63  0.**      foreac
2b9f0 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a  h row2 in t2 do.
2ba00 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72 74 3a  **        start:
2ba10 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  .**          ...
2ba20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61  .**          fla
2ba30 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e  g = 1.**      en
2ba40 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61  d.**      if fla
2ba50 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20  g==0 then.**    
2ba60 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77      move the row
2ba70 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75  2 cursor to a nu
2ba80 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20  ll row.**       
2ba90 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20   goto start.**  
2baa0 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64      fi.**    end
2bab0 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20  .**.** ORDER BY 
2bac0 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e  CLAUSE PROCESSIN
2bad0 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79  G.**.** pOrderBy
2bae0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
2baf0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2bb00 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
2bb10 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 69   statement,.** i
2bb20 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20  f there is one. 
2bb30 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
2bb40 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2bb50 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  or if this routi
2bb60 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  ne.** is called 
2bb70 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45 20 6f  from an UPDATE o
2bb80 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
2bb90 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64 65 72 42  nt, then pOrderB
2bba0 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  y is NULL..**.**
2bbb0 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63 61 6e   If an index can
2bbc0 20 62 65 20 75 73 65 64 20 73 6f 20 74 68 61 74   be used so that
2bbd0 20 74 68 65 20 6e 61 74 75 72 61 6c 20 6f 75 74   the natural out
2bbe0 70 75 74 20 6f 72 64 65 72 20 6f 66 20 74 68 65  put order of the
2bbf0 20 74 61 62 6c 65 0a 2a 2a 20 73 63 61 6e 20 69   table.** scan i
2bc00 73 20 63 6f 72 72 65 63 74 20 66 6f 72 20 74 68  s correct for th
2bc10 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2bc20 65 2c 20 74 68 65 6e 20 74 68 61 74 20 69 6e 64  e, then that ind
2bc30 65 78 20 69 73 20 75 73 65 64 20 61 6e 64 0a 2a  ex is used and.*
2bc40 2a 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 57  * the returned W
2bc50 68 65 72 65 49 6e 66 6f 2e 6e 4f 42 53 61 74 20  hereInfo.nOBSat 
2bc60 66 69 65 6c 64 20 69 73 20 73 65 74 20 74 6f 20  field is set to 
2bc70 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2e  pOrderBy->nExpr.
2bc80 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 61 6e 20    This.** is an 
2bc90 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 68 61  optimization tha
2bca0 74 20 70 72 65 76 65 6e 74 73 20 61 6e 20 75 6e  t prevents an un
2bcb0 6e 65 63 65 73 73 61 72 79 20 73 6f 72 74 20 6f  necessary sort o
2bcc0 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
2bcd0 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 64 65 78 20  .** if an index 
2bce0 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
2bcf0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2bd00 75 73 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  use already exis
2bd10 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ts..**.** If the
2bd20 20 77 68 65 72 65 20 63 6c 61 75 73 65 20 6c 6f   where clause lo
2bd30 6f 70 73 20 63 61 6e 6e 6f 74 20 62 65 20 61 72  ops cannot be ar
2bd40 72 61 6e 67 65 64 20 74 6f 20 70 72 6f 76 69 64  ranged to provid
2bd50 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a  e the correct.**
2bd60 20 6f 75 74 70 75 74 20 6f 72 64 65 72 2c 20 74   output order, t
2bd70 68 65 6e 20 57 68 65 72 65 49 6e 66 6f 2e 6e 4f  hen WhereInfo.nO
2bd80 42 53 61 74 20 69 73 20 30 2e 0a 2a 2f 0a 57 68  BSat is 0..*/.Wh
2bd90 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  ereInfo *sqlite3
2bda0 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61  WhereBegin(.  Pa
2bdb0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
2bdc0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
2bdd0 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
2bde0 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
2bdf0 2c 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f  ,    /* A list o
2be00 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  f all tables to 
2be10 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20  be scanned */.  
2be20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
2be30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
2be40 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
2be50 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
2be60 79 2c 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52  y,   /* An ORDER
2be70 20 42 59 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e   BY clause, or N
2be80 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
2be90 74 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 20 2f  t *pDistinct,  /
2bea0 2a 20 54 68 65 20 73 65 6c 65 63 74 2d 6c 69 73  * The select-lis
2beb0 74 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 71  t for DISTINCT q
2bec0 75 65 72 69 65 73 20 2d 20 6f 72 20 4e 55 4c 4c  ueries - or NULL
2bed0 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46   */.  u16 wctrlF
2bee0 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a 20 4f  lags,       /* O
2bef0 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f  ne of the WHERE_
2bf00 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20  * flags defined 
2bf10 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a  in sqliteInt.h *
2bf20 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72 20  /.  int iIdxCur 
2bf30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
2bf40 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
2bf50 4e 4c 59 20 69 73 20 73 65 74 2c 20 69 6e 64 65  NLY is set, inde
2bf60 78 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  x cursor number 
2bf70 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
2bf80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf90 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2bfa0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  er */.  int nByt
2bfb0 65 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  eWInfo;         
2bfc0 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73     /* Num. bytes
2bfd0 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 57   allocated for W
2bfe0 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 20  hereInfo struct 
2bff0 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73  */.  int nTabLis
2c000 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2c010 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
2c020 6d 65 6e 74 73 20 69 6e 20 70 54 61 62 4c 69 73  ments in pTabLis
2c030 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f  t */.  WhereInfo
2c040 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20   *pWInfo;       
2c050 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65    /* Will become
2c060 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
2c070 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
2c080 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  on */.  Vdbe *v 
2c090 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
2c0a0 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
2c0b0 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e  l database engin
2c0c0 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  e */.  Bitmask n
2c0d0 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20  otReady;        
2c0e0 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 74 68 61    /* Cursors tha
2c0f0 74 20 61 72 65 20 6e 6f 74 20 79 65 74 20 70 6f  t are not yet po
2c100 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68  sitioned */.  Wh
2c110 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
2c120 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  kSet;    /* The 
2c130 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20  expression mask 
2c140 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  set */.  WhereCl
2c150 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20  ause *pWC;      
2c160 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 63 6f           /* Deco
2c170 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65  mposition of the
2c180 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
2c190 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
2c1a0 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d  t_item *pTabItem
2c1b0 3b 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 65  ;  /* A single e
2c1c0 6e 74 72 79 20 66 72 6f 6d 20 70 54 61 62 4c 69  ntry from pTabLi
2c1d0 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  st */.  WhereLev
2c1e0 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20  el *pLevel;     
2c1f0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
2c200 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20 70 57 49  gle level in pWI
2c210 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e  nfo->a[] */.  in
2c220 74 20 69 46 72 6f 6d 3b 20 20 20 20 20 20 20 20  t iFrom;        
2c230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c240 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 46 52   First unused FR
2c250 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e  OM clause elemen
2c260 74 20 2a 2f 0a 20 20 69 6e 74 20 61 6e 64 46 6c  t */.  int andFl
2c270 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
2c280 20 20 2f 2a 20 41 4e 44 2d 65 64 20 63 6f 6d 62    /* AND-ed comb
2c290 69 6e 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 70  ination of all p
2c2a0 57 43 2d 3e 61 5b 5d 2e 77 74 46 6c 61 67 73 20  WC->a[].wtFlags 
2c2b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
2c2c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c2d0 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
2c2e0 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  ection */..  /* 
2c2f0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 61  The number of ta
2c300 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
2c310 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74   clause is limit
2c320 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72  ed by the number
2c330 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e   of.  ** bits in
2c340 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f   a Bitmask .  */
2c350 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61  .  testcase( pTa
2c360 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53  bList->nSrc==BMS
2c370 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 4c 69   );.  if( pTabLi
2c380 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a  st->nSrc>BMS ){.
2c390 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2c3a0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 74 20  Msg(pParse, "at 
2c3b0 6d 6f 73 74 20 25 64 20 74 61 62 6c 65 73 20 69  most %d tables i
2c3c0 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b  n a join", BMS);
2c3d0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2c3e0 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75   }..  /* This fu
2c3f0 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20  nction normally 
2c400 67 65 6e 65 72 61 74 65 73 20 61 20 6e 65 73 74  generates a nest
2c410 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c 20  ed loop for all 
2c420 74 61 62 6c 65 73 20 69 6e 20 0a 20 20 2a 2a 20  tables in .  ** 
2c430 70 54 61 62 4c 69 73 74 2e 20 20 42 75 74 20 69  pTabList.  But i
2c440 66 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 54  f the WHERE_ONET
2c450 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69  ABLE_ONLY flag i
2c460 73 20 73 65 74 2c 20 74 68 65 6e 20 77 65 20 73  s set, then we s
2c470 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20  hould.  ** only 
2c480 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  generate code fo
2c490 72 20 74 68 65 20 66 69 72 73 74 20 74 61 62 6c  r the first tabl
2c4a0 65 20 69 6e 20 70 54 61 62 4c 69 73 74 20 61 6e  e in pTabList an
2c4b0 64 20 61 73 73 75 6d 65 20 74 68 61 74 0a 20 20  d assume that.  
2c4c0 2a 2a 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61  ** any cursors a
2c4d0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 73  ssociated with s
2c4e0 75 62 73 65 71 75 65 6e 74 20 74 61 62 6c 65 73  ubsequent tables
2c4f0 20 61 72 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a   are uninitializ
2c500 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61 62 4c  ed..  */.  nTabL
2c510 69 73 74 20 3d 20 28 77 63 74 72 6c 46 6c 61 67  ist = (wctrlFlag
2c520 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42  s & WHERE_ONETAB
2c530 4c 45 5f 4f 4e 4c 59 29 20 3f 20 31 20 3a 20 70  LE_ONLY) ? 1 : p
2c540 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a  TabList->nSrc;..
2c550 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
2c560 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  d initialize the
2c570 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
2c580 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62  ture that will b
2c590 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72  ecome the.  ** r
2c5a0 65 74 75 72 6e 20 76 61 6c 75 65 2e 20 41 20 73  eturn value. A s
2c5b0 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  ingle allocation
2c5c0 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72   is used to stor
2c5d0 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 0a  e the WhereInfo.
2c5e0 20 20 2a 2a 20 73 74 72 75 63 74 2c 20 74 68 65    ** struct, the
2c5f0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 57 68 65   contents of Whe
2c600 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65 20  reInfo.a[], the 
2c610 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
2c620 63 74 75 72 65 0a 20 20 2a 2a 20 61 6e 64 20 74  cture.  ** and t
2c630 68 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  he WhereMaskSet 
2c640 73 74 72 75 63 74 75 72 65 2e 20 53 69 6e 63 65  structure. Since
2c650 20 57 68 65 72 65 43 6c 61 75 73 65 20 63 6f 6e   WhereClause con
2c660 74 61 69 6e 73 20 61 6e 20 38 2d 62 79 74 65 0a  tains an 8-byte.
2c670 20 20 2a 2a 20 66 69 65 6c 64 20 28 74 79 70 65    ** field (type
2c680 20 42 69 74 6d 61 73 6b 29 20 69 74 20 6d 75 73   Bitmask) it mus
2c690 74 20 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e 20  t be aligned on 
2c6a0 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61  an 8-byte bounda
2c6b0 72 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20  ry on.  ** some 
2c6c0 61 72 63 68 69 74 65 63 74 75 72 65 73 2e 20 48  architectures. H
2c6d0 65 6e 63 65 20 74 68 65 20 52 4f 55 4e 44 38 28  ence the ROUND8(
2c6e0 29 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20  ) below..  */.  
2c6f0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
2c700 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f 20 3d 20  .  nByteWInfo = 
2c710 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 57 68  ROUND8(sizeof(Wh
2c720 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61 62 4c 69  ereInfo)+(nTabLi
2c730 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68 65  st-1)*sizeof(Whe
2c740 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57 49  reLevel));.  pWI
2c750 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
2c760 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 0a 20  allocZero(db, . 
2c770 20 20 20 20 20 6e 42 79 74 65 57 49 6e 66 6f 20       nByteWInfo 
2c780 2b 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  + .      sizeof(
2c790 57 68 65 72 65 43 6c 61 75 73 65 29 20 2b 0a 20  WhereClause) +. 
2c7a0 20 20 20 20 20 73 69 7a 65 6f 66 28 57 68 65 72       sizeof(Wher
2c7b0 65 4d 61 73 6b 53 65 74 29 0a 20 20 29 3b 0a 20  eMaskSet).  );. 
2c7c0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2c7d0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  ailed ){.    sql
2c7e0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
2c7f0 57 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57 49 6e  WInfo);.    pWIn
2c800 66 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  fo = 0;.    goto
2c810 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
2c820 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e  ;.  }.  pWInfo->
2c830 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73  nLevel = nTabLis
2c840 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61  t;.  pWInfo->pPa
2c850 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
2c860 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
2c870 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 70   = pTabList;.  p
2c880 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20  WInfo->iBreak = 
2c890 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
2c8a0 61 62 65 6c 28 76 29 3b 0a 20 20 70 57 49 6e 66  abel(v);.  pWInf
2c8b0 6f 2d 3e 70 57 43 20 3d 20 70 57 43 20 3d 20 28  o->pWC = pWC = (
2c8c0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 29 26 28  WhereClause *)&(
2c8d0 28 75 38 20 2a 29 70 57 49 6e 66 6f 29 5b 6e 42  (u8 *)pWInfo)[nB
2c8e0 79 74 65 57 49 6e 66 6f 5d 3b 0a 20 20 70 57 49  yteWInfo];.  pWI
2c8f0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
2c900 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20  = wctrlFlags;.  
2c910 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75  pWInfo->savedNQu
2c920 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65  eryLoop = pParse
2c930 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  ->nQueryLoop;.  
2c940 70 4d 61 73 6b 53 65 74 20 3d 20 28 57 68 65 72  pMaskSet = (Wher
2c950 65 4d 61 73 6b 53 65 74 2a 29 26 70 57 43 5b 31  eMaskSet*)&pWC[1
2c960 5d 3b 0a 0a 20 20 2f 2a 20 44 69 73 61 62 6c 65  ];..  /* Disable
2c970 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6f 70   the DISTINCT op
2c980 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 53 51  timization if SQ
2c990 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74  LITE_DistinctOpt
2c9a0 20 69 73 20 73 65 74 20 76 69 61 0a 20 20 2a 2a   is set via.  **
2c9b0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 74   sqlite3_test_ct
2c9c0 72 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  rl(SQLITE_TESTCT
2c9d0 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53  RL_OPTIMIZATIONS
2c9e0 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66 28 20 64  ,...) */.  if( d
2c9f0 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
2ca00 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 20 29 20  E_DistinctOpt ) 
2ca10 70 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 0a  pDistinct = 0;..
2ca20 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57    /* Split the W
2ca30 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f  HERE clause into
2ca40 20 73 65 70 61 72 61 74 65 20 73 75 62 65 78 70   separate subexp
2ca50 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65  ressions where e
2ca60 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72  ach.  ** subexpr
2ca70 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61  ession is separa
2ca80 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70  ted by an AND op
2ca90 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69  erator..  */.  i
2caa0 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b  nitMaskSet(pMask
2cab0 53 65 74 29 3b 0a 20 20 77 68 65 72 65 43 6c 61  Set);.  whereCla
2cac0 75 73 65 49 6e 69 74 28 70 57 43 2c 20 70 50 61  useInit(pWC, pPa
2cad0 72 73 65 2c 20 70 4d 61 73 6b 53 65 74 2c 20 77  rse, pMaskSet, w
2cae0 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 73 71  ctrlFlags);.  sq
2caf0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 6e  lite3ExprCodeCon
2cb00 73 74 61 6e 74 73 28 70 50 61 72 73 65 2c 20 70  stants(pParse, p
2cb10 57 68 65 72 65 29 3b 0a 20 20 77 68 65 72 65 53  Where);.  whereS
2cb20 70 6c 69 74 28 70 57 43 2c 20 70 57 68 65 72 65  plit(pWC, pWhere
2cb30 2c 20 54 4b 5f 41 4e 44 29 3b 20 20 20 2f 2a 20  , TK_AND);   /* 
2cb40 49 4d 50 3a 20 52 2d 31 35 38 34 32 2d 35 33 32  IMP: R-15842-532
2cb50 39 36 20 2a 2f 0a 20 20 20 20 0a 20 20 2f 2a 20  96 */.    .  /* 
2cb60 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 61 20  Special case: a 
2cb70 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
2cb80 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20  t is constant.  
2cb90 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20 20 2a  Evaluate the.  *
2cba0 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  * expression and
2cbb0 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f 76 65   either jump ove
2cbc0 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64  r all of the cod
2cbd0 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a  e or fall thru..
2cbe0 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 68 65 72    */.  if( pWher
2cbf0 65 20 26 26 20 28 6e 54 61 62 4c 69 73 74 3d 3d  e && (nTabList==
2cc00 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72  0 || sqlite3Expr
2cc10 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
2cc20 6e 28 70 57 68 65 72 65 29 29 20 29 7b 0a 20 20  n(pWhere)) ){.  
2cc30 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
2cc40 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 57 68  alse(pParse, pWh
2cc50 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  ere, pWInfo->iBr
2cc60 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  eak, SQLITE_JUMP
2cc70 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 57 68  IFNULL);.    pWh
2cc80 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ere = 0;.  }..  
2cc90 2f 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74 20  /* Assign a bit 
2cca0 66 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b  from the bitmask
2ccb0 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69   to every term i
2ccc0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2ccd0 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  e..  **.  ** Whe
2cce0 6e 20 61 73 73 69 67 6e 69 6e 67 20 62 69 74 6d  n assigning bitm
2ccf0 61 73 6b 20 76 61 6c 75 65 73 20 74 6f 20 46 52  ask values to FR
2cd00 4f 4d 20 63 6c 61 75 73 65 20 63 75 72 73 6f 72  OM clause cursor
2cd10 73 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 20 20  s, it must be.  
2cd20 2a 2a 20 74 68 65 20 63 61 73 65 20 74 68 61 74  ** the case that
2cd30 20 69 66 20 58 20 69 73 20 74 68 65 20 62 69 74   if X is the bit
2cd40 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d 74  mask for the N-t
2cd50 68 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  h FROM clause te
2cd60 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65  rm then.  ** the
2cd70 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c   bitmask for all
2cd80 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
2cd90 6d 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  ms to the left o
2cda0 66 20 74 68 65 20 4e 2d 74 68 20 74 65 72 6d 0a  f the N-th term.
2cdb0 20 20 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20 20    ** is (X-1).  
2cdc0 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66   An expression f
2cdd0 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73  rom the ON claus
2cde0 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e of a LEFT JOIN
2cdf0 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69 74   can use.  ** it
2ce00 73 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69  s Expr.iRightJoi
2ce10 6e 54 61 62 6c 65 20 76 61 6c 75 65 20 74 6f 20  nTable value to 
2ce20 66 69 6e 64 20 74 68 65 20 62 69 74 6d 61 73 6b  find the bitmask
2ce30 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61   of the right ta
2ce40 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ble.  ** of the 
2ce50 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61 63 74 69  join.  Subtracti
2ce60 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20  ng one from the 
2ce70 72 69 67 68 74 20 74 61 62 6c 65 20 62 69 74 6d  right table bitm
2ce80 61 73 6b 20 67 69 76 65 73 20 61 0a 20 20 2a 2a  ask gives a.  **
2ce90 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c   bitmask for all
2cea0 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
2ceb0 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  eft of the join.
2cec0 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69    Knowing the bi
2ced0 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20 61  tmask.  ** for a
2cee0 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  ll tables to the
2cef0 20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20   left of a left 
2cf00 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72 74 61 6e  join is importan
2cf10 74 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31 35  t.  Ticket #3015
2cf20 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 66  ..  **.  ** Conf
2cf30 69 67 75 72 65 20 74 68 65 20 57 68 65 72 65 43  igure the WhereC
2cf40 6c 61 75 73 65 2e 76 6d 61 73 6b 20 76 61 72 69  lause.vmask vari
2cf50 61 62 6c 65 20 73 6f 20 74 68 61 74 20 62 69 74  able so that bit
2cf60 73 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  s that correspon
2cf70 64 0a 20 20 2a 2a 20 74 6f 20 76 69 72 74 75 61  d.  ** to virtua
2cf80 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72 73 20  l table cursors 
2cf90 61 72 65 20 73 65 74 2e 20 54 68 69 73 20 69 73  are set. This is
2cfa0 20 75 73 65 64 20 74 6f 20 73 65 6c 65 63 74 69   used to selecti
2cfb0 76 65 6c 79 20 64 69 73 61 62 6c 65 20 0a 20 20  vely disable .  
2cfc0 2a 2a 20 74 68 65 20 4f 52 2d 74 6f 2d 49 4e 20  ** the OR-to-IN 
2cfd0 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69  transformation i
2cfe0 6e 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54  n exprAnalyzeOrT
2cff0 65 72 6d 28 29 2e 20 49 74 20 69 73 20 6e 6f 74  erm(). It is not
2d000 20 68 65 6c 70 66 75 6c 20 0a 20 20 2a 2a 20 77   helpful .  ** w
2d010 69 74 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ith virtual tabl
2d020 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f  es..  **.  ** No
2d030 74 65 20 74 68 61 74 20 62 69 74 6d 61 73 6b 73  te that bitmasks
2d040 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72   are created for
2d050 20 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e   all pTabList->n
2d060 53 72 63 20 74 61 62 6c 65 73 20 69 6e 0a 20 20  Src tables in.  
2d070 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74  ** pTabList, not
2d080 20 6a 75 73 74 20 74 68 65 20 66 69 72 73 74 20   just the first 
2d090 6e 54 61 62 4c 69 73 74 20 74 61 62 6c 65 73 2e  nTabList tables.
2d0a0 20 20 6e 54 61 62 4c 69 73 74 20 69 73 20 6e 6f    nTabList is no
2d0b0 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75 61  rmally.  ** equa
2d0c0 6c 20 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e  l to pTabList->n
2d0d0 53 72 63 20 62 75 74 20 6d 69 67 68 74 20 62 65  Src but might be
2d0e0 20 73 68 6f 72 74 65 6e 65 64 20 74 6f 20 31 20   shortened to 1 
2d0f0 69 66 20 74 68 65 0a 20 20 2a 2a 20 57 48 45 52  if the.  ** WHER
2d100 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20  E_ONETABLE_ONLY 
2d110 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 20 20 2a  flag is set..  *
2d120 2f 0a 20 20 61 73 73 65 72 74 28 20 70 57 43 2d  /.  assert( pWC-
2d130 3e 76 6d 61 73 6b 3d 3d 30 20 26 26 20 70 4d 61  >vmask==0 && pMa
2d140 73 6b 53 65 74 2d 3e 6e 3d 3d 30 20 29 3b 0a 20  skSet->n==0 );. 
2d150 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
2d160 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
2d170 7b 0a 20 20 20 20 63 72 65 61 74 65 4d 61 73 6b  {.    createMask
2d180 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c  (pMaskSet, pTabL
2d190 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
2d1a0 72 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  r);.#ifndef SQLI
2d1b0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2d1c0 41 42 4c 45 0a 20 20 20 20 69 66 28 20 41 4c 57  ABLE.    if( ALW
2d1d0 41 59 53 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b  AYS(pTabList->a[
2d1e0 69 5d 2e 70 54 61 62 29 20 26 26 20 49 73 56 69  i].pTab) && IsVi
2d1f0 72 74 75 61 6c 28 70 54 61 62 4c 69 73 74 2d 3e  rtual(pTabList->
2d200 61 5b 69 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20  a[i].pTab) ){.  
2d210 20 20 20 20 70 57 43 2d 3e 76 6d 61 73 6b 20 7c      pWC->vmask |
2d220 3d 20 28 28 42 69 74 6d 61 73 6b 29 31 20 3c 3c  = ((Bitmask)1 <<
2d230 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   i);.    }.#endi
2d240 66 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44  f.  }.#ifndef ND
2d250 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 42 69 74  EBUG.  {.    Bit
2d260 6d 61 73 6b 20 74 6f 54 68 65 4c 65 66 74 20 3d  mask toTheLeft =
2d270 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
2d280 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
2d290 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  c; i++){.      B
2d2a0 69 74 6d 61 73 6b 20 6d 20 3d 20 67 65 74 4d 61  itmask m = getMa
2d2b0 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61  sk(pMaskSet, pTa
2d2c0 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  bList->a[i].iCur
2d2d0 73 6f 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  sor);.      asse
2d2e0 72 74 28 20 28 6d 2d 31 29 3d 3d 74 6f 54 68 65  rt( (m-1)==toThe
2d2f0 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 74 6f  Left );.      to
2d300 54 68 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20 20  TheLeft |= m;.  
2d310 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
2d320 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c    /* Analyze all
2d330 20 6f 66 20 74 68 65 20 73 75 62 65 78 70 72 65   of the subexpre
2d340 73 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68  ssions.  Note th
2d350 61 74 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 29  at exprAnalyze()
2d360 20 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64 64 20   might.  ** add 
2d370 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d  new virtual term
2d380 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  s onto the end o
2d390 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
2d3a0 73 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20  se.  We do not. 
2d3b0 20 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c   ** want to anal
2d3c0 79 7a 65 20 74 68 65 73 65 20 76 69 72 74 75 61  yze these virtua
2d3d0 6c 20 74 65 72 6d 73 2c 20 73 6f 20 73 74 61 72  l terms, so star
2d3e0 74 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74  t analyzing at t
2d3f0 68 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20  he end.  ** and 
2d400 77 6f 72 6b 20 66 6f 72 77 61 72 64 20 73 6f 20  work forward so 
2d410 74 68 61 74 20 74 68 65 20 61 64 64 65 64 20 76  that the added v
2d420 69 72 74 75 61 6c 20 74 65 72 6d 73 20 61 72 65  irtual terms are
2d430 20 6e 65 76 65 72 20 70 72 6f 63 65 73 73 65 64   never processed
2d440 2e 0a 20 20 2a 2f 0a 20 20 65 78 70 72 41 6e 61  ..  */.  exprAna
2d450 6c 79 7a 65 41 6c 6c 28 70 54 61 62 4c 69 73 74  lyzeAll(pTabList
2d460 2c 20 70 57 43 29 3b 0a 20 20 69 66 28 20 64 62  , pWC);.  if( db
2d470 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2d480 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65  {.    goto where
2d490 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a  BeginError;.  }.
2d4a0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74  .  /* Check if t
2d4b0 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c  he DISTINCT qual
2d4c0 69 66 69 65 72 2c 20 69 66 20 74 68 65 72 65 20  ifier, if there 
2d4d0 69 73 20 6f 6e 65 2c 20 69 73 20 72 65 64 75 6e  is one, is redun
2d4e0 64 61 6e 74 2e 20 0a 20 20 2a 2a 20 49 66 20 69  dant. .  ** If i
2d4f0 74 20 69 73 2c 20 74 68 65 6e 20 73 65 74 20 70  t is, then set p
2d500 44 69 73 74 69 6e 63 74 20 74 6f 20 4e 55 4c 4c  Distinct to NULL
2d510 20 61 6e 64 20 57 68 65 72 65 49 6e 66 6f 2e 65   and WhereInfo.e
2d520 44 69 73 74 69 6e 63 74 20 74 6f 0a 20 20 2a 2a  Distinct to.  **
2d530 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
2d540 55 4e 49 51 55 45 20 74 6f 20 74 65 6c 6c 20 74  UNIQUE to tell t
2d550 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 67 6e  he caller to ign
2d560 6f 72 65 20 74 68 65 20 44 49 53 54 49 4e 43 54  ore the DISTINCT
2d570 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 69  ..  */.  if( pDi
2d580 73 74 69 6e 63 74 20 26 26 20 69 73 44 69 73 74  stinct && isDist
2d590 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 70 50  inctRedundant(pP
2d5a0 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
2d5b0 70 57 43 2c 20 70 44 69 73 74 69 6e 63 74 29 20  pWC, pDistinct) 
2d5c0 29 7b 0a 20 20 20 20 70 44 69 73 74 69 6e 63 74  ){.    pDistinct
2d5d0 20 3d 20 30 3b 0a 20 20 20 20 70 57 49 6e 66 6f   = 0;.    pWInfo
2d5e0 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48  ->eDistinct = WH
2d5f0 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
2d600 51 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  QUE;.  }..  /* C
2d610 68 6f 73 65 20 74 68 65 20 62 65 73 74 20 69 6e  hose the best in
2d620 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 65  dex to use for e
2d630 61 63 68 20 74 61 62 6c 65 20 69 6e 20 74 68 65  ach table in the
2d640 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20   FROM clause..  
2d650 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f  **.  ** This loo
2d660 70 20 66 69 6c 6c 73 20 69 6e 20 74 68 65 20 66  p fills in the f
2d670 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a  ollowing fields:
2d680 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 70 57 49  .  **.  **   pWI
2d690 6e 66 6f 2d 3e 61 5b 5d 2e 70 49 64 78 20 20 20  nfo->a[].pIdx   
2d6a0 20 20 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20     The index to 
2d6b0 75 73 65 20 66 6f 72 20 74 68 69 73 20 6c 65 76  use for this lev
2d6c0 65 6c 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a  el of the loop..
2d6d0 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61    **   pWInfo->a
2d6e0 5b 5d 2e 77 73 46 6c 61 67 73 20 20 20 57 48 45  [].wsFlags   WHE
2d6f0 52 45 5f 78 78 78 20 66 6c 61 67 73 20 61 73 73  RE_xxx flags ass
2d700 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49 64  ociated with pId
2d710 78 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  x.  **   pWInfo-
2d720 3e 61 5b 5d 2e 6e 45 71 20 20 20 20 20 20 20 54  >a[].nEq       T
2d730 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20  he number of == 
2d740 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e  and IN constrain
2d750 74 73 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f  ts.  **   pWInfo
2d760 2d 3e 61 5b 5d 2e 69 46 72 6f 6d 20 20 20 20 20  ->a[].iFrom     
2d770 57 68 69 63 68 20 74 65 72 6d 20 6f 66 20 74 68  Which term of th
2d780 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
2d790 20 62 65 69 6e 67 20 63 6f 64 65 64 0a 20 20 2a   being coded.  *
2d7a0 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e  *   pWInfo->a[].
2d7b0 69 54 61 62 43 75 72 20 20 20 54 68 65 20 56 44  iTabCur   The VD
2d7c0 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  BE cursor for th
2d7d0 65 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  e database table
2d7e0 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
2d7f0 61 5b 5d 2e 69 49 64 78 43 75 72 20 20 20 54 68  a[].iIdxCur   Th
2d800 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
2d810 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  r the index.  **
2d820 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70     pWInfo->a[].p
2d830 54 65 72 6d 20 20 20 20 20 57 68 65 6e 20 77 73  Term     When ws
2d840 46 6c 61 67 73 3d 3d 57 4f 5f 4f 52 2c 20 74 68  Flags==WO_OR, th
2d850 65 20 4f 52 2d 63 6c 61 75 73 65 20 74 65 72 6d  e OR-clause term
2d860 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
2d870 6c 6f 6f 70 20 61 6c 73 6f 20 66 69 67 75 72 65  loop also figure
2d880 73 20 6f 75 74 20 74 68 65 20 6e 65 73 74 69 6e  s out the nestin
2d890 67 20 6f 72 64 65 72 20 6f 66 20 74 61 62 6c 65  g order of table
2d8a0 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20  s in the FROM.  
2d8b0 2a 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a  ** clause..  */.
2d8c0 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42    notReady = ~(B
2d8d0 69 74 6d 61 73 6b 29 30 3b 0a 20 20 61 6e 64 46  itmask)0;.  andF
2d8e0 6c 61 67 73 20 3d 20 7e 30 3b 0a 20 20 57 48 45  lags = ~0;.  WHE
2d8f0 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70  RETRACE(("*** Op
2d900 74 69 6d 69 7a 65 72 20 53 74 61 72 74 20 2a 2a  timizer Start **
2d910 2a 5c 6e 22 29 29 3b 0a 20 20 66 6f 72 28 69 3d  *\n"));.  for(i=
2d920 69 46 72 6f 6d 3d 30 2c 20 70 4c 65 76 65 6c 3d  iFrom=0, pLevel=
2d930 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 6e 54 61  pWInfo->a; i<nTa
2d940 62 4c 69 73 74 3b 20 69 2b 2b 2c 20 70 4c 65 76  bList; i++, pLev
2d950 65 6c 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65  el++){.    Where
2d960 43 6f 73 74 20 62 65 73 74 50 6c 61 6e 3b 20 20  Cost bestPlan;  
2d970 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 65         /* Most e
2d980 66 66 69 63 69 65 6e 74 20 70 6c 61 6e 20 73 65  fficient plan se
2d990 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  en so far */.   
2d9a0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
2d9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d9c0 49 6e 64 65 78 20 66 6f 72 20 46 52 4f 4d 20 74  Index for FROM t
2d9d0 61 62 6c 65 20 61 74 20 70 54 61 62 49 74 65 6d  able at pTabItem
2d9e0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 3b 20 20   */.    int j;  
2d9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da00 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
2da10 6e 67 20 6f 76 65 72 20 46 52 4f 4d 20 74 61 62  ng over FROM tab
2da20 6c 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  les */.    int b
2da30 65 73 74 4a 20 3d 20 2d 31 3b 20 20 20 20 20 20  estJ = -1;      
2da40 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61         /* The va
2da50 6c 75 65 20 6f 66 20 6a 20 2a 2f 0a 20 20 20 20  lue of j */.    
2da60 42 69 74 6d 61 73 6b 20 6d 3b 20 20 20 20 20 20  Bitmask m;      
2da70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
2da80 69 74 6d 61 73 6b 20 76 61 6c 75 65 20 66 6f 72  itmask value for
2da90 20 6a 20 6f 72 20 62 65 73 74 4a 20 2a 2f 0a 20   j or bestJ */. 
2daa0 20 20 20 69 6e 74 20 69 73 4f 70 74 69 6d 61 6c     int isOptimal
2dab0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2dac0 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6f  * Iterator for o
2dad0 70 74 69 6d 61 6c 2f 6e 6f 6e 2d 6f 70 74 69 6d  ptimal/non-optim
2dae0 61 6c 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 20  al search */.   
2daf0 20 69 6e 74 20 6e 55 6e 63 6f 6e 73 74 72 61 69   int nUnconstrai
2db00 6e 65 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ned;         /* 
2db10 4e 75 6d 62 65 72 20 74 61 62 6c 65 73 20 77 69  Number tables wi
2db20 74 68 6f 75 74 20 49 4e 44 45 58 45 44 20 42 59  thout INDEXED BY
2db30 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   */.    Bitmask 
2db40 6e 6f 74 49 6e 64 65 78 65 64 3b 20 20 20 20 20  notIndexed;     
2db50 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74      /* Mask of t
2db60 61 62 6c 65 73 20 74 68 61 74 20 63 61 6e 6e 6f  ables that canno
2db70 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78 20 2a  t use an index *
2db80 2f 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 62  /..    memset(&b
2db90 65 73 74 50 6c 61 6e 2c 20 30 2c 20 73 69 7a 65  estPlan, 0, size
2dba0 6f 66 28 62 65 73 74 50 6c 61 6e 29 29 3b 0a 20  of(bestPlan));. 
2dbb0 20 20 20 62 65 73 74 50 6c 61 6e 2e 72 43 6f 73     bestPlan.rCos
2dbc0 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44  t = SQLITE_BIG_D
2dbd0 42 4c 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41  BL;.    WHERETRA
2dbe0 43 45 28 28 22 2a 2a 2a 20 42 65 67 69 6e 20 73  CE(("*** Begin s
2dbf0 65 61 72 63 68 20 66 6f 72 20 6c 6f 6f 70 20 25  earch for loop %
2dc00 64 20 2a 2a 2a 5c 6e 22 2c 20 69 29 29 3b 0a 0a  d ***\n", i));..
2dc10 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
2dc20 75 67 68 20 74 68 65 20 72 65 6d 61 69 6e 69 6e  ugh the remainin
2dc30 67 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  g entries in the
2dc40 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 6f 20   FROM clause to 
2dc50 66 69 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20  find the.    ** 
2dc60 6e 65 78 74 20 6e 65 73 74 65 64 20 6c 6f 6f 70  next nested loop
2dc70 2e 20 54 68 65 20 6c 6f 6f 70 20 74 65 73 74 73  . The loop tests
2dc80 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65   all FROM clause
2dc90 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20   entries.    ** 
2dca0 65 69 74 68 65 72 20 6f 6e 63 65 20 6f 72 20 74  either once or t
2dcb0 77 69 63 65 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  wice. .    **.  
2dcc0 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74    ** The first t
2dcd0 65 73 74 20 69 73 20 61 6c 77 61 79 73 20 70 65  est is always pe
2dce0 72 66 6f 72 6d 65 64 20 69 66 20 74 68 65 72 65  rformed if there
2dcf0 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65   are two or more
2dd00 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20   entries.    ** 
2dd10 72 65 6d 61 69 6e 69 6e 67 20 61 6e 64 20 6e 65  remaining and ne
2dd20 76 65 72 20 70 65 72 66 6f 72 6d 65 64 20 69 66  ver performed if
2dd30 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f   there is only o
2dd40 6e 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  ne FROM clause e
2dd50 6e 74 72 79 0a 20 20 20 20 2a 2a 20 74 6f 20 63  ntry.    ** to c
2dd60 68 6f 6f 73 65 20 66 72 6f 6d 2e 20 20 54 68 65  hoose from.  The
2dd70 20 66 69 72 73 74 20 74 65 73 74 20 6c 6f 6f 6b   first test look
2dd80 73 20 66 6f 72 20 61 6e 20 22 6f 70 74 69 6d 61  s for an "optima
2dd90 6c 22 20 73 63 61 6e 2e 20 20 49 6e 0a 20 20 20  l" scan.  In.   
2dda0 20 2a 2a 20 74 68 69 73 20 63 6f 6e 74 65 78 74   ** this context
2ddb0 20 61 6e 20 6f 70 74 69 6d 61 6c 20 73 63 61 6e   an optimal scan
2ddc0 20 69 73 20 6f 6e 65 20 74 68 61 74 20 75 73 65   is one that use
2ddd0 73 20 74 68 65 20 73 61 6d 65 20 73 74 72 61 74  s the same strat
2dde0 65 67 79 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74  egy.    ** for t
2ddf0 68 65 20 67 69 76 65 6e 20 46 52 4f 4d 20 63 6c  he given FROM cl
2de00 61 75 73 65 20 65 6e 74 72 79 20 61 73 20 77 6f  ause entry as wo
2de10 75 6c 64 20 62 65 20 73 65 6c 65 63 74 65 64 20  uld be selected 
2de20 69 66 20 74 68 65 20 65 6e 74 72 79 0a 20 20 20  if the entry.   
2de30 20 2a 2a 20 77 65 72 65 20 75 73 65 64 20 61 73   ** were used as
2de40 20 74 68 65 20 69 6e 6e 65 72 6d 6f 73 74 20 6e   the innermost n
2de50 65 73 74 65 64 20 6c 6f 6f 70 2e 20 20 49 6e 20  ested loop.  In 
2de60 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61 20 74  other words, a t
2de70 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 63  able.    ** is c
2de80 68 6f 73 65 6e 20 73 75 63 68 20 74 68 61 74 20  hosen such that 
2de90 74 68 65 20 63 6f 73 74 20 6f 66 20 72 75 6e 6e  the cost of runn
2dea0 69 6e 67 20 74 68 61 74 20 74 61 62 6c 65 20 63  ing that table c
2deb0 61 6e 6e 6f 74 20 62 65 20 72 65 64 75 63 65 64  annot be reduced
2dec0 0a 20 20 20 20 2a 2a 20 62 79 20 77 61 69 74 69  .    ** by waiti
2ded0 6e 67 20 66 6f 72 20 6f 74 68 65 72 20 74 61 62  ng for other tab
2dee0 6c 65 73 20 74 6f 20 72 75 6e 20 66 69 72 73 74  les to run first
2def0 2e 20 20 54 68 69 73 20 22 6f 70 74 69 6d 61 6c  .  This "optimal
2df00 22 20 74 65 73 74 20 77 6f 72 6b 73 0a 20 20 20  " test works.   
2df10 20 2a 2a 20 62 79 20 66 69 72 73 74 20 61 73 73   ** by first ass
2df20 75 6d 69 6e 67 20 74 68 61 74 20 74 68 65 20 46  uming that the F
2df30 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6f 6e  ROM clause is on
2df40 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20   the inner loop 
2df50 61 6e 64 20 66 69 6e 64 69 6e 67 0a 20 20 20 20  and finding.    
2df60 2a 2a 20 69 74 73 20 71 75 65 72 79 20 70 6c 61  ** its query pla
2df70 6e 2c 20 74 68 65 6e 20 63 68 65 63 6b 69 6e 67  n, then checking
2df80 20 74 6f 20 73 65 65 20 69 66 20 74 68 61 74 20   to see if that 
2df90 71 75 65 72 79 20 70 6c 61 6e 20 75 73 65 73 20  query plan uses 
2dfa0 61 6e 79 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  any.    ** other
2dfb0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
2dfc0 6d 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 52  ms that are notR
2dfd0 65 61 64 79 2e 20 20 49 66 20 6e 6f 20 6e 6f 74  eady.  If no not
2dfe0 52 65 61 64 79 20 74 65 72 6d 73 20 61 72 65 0a  Ready terms are.
2dff0 20 20 20 20 2a 2a 20 75 73 65 64 20 74 68 65 6e      ** used then
2e000 20 74 68 65 20 22 6f 70 74 69 6d 61 6c 22 20 71   the "optimal" q
2e010 75 65 72 79 20 70 6c 61 6e 20 77 6f 72 6b 73 2e  uery plan works.
2e020 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e  .    **.    ** N
2e030 6f 74 65 20 74 68 61 74 20 74 68 65 20 57 68 65  ote that the Whe
2e040 72 65 43 6f 73 74 2e 6e 52 6f 77 20 70 61 72 61  reCost.nRow para
2e050 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 74  meter for an opt
2e060 69 6d 61 6c 20 73 63 61 6e 20 6d 69 67 68 74 0a  imal scan might.
2e070 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 73      ** not be as
2e080 20 73 6d 61 6c 6c 20 61 73 20 69 74 20 77 6f 75   small as it wou
2e090 6c 64 20 62 65 20 69 66 20 74 68 65 20 74 61 62  ld be if the tab
2e0a0 6c 65 20 72 65 61 6c 6c 79 20 77 65 72 65 20 74  le really were t
2e0b0 68 65 20 69 6e 6e 65 72 6d 6f 73 74 0a 20 20 20  he innermost.   
2e0c0 20 2a 2a 20 6a 6f 69 6e 2e 20 20 54 68 65 20 6e   ** join.  The n
2e0d0 52 6f 77 20 76 61 6c 75 65 20 63 61 6e 20 62 65  Row value can be
2e0e0 20 72 65 64 75 63 65 64 20 62 79 20 57 48 45 52   reduced by WHER
2e0f0 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61  E clause constra
2e100 69 6e 74 73 0a 20 20 20 20 2a 2a 20 74 68 61 74  ints.    ** that
2e110 20 64 6f 20 6e 6f 74 20 75 73 65 20 69 6e 64 69   do not use indi
2e120 63 65 73 2e 20 20 42 75 74 20 74 68 69 73 20 6e  ces.  But this n
2e130 52 6f 77 20 72 65 64 75 63 74 69 6f 6e 20 6f 6e  Row reduction on
2e140 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20 74 68  ly happens if th
2e150 65 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 72  e.    ** table r
2e160 65 61 6c 6c 79 20 69 73 20 74 68 65 20 69 6e 6e  eally is the inn
2e170 65 72 6d 6f 73 74 20 6a 6f 69 6e 2e 20 20 0a 20  ermost join.  . 
2e180 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
2e190 20 73 65 63 6f 6e 64 20 6c 6f 6f 70 20 69 74 65   second loop ite
2e1a0 72 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 70  ration is only p
2e1b0 65 72 66 6f 72 6d 65 64 20 69 66 20 6e 6f 20 6f  erformed if no o
2e1c0 70 74 69 6d 61 6c 20 73 63 61 6e 0a 20 20 20 20  ptimal scan.    
2e1d0 2a 2a 20 73 74 72 61 74 65 67 69 65 73 20 77 65  ** strategies we
2e1e0 72 65 20 66 6f 75 6e 64 20 62 79 20 74 68 65 20  re found by the 
2e1f0 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 2e  first iteration.
2e200 20 54 68 69 73 20 73 65 63 6f 6e 64 20 69 74 65   This second ite
2e210 72 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 73  ration.    ** is
2e220 20 75 73 65 64 20 74 6f 20 73 65 61 72 63 68 20   used to search 
2e230 66 6f 72 20 74 68 65 20 6c 6f 77 65 73 74 20 63  for the lowest c
2e240 6f 73 74 20 73 63 61 6e 20 6f 76 65 72 61 6c 6c  ost scan overall
2e250 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2e260 50 72 65 76 69 6f 75 73 20 76 65 72 73 69 6f 6e  Previous version
2e270 73 20 6f 66 20 53 51 4c 69 74 65 20 70 65 72 66  s of SQLite perf
2e280 6f 72 6d 65 64 20 6f 6e 6c 79 20 74 68 65 20 73  ormed only the s
2e290 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20  econd iteration 
2e2a0 2d 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 78  -.    ** the nex
2e2b0 74 20 6f 75 74 65 72 6d 6f 73 74 20 6c 6f 6f 70  t outermost loop
2e2c0 20 77 61 73 20 61 6c 77 61 79 73 20 74 68 61 74   was always that
2e2d0 20 77 69 74 68 20 74 68 65 20 6c 6f 77 65 73 74   with the lowest
2e2e0 20 6f 76 65 72 61 6c 6c 0a 20 20 20 20 2a 2a 20   overall.    ** 
2e2f0 63 6f 73 74 2e 20 48 6f 77 65 76 65 72 2c 20 74  cost. However, t
2e300 68 69 73 20 6d 65 61 6e 74 20 74 68 61 74 20 53  his meant that S
2e310 51 4c 69 74 65 20 63 6f 75 6c 64 20 73 65 6c 65  QLite could sele
2e320 63 74 20 74 68 65 20 77 72 6f 6e 67 20 70 6c 61  ct the wrong pla
2e330 6e 0a 20 20 20 20 2a 2a 20 66 6f 72 20 73 63 72  n.    ** for scr
2e340 69 70 74 73 20 73 75 63 68 20 61 73 20 74 68 65  ipts such as the
2e350 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20   following:.    
2e360 2a 2a 20 20 20 0a 20 20 20 20 2a 2a 20 20 20 43  **   .    **   C
2e370 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
2e380 2c 20 62 29 3b 20 0a 20 20 20 20 2a 2a 20 20 20  , b); .    **   
2e390 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
2e3a0 63 2c 20 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20  c, d);.    **   
2e3b0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
2e3c0 2c 20 74 31 20 57 48 45 52 45 20 74 32 2e 72 6f  , t1 WHERE t2.ro
2e3d0 77 69 64 20 3d 20 74 31 2e 61 3b 0a 20 20 20 20  wid = t1.a;.    
2e3e0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 62 65  **.    ** The be
2e3f0 73 74 20 73 74 72 61 74 65 67 79 20 69 73 20 74  st strategy is t
2e400 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
2e410 68 20 74 61 62 6c 65 20 74 31 20 66 69 72 73 74  h table t1 first
2e420 2e 20 48 6f 77 65 76 65 72 20 69 74 0a 20 20 20  . However it.   
2e430 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   ** is not possi
2e440 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ble to determine
2e450 20 74 68 69 73 20 77 69 74 68 20 61 20 73 69 6d   this with a sim
2e460 70 6c 65 20 67 72 65 65 64 79 20 61 6c 67 6f 72  ple greedy algor
2e470 69 74 68 6d 2e 0a 20 20 20 20 2a 2a 20 53 69 6e  ithm..    ** Sin
2e480 63 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20 61  ce the cost of a
2e490 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72   linear scan thr
2e4a0 6f 75 67 68 20 74 61 62 6c 65 20 74 32 20 69 73  ough table t2 is
2e4b0 20 74 68 65 20 73 61 6d 65 20 0a 20 20 20 20 2a   the same .    *
2e4c0 2a 20 61 73 20 74 68 65 20 63 6f 73 74 20 6f 66  * as the cost of
2e4d0 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74   a linear scan t
2e4e0 68 72 6f 75 67 68 20 74 61 62 6c 65 20 74 31 2c  hrough table t1,
2e4f0 20 61 20 73 69 6d 70 6c 65 20 67 72 65 65 64 79   a simple greedy
2e500 20 0a 20 20 20 20 2a 2a 20 61 6c 67 6f 72 69 74   .    ** algorit
2e510 68 6d 20 6d 61 79 20 63 68 6f 6f 73 65 20 74 6f  hm may choose to
2e520 20 75 73 65 20 74 32 20 66 6f 72 20 74 68 65 20   use t2 for the 
2e530 6f 75 74 65 72 20 6c 6f 6f 70 2c 20 77 68 69 63  outer loop, whic
2e540 68 20 69 73 20 61 20 6d 75 63 68 0a 20 20 20 20  h is a much.    
2e550 2a 2a 20 63 6f 73 74 6c 69 65 72 20 61 70 70 72  ** costlier appr
2e560 6f 61 63 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  oach..    */.   
2e570 20 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65 64 20   nUnconstrained 
2e580 3d 20 30 3b 0a 20 20 20 20 6e 6f 74 49 6e 64 65  = 0;.    notInde
2e590 78 65 64 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  xed = 0;.    for
2e5a0 28 69 73 4f 70 74 69 6d 61 6c 3d 28 69 46 72 6f  (isOptimal=(iFro
2e5b0 6d 3c 6e 54 61 62 4c 69 73 74 2d 31 29 3b 20 69  m<nTabList-1); i
2e5c0 73 4f 70 74 69 6d 61 6c 3e 3d 30 20 26 26 20 62  sOptimal>=0 && b
2e5d0 65 73 74 4a 3c 30 3b 20 69 73 4f 70 74 69 6d 61  estJ<0; isOptima
2e5e0 6c 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69 74 6d  l--){.      Bitm
2e5f0 61 73 6b 20 6d 61 73 6b 3b 20 20 20 20 20 20 20  ask mask;       
2e600 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
2e610 20 74 61 62 6c 65 73 20 6e 6f 74 20 79 65 74 20   tables not yet 
2e620 72 65 61 64 79 20 2a 2f 0a 20 20 20 20 20 20 66  ready */.      f
2e630 6f 72 28 6a 3d 69 46 72 6f 6d 2c 20 70 54 61 62  or(j=iFrom, pTab
2e640 49 74 65 6d 3d 26 70 54 61 62 4c 69 73 74 2d 3e  Item=&pTabList->
2e650 61 5b 6a 5d 3b 20 6a 3c 6e 54 61 62 4c 69 73 74  a[j]; j<nTabList
2e660 3b 20 6a 2b 2b 2c 20 70 54 61 62 49 74 65 6d 2b  ; j++, pTabItem+
2e670 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
2e680 64 6f 4e 6f 74 52 65 6f 72 64 65 72 3b 20 20 20  doNotReorder;   
2e690 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
2e6a0 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 6e 6f   table should no
2e6b0 74 20 62 65 20 72 65 6f 72 64 65 72 65 64 20 2a  t be reordered *
2e6c0 2f 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 43  /.        WhereC
2e6d0 6f 73 74 20 73 43 6f 73 74 3b 20 20 20 20 20 2f  ost sCost;     /
2e6e0 2a 20 43 6f 73 74 20 69 6e 66 6f 72 6d 61 74 69  * Cost informati
2e6f0 6f 6e 20 66 72 6f 6d 20 62 65 73 74 5b 56 69 72  on from best[Vir
2e700 74 75 61 6c 5d 49 6e 64 65 78 28 29 20 2a 2f 0a  tual]Index() */.
2e710 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
2e720 20 2a 70 4f 42 3b 20 20 20 20 20 20 20 2f 2a 20   *pOB;       /* 
2e730 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2e740 66 6f 72 20 69 6e 64 65 78 20 74 6f 20 6f 70 74  for index to opt
2e750 69 6d 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20  imize */.       
2e760 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74   ExprList *pDist
2e770 3b 20 20 20 20 20 2f 2a 20 44 49 53 54 49 4e 43  ;     /* DISTINC
2e780 54 20 63 6c 61 75 73 65 20 66 6f 72 20 69 6e 64  T clause for ind
2e790 65 78 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 2a  ex to optimize *
2e7a0 2f 0a 20 20 0a 20 20 20 20 20 20 20 20 64 6f 4e  /.  .        doN
2e7b0 6f 74 52 65 6f 72 64 65 72 20 3d 20 20 28 70 54  otReorder =  (pT
2e7c0 61 62 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  abItem->jointype
2e7d0 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43   & (JT_LEFT|JT_C
2e7e0 52 4f 53 53 29 29 21 3d 30 3b 0a 20 20 20 20 20  ROSS))!=0;.     
2e7f0 20 20 20 69 66 28 20 6a 21 3d 69 46 72 6f 6d 20     if( j!=iFrom 
2e800 26 26 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20  && doNotReorder 
2e810 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
2e820 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61   m = getMask(pMa
2e830 73 6b 53 65 74 2c 20 70 54 61 62 49 74 65 6d 2d  skSet, pTabItem-
2e840 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
2e850 20 20 20 69 66 28 20 28 6d 20 26 20 6e 6f 74 52     if( (m & notR
2e860 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20  eady)==0 ){.    
2e870 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 69 46 72        if( j==iFr
2e880 6f 6d 20 29 20 69 46 72 6f 6d 2b 2b 3b 0a 20 20  om ) iFrom++;.  
2e890 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
2e8a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2e8b0 20 20 20 20 6d 61 73 6b 20 3d 20 28 69 73 4f 70      mask = (isOp
2e8c0 74 69 6d 61 6c 20 3f 20 6d 20 3a 20 6e 6f 74 52  timal ? m : notR
2e8d0 65 61 64 79 29 3b 0a 20 20 20 20 20 20 20 20 70  eady);.        p
2e8e0 4f 42 20 3d 20 28 69 3d 3d 30 29 20 3f 20 70 4f  OB = (i==0) ? pO
2e8f0 72 64 65 72 42 79 20 3a 20 30 3b 0a 20 20 20 20  rderBy : 0;.    
2e900 20 20 20 20 70 44 69 73 74 20 3d 20 28 69 3d 3d      pDist = (i==
2e910 30 20 3f 20 70 44 69 73 74 69 6e 63 74 20 3a 20  0 ? pDistinct : 
2e920 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
2e930 70 54 61 62 49 74 65 6d 2d 3e 70 49 6e 64 65 78  pTabItem->pIndex
2e940 3d 3d 30 20 29 20 6e 55 6e 63 6f 6e 73 74 72 61  ==0 ) nUnconstra
2e950 69 6e 65 64 2b 2b 3b 0a 20 20 0a 20 20 20 20 20  ined++;.  .     
2e960 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22     WHERETRACE(("
2e970 3d 3d 3d 20 74 72 79 69 6e 67 20 74 61 62 6c 65  === trying table
2e980 20 25 64 20 77 69 74 68 20 69 73 4f 70 74 69 6d   %d with isOptim
2e990 61 6c 3d 25 64 20 3d 3d 3d 5c 6e 22 2c 0a 20 20  al=%d ===\n",.  
2e9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e9b0 20 20 6a 2c 20 69 73 4f 70 74 69 6d 61 6c 29 29    j, isOptimal))
2e9c0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2e9d0 28 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  ( pTabItem->pTab
2e9e0 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
2e9f0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2ea00 41 42 4c 45 0a 20 20 20 20 20 20 20 20 69 66 28  ABLE.        if(
2ea10 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 49   IsVirtual(pTabI
2ea20 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20  tem->pTab) ){.  
2ea30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2ea40 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 2a 70 70 20  index_info **pp 
2ea50 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e  = &pWInfo->a[j].
2ea60 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pIdxInfo;.      
2ea70 20 20 20 20 62 65 73 74 56 69 72 74 75 61 6c 49      bestVirtualI
2ea80 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 57 43  ndex(pParse, pWC
2ea90 2c 20 70 54 61 62 49 74 65 6d 2c 20 6d 61 73 6b  , pTabItem, mask
2eaa0 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4f 42 2c  , notReady, pOB,
2eab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2eac0 20 20 20 20 20 20 20 20 20 20 20 20 26 73 43 6f              &sCo
2ead0 73 74 2c 20 70 70 29 3b 0a 20 20 20 20 20 20 20  st, pp);.       
2eae0 20 7d 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20   }else .#endif. 
2eaf0 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
2eb00 20 20 20 62 65 73 74 42 74 72 65 65 49 6e 64 65     bestBtreeInde
2eb10 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70  x(pParse, pWC, p
2eb20 54 61 62 49 74 65 6d 2c 20 6d 61 73 6b 2c 20 6e  TabItem, mask, n
2eb30 6f 74 52 65 61 64 79 2c 20 70 4f 42 2c 0a 20 20  otReady, pOB,.  
2eb40 20 20 20 20 20 20 20 20 20 20 20 20 70 44 69 73              pDis
2eb50 74 2c 20 26 73 43 6f 73 74 29 3b 0a 20 20 20 20  t, &sCost);.    
2eb60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
2eb70 73 65 72 74 28 20 69 73 4f 70 74 69 6d 61 6c 20  sert( isOptimal 
2eb80 7c 7c 20 28 73 43 6f 73 74 2e 75 73 65 64 26 6e  || (sCost.used&n
2eb90 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 3b 0a 0a  otReady)==0 );..
2eba0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e          /* If an
2ebb0 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
2ebc0 73 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74  se is present, t
2ebd0 68 65 6e 20 74 68 65 20 70 6c 61 6e 20 6d 75 73  hen the plan mus
2ebe0 74 20 75 73 65 20 74 68 61 74 0a 20 20 20 20 20  t use that.     
2ebf0 20 20 20 2a 2a 20 69 6e 64 65 78 20 69 66 20 69     ** index if i
2ec00 74 20 75 73 65 73 20 61 6e 79 20 69 6e 64 65 78  t uses any index
2ec10 20 61 74 20 61 6c 6c 20 2a 2f 0a 20 20 20 20 20   at all */.     
2ec20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 49     assert( pTabI
2ec30 74 65 6d 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 0a  tem->pIndex==0 .
2ec40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec50 20 20 7c 7c 20 28 73 43 6f 73 74 2e 70 6c 61 6e    || (sCost.plan
2ec60 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
2ec70 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d  _NOT_FULLSCAN)==
2ec80 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
2ec90 20 20 20 20 7c 7c 20 73 43 6f 73 74 2e 70 6c 61      || sCost.pla
2eca0 6e 2e 75 2e 70 49 64 78 3d 3d 70 54 61 62 49 74  n.u.pIdx==pTabIt
2ecb0 65 6d 2d 3e 70 49 6e 64 65 78 20 29 3b 0a 0a 20  em->pIndex );.. 
2ecc0 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 74         if( isOpt
2ecd0 69 6d 61 6c 20 26 26 20 28 73 43 6f 73 74 2e 70  imal && (sCost.p
2ece0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
2ecf0 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e  ERE_NOT_FULLSCAN
2ed00 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2ed10 20 20 6e 6f 74 49 6e 64 65 78 65 64 20 7c 3d 20    notIndexed |= 
2ed20 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  m;.        }..  
2ed30 20 20 20 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69        /* Conditi
2ed40 6f 6e 73 20 75 6e 64 65 72 20 77 68 69 63 68 20  ons under which 
2ed50 74 68 69 73 20 74 61 62 6c 65 20 62 65 63 6f 6d  this table becom
2ed60 65 73 20 74 68 65 20 62 65 73 74 20 73 6f 20 66  es the best so f
2ed70 61 72 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ar:.        **. 
2ed80 20 20 20 20 20 20 20 2a 2a 20 20 20 28 31 29 20         **   (1) 
2ed90 54 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 6e  The table must n
2eda0 6f 74 20 64 65 70 65 6e 64 20 6f 6e 20 6f 74 68  ot depend on oth
2edb0 65 72 20 74 61 62 6c 65 73 20 74 68 61 74 20 68  er tables that h
2edc0 61 76 65 20 6e 6f 74 0a 20 20 20 20 20 20 20 20  ave not.        
2edd0 2a 2a 20 20 20 20 20 20 20 79 65 74 20 72 75 6e  **       yet run
2ede0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
2edf0 20 20 20 20 20 2a 2a 20 20 20 28 32 29 20 41 20       **   (2) A 
2ee00 66 75 6c 6c 2d 74 61 62 6c 65 2d 73 63 61 6e 20  full-table-scan 
2ee10 70 6c 61 6e 20 63 61 6e 6e 6f 74 20 73 75 70 65  plan cannot supe
2ee20 72 63 65 64 65 20 69 6e 64 65 78 65 64 20 70 6c  rcede indexed pl
2ee30 61 6e 20 75 6e 6c 65 73 73 0a 20 20 20 20 20 20  an unless.      
2ee40 20 20 2a 2a 20 20 20 20 20 20 20 74 68 65 20 66    **       the f
2ee50 75 6c 6c 2d 74 61 62 6c 65 2d 73 63 61 6e 20 69  ull-table-scan i
2ee60 73 20 61 6e 20 22 6f 70 74 69 6d 61 6c 22 20 70  s an "optimal" p
2ee70 6c 61 6e 20 61 73 20 64 65 66 69 6e 65 64 20 61  lan as defined a
2ee80 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  bove..        **
2ee90 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 28 33  .        **   (3
2eea0 29 20 41 6c 6c 20 74 61 62 6c 65 73 20 68 61 76  ) All tables hav
2eeb0 65 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20  e an INDEXED BY 
2eec0 63 6c 61 75 73 65 20 6f 72 20 74 68 69 73 20 74  clause or this t
2eed0 61 62 6c 65 20 6c 61 63 6b 73 20 61 6e 0a 20 20  able lacks an.  
2eee0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 49        **       I
2eef0 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
2ef00 20 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20 75   or this table u
2ef10 73 65 73 20 74 68 65 20 73 70 65 63 69 66 69 63  ses the specific
2ef20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
2ef30 20 20 69 6e 64 65 78 20 73 70 65 63 69 66 69 65    index specifie
2ef40 64 20 62 79 20 69 74 73 20 49 4e 44 45 58 45 44  d by its INDEXED
2ef50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68 69   BY clause.  Thi
2ef60 73 20 72 75 6c 65 20 65 6e 73 75 72 65 73 0a 20  s rule ensures. 
2ef70 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20         **       
2ef80 74 68 61 74 20 61 20 62 65 73 74 2d 73 6f 2d 66  that a best-so-f
2ef90 61 72 20 69 73 20 61 6c 77 61 79 73 20 73 65 6c  ar is always sel
2efa0 65 63 74 65 64 20 65 76 65 6e 20 69 66 20 61 6e  ected even if an
2efb0 20 69 6d 70 6f 73 73 69 62 6c 65 0a 20 20 20 20   impossible.    
2efc0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 63 6f 6d      **       com
2efd0 62 69 6e 61 74 69 6f 6e 20 6f 66 20 49 4e 44 45  bination of INDE
2efe0 58 45 44 20 42 59 20 63 6c 61 75 73 65 73 20 61  XED BY clauses a
2eff0 72 65 20 67 69 76 65 6e 2e 20 20 54 68 65 20 65  re given.  The e
2f000 72 72 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  rror.        ** 
2f010 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20 64 65        will be de
2f020 74 65 63 74 65 64 20 61 6e 64 20 72 65 6c 61 79  tected and relay
2f030 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20 61  ed back to the a
2f040 70 70 6c 69 63 61 74 69 6f 6e 20 6c 61 74 65 72  pplication later
2f050 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  ..        **    
2f060 20 20 20 54 68 65 20 4e 45 56 45 52 28 29 20 63     The NEVER() c
2f070 6f 6d 65 73 20 61 62 6f 75 74 20 62 65 63 61 75  omes about becau
2f080 73 65 20 72 75 6c 65 20 28 32 29 20 61 62 6f 76  se rule (2) abov
2f090 65 20 70 72 65 76 65 6e 74 73 0a 20 20 20 20 20  e prevents.     
2f0a0 20 20 20 2a 2a 20 20 20 20 20 20 20 41 6e 20 69     **       An i
2f0b0 6e 64 65 78 61 62 6c 65 20 66 75 6c 6c 2d 74 61  ndexable full-ta
2f0c0 62 6c 65 2d 73 63 61 6e 20 66 72 6f 6d 20 72 65  ble-scan from re
2f0d0 61 63 68 69 6e 67 20 72 75 6c 65 20 28 33 29 2e  aching rule (3).
2f0e0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2f0f0 20 20 20 20 2a 2a 20 20 20 28 34 29 20 54 68 65      **   (4) The
2f100 20 70 6c 61 6e 20 63 6f 73 74 20 6d 75 73 74 20   plan cost must 
2f110 62 65 20 6c 6f 77 65 72 20 74 68 61 6e 20 70 72  be lower than pr
2f120 69 6f 72 20 70 6c 61 6e 73 20 6f 72 20 65 6c 73  ior plans or els
2f130 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  e the.        **
2f140 20 20 20 20 20 20 20 63 6f 73 74 20 6d 75 73 74         cost must
2f150 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 6e 64   be the same and
2f160 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
2f170 6f 77 73 20 6d 75 73 74 20 62 65 20 6c 6f 77 65  ows must be lowe
2f180 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  r..        */.  
2f190 20 20 20 20 20 20 69 66 28 20 28 73 43 6f 73 74        if( (sCost
2f1a0 2e 75 73 65 64 26 6e 6f 74 52 65 61 64 79 29 3d  .used&notReady)=
2f1b0 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =0              
2f1c0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20           /* (1) 
2f1d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  */.            &
2f1e0 26 20 28 62 65 73 74 4a 3c 30 20 7c 7c 20 28 6e  & (bestJ<0 || (n
2f1f0 6f 74 49 6e 64 65 78 65 64 26 6d 29 21 3d 30 20  otIndexed&m)!=0 
2f200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f210 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (2) */.        
2f220 20 20 20 20 20 20 20 20 7c 7c 20 28 62 65 73 74          || (best
2f230 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  Plan.plan.wsFlag
2f240 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55  s & WHERE_NOT_FU
2f250 4c 4c 53 43 41 4e 29 3d 3d 30 0a 20 20 20 20 20  LLSCAN)==0.     
2f260 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 73             || (s
2f270 43 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  Cost.plan.wsFlag
2f280 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55  s & WHERE_NOT_FU
2f290 4c 4c 53 43 41 4e 29 21 3d 30 29 0a 20 20 20 20  LLSCAN)!=0).    
2f2a0 20 20 20 20 20 20 20 20 26 26 20 28 6e 55 6e 63          && (nUnc
2f2b0 6f 6e 73 74 72 61 69 6e 65 64 3d 3d 30 20 7c 7c  onstrained==0 ||
2f2c0 20 70 54 61 62 49 74 65 6d 2d 3e 70 49 6e 64 65   pTabItem->pInde
2f2d0 78 3d 3d 30 20 20 20 2f 2a 20 28 33 29 20 2a 2f  x==0   /* (3) */
2f2e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f2f0 20 7c 7c 20 4e 45 56 45 52 28 28 73 43 6f 73 74   || NEVER((sCost
2f300 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
2f310 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43  WHERE_NOT_FULLSC
2f320 41 4e 29 21 3d 30 29 29 0a 20 20 20 20 20 20 20  AN)!=0)).       
2f330 20 20 20 20 20 26 26 20 28 62 65 73 74 4a 3c 30       && (bestJ<0
2f340 20 7c 7c 20 73 43 6f 73 74 2e 72 43 6f 73 74 3c   || sCost.rCost<
2f350 62 65 73 74 50 6c 61 6e 2e 72 43 6f 73 74 20 20  bestPlan.rCost  
2f360 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20      /* (4) */.  
2f370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
2f380 20 28 73 43 6f 73 74 2e 72 43 6f 73 74 3c 3d 62   (sCost.rCost<=b
2f390 65 73 74 50 6c 61 6e 2e 72 43 6f 73 74 20 0a 20  estPlan.rCost . 
2f3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f3b0 26 26 20 73 43 6f 73 74 2e 70 6c 61 6e 2e 6e 52  && sCost.plan.nR
2f3c0 6f 77 3c 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e  ow<bestPlan.plan
2f3d0 2e 6e 52 6f 77 29 29 0a 20 20 20 20 20 20 20 20  .nRow)).        
2f3e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57 48 45  ){.          WHE
2f3f0 52 45 54 52 41 43 45 28 28 22 3d 3d 3d 20 74 61  RETRACE(("=== ta
2f400 62 6c 65 20 25 64 20 69 73 20 62 65 73 74 20 73  ble %d is best s
2f410 6f 20 66 61 72 22 0a 20 20 20 20 20 20 20 20 20  o far".         
2f420 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 77               " w
2f430 69 74 68 20 63 6f 73 74 3d 25 67 20 61 6e 64 20  ith cost=%g and 
2f440 6e 52 6f 77 3d 25 67 5c 6e 22 2c 0a 20 20 20 20  nRow=%g\n",.    
2f450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f460 20 20 6a 2c 20 73 43 6f 73 74 2e 72 43 6f 73 74    j, sCost.rCost
2f470 2c 20 73 43 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f  , sCost.plan.nRo
2f480 77 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  w));.          b
2f490 65 73 74 50 6c 61 6e 20 3d 20 73 43 6f 73 74 3b  estPlan = sCost;
2f4a0 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74 4a  .          bestJ
2f4b0 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = j;.        }.
2f4c0 20 20 20 20 20 20 20 20 69 66 28 20 64 6f 4e 6f          if( doNo
2f4d0 74 52 65 6f 72 64 65 72 20 29 20 62 72 65 61 6b  tReorder ) break
2f4e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2f4f0 20 20 20 20 61 73 73 65 72 74 28 20 62 65 73 74      assert( best
2f500 4a 3e 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  J>=0 );.    asse
2f510 72 74 28 20 6e 6f 74 52 65 61 64 79 20 26 20 67  rt( notReady & g
2f520 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
2f530 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73   pTabList->a[bes
2f540 74 4a 5d 2e 69 43 75 72 73 6f 72 29 20 29 3b 0a  tJ].iCursor) );.
2f550 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28      WHERETRACE((
2f560 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 73  "*** Optimizer s
2f570 65 6c 65 63 74 73 20 74 61 62 6c 65 20 25 64 20  elects table %d 
2f580 66 6f 72 20 6c 6f 6f 70 20 25 64 22 0a 20 20 20  for loop %d".   
2f590 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 77               " w
2f5a0 69 74 68 20 63 6f 73 74 3d 25 67 20 61 6e 64 20  ith cost=%g and 
2f5b0 6e 52 6f 77 3d 25 67 5c 6e 22 2c 0a 20 20 20 20  nRow=%g\n",.    
2f5c0 20 20 20 20 20 20 20 20 20 20 20 20 62 65 73 74              best
2f5d0 4a 2c 20 70 4c 65 76 65 6c 2d 70 57 49 6e 66 6f  J, pLevel-pWInfo
2f5e0 2d 3e 61 2c 20 62 65 73 74 50 6c 61 6e 2e 72 43  ->a, bestPlan.rC
2f5f0 6f 73 74 2c 20 62 65 73 74 50 6c 61 6e 2e 70 6c  ost, bestPlan.pl
2f600 61 6e 2e 6e 52 6f 77 29 29 3b 0a 20 20 20 20 69  an.nRow));.    i
2f610 66 28 20 28 62 65 73 74 50 6c 61 6e 2e 70 6c 61  f( (bestPlan.pla
2f620 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
2f630 45 5f 4f 52 44 45 52 42 59 29 21 3d 30 20 29 7b  E_ORDERBY)!=0 ){
2f640 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e  .      pWInfo->n
2f650 4f 42 53 61 74 20 3d 20 70 4f 72 64 65 72 42 79  OBSat = pOrderBy
2f660 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 7d 0a 20  ->nExpr;.    }. 
2f670 20 20 20 69 66 28 20 28 62 65 73 74 50 6c 61 6e     if( (bestPlan
2f680 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
2f690 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 29 21  WHERE_DISTINCT)!
2f6a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
2f6b0 72 74 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73  rt( pWInfo->eDis
2f6c0 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20  tinct==0 );.    
2f6d0 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69    pWInfo->eDisti
2f6e0 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54  nct = WHERE_DIST
2f6f0 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20  INCT_ORDERED;.  
2f700 20 20 7d 0a 20 20 20 20 61 6e 64 46 6c 61 67 73    }.    andFlags
2f710 20 26 3d 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61   &= bestPlan.pla
2f720 6e 2e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70  n.wsFlags;.    p
2f730 4c 65 76 65 6c 2d 3e 70 6c 61 6e 20 3d 20 62 65  Level->plan = be
2f740 73 74 50 6c 61 6e 2e 70 6c 61 6e 3b 0a 20 20 20  stPlan.plan;.   
2f750 20 74 65 73 74 63 61 73 65 28 20 62 65 73 74 50   testcase( bestP
2f760 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  lan.plan.wsFlags
2f770 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
2f780 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
2f790 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e  ( bestPlan.plan.
2f7a0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2f7b0 54 45 4d 50 5f 49 4e 44 45 58 20 29 3b 0a 20 20  TEMP_INDEX );.  
2f7c0 20 20 69 66 28 20 62 65 73 74 50 6c 61 6e 2e 70    if( bestPlan.p
2f7d0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 28 57  lan.wsFlags & (W
2f7e0 48 45 52 45 5f 49 4e 44 45 58 45 44 7c 57 48 45  HERE_INDEXED|WHE
2f7f0 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 20 29  RE_TEMP_INDEX) )
2f800 7b 0a 20 20 20 20 20 20 69 66 28 20 28 77 63 74  {.      if( (wct
2f810 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2f820 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 0a  ONETABLE_ONLY) .
2f830 20 20 20 20 20 20 20 26 26 20 28 62 65 73 74 50         && (bestP
2f840 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  lan.plan.wsFlags
2f850 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
2f860 44 45 58 29 3d 3d 30 20 0a 20 20 20 20 20 20 29  DEX)==0 .      )
2f870 7b 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c  {.        pLevel
2f880 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 49 64 78  ->iIdxCur = iIdx
2f890 43 75 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Cur;.      }else
2f8a0 7b 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c  {.        pLevel
2f8b0 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61 72  ->iIdxCur = pPar
2f8c0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
2f8d0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
2f8e0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64       pLevel->iId
2f8f0 78 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  xCur = -1;.    }
2f900 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d  .    notReady &=
2f910 20 7e 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53   ~getMask(pMaskS
2f920 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
2f930 62 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72 29 3b  bestJ].iCursor);
2f940 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72  .    pLevel->iFr
2f950 6f 6d 20 3d 20 28 75 38 29 62 65 73 74 4a 3b 0a  om = (u8)bestJ;.
2f960 20 20 20 20 69 66 28 20 62 65 73 74 50 6c 61 6e      if( bestPlan
2f970 2e 70 6c 61 6e 2e 6e 52 6f 77 3e 3d 28 64 6f 75  .plan.nRow>=(dou
2f980 62 6c 65 29 31 20 29 7b 0a 20 20 20 20 20 20 70  ble)1 ){.      p
2f990 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
2f9a0 70 20 2a 3d 20 62 65 73 74 50 6c 61 6e 2e 70 6c  p *= bestPlan.pl
2f9b0 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20 7d 0a 0a  an.nRow;.    }..
2f9c0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
2f9d0 74 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73  t if the table s
2f9e0 63 61 6e 6e 65 64 20 62 79 20 74 68 69 73 20 6c  canned by this l
2f9f0 6f 6f 70 20 69 74 65 72 61 74 69 6f 6e 20 68 61  oop iteration ha
2fa00 64 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4e 44 45  d an.    ** INDE
2fa10 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 61 74  XED BY clause at
2fa20 74 61 63 68 65 64 20 74 6f 20 69 74 2c 20 74 68  tached to it, th
2fa30 61 74 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64  at the named ind
2fa40 65 78 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20  ex is being.    
2fa50 2a 2a 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  ** used for the 
2fa60 73 63 61 6e 2e 20 49 66 20 6e 6f 74 2c 20 74 68  scan. If not, th
2fa70 65 6e 20 71 75 65 72 79 20 63 6f 6d 70 69 6c 61  en query compila
2fa80 74 69 6f 6e 20 68 61 73 20 66 61 69 6c 65 64 2e  tion has failed.
2fa90 0a 20 20 20 20 2a 2a 20 52 65 74 75 72 6e 20 61  .    ** Return a
2faa0 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a  n error..    */.
2fab0 20 20 20 20 70 49 64 78 20 3d 20 70 54 61 62 4c      pIdx = pTabL
2fac0 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 70 49  ist->a[bestJ].pI
2fad0 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 49  ndex;.    if( pI
2fae0 64 78 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  dx ){.      if( 
2faf0 28 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77  (bestPlan.plan.w
2fb00 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
2fb10 4e 44 45 58 45 44 29 3d 3d 30 20 29 7b 0a 20 20  NDEXED)==0 ){.  
2fb20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2fb30 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
2fb40 61 6e 6e 6f 74 20 75 73 65 20 69 6e 64 65 78 3a  annot use index:
2fb50 20 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d   %s", pIdx->zNam
2fb60 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  e);.        goto
2fb70 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
2fb80 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2fb90 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20         /* If an 
2fba0 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
2fbb0 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 20 62  e is used, the b
2fbc0 65 73 74 49 6e 64 65 78 28 29 20 66 75 6e 63 74  estIndex() funct
2fbd0 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 20 20 2a  ion is.        *
2fbe0 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  * guaranteed to 
2fbf0 66 69 6e 64 20 74 68 65 20 69 6e 64 65 78 20 73  find the index s
2fc00 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20  pecified in the 
2fc10 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
2fc20 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20  e.        ** if 
2fc30 69 74 20 66 69 6e 64 20 61 6e 20 69 6e 64 65 78  it find an index
2fc40 20 61 74 20 61 6c 6c 2e 20 2a 2f 0a 20 20 20 20   at all. */.    
2fc50 20 20 20 20 61 73 73 65 72 74 28 20 62 65 73 74      assert( best
2fc60 50 6c 61 6e 2e 70 6c 61 6e 2e 75 2e 70 49 64 78  Plan.plan.u.pIdx
2fc70 3d 3d 70 49 64 78 20 29 3b 0a 20 20 20 20 20 20  ==pIdx );.      
2fc80 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 57 48  }.    }.  }.  WH
2fc90 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f  ERETRACE(("*** O
2fca0 70 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65  ptimizer Finishe
2fcb0 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 69 66  d ***\n"));.  if
2fcc0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
2fcd0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
2fce0 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77  ed ){.    goto w
2fcf0 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
2fd00 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
2fd10 20 74 6f 74 61 6c 20 71 75 65 72 79 20 6f 6e 6c   total query onl
2fd20 79 20 73 65 6c 65 63 74 73 20 61 20 73 69 6e 67  y selects a sing
2fd30 6c 65 20 72 6f 77 2c 20 74 68 65 6e 20 74 68 65  le row, then the
2fd40 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20 63   ORDER BY.  ** c
2fd50 6c 61 75 73 65 20 69 73 20 69 72 72 65 6c 65 76  lause is irrelev
2fd60 61 6e 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ant..  */.  if( 
2fd70 28 61 6e 64 46 6c 61 67 73 20 26 20 57 48 45 52  (andFlags & WHER
2fd80 45 5f 55 4e 49 51 55 45 29 21 3d 30 20 26 26 20  E_UNIQUE)!=0 && 
2fd90 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
2fda0 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d  pWInfo->nOBSat =
2fdb0 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
2fdc0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
2fdd0 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20  he caller is an 
2fde0 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
2fdf0 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
2fe00 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20  is requesting.  
2fe10 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d  ** to use a one-
2fe20 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20  pass algorithm, 
2fe30 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69  determine if thi
2fe40 73 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  s is appropriate
2fe50 2e 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d 70  ..  ** The one-p
2fe60 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e  ass algorithm on
2fe70 6c 79 20 77 6f 72 6b 73 20 69 66 20 74 68 65 20  ly works if the 
2fe80 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
2fe90 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 74 68  straints.  ** th
2fea0 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 75  e statement to u
2feb0 70 64 61 74 65 20 61 20 73 69 6e 67 6c 65 20 72  pdate a single r
2fec0 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ow..  */.  asser
2fed0 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  t( (wctrlFlags &
2fee0 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
2fef0 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57  ESIRED)==0 || pW
2ff00 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20  Info->nLevel==1 
2ff10 29 3b 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46  );.  if( (wctrlF
2ff20 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
2ff30 50 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30  PASS_DESIRED)!=0
2ff40 20 26 26 20 28 61 6e 64 46 6c 61 67 73 20 26 20   && (andFlags & 
2ff50 57 48 45 52 45 5f 55 4e 49 51 55 45 29 21 3d 30  WHERE_UNIQUE)!=0
2ff60 20 29 7b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e   ){.    pWInfo->
2ff70 6f 6b 4f 6e 65 50 61 73 73 20 3d 20 31 3b 0a 20  okOnePass = 1;. 
2ff80 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e     pWInfo->a[0].
2ff90 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 3d 20  plan.wsFlags &= 
2ffa0 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b  ~WHERE_IDX_ONLY;
2ffb0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
2ffc0 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  all tables in th
2ffd0 65 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61  e pTabList and a
2ffe0 6e 79 20 69 6e 64 69 63 65 73 20 73 65 6c 65 63  ny indices selec
2fff0 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61  ted for.  ** sea
30000 72 63 68 69 6e 67 20 74 68 6f 73 65 20 74 61 62  rching those tab
30010 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  les..  */.  sqli
30020 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
30030 65 6d 61 28 70 50 61 72 73 65 2c 20 2d 31 29 3b  ema(pParse, -1);
30040 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 63   /* Insert the c
30050 6f 6f 6b 69 65 20 76 65 72 69 66 69 65 72 20 47  ookie verifier G
30060 6f 74 6f 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64  oto */.  notRead
30070 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  y = ~(Bitmask)0;
30080 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  .  pWInfo->nRowO
30090 75 74 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a  ut = (double)1;.
300a0 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65    for(i=0, pLeve
300b0 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 6e  l=pWInfo->a; i<n
300c0 54 61 62 4c 69 73 74 3b 20 69 2b 2b 2c 20 70 4c  TabList; i++, pL
300d0 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62  evel++){.    Tab
300e0 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a  le *pTab;     /*
300f0 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   Table to open *
30100 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20  /.    int iDb;  
30110 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
30120 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  of database cont
30130 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64  aining table/ind
30140 65 78 20 2a 2f 0a 0a 20 20 20 20 70 54 61 62 49  ex */..    pTabI
30150 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
30160 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
30170 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54  ];.    pTab = pT
30180 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  abItem->pTab;.  
30190 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75    pLevel->iTabCu
301a0 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  r = pTabItem->iC
301b0 75 72 73 6f 72 3b 0a 20 20 20 20 70 57 49 6e 66  ursor;.    pWInf
301c0 6f 2d 3e 6e 52 6f 77 4f 75 74 20 2a 3d 20 70 4c  o->nRowOut *= pL
301d0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 3b  evel->plan.nRow;
301e0 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
301f0 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
30200 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
30210 61 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61  a);.    if( (pTa
30220 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
30230 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c  _Ephemeral)!=0 |
30240 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  | pTab->pSelect 
30250 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  ){.      /* Do n
30260 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65  othing */.    }e
30270 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  lse.#ifndef SQLI
30280 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
30290 41 42 4c 45 0a 20 20 20 20 69 66 28 20 28 70 4c  ABLE.    if( (pL
302a0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
302b0 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
302c0 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20  ALTABLE)!=0 ){. 
302d0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
302e0 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74 20  *pVTab = (const 
302f0 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65  char *)sqlite3Ge
30300 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  tVTable(db, pTab
30310 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 75  );.      int iCu
30320 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  r = pTabItem->iC
30330 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c  ursor;.      sql
30340 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
30350 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72  , OP_VOpen, iCur
30360 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c 20 50  , 0, 0, pVTab, P
30370 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c  4_VTAB);.    }el
30380 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  se.#endif.    if
30390 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
303a0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
303b0 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20  IDX_ONLY)==0.   
303c0 20 20 20 20 20 20 26 26 20 28 77 63 74 72 6c 46        && (wctrlF
303d0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49  lags & WHERE_OMI
303e0 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30  T_OPEN_CLOSE)==0
303f0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70   ){.      int op
30400 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65   = pWInfo->okOne
30410 50 61 73 73 20 3f 20 4f 50 5f 4f 70 65 6e 57 72  Pass ? OP_OpenWr
30420 69 74 65 20 3a 20 4f 50 5f 4f 70 65 6e 52 65 61  ite : OP_OpenRea
30430 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  d;.      sqlite3
30440 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
30450 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
30460 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  sor, iDb, pTab, 
30470 6f 70 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  op);.      testc
30480 61 73 65 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d  ase( pTab->nCol=
30490 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
304a0 74 65 73 74 63 61 73 65 28 20 70 54 61 62 2d 3e  testcase( pTab->
304b0 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20  nCol==BMS );.   
304c0 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e     if( !pWInfo->
304d0 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61  okOnePass && pTa
304e0 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 29 7b 0a 20  b->nCol<BMS ){. 
304f0 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62         Bitmask b
30500 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c   = pTabItem->col
30510 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69 6e  Used;.        in
30520 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  t n = 0;.       
30530 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31   for(; b; b=b>>1
30540 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20  , n++){}.       
30550 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
30560 67 65 50 34 28 76 2c 20 73 71 6c 69 74 65 33 56  geP4(v, sqlite3V
30570 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
30580 29 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20  )-1, .          
30590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
305a0 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f    SQLITE_INT_TO_
305b0 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32  PTR(n), P4_INT32
305c0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
305d0 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c  t( n<=pTab->nCol
305e0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
305f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
30600 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
30610 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
30620 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
30630 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69  zName);.    }.#i
30640 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
30650 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
30660 58 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65  X.    if( (pLeve
30670 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
30680 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44  & WHERE_TEMP_IND
30690 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  EX)!=0 ){.      
306a0 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74  constructAutomat
306b0 69 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  icIndex(pParse, 
306c0 70 57 43 2c 20 70 54 61 62 49 74 65 6d 2c 20 6e  pWC, pTabItem, n
306d0 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 29  otReady, pLevel)
306e0 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
306f0 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76  if.    if( (pLev
30700 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
30710 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
30720 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 49 6e  )!=0 ){.      In
30730 64 65 78 20 2a 70 49 78 20 3d 20 70 4c 65 76 65  dex *pIx = pLeve
30740 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a  l->plan.u.pIdx;.
30750 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
30760 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64  Key = sqlite3Ind
30770 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65  exKeyinfo(pParse
30780 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20 69 6e  , pIx);.      in
30790 74 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70 4c  t iIndexCur = pL
307a0 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
307b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 78       assert( pIx
307c0 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
307d0 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  >pSchema );.    
307e0 20 20 61 73 73 65 72 74 28 20 69 49 6e 64 65 78    assert( iIndex
307f0 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  Cur>=0 );.      
30800 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
30810 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  4(v, OP_OpenRead
30820 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 70 49 78  , iIndexCur, pIx
30830 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20 20  ->tnum, iDb,.   
30840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30850 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
30860 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
30870 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 56 64 62  DOFF);.      Vdb
30880 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
30890 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b  ", pIx->zName));
308a0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
308b0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
308c0 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
308d0 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d  .    notReady &=
308e0 20 7e 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70   ~getMask(pWC->p
308f0 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 49 74 65  MaskSet, pTabIte
30900 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d  m->iCursor);.  }
30910 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20  .  pWInfo->iTop 
30920 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
30930 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
30940 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
30950 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65  led ) goto where
30960 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f  BeginError;..  /
30970 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 63  * Generate the c
30980 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65  ode to do the se
30990 61 72 63 68 2e 20 20 45 61 63 68 20 69 74 65 72  arch.  Each iter
309a0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72  ation of the for
309b0 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77  .  ** loop below
309c0 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
309d0 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73  for a single nes
309e0 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20  ted loop of the 
309f0 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e  VM.  ** program.
30a00 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79  .  */.  notReady
30a10 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
30a20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 61    for(i=0; i<nTa
30a30 62 4c 69 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  bList; i++){.   
30a40 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
30a50 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 65 78 70  o->a[i];.    exp
30a60 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 70 50 61 72  lainOneScan(pPar
30a70 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c  se, pTabList, pL
30a80 65 76 65 6c 2c 20 69 2c 20 70 4c 65 76 65 6c 2d  evel, i, pLevel-
30a90 3e 69 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c 61  >iFrom, wctrlFla
30aa0 67 73 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64  gs);.    notRead
30ab0 79 20 3d 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53  y = codeOneLoopS
30ac0 74 61 72 74 28 70 57 49 6e 66 6f 2c 20 69 2c 20  tart(pWInfo, i, 
30ad0 77 63 74 72 6c 46 6c 61 67 73 2c 20 6e 6f 74 52  wctrlFlags, notR
30ae0 65 61 64 79 29 3b 0a 20 20 20 20 70 57 49 6e 66  eady);.    pWInf
30af0 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70  o->iContinue = p
30b00 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b  Level->addrCont;
30b10 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
30b20 49 54 45 5f 54 45 53 54 20 20 2f 2a 20 46 6f 72  ITE_TEST  /* For
30b30 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
30b40 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20  ugging use only 
30b50 2a 2f 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 69  */.  /* Record i
30b60 6e 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e  n the query plan
30b70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
30b80 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ut the current t
30b90 61 62 6c 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68  able.  ** and th
30ba0 65 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20  e index used to 
30bb0 61 63 63 65 73 73 20 69 74 20 28 69 66 20 61 6e  access it (if an
30bc0 79 29 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c  y).  If the tabl
30bd0 65 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69 73  e itself.  ** is
30be0 20 6e 6f 74 20 75 73 65 64 2c 20 69 74 73 20 6e   not used, its n
30bf0 61 6d 65 20 69 73 20 6a 75 73 74 20 27 7b 7d 27  ame is just '{}'
30c00 2e 20 20 49 66 20 6e 6f 20 69 6e 64 65 78 20 69  .  If no index i
30c10 73 20 75 73 65 64 0a 20 20 2a 2a 20 74 68 65 20  s used.  ** the 
30c20 69 6e 64 65 78 20 69 73 20 6c 69 73 74 65 64 20  index is listed 
30c30 61 73 20 22 7b 7d 22 2e 20 20 49 66 20 74 68 65  as "{}".  If the
30c40 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20   primary key is 
30c50 75 73 65 64 20 74 68 65 0a 20 20 2a 2a 20 69 6e  used the.  ** in
30c60 64 65 78 20 6e 61 6d 65 20 69 73 20 27 2a 27 2e  dex name is '*'.
30c70 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
30c80 20 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 2b 2b   i<nTabList; i++
30c90 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  ){.    char *z;.
30ca0 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69      int n;.    i
30cb0 6e 74 20 77 3b 0a 20 20 20 20 70 4c 65 76 65 6c  nt w;.    pLevel
30cc0 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d   = &pWInfo->a[i]
30cd0 3b 0a 20 20 20 20 77 20 3d 20 70 4c 65 76 65 6c  ;.    w = pLevel
30ce0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a  ->plan.wsFlags;.
30cf0 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26      pTabItem = &
30d00 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
30d10 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
30d20 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 7a 41  z = pTabItem->zA
30d30 6c 69 61 73 3b 0a 20 20 20 20 69 66 28 20 7a 3d  lias;.    if( z=
30d40 3d 30 20 29 20 7a 20 3d 20 70 54 61 62 49 74 65  =0 ) z = pTabIte
30d50 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a  m->pTab->zName;.
30d60 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53      n = sqlite3S
30d70 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20  trlen30(z);.    
30d80 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73  if( n+nQPlan < s
30d90 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75  izeof(sqlite3_qu
30da0 65 72 79 5f 70 6c 61 6e 29 2d 31 30 20 29 7b 0a  ery_plan)-10 ){.
30db0 20 20 20 20 20 20 69 66 28 20 28 77 20 26 20 57        if( (w & W
30dc0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d  HERE_IDX_ONLY)!=
30dd0 30 20 26 26 20 28 77 20 26 20 57 48 45 52 45 5f  0 && (w & WHERE_
30de0 43 4f 56 45 52 5f 53 43 41 4e 29 3d 3d 30 20 29  COVER_SCAN)==0 )
30df0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
30e00 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f  (&sqlite3_query_
30e10 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b  plan[nQPlan], "{
30e20 7d 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20  }", 2);.        
30e30 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20  nQPlan += 2;.   
30e40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30e50 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65    memcpy(&sqlite
30e60 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
30e70 6c 61 6e 5d 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  lan], z, n);.   
30e80 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e       nQPlan += n
30e90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
30ea0 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
30eb0 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27  an[nQPlan++] = '
30ec0 20 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65   ';.    }.    te
30ed0 73 74 63 61 73 65 28 20 77 20 26 20 57 48 45 52  stcase( w & WHER
30ee0 45 5f 52 4f 57 49 44 5f 45 51 20 29 3b 0a 20 20  E_ROWID_EQ );.  
30ef0 20 20 74 65 73 74 63 61 73 65 28 20 77 20 26 20    testcase( w & 
30f00 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47  WHERE_ROWID_RANG
30f10 45 20 29 3b 0a 20 20 20 20 69 66 28 20 77 20 26  E );.    if( w &
30f20 20 28 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51   (WHERE_ROWID_EQ
30f30 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e  |WHERE_ROWID_RAN
30f40 47 45 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  GE) ){.      mem
30f50 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65  cpy(&sqlite3_que
30f60 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c  ry_plan[nQPlan],
30f70 20 22 2a 20 22 2c 20 32 29 3b 0a 20 20 20 20 20   "* ", 2);.     
30f80 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20   nQPlan += 2;.  
30f90 20 20 7d 65 6c 73 65 20 69 66 28 20 28 77 20 26    }else if( (w &
30fa0 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
30fb0 3d 30 20 26 26 20 28 77 20 26 20 57 48 45 52 45  =0 && (w & WHERE
30fc0 5f 43 4f 56 45 52 5f 53 43 41 4e 29 3d 3d 30 20  _COVER_SCAN)==0 
30fd0 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c  ){.      n = sql
30fe0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4c 65  ite3Strlen30(pLe
30ff0 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  vel->plan.u.pIdx
31000 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
31010 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73  if( n+nQPlan < s
31020 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75  izeof(sqlite3_qu
31030 65 72 79 5f 70 6c 61 6e 29 2d 32 20 29 7b 0a 20  ery_plan)-2 ){. 
31040 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73         memcpy(&s
31050 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
31060 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 70 4c 65 76 65  n[nQPlan], pLeve
31070 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e  l->plan.u.pIdx->
31080 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20  zName, n);.     
31090 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a     nQPlan += n;.
310a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
310b0 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
310c0 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  n++] = ' ';.    
310d0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
310e0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c       memcpy(&sql
310f0 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
31100 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 20 22 2c 20  nQPlan], "{} ", 
31110 33 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e  3);.      nQPlan
31120 20 2b 3d 20 33 3b 0a 20 20 20 20 7d 0a 20 20 7d   += 3;.    }.  }
31130 0a 20 20 77 68 69 6c 65 28 20 6e 51 50 6c 61 6e  .  while( nQPlan
31140 3e 30 20 26 26 20 73 71 6c 69 74 65 33 5f 71 75  >0 && sqlite3_qu
31150 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2d  ery_plan[nQPlan-
31160 31 5d 3d 3d 27 20 27 20 29 7b 0a 20 20 20 20 73  1]==' ' ){.    s
31170 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
31180 6e 5b 2d 2d 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b  n[--nQPlan] = 0;
31190 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 71  .  }.  sqlite3_q
311a0 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
311b0 5d 20 3d 20 30 3b 0a 20 20 6e 51 50 6c 61 6e 20  ] = 0;.  nQPlan 
311c0 3d 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  = 0;.#endif /* S
311d0 51 4c 49 54 45 5f 54 45 53 54 20 2f 2f 20 54 65  QLITE_TEST // Te
311e0 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
311f0 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a  ing use only */.
31200 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65  .  /* Record the
31210 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 61 64   continuation ad
31220 64 72 65 73 73 20 69 6e 20 74 68 65 20 57 68 65  dress in the Whe
31230 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
31240 2e 20 20 54 68 65 6e 0a 20 20 2a 2a 20 63 6c 65  .  Then.  ** cle
31250 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e  an up and return
31260 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
31270 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75  pWInfo;..  /* Ju
31280 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f  mp here if mallo
31290 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65  c fails */.where
312a0 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20 69 66  BeginError:.  if
312b0 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20  ( pWInfo ){.    
312c0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
312d0 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76  op = pWInfo->sav
312e0 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  edNQueryLoop;.  
312f0 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28    whereInfoFree(
31300 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  db, pWInfo);.  }
31310 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
31320 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
31330 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
31340 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63  ERE loop.  See c
31350 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73  omments on .** s
31360 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
31370 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  () for additiona
31380 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
31390 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68  /.void sqlite3Wh
313a0 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f  ereEnd(WhereInfo
313b0 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72   *pWInfo){.  Par
313c0 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49  se *pParse = pWI
313d0 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56  nfo->pParse;.  V
313e0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
313f0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
31400 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
31410 4c 65 76 65 6c 3b 0a 20 20 53 72 63 4c 69 73 74  Level;.  SrcList
31420 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49   *pTabList = pWI
31430 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20  nfo->pTabList;. 
31440 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
31450 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  Parse->db;..  /*
31460 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74   Generate loop t
31470 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e  ermination code.
31480 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  .  */.  sqlite3E
31490 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
314a0 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 70  arse);.  for(i=p
314b0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b  WInfo->nLevel-1;
314c0 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
314d0 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
314e0 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 71 6c  o->a[i];.    sql
314f0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
31500 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
31510 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 69  addrCont);.    i
31520 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f  f( pLevel->op!=O
31530 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
31540 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
31550 32 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c  2(v, pLevel->op,
31560 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65   pLevel->p1, pLe
31570 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 20 20  vel->p2);.      
31580 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
31590 65 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70  eP5(v, pLevel->p
315a0 35 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  5);.    }.    if
315b0 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
315c0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
315d0 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65 76 65 6c  N_ABLE && pLevel
315e0 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a  ->u.in.nIn>0 ){.
315f0 20 20 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c        struct InL
31600 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20  oop *pIn;.      
31610 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c  int j;.      sql
31620 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
31630 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
31640 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20  addrNxt);.      
31650 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e  for(j=pLevel->u.
31660 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65  in.nIn, pIn=&pLe
31670 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
31680 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d  p[j-1]; j>0; j--
31690 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20  , pIn--){.      
316a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
316b0 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64  pHere(v, pIn->ad
316c0 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20  drInTop+1);.    
316d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
316e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
316f0 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e  , pIn->iCur, pIn
31700 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20  ->addrInTop);.  
31710 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
31720 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e  eJumpHere(v, pIn
31730 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a  ->addrInTop-1);.
31740 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
31750 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
31760 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
31770 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Loop);.    }.   
31780 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
31790 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76  lveLabel(v, pLev
317a0 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20  el->addrBrk);.  
317b0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c    if( pLevel->iL
317c0 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20  eftJoin ){.     
317d0 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
317e0 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
317f0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
31800 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69  IfPos, pLevel->i
31810 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20  LeftJoin);.     
31820 20 61 73 73 65 72 74 28 20 28 70 4c 65 76 65 6c   assert( (pLevel
31830 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
31840 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
31850 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ==0.           |
31860 7c 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  | (pLevel->plan.
31870 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
31880 49 4e 44 45 58 45 44 29 21 3d 30 20 29 3b 0a 20  INDEXED)!=0 );. 
31890 20 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c       if( (pLevel
318a0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
318b0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
318c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
318d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
318e0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20  (v, OP_NullRow, 
318f0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  pTabList->a[i].i
31900 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d  Cursor);.      }
31910 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65  .      if( pLeve
31920 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 7b  l->iIdxCur>=0 ){
31930 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
31940 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
31950 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c  _NullRow, pLevel
31960 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20  ->iIdxCur);.    
31970 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c    }.      if( pL
31980 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74  evel->op==OP_Ret
31990 75 72 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73  urn ){.        s
319a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
319b0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 4c  (v, OP_Gosub, pL
319c0 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c  evel->p1, pLevel
319d0 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20  ->addrFirst);.  
319e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
319f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
31a00 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
31a10 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72   0, pLevel->addr
31a20 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  First);.      }.
31a30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
31a40 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
31a50 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
31a60 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20   /* The "break" 
31a70 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a  point is here, j
31a80 75 73 74 20 70 61 73 74 20 74 68 65 20 65 6e 64  ust past the end
31a90 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f   of the outer lo
31aa0 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e  op..  ** Set it.
31ab0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
31ac0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
31ad0 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  v, pWInfo->iBrea
31ae0 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20  k);..  /* Close 
31af0 61 6c 6c 20 6f 66 20 74 68 65 20 63 75 72 73 6f  all of the curso
31b00 72 73 20 74 68 61 74 20 77 65 72 65 20 6f 70 65  rs that were ope
31b10 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68  ned by sqlite3Wh
31b20 65 72 65 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20  ereBegin..  */. 
31b30 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
31b40 3e 6e 4c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 57  >nLevel==1 || pW
31b50 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 70 54  Info->nLevel==pT
31b60 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a  abList->nSrc );.
31b70 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65    for(i=0, pLeve
31b80 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70  l=pWInfo->a; i<p
31b90 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69  WInfo->nLevel; i
31ba0 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20  ++, pLevel++){. 
31bb0 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d     Index *pIdx =
31bc0 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53   0;.    struct S
31bd0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61  rcList_item *pTa
31be0 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
31bf0 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
31c00 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  om];.    Table *
31c10 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  pTab = pTabItem-
31c20 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72  >pTab;.    asser
31c30 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
31c40 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62    if( (pTab->tab
31c50 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
31c60 65 72 61 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26  eral)==0.     &&
31c70 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d   pTab->pSelect==
31c80 30 0a 20 20 20 20 20 26 26 20 28 70 57 49 6e 66  0.     && (pWInf
31c90 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
31ca0 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f  WHERE_OMIT_OPEN_
31cb0 43 4c 4f 53 45 29 3d 3d 30 0a 20 20 20 20 29 7b  CLOSE)==0.    ){
31cc0 0a 20 20 20 20 20 20 69 6e 74 20 77 73 20 3d 20  .      int ws = 
31cd0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
31ce0 6c 61 67 73 3b 0a 20 20 20 20 20 20 69 66 28 20  lags;.      if( 
31cf0 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61  !pWInfo->okOnePa
31d00 73 73 20 26 26 20 28 77 73 20 26 20 57 48 45 52  ss && (ws & WHER
31d10 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29  E_IDX_ONLY)==0 )
31d20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
31d30 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
31d40 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49 74 65  P_Close, pTabIte
31d50 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
31d60 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
31d70 77 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  ws & WHERE_INDEX
31d80 45 44 29 21 3d 30 20 26 26 20 28 77 73 20 26 20  ED)!=0 && (ws & 
31d90 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58  WHERE_TEMP_INDEX
31da0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
31db0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
31dc0 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70  1(v, OP_Close, p
31dd0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b  Level->iIdxCur);
31de0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
31df0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 73      /* If this s
31e00 63 61 6e 20 75 73 65 73 20 61 6e 20 69 6e 64 65  can uses an inde
31e10 78 2c 20 6d 61 6b 65 20 63 6f 64 65 20 73 75 62  x, make code sub
31e20 73 74 69 74 75 74 69 6f 6e 73 20 74 6f 20 72 65  stitutions to re
31e30 61 64 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66  ad data.    ** f
31e40 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 69 6e  rom the index in
31e50 20 70 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74   preference to t
31e60 68 65 20 74 61 62 6c 65 2e 20 53 6f 6d 65 74 69  he table. Someti
31e70 6d 65 73 2c 20 74 68 69 73 20 6d 65 61 6e 73 0a  mes, this means.
31e80 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65      ** the table
31e90 20 6e 65 65 64 20 6e 65 76 65 72 20 62 65 20 72   need never be r
31ea0 65 61 64 20 66 72 6f 6d 2e 20 54 68 69 73 20 69  ead from. This i
31eb0 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  s a performance 
31ec0 62 6f 6f 73 74 2c 0a 20 20 20 20 2a 2a 20 61 73  boost,.    ** as
31ed0 20 74 68 65 20 76 64 62 65 20 6c 65 76 65 6c 20   the vdbe level 
31ee0 77 61 69 74 73 20 75 6e 74 69 6c 20 74 68 65 20  waits until the 
31ef0 74 61 62 6c 65 20 69 73 20 72 65 61 64 20 62 65  table is read be
31f00 66 6f 72 65 20 61 63 74 75 61 6c 6c 79 0a 20 20  fore actually.  
31f10 20 20 2a 2a 20 73 65 65 6b 69 6e 67 20 74 68 65    ** seeking the
31f20 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 74 6f   table cursor to
31f30 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 72 72   the record corr
31f40 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
31f50 20 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20   current.    ** 
31f60 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20  position in the 
31f70 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 20 0a 20  index..    ** . 
31f80 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74     ** Calls to t
31f90 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
31fa0 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71 6c  r in between sql
31fb0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 20 61  ite3WhereBegin a
31fc0 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  nd.    ** sqlite
31fd0 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20 68  3WhereEnd will h
31fe0 61 76 65 20 63 72 65 61 74 65 64 20 63 6f 64 65  ave created code
31ff0 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
32000 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a   the table.    *
32010 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69  * directly.  Thi
32020 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c  s loop scans all
32030 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69   that code looki
32040 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20  ng for opcodes. 
32050 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65 72     ** that refer
32060 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20 61  ence the table a
32070 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65 6d  nd converts them
32080 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74 68   into opcodes th
32090 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65  at.    ** refere
320a0 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a 20  nce the index.. 
320b0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
320c0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
320d0 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
320e0 45 44 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  ED ){.      pIdx
320f0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
32100 75 2e 70 49 64 78 3b 0a 20 20 20 20 7d 65 6c 73  u.pIdx;.    }els
32110 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c  e if( pLevel->pl
32120 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
32130 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20  RE_MULTI_OR ){. 
32140 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76       pIdx = pLev
32150 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 3b 0a 20  el->u.pCovidx;. 
32160 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64     }.    if( pId
32170 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  x && !db->malloc
32180 46 61 69 6c 65 64 29 7b 0a 20 20 20 20 20 20 69  Failed){.      i
32190 6e 74 20 6b 2c 20 6a 2c 20 6c 61 73 74 3b 0a 20  nt k, j, last;. 
321a0 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70       VdbeOp *pOp
321b0 3b 0a 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 73  ;..      pOp = s
321c0 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
321d0 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 29  v, pWInfo->iTop)
321e0 3b 0a 20 20 20 20 20 20 6c 61 73 74 20 3d 20 73  ;.      last = s
321f0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
32200 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
32210 66 6f 72 28 6b 3d 70 57 49 6e 66 6f 2d 3e 69 54  for(k=pWInfo->iT
32220 6f 70 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c  op; k<last; k++,
32230 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pOp++){.       
32240 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c   if( pOp->p1!=pL
32250 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 20  evel->iTabCur ) 
32260 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
32270 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
32280 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a  e==OP_Column ){.
32290 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
322a0 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; j<pIdx->nColu
322b0 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; j++){.      
322c0 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
322d0 32 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  2==pIdx->aiColum
322e0 6e 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  n[j] ){.        
322f0 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20        pOp->p2 = 
32300 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  j;.             
32310 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65   pOp->p1 = pLeve
32320 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  l->iIdxCur;.    
32330 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
32340 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
32350 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
32360 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c       assert( (pL
32370 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
32380 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
32390 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  NLY)==0.        
323a0 20 20 20 20 20 20 20 7c 7c 20 6a 3c 70 49 64 78         || j<pIdx
323b0 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20  ->nColumn );.   
323c0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
323d0 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52  Op->opcode==OP_R
323e0 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
323f0 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76    pOp->p1 = pLev
32400 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
32410 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
32420 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64  de = OP_IdxRowid
32430 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
32440 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
32450 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75   /* Final cleanu
32460 70 0a 20 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d  p.  */.  pParse-
32470 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57  >nQueryLoop = pW
32480 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72  Info->savedNQuer
32490 79 4c 6f 6f 70 3b 0a 20 20 77 68 65 72 65 49 6e  yLoop;.  whereIn
324a0 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  foFree(db, pWInf
324b0 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  o);.  return;.}.