/ Hex Artifact Content
Login

Artifact e09d21a4506a19c0a8b17e9614d362043c9ffeb1:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  .../*.** Trace o
0350: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
0360: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
0370: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
0380: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
0390: 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c 69  )./***/ int sqli
03a0: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d 20  te3WhereTrace = 
03b0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
03c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
03d0: 55 47 29 20 5c 0a 20 20 20 20 26 26 20 28 64 65  UG) \.    && (de
03e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
03f0: 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
0400: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52  LITE_ENABLE_WHER
0410: 45 54 52 41 43 45 29 29 0a 23 20 64 65 66 69 6e  ETRACE)).# defin
0420: 65 20 57 48 45 52 45 54 52 41 43 45 28 58 29 20  e WHERETRACE(X) 
0430: 20 69 66 28 73 71 6c 69 74 65 33 57 68 65 72 65   if(sqlite3Where
0440: 54 72 61 63 65 29 20 73 71 6c 69 74 65 33 44 65  Trace) sqlite3De
0450: 62 75 67 50 72 69 6e 74 66 20 58 0a 23 65 6c 73  bugPrintf X.#els
0460: 65 0a 23 20 64 65 66 69 6e 65 20 57 48 45 52 45  e.# define WHERE
0470: 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a  TRACE(X).#endif.
0480: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
0490: 72 65 6e 63 65 0a 2a 2f 0a 74 79 70 65 64 65 66  rence.*/.typedef
04a0: 20 73 74 72 75 63 74 20 57 68 65 72 65 43 6c 61   struct WhereCla
04b0: 75 73 65 20 57 68 65 72 65 43 6c 61 75 73 65 3b  use WhereClause;
04c0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
04d0: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 57 68 65  WhereMaskSet Whe
04e0: 72 65 4d 61 73 6b 53 65 74 3b 0a 74 79 70 65 64  reMaskSet;.typed
04f0: 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65 4f  ef struct WhereO
0500: 72 49 6e 66 6f 20 57 68 65 72 65 4f 72 49 6e 66  rInfo WhereOrInf
0510: 6f 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  o;.typedef struc
0520: 74 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 57  t WhereAndInfo W
0530: 68 65 72 65 41 6e 64 49 6e 66 6f 3b 0a 74 79 70  hereAndInfo;.typ
0540: 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72  edef struct Wher
0550: 65 43 6f 73 74 20 57 68 65 72 65 43 6f 73 74 3b  eCost WhereCost;
0560: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72  ../*.** The quer
0570: 79 20 67 65 6e 65 72 61 74 6f 72 20 75 73 65 73  y generator uses
0580: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 73   an array of ins
0590: 74 61 6e 63 65 73 20 6f 66 20 74 68 69 73 20 73  tances of this s
05a0: 74 72 75 63 74 75 72 65 20 74 6f 0a 2a 2a 20 68  tructure to.** h
05b0: 65 6c 70 20 69 74 20 61 6e 61 6c 79 7a 65 20 74  elp it analyze t
05c0: 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
05d0: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
05e0: 6c 61 75 73 65 2e 20 20 45 61 63 68 20 57 48 45  lause.  Each WHE
05f0: 52 45 0a 2a 2a 20 63 6c 61 75 73 65 20 73 75 62  RE.** clause sub
0600: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
0610: 70 61 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65  parated from the
0620: 20 6f 74 68 65 72 73 20 62 79 20 41 4e 44 20 6f   others by AND o
0630: 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20 75 73 75  perators,.** usu
0640: 61 6c 6c 79 2c 20 6f 72 20 73 6f 6d 65 74 69 6d  ally, or sometim
0650: 65 73 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  es subexpression
0660: 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20 4f  s separated by O
0670: 52 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 57 68 65  R..**.** All Whe
0680: 72 65 54 65 72 6d 73 20 61 72 65 20 63 6f 6c 6c  reTerms are coll
0690: 65 63 74 65 64 20 69 6e 74 6f 20 61 20 73 69 6e  ected into a sin
06a0: 67 6c 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  gle WhereClause 
06b0: 73 74 72 75 63 74 75 72 65 2e 20 20 0a 2a 2a 20  structure.  .** 
06c0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 64  The following id
06d0: 65 6e 74 69 74 79 20 68 6f 6c 64 73 3a 0a 2a 2a  entity holds:.**
06e0: 0a 2a 2a 20 20 20 20 20 20 20 20 57 68 65 72 65  .**        Where
06f0: 54 65 72 6d 2e 70 57 43 2d 3e 61 5b 57 68 65 72  Term.pWC->a[Wher
0700: 65 54 65 72 6d 2e 69 64 78 5d 20 3d 3d 20 57 68  eTerm.idx] == Wh
0710: 65 72 65 54 65 72 6d 0a 2a 2a 0a 2a 2a 20 57 68  ereTerm.**.** Wh
0720: 65 6e 20 61 20 74 65 72 6d 20 69 73 20 6f 66 20  en a term is of 
0730: 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 58 20 3c               X <
0750: 6f 70 3e 20 3c 65 78 70 72 3e 0a 2a 2a 0a 2a 2a  op> <expr>.**.**
0760: 20 77 68 65 72 65 20 58 20 69 73 20 61 20 63 6f   where X is a co
0770: 6c 75 6d 6e 20 6e 61 6d 65 20 61 6e 64 20 3c 6f  lumn name and <o
0780: 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 63 65 72  p> is one of cer
0790: 74 61 69 6e 20 6f 70 65 72 61 74 6f 72 73 2c 0a  tain operators,.
07a0: 2a 2a 20 74 68 65 6e 20 57 68 65 72 65 54 65 72  ** then WhereTer
07b0: 6d 2e 6c 65 66 74 43 75 72 73 6f 72 20 61 6e 64  m.leftCursor and
07c0: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 6c 65 66   WhereTerm.u.lef
07d0: 74 43 6f 6c 75 6d 6e 20 72 65 63 6f 72 64 20 74  tColumn record t
07e0: 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d  he.** cursor num
07f0: 62 65 72 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e  ber and column n
0800: 75 6d 62 65 72 20 66 6f 72 20 58 2e 20 20 57 68  umber for X.  Wh
0810: 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f  ereTerm.eOperato
0820: 72 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65  r records.** the
0830: 20 3c 6f 70 3e 20 75 73 69 6e 67 20 61 20 62 69   <op> using a bi
0840: 74 6d 61 73 6b 20 65 6e 63 6f 64 69 6e 67 20 64  tmask encoding d
0850: 65 66 69 6e 65 64 20 62 79 20 57 4f 5f 78 78 78  efined by WO_xxx
0860: 20 62 65 6c 6f 77 2e 20 20 54 68 65 0a 2a 2a 20   below.  The.** 
0870: 75 73 65 20 6f 66 20 61 20 62 69 74 6d 61 73 6b  use of a bitmask
0880: 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72 20 74 68   encoding for th
0890: 65 20 6f 70 65 72 61 74 6f 72 20 61 6c 6c 6f 77  e operator allow
08a0: 73 20 75 73 20 74 6f 20 73 65 61 72 63 68 0a 2a  s us to search.*
08b0: 2a 20 71 75 69 63 6b 6c 79 20 66 6f 72 20 74 65  * quickly for te
08c0: 72 6d 73 20 74 68 61 74 20 6d 61 74 63 68 20 61  rms that match a
08d0: 6e 79 20 6f 66 20 73 65 76 65 72 61 6c 20 64 69  ny of several di
08e0: 66 66 65 72 65 6e 74 20 6f 70 65 72 61 74 6f 72  fferent operator
08f0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 57 68 65 72 65  s..**.** A Where
0900: 54 65 72 6d 20 6d 69 67 68 74 20 61 6c 73 6f 20  Term might also 
0910: 62 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  be two or more s
0920: 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65  ubterms connecte
0930: 64 20 62 79 20 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20  d by OR:.**.**  
0940: 20 20 20 20 20 20 20 28 74 31 2e 58 20 3c 6f 70         (t1.X <op
0950: 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20 28 74 31  > <expr>) OR (t1
0960: 2e 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 29 20  .Y <op> <expr>) 
0970: 4f 52 20 2e 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e  OR .....**.** In
0980: 20 74 68 69 73 20 73 65 63 6f 6e 64 20 63 61 73   this second cas
0990: 65 2c 20 77 74 46 6c 61 67 20 61 73 20 74 68 65  e, wtFlag as the
09a0: 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 73 65 74   TERM_ORINFO set
09b0: 20 61 6e 64 20 65 4f 70 65 72 61 74 6f 72 3d 3d   and eOperator==
09c0: 57 4f 5f 4f 52 0a 2a 2a 20 61 6e 64 20 74 68 65  WO_OR.** and the
09d0: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72   WhereTerm.u.pOr
09e0: 49 6e 66 6f 20 66 69 65 6c 64 20 70 6f 69 6e 74  Info field point
09f0: 73 20 74 6f 20 61 75 78 69 6c 69 61 72 79 20 69  s to auxiliary i
0a00: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 0a  nformation that.
0a10: 2a 2a 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20  ** is collected 
0a20: 61 62 6f 75 74 20 74 68 65 0a 2a 2a 0a 2a 2a 20  about the.**.** 
0a30: 49 66 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65  If a term in the
0a40: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 6f   WHERE clause do
0a50: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 65 69 74  es not match eit
0a60: 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
0a70: 72 65 76 69 6f 75 73 0a 2a 2a 20 63 61 74 65 67  revious.** categ
0a80: 6f 72 69 65 73 2c 20 74 68 65 6e 20 65 4f 70 65  ories, then eOpe
0a90: 72 61 74 6f 72 3d 3d 30 2e 20 20 54 68 65 20 57  rator==0.  The W
0aa0: 68 65 72 65 54 65 72 6d 2e 70 45 78 70 72 20 66  hereTerm.pExpr f
0ab0: 69 65 6c 64 20 69 73 20 73 74 69 6c 6c 20 73 65  ield is still se
0ac0: 74 0a 2a 2a 20 74 6f 20 74 68 65 20 6f 72 69 67  t.** to the orig
0ad0: 69 6e 61 6c 20 73 75 62 65 78 70 72 65 73 73 69  inal subexpressi
0ae0: 6f 6e 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 77  on content and w
0af0: 74 46 6c 61 67 73 20 69 73 20 73 65 74 20 75 70  tFlags is set up
0b00: 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 0a 2a   appropriately.*
0b10: 2a 20 62 75 74 20 6e 6f 20 6f 74 68 65 72 20 66  * but no other f
0b20: 69 65 6c 64 73 20 69 6e 20 74 68 65 20 57 68 65  ields in the Whe
0b30: 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 20 61 72  reTerm object ar
0b40: 65 20 6d 65 61 6e 69 6e 67 66 75 6c 2e 0a 2a 2a  e meaningful..**
0b50: 0a 2a 2a 20 57 68 65 6e 20 65 4f 70 65 72 61 74  .** When eOperat
0b60: 6f 72 21 3d 30 2c 20 70 72 65 72 65 71 52 69 67  or!=0, prereqRig
0b70: 68 74 20 61 6e 64 20 70 72 65 72 65 71 41 6c 6c  ht and prereqAll
0b80: 20 72 65 63 6f 72 64 20 73 65 74 73 20 6f 66 20   record sets of 
0b90: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 2c 0a  cursor numbers,.
0ba0: 2a 2a 20 62 75 74 20 74 68 65 79 20 64 6f 20 73  ** but they do s
0bb0: 6f 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 20 41  o indirectly.  A
0bc0: 20 73 69 6e 67 6c 65 20 57 68 65 72 65 4d 61 73   single WhereMas
0bd0: 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 20 74  kSet structure t
0be0: 72 61 6e 73 6c 61 74 65 73 0a 2a 2a 20 63 75 72  ranslates.** cur
0bf0: 73 6f 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  sor number into 
0c00: 62 69 74 73 20 61 6e 64 20 74 68 65 20 74 72 61  bits and the tra
0c10: 6e 73 6c 61 74 65 64 20 62 69 74 20 69 73 20 73  nslated bit is s
0c20: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 72 65  tored in the pre
0c30: 72 65 71 0a 2a 2a 20 66 69 65 6c 64 73 2e 20 20  req.** fields.  
0c40: 54 68 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20  The translation 
0c50: 69 73 20 75 73 65 64 20 69 6e 20 6f 72 64 65 72  is used in order
0c60: 20 74 6f 20 6d 61 78 69 6d 69 7a 65 20 74 68 65   to maximize the
0c70: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 69   number of.** bi
0c80: 74 73 20 74 68 61 74 20 77 69 6c 6c 20 66 69 74  ts that will fit
0c90: 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 2e 20 20   in a Bitmask.  
0ca0: 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
0cb0: 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20 62 65  numbers might be
0cc0: 0a 2a 2a 20 73 70 72 65 61 64 20 6f 75 74 20 6f  .** spread out o
0cd0: 76 65 72 20 74 68 65 20 6e 6f 6e 2d 6e 65 67 61  ver the non-nega
0ce0: 74 69 76 65 20 69 6e 74 65 67 65 72 73 2e 20 20  tive integers.  
0cf0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  For example, the
0d00: 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65   cursor.** numbe
0d10: 72 73 20 6d 69 67 68 74 20 62 65 20 33 2c 20 38  rs might be 3, 8
0d20: 2c 20 39 2c 20 31 30 2c 20 32 30 2c 20 32 33 2c  , 9, 10, 20, 23,
0d30: 20 34 31 2c 20 61 6e 64 20 34 35 2e 20 20 54 68   41, and 45.  Th
0d40: 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74 0a 2a  e WhereMaskSet.*
0d50: 2a 20 74 72 61 6e 73 6c 61 74 65 73 20 74 68 65  * translates the
0d60: 73 65 20 73 70 61 72 73 65 20 63 75 72 73 6f 72  se sparse cursor
0d70: 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f   numbers into co
0d80: 6e 73 65 63 75 74 69 76 65 20 69 6e 74 65 67 65  nsecutive intege
0d90: 72 73 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20  rs.** beginning 
0da0: 77 69 74 68 20 30 20 69 6e 20 6f 72 64 65 72 20  with 0 in order 
0db0: 74 6f 20 6d 61 6b 65 20 74 68 65 20 62 65 73 74  to make the best
0dc0: 20 70 6f 73 73 69 62 6c 65 20 75 73 65 20 6f 66   possible use of
0dd0: 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a   the available.*
0de0: 2a 20 62 69 74 73 20 69 6e 20 74 68 65 20 42 69  * bits in the Bi
0df0: 74 6d 61 73 6b 2e 20 20 53 6f 2c 20 69 6e 20 74  tmask.  So, in t
0e00: 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65  he example above
0e10: 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  , the cursor num
0e20: 62 65 72 73 0a 2a 2a 20 77 6f 75 6c 64 20 62 65  bers.** would be
0e30: 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 69 6e 74   mapped into int
0e40: 65 67 65 72 73 20 30 20 74 68 72 6f 75 67 68 20  egers 0 through 
0e50: 37 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d  7..**.** The num
0e60: 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
0e70: 61 20 6a 6f 69 6e 20 69 73 20 6c 69 6d 69 74 65  a join is limite
0e80: 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20  d by the number 
0e90: 6f 66 20 62 69 74 73 0a 2a 2a 20 69 6e 20 70 72  of bits.** in pr
0ea0: 65 72 65 71 52 69 67 68 74 20 61 6e 64 20 70 72  ereqRight and pr
0eb0: 65 72 65 71 41 6c 6c 2e 20 20 54 68 65 20 64 65  ereqAll.  The de
0ec0: 66 61 75 6c 74 20 69 73 20 36 34 20 62 69 74 73  fault is 64 bits
0ed0: 2c 20 68 65 6e 63 65 20 53 51 4c 69 74 65 0a 2a  , hence SQLite.*
0ee0: 2a 20 69 73 20 6f 6e 6c 79 20 61 62 6c 65 20 74  * is only able t
0ef0: 6f 20 70 72 6f 63 65 73 73 20 6a 6f 69 6e 73 20  o process joins 
0f00: 77 69 74 68 20 36 34 20 6f 72 20 66 65 77 65 72  with 64 or fewer
0f10: 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 74 79 70 65   tables..*/.type
0f20: 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65  def struct Where
0f30: 54 65 72 6d 20 57 68 65 72 65 54 65 72 6d 3b 0a  Term WhereTerm;.
0f40: 73 74 72 75 63 74 20 57 68 65 72 65 54 65 72 6d  struct WhereTerm
0f50: 20 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72   {.  Expr *pExpr
0f60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0f70: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  Pointer to the s
0f80: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  ubexpression tha
0f90: 74 20 69 73 20 74 68 69 73 20 74 65 72 6d 20 2a  t is this term *
0fa0: 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b  /.  int iParent;
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
0fc0: 69 73 61 62 6c 65 20 70 57 43 2d 3e 61 5b 69 50  isable pWC->a[iP
0fd0: 61 72 65 6e 74 5d 20 77 68 65 6e 20 74 68 69 73  arent] when this
0fe0: 20 74 65 72 6d 20 64 69 73 61 62 6c 65 64 20 2a   term disabled *
0ff0: 2f 0a 20 20 69 6e 74 20 6c 65 66 74 43 75 72 73  /.  int leftCurs
1000: 6f 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  or;         /* C
1010: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
1020: 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78  X in "X <op> <ex
1030: 70 72 3e 22 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20  pr>" */.  union 
1040: 7b 0a 20 20 20 20 69 6e 74 20 6c 65 66 74 43 6f  {.    int leftCo
1050: 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  lumn;         /*
1060: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f   Column number o
1070: 66 20 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c  f X in "X <op> <
1080: 65 78 70 72 3e 22 20 2a 2f 0a 20 20 20 20 57 68  expr>" */.    Wh
1090: 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e  ereOrInfo *pOrIn
10a0: 66 6f 3b 20 20 20 2f 2a 20 45 78 74 72 61 20 69  fo;   /* Extra i
10b0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 66 20 28 65  nformation if (e
10c0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52  Operator & WO_OR
10d0: 29 21 3d 30 20 2a 2f 0a 20 20 20 20 57 68 65 72  )!=0 */.    Wher
10e0: 65 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e  eAndInfo *pAndIn
10f0: 66 6f 3b 20 2f 2a 20 45 78 74 72 61 20 69 6e 66  fo; /* Extra inf
1100: 6f 72 6d 61 74 69 6f 6e 20 69 66 20 28 65 4f 70  ormation if (eOp
1110: 65 72 61 74 6f 72 26 20 57 4f 5f 41 4e 44 29 21  erator& WO_AND)!
1120: 3d 30 20 2a 2f 0a 20 20 7d 20 75 3b 0a 20 20 75  =0 */.  } u;.  u
1130: 31 36 20 65 4f 70 65 72 61 74 6f 72 3b 20 20 20  16 eOperator;   
1140: 20 20 20 20 20 20 20 2f 2a 20 41 20 57 4f 5f 78         /* A WO_x
1150: 78 20 76 61 6c 75 65 20 64 65 73 63 72 69 62 69  x value describi
1160: 6e 67 20 3c 6f 70 3e 20 2a 2f 0a 20 20 75 38 20  ng <op> */.  u8 
1170: 77 74 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  wtFlags;        
1180: 20 20 20 20 20 2f 2a 20 54 45 52 4d 5f 78 78 78       /* TERM_xxx
1190: 20 62 69 74 20 66 6c 61 67 73 2e 20 20 53 65 65   bit flags.  See
11a0: 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 75 38 20 6e   below */.  u8 n
11b0: 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20  Child;          
11c0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
11d0: 20 63 68 69 6c 64 72 65 6e 20 74 68 61 74 20 6d   children that m
11e0: 75 73 74 20 64 69 73 61 62 6c 65 20 75 73 20 2a  ust disable us *
11f0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
1200: 2a 70 57 43 3b 20 20 20 20 20 20 20 2f 2a 20 54  *pWC;       /* T
1210: 68 65 20 63 6c 61 75 73 65 20 74 68 69 73 20 74  he clause this t
1220: 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 2a  erm is part of *
1230: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
1240: 65 71 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 42  eqRight;    /* B
1250: 69 74 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73  itmask of tables
1260: 20 75 73 65 64 20 62 79 20 70 45 78 70 72 2d 3e   used by pExpr->
1270: 70 52 69 67 68 74 20 2a 2f 0a 20 20 42 69 74 6d  pRight */.  Bitm
1280: 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20 20  ask prereqAll;  
1290: 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f      /* Bitmask o
12a0: 66 20 74 61 62 6c 65 73 20 72 65 66 65 72 65 6e  f tables referen
12b0: 63 65 64 20 62 79 20 70 45 78 70 72 20 2a 2f 0a  ced by pExpr */.
12c0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65  };../*.** Allowe
12d0: 64 20 76 61 6c 75 65 73 20 6f 66 20 57 68 65 72  d values of Wher
12e0: 65 54 65 72 6d 2e 77 74 46 6c 61 67 73 0a 2a 2f  eTerm.wtFlags.*/
12f0: 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 44 59  .#define TERM_DY
1300: 4e 41 4d 49 43 20 20 20 20 30 78 30 31 20 20 20  NAMIC    0x01   
1310: 2f 2a 20 4e 65 65 64 20 74 6f 20 63 61 6c 6c 20  /* Need to call 
1320: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1330: 65 28 64 62 2c 20 70 45 78 70 72 29 20 2a 2f 0a  e(db, pExpr) */.
1340: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 56 49 52  #define TERM_VIR
1350: 54 55 41 4c 20 20 20 20 30 78 30 32 20 20 20 2f  TUAL    0x02   /
1360: 2a 20 41 64 64 65 64 20 62 79 20 74 68 65 20 6f  * Added by the o
1370: 70 74 69 6d 69 7a 65 72 2e 20 20 44 6f 20 6e 6f  ptimizer.  Do no
1380: 74 20 63 6f 64 65 20 2a 2f 0a 23 64 65 66 69 6e  t code */.#defin
1390: 65 20 54 45 52 4d 5f 43 4f 44 45 44 20 20 20 20  e TERM_CODED    
13a0: 20 20 30 78 30 34 20 20 20 2f 2a 20 54 68 69 73    0x04   /* This
13b0: 20 74 65 72 6d 20 69 73 20 61 6c 72 65 61 64 79   term is already
13c0: 20 63 6f 64 65 64 20 2a 2f 0a 23 64 65 66 69 6e   coded */.#defin
13d0: 65 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 20 20  e TERM_COPIED   
13e0: 20 20 30 78 30 38 20 20 20 2f 2a 20 48 61 73 20    0x08   /* Has 
13f0: 61 20 63 68 69 6c 64 20 2a 2f 0a 23 64 65 66 69  a child */.#defi
1400: 6e 65 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 20  ne TERM_ORINFO  
1410: 20 20 20 30 78 31 30 20 20 20 2f 2a 20 4e 65 65     0x10   /* Nee
1420: 64 20 74 6f 20 66 72 65 65 20 74 68 65 20 57 68  d to free the Wh
1430: 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66  ereTerm.u.pOrInf
1440: 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 64 65 66  o object */.#def
1450: 69 6e 65 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f  ine TERM_ANDINFO
1460: 20 20 20 20 30 78 32 30 20 20 20 2f 2a 20 4e 65      0x20   /* Ne
1470: 65 64 20 74 6f 20 66 72 65 65 20 74 68 65 20 57  ed to free the W
1480: 68 65 72 65 54 65 72 6d 2e 75 2e 70 41 6e 64 49  hereTerm.u.pAndI
1490: 6e 66 6f 20 6f 62 6a 20 2a 2f 0a 23 64 65 66 69  nfo obj */.#defi
14a0: 6e 65 20 54 45 52 4d 5f 4f 52 5f 4f 4b 20 20 20  ne TERM_OR_OK   
14b0: 20 20 20 30 78 34 30 20 20 20 2f 2a 20 55 73 65     0x40   /* Use
14c0: 64 20 64 75 72 69 6e 67 20 4f 52 2d 63 6c 61 75  d during OR-clau
14d0: 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  se processing */
14e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
14f0: 4e 41 42 4c 45 5f 53 54 41 54 33 0a 23 20 20 64  NABLE_STAT3.#  d
1500: 65 66 69 6e 65 20 54 45 52 4d 5f 56 4e 55 4c 4c  efine TERM_VNULL
1510: 20 20 20 20 30 78 38 30 20 20 20 2f 2a 20 4d 61      0x80   /* Ma
1520: 6e 75 66 61 63 74 75 72 65 64 20 78 3e 4e 55 4c  nufactured x>NUL
1530: 4c 20 6f 72 20 78 3c 3d 4e 55 4c 4c 20 74 65 72  L or x<=NULL ter
1540: 6d 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 20 64 65  m */.#else.#  de
1550: 66 69 6e 65 20 54 45 52 4d 5f 56 4e 55 4c 4c 20  fine TERM_VNULL 
1560: 20 20 20 30 78 30 30 20 20 20 2f 2a 20 44 69 73     0x00   /* Dis
1570: 61 62 6c 65 64 20 69 66 20 6e 6f 74 20 75 73 69  abled if not usi
1580: 6e 67 20 73 74 61 74 33 20 2a 2f 0a 23 65 6e 64  ng stat3 */.#end
1590: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  if../*.** An ins
15a0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
15b0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
15c0: 20 68 6f 6c 64 73 20 61 6c 6c 20 69 6e 66 6f 72   holds all infor
15d0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 0a 2a  mation about a.*
15e0: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  * WHERE clause. 
15f0: 20 4d 6f 73 74 6c 79 20 74 68 69 73 20 69 73 20   Mostly this is 
1600: 61 20 63 6f 6e 74 61 69 6e 65 72 20 66 6f 72 20  a container for 
1610: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 68 65 72  one or more Wher
1620: 65 54 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 45 78  eTerms..**.** Ex
1630: 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 70 4f 75  planation of pOu
1640: 74 65 72 3a 20 20 46 6f 72 20 61 20 57 48 45 52  ter:  For a WHER
1650: 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  E clause of the 
1660: 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  form.**.**      
1670: 20 20 20 20 20 61 20 41 4e 44 20 28 28 62 20 41       a AND ((b A
1680: 4e 44 20 63 29 20 4f 52 20 28 64 20 41 4e 44 20  ND c) OR (d AND 
1690: 65 29 29 20 41 4e 44 20 66 0a 2a 2a 0a 2a 2a 20  e)) AND f.**.** 
16a0: 54 68 65 72 65 20 61 72 65 20 73 65 70 61 72 61  There are separa
16b0: 74 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f  te WhereClause o
16c0: 62 6a 65 63 74 73 20 66 6f 72 20 74 68 65 20 77  bjects for the w
16d0: 68 6f 6c 65 20 63 6c 61 75 73 65 20 61 6e 64 20  hole clause and 
16e0: 66 6f 72 0a 2a 2a 20 74 68 65 20 73 75 62 63 6c  for.** the subcl
16f0: 61 75 73 65 73 20 22 28 62 20 41 4e 44 20 63 29  auses "(b AND c)
1700: 22 20 61 6e 64 20 22 28 64 20 41 4e 44 20 65 29  " and "(d AND e)
1710: 22 2e 20 20 54 68 65 20 70 4f 75 74 65 72 20 66  ".  The pOuter f
1720: 69 65 6c 64 20 6f 66 20 74 68 65 0a 2a 2a 20 73  ield of the.** s
1730: 75 62 63 6c 61 75 73 65 73 20 70 6f 69 6e 74 73  ubclauses points
1740: 20 74 6f 20 74 68 65 20 57 68 65 72 65 43 6c 61   to the WhereCla
1750: 75 73 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 74  use object for t
1760: 68 65 20 77 68 6f 6c 65 20 63 6c 61 75 73 65 2e  he whole clause.
1770: 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65  .*/.struct Where
1780: 43 6c 61 75 73 65 20 7b 0a 20 20 50 61 72 73 65  Clause {.  Parse
1790: 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20   *pParse;       
17a0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
17b0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  r context */.  W
17c0: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
17d0: 73 6b 53 65 74 3b 20 20 2f 2a 20 4d 61 70 70 69  skSet;  /* Mappi
17e0: 6e 67 20 6f 66 20 74 61 62 6c 65 20 63 75 72 73  ng of table curs
17f0: 6f 72 20 6e 75 6d 62 65 72 73 20 74 6f 20 62 69  or numbers to bi
1800: 74 6d 61 73 6b 73 20 2a 2f 0a 20 20 57 68 65 72  tmasks */.  Wher
1810: 65 43 6c 61 75 73 65 20 2a 70 4f 75 74 65 72 3b  eClause *pOuter;
1820: 20 20 20 20 20 2f 2a 20 4f 75 74 65 72 20 63 6f       /* Outer co
1830: 6e 6a 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75  njunction */.  u
1840: 38 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  8 op;           
1850: 20 20 20 20 20 20 20 20 2f 2a 20 53 70 6c 69 74          /* Split
1860: 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 4b 5f 41   operator.  TK_A
1870: 4e 44 20 6f 72 20 54 4b 5f 4f 52 20 2a 2f 0a 20  ND or TK_OR */. 
1880: 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 3b   u16 wctrlFlags;
1890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 67            /* Mig
18a0: 68 74 20 69 6e 63 6c 75 64 65 20 57 48 45 52 45  ht include WHERE
18b0: 5f 41 4e 44 5f 4f 4e 4c 59 20 2a 2f 0a 20 20 69  _AND_ONLY */.  i
18c0: 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
18d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18e0: 72 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20  r of terms */.  
18f0: 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20  int nSlot;      
1900: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1910: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
1920: 20 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54   a[] */.  WhereT
1930: 65 72 6d 20 2a 61 3b 20 20 20 20 20 20 20 20 20  erm *a;         
1940: 20 20 20 2f 2a 20 45 61 63 68 20 61 5b 5d 20 64     /* Each a[] d
1950: 65 73 63 72 69 62 65 73 20 61 20 74 65 72 6d 20  escribes a term 
1960: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 75  of the WHERE clu
1970: 61 73 65 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ase */.#if defin
1980: 65 64 28 53 51 4c 49 54 45 5f 53 4d 41 4c 4c 5f  ed(SQLITE_SMALL_
1990: 53 54 41 43 4b 29 0a 20 20 57 68 65 72 65 54 65  STACK).  WhereTe
19a0: 72 6d 20 61 53 74 61 74 69 63 5b 31 5d 3b 20 20  rm aStatic[1];  
19b0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74 61    /* Initial sta
19c0: 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 5b  tic space for a[
19d0: 5d 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 57 68 65  ] */.#else.  Whe
19e0: 72 65 54 65 72 6d 20 61 53 74 61 74 69 63 5b 38  reTerm aStatic[8
19f0: 5d 3b 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  ];    /* Initial
1a00: 20 73 74 61 74 69 63 20 73 70 61 63 65 20 66 6f   static space fo
1a10: 72 20 61 5b 5d 20 2a 2f 0a 23 65 6e 64 69 66 0a  r a[] */.#endif.
1a20: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72  };../*.** A Wher
1a30: 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65 72  eTerm with eOper
1a40: 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 68 61 73 20  ator==WO_OR has 
1a50: 69 74 73 20 75 2e 70 4f 72 49 6e 66 6f 20 70 6f  its u.pOrInfo po
1a60: 69 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20  inter set to.** 
1a70: 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  a dynamically al
1a80: 6c 6f 63 61 74 65 64 20 69 6e 73 74 61 6e 63 65  located instance
1a90: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1aa0: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  g structure..*/.
1ab0: 73 74 72 75 63 74 20 57 68 65 72 65 4f 72 49 6e  struct WhereOrIn
1ac0: 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61 75  fo {.  WhereClau
1ad0: 73 65 20 77 63 3b 20 20 20 20 20 20 20 20 20 20  se wc;          
1ae0: 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e  /* Decomposition
1af0: 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
1b00: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65  /.  Bitmask inde
1b10: 78 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  xable;       /* 
1b20: 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 69  Bitmask of all i
1b30: 6e 64 65 78 61 62 6c 65 20 74 61 62 6c 65 73 20  ndexable tables 
1b40: 69 6e 20 74 68 65 20 63 6c 61 75 73 65 20 2a 2f  in the clause */
1b50: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65  .};../*.** A Whe
1b60: 72 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65  reTerm with eOpe
1b70: 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 68 61  rator==WO_AND ha
1b80: 73 20 69 74 73 20 75 2e 70 41 6e 64 49 6e 66 6f  s its u.pAndInfo
1b90: 20 70 6f 69 6e 74 65 72 20 73 65 74 20 74 6f 0a   pointer set to.
1ba0: 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  ** a dynamically
1bb0: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 73 74 61   allocated insta
1bc0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
1bd0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
1be0: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 41  */.struct WhereA
1bf0: 6e 64 49 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65  ndInfo {.  Where
1c00: 43 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20 20  Clause wc;      
1c10: 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 65 78      /* The subex
1c20: 70 72 65 73 73 69 6f 6e 20 62 72 6f 6b 65 6e 20  pression broken 
1c30: 6f 75 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  out */.};../*.**
1c40: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
1c50: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
1c60: 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 74 72  ructure keeps tr
1c70: 61 63 6b 20 6f 66 20 61 20 6d 61 70 70 69 6e 67  ack of a mapping
1c80: 0a 2a 2a 20 62 65 74 77 65 65 6e 20 56 44 42 45  .** between VDBE
1c90: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
1ca0: 61 6e 64 20 62 69 74 73 20 6f 66 20 74 68 65 20  and bits of the 
1cb0: 62 69 74 6d 61 73 6b 73 20 69 6e 20 57 68 65 72  bitmasks in Wher
1cc0: 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  eTerm..**.** The
1cd0: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
1ce0: 62 65 72 73 20 61 72 65 20 73 6d 61 6c 6c 20 69  bers are small i
1cf0: 6e 74 65 67 65 72 73 20 63 6f 6e 74 61 69 6e 65  ntegers containe
1d00: 64 20 69 6e 20 0a 2a 2a 20 53 72 63 4c 69 73 74  d in .** SrcList
1d10: 5f 69 74 65 6d 2e 69 43 75 72 73 6f 72 20 61 6e  _item.iCursor an
1d20: 64 20 45 78 70 72 2e 69 54 61 62 6c 65 20 66 69  d Expr.iTable fi
1d30: 65 6c 64 73 2e 20 20 46 6f 72 20 61 6e 79 20 67  elds.  For any g
1d40: 69 76 65 6e 20 57 48 45 52 45 20 0a 2a 2a 20 63  iven WHERE .** c
1d50: 6c 61 75 73 65 2c 20 74 68 65 20 63 75 72 73 6f  lause, the curso
1d60: 72 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20  r numbers might 
1d70: 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  not begin with 0
1d80: 20 61 6e 64 20 74 68 65 79 20 6d 69 67 68 74 0a   and they might.
1d90: 2a 2a 20 63 6f 6e 74 61 69 6e 20 67 61 70 73 20  ** contain gaps 
1da0: 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 69 6e 67  in the numbering
1db0: 20 73 65 71 75 65 6e 63 65 2e 20 20 42 75 74 20   sequence.  But 
1dc0: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
1dd0: 6d 61 78 69 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f  maximum.** use o
1de0: 66 20 74 68 65 20 62 69 74 73 20 69 6e 20 6f 75  f the bits in ou
1df0: 72 20 62 69 74 6d 61 73 6b 73 2e 20 20 54 68 69  r bitmasks.  Thi
1e00: 73 20 73 74 72 75 63 74 75 72 65 20 70 72 6f 76  s structure prov
1e10: 69 64 65 73 20 61 20 6d 61 70 70 69 6e 67 0a 2a  ides a mapping.*
1e20: 2a 20 66 72 6f 6d 20 74 68 65 20 73 70 61 72 73  * from the spars
1e30: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
1e40: 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69 76   into consecutiv
1e50: 65 20 69 6e 74 65 67 65 72 73 20 62 65 67 69 6e  e integers begin
1e60: 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20 30 2e 0a  ning.** with 0..
1e70: 2a 2a 0a 2a 2a 20 49 66 20 57 68 65 72 65 4d 61  **.** If WhereMa
1e80: 73 6b 53 65 74 2e 69 78 5b 41 5d 3d 3d 42 20 69  skSet.ix[A]==B i
1e90: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 54 68 65  t means that The
1ea0: 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 42   A-th bit of a B
1eb0: 69 74 6d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73  itmask.** corres
1ec0: 70 6f 6e 64 73 20 56 44 42 45 20 63 75 72 73 6f  ponds VDBE curso
1ed0: 72 20 6e 75 6d 62 65 72 20 42 2e 20 20 54 68 65  r number B.  The
1ee0: 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 62   A-th bit of a b
1ef0: 69 74 6d 61 73 6b 20 69 73 20 31 3c 3c 41 2e 0a  itmask is 1<<A..
1f00: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1f10: 65 2c 20 69 66 20 74 68 65 20 57 48 45 52 45 20  e, if the WHERE 
1f20: 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69 6f  clause expressio
1f30: 6e 20 75 73 65 64 20 74 68 65 73 65 20 56 44 42  n used these VDB
1f40: 45 0a 2a 2a 20 63 75 72 73 6f 72 73 3a 20 20 34  E.** cursors:  4
1f50: 2c 20 35 2c 20 38 2c 20 32 39 2c 20 35 37 2c 20  , 5, 8, 29, 57, 
1f60: 37 33 2e 20 20 54 68 65 6e 20 74 68 65 20 20 57  73.  Then the  W
1f70: 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75  hereMaskSet stru
1f80: 63 74 75 72 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d  cture.** would m
1f90: 61 70 20 74 68 6f 73 65 20 63 75 72 73 6f 72 20  ap those cursor 
1fa0: 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74  numbers into bit
1fb0: 73 20 30 20 74 68 72 6f 75 67 68 20 35 2e 0a 2a  s 0 through 5..*
1fc0: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
1fd0: 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f  he mapping is no
1fe0: 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 6f 72  t necessarily or
1ff0: 64 65 72 65 64 2e 20 20 49 6e 20 74 68 65 20 65  dered.  In the e
2000: 78 61 6d 70 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c  xample.** above,
2010: 20 74 68 65 20 6d 61 70 70 69 6e 67 20 6d 69 67   the mapping mig
2020: 68 74 20 67 6f 20 6c 69 6b 65 20 74 68 69 73 3a  ht go like this:
2030: 20 20 34 2d 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d    4->3, 5->1, 8-
2040: 3e 32 2c 20 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37  >2, 29->0,.** 57
2050: 2d 3e 35 2c 20 37 33 2d 3e 34 2e 20 20 4f 72 20  ->5, 73->4.  Or 
2060: 6f 6e 65 20 6f 66 20 37 31 39 20 6f 74 68 65 72  one of 719 other
2070: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6d 69   combinations mi
2080: 67 68 74 20 62 65 20 75 73 65 64 2e 20 49 74 0a  ght be used. It.
2090: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 6c  ** does not real
20a0: 6c 79 20 6d 61 74 74 65 72 2e 20 20 57 68 61 74  ly matter.  What
20b0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 73   is important is
20c0: 20 74 68 61 74 20 73 70 61 72 73 65 20 63 75 72   that sparse cur
20d0: 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 61  sor.** numbers a
20e0: 6c 6c 20 67 65 74 20 6d 61 70 70 65 64 20 69 6e  ll get mapped in
20f0: 74 6f 20 62 69 74 20 6e 75 6d 62 65 72 73 20 74  to bit numbers t
2100: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  hat begin with 0
2110: 20 61 6e 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20   and contain.** 
2120: 6e 6f 20 67 61 70 73 2e 0a 2a 2f 0a 73 74 72 75  no gaps..*/.stru
2130: 63 74 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  ct WhereMaskSet 
2140: 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  {.  int n;      
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
2170: 73 73 69 67 6e 65 64 20 63 75 72 73 6f 72 20 76  ssigned cursor v
2180: 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  alues */.  int i
2190: 78 5b 42 4d 53 5d 3b 20 20 20 20 20 20 20 20 20  x[BMS];         
21a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
21b0: 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65  or assigned to e
21c0: 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b 0a 0a 2f  ach bit */.};../
21d0: 2a 0a 2a 2a 20 41 20 57 68 65 72 65 43 6f 73 74  *.** A WhereCost
21e0: 20 6f 62 6a 65 63 74 20 72 65 63 6f 72 64 73 20   object records 
21f0: 61 20 6c 6f 6f 6b 75 70 20 73 74 72 61 74 65 67  a lookup strateg
2200: 79 20 61 6e 64 20 74 68 65 20 65 73 74 69 6d 61  y and the estima
2210: 74 65 64 0a 2a 2a 20 63 6f 73 74 20 6f 66 20 70  ted.** cost of p
2220: 75 72 73 75 69 6e 67 20 74 68 61 74 20 73 74 72  ursuing that str
2230: 61 74 65 67 79 2e 0a 2a 2f 0a 73 74 72 75 63 74  ategy..*/.struct
2240: 20 57 68 65 72 65 43 6f 73 74 20 7b 0a 20 20 57   WhereCost {.  W
2250: 68 65 72 65 50 6c 61 6e 20 70 6c 61 6e 3b 20 20  herePlan plan;  
2260: 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20    /* The lookup 
2270: 73 74 72 61 74 65 67 79 20 2a 2f 0a 20 20 64 6f  strategy */.  do
2280: 75 62 6c 65 20 72 43 6f 73 74 3b 20 20 20 20 20  uble rCost;     
2290: 20 2f 2a 20 4f 76 65 72 61 6c 6c 20 63 6f 73 74   /* Overall cost
22a0: 20 6f 66 20 70 75 72 73 75 69 6e 67 20 74 68 69   of pursuing thi
22b0: 73 20 73 65 61 72 63 68 20 73 74 72 61 74 65 67  s search strateg
22c0: 79 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 75  y */.  Bitmask u
22d0: 73 65 64 3b 20 20 20 20 20 20 2f 2a 20 42 69 74  sed;      /* Bit
22e0: 6d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20  mask of cursors 
22f0: 75 73 65 64 20 62 79 20 74 68 69 73 20 70 6c 61  used by this pla
2300: 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42  n */.};../*.** B
2310: 69 74 6d 61 73 6b 73 20 66 6f 72 20 74 68 65 20  itmasks for the 
2320: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 69  operators that i
2330: 6e 64 69 63 65 73 20 61 72 65 20 61 62 6c 65 20  ndices are able 
2340: 74 6f 20 65 78 70 6c 6f 69 74 2e 20 20 41 6e 0a  to exploit.  An.
2350: 2a 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61  ** OR-ed combina
2360: 74 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 76 61  tion of these va
2370: 6c 75 65 73 20 63 61 6e 20 62 65 20 75 73 65 64  lues can be used
2380: 20 77 68 65 6e 20 73 65 61 72 63 68 69 6e 67 20   when searching 
2390: 66 6f 72 0a 2a 2a 20 74 65 72 6d 73 20 69 6e 20  for.** terms in 
23a0: 74 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65  the where clause
23b0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f  ..*/.#define WO_
23c0: 49 4e 20 20 20 20 20 30 78 30 30 31 0a 23 64 65  IN     0x001.#de
23d0: 66 69 6e 65 20 57 4f 5f 45 51 20 20 20 20 20 30  fine WO_EQ     0
23e0: 78 30 30 32 0a 23 64 65 66 69 6e 65 20 57 4f 5f  x002.#define WO_
23f0: 4c 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28  LT     (WO_EQ<<(
2400: 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29 0a 23 64  TK_LT-TK_EQ)).#d
2410: 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20 20 20 20  efine WO_LE     
2420: 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d 54  (WO_EQ<<(TK_LE-T
2430: 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57  K_EQ)).#define W
2440: 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f 45 51 3c  O_GT     (WO_EQ<
2450: 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51 29 29 0a  <(TK_GT-TK_EQ)).
2460: 23 64 65 66 69 6e 65 20 57 4f 5f 47 45 20 20 20  #define WO_GE   
2470: 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 45    (WO_EQ<<(TK_GE
2480: 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65  -TK_EQ)).#define
2490: 20 57 4f 5f 4d 41 54 43 48 20 20 30 78 30 34 30   WO_MATCH  0x040
24a0: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49 53 4e 55  .#define WO_ISNU
24b0: 4c 4c 20 30 78 30 38 30 0a 23 64 65 66 69 6e 65  LL 0x080.#define
24c0: 20 57 4f 5f 4f 52 20 20 20 20 20 30 78 31 30 30   WO_OR     0x100
24d0: 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72         /* Two or
24e0: 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74   more OR-connect
24f0: 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23 64 65 66  ed terms */.#def
2500: 69 6e 65 20 57 4f 5f 41 4e 44 20 20 20 20 30 78  ine WO_AND    0x
2510: 32 30 30 20 20 20 20 20 20 20 2f 2a 20 54 77 6f  200       /* Two
2520: 20 6f 72 20 6d 6f 72 65 20 41 4e 44 2d 63 6f 6e   or more AND-con
2530: 6e 65 63 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a  nected terms */.
2540: 23 64 65 66 69 6e 65 20 57 4f 5f 45 51 55 49 56  #define WO_EQUIV
2550: 20 20 30 78 34 30 30 20 20 20 20 20 20 20 2f 2a    0x400       /*
2560: 20 4f 66 20 74 68 65 20 66 6f 72 6d 20 41 3d 3d   Of the form A==
2570: 42 2c 20 62 6f 74 68 20 63 6f 6c 75 6d 6e 73 20  B, both columns 
2580: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4e 4f  */.#define WO_NO
2590: 4f 50 20 20 20 30 78 38 30 30 20 20 20 20 20 20  OP   0x800      
25a0: 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 64 6f   /* This term do
25b0: 65 73 20 6e 6f 74 20 72 65 73 74 72 69 63 74 20  es not restrict 
25c0: 73 65 61 72 63 68 20 73 70 61 63 65 20 2a 2f 0a  search space */.
25d0: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 41 4c 4c 20  .#define WO_ALL 
25e0: 20 20 20 30 78 66 66 66 20 20 20 20 20 20 20 2f     0xfff       /
25f0: 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 70 6f  * Mask of all po
2600: 73 73 69 62 6c 65 20 57 4f 5f 2a 20 76 61 6c 75  ssible WO_* valu
2610: 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f  es */.#define WO
2620: 5f 53 49 4e 47 4c 45 20 30 78 30 66 66 20 20 20  _SINGLE 0x0ff   
2630: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61      /* Mask of a
2640: 6c 6c 20 6e 6f 6e 2d 63 6f 6d 70 6f 75 6e 64 20  ll non-compound 
2650: 57 4f 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 0a  WO_* values */..
2660: 2f 2a 0a 2a 2a 20 56 61 6c 75 65 20 66 6f 72 20  /*.** Value for 
2670: 77 73 46 6c 61 67 73 20 72 65 74 75 72 6e 65 64  wsFlags returned
2680: 20 62 79 20 62 65 73 74 49 6e 64 65 78 28 29 20   by bestIndex() 
2690: 61 6e 64 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a  and stored in.**
26a0: 20 57 68 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c   WhereLevel.wsFl
26b0: 61 67 73 2e 20 20 54 68 65 73 65 20 66 6c 61 67  ags.  These flag
26c0: 73 20 64 65 74 65 72 6d 69 6e 65 20 77 68 69 63  s determine whic
26d0: 68 20 73 65 61 72 63 68 0a 2a 2a 20 73 74 72 61  h search.** stra
26e0: 74 65 67 69 65 73 20 61 72 65 20 61 70 70 72 6f  tegies are appro
26f0: 70 72 69 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  priate..**.** Th
2700: 65 20 6c 65 61 73 74 20 73 69 67 6e 69 66 69 63  e least signific
2710: 61 6e 74 20 31 32 20 62 69 74 73 20 69 73 20 72  ant 12 bits is r
2720: 65 73 65 72 76 65 64 20 61 73 20 61 20 6d 61 73  eserved as a mas
2730: 6b 20 66 6f 72 20 57 4f 5f 20 76 61 6c 75 65 73  k for WO_ values
2740: 20 61 62 6f 76 65 2e 0a 2a 2a 20 54 68 65 20 57   above..** The W
2750: 68 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67  hereLevel.wsFlag
2760: 73 20 66 69 65 6c 64 20 69 73 20 75 73 75 61 6c  s field is usual
2770: 6c 79 20 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c  ly set to WO_IN|
2780: 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2e  WO_EQ|WO_ISNULL.
2790: 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 74  .** But if the t
27a0: 61 62 6c 65 20 69 73 20 74 68 65 20 72 69 67 68  able is the righ
27b0: 74 20 74 61 62 6c 65 20 6f 66 20 61 20 6c 65 66  t table of a lef
27c0: 74 20 6a 6f 69 6e 2c 20 57 68 65 72 65 4c 65 76  t join, WhereLev
27d0: 65 6c 2e 77 73 46 6c 61 67 73 0a 2a 2a 20 69 73  el.wsFlags.** is
27e0: 20 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f   set to WO_IN|WO
27f0: 5f 45 51 2e 20 20 54 68 65 20 57 68 65 72 65 4c  _EQ.  The WhereL
2800: 65 76 65 6c 2e 77 73 46 6c 61 67 73 20 66 69 65  evel.wsFlags fie
2810: 6c 64 20 63 61 6e 20 74 68 65 6e 20 62 65 20 75  ld can then be u
2820: 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 22 6f  sed as.** the "o
2830: 70 22 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  p" parameter to 
2840: 66 69 6e 64 54 65 72 6d 20 77 68 65 6e 20 77 65  findTerm when we
2850: 20 61 72 65 20 72 65 73 6f 6c 76 69 6e 67 20 65   are resolving e
2860: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
2870: 6e 74 73 2e 0a 2a 2a 20 49 53 4e 55 4c 4c 20 63  nts..** ISNULL c
2880: 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20  onstraints will 
2890: 74 68 65 6e 20 6e 6f 74 20 62 65 20 75 73 65 64  then not be used
28a0: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 74 61   on the right ta
28b0: 62 6c 65 20 6f 66 20 61 20 6c 65 66 74 0a 2a 2a  ble of a left.**
28c0: 20 6a 6f 69 6e 2e 20 20 54 69 63 6b 65 74 73 20   join.  Tickets 
28d0: 23 32 31 37 37 20 61 6e 64 20 23 32 31 38 39 2e  #2177 and #2189.
28e0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52  .*/.#define WHER
28f0: 45 5f 52 4f 57 49 44 5f 45 51 20 20 20 20 20 30  E_ROWID_EQ     0
2900: 78 30 30 30 30 31 30 30 30 20 20 2f 2a 20 72 6f  x00001000  /* ro
2910: 77 69 64 3d 45 58 50 52 20 6f 72 20 72 6f 77 69  wid=EXPR or rowi
2920: 64 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64  d IN (...) */.#d
2930: 65 66 69 6e 65 20 57 48 45 52 45 5f 52 4f 57 49  efine WHERE_ROWI
2940: 44 5f 52 41 4e 47 45 20 20 30 78 30 30 30 30 32  D_RANGE  0x00002
2950: 30 30 30 20 20 2f 2a 20 72 6f 77 69 64 3c 45 58  000  /* rowid<EX
2960: 50 52 20 61 6e 64 2f 6f 72 20 72 6f 77 69 64 3e  PR and/or rowid>
2970: 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20  EXPR */.#define 
2980: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20  WHERE_COLUMN_EQ 
2990: 20 20 20 30 78 30 30 30 31 30 30 30 30 20 20 2f     0x00010000  /
29a0: 2a 20 78 3d 45 58 50 52 20 6f 72 20 78 20 49 4e  * x=EXPR or x IN
29b0: 20 28 2e 2e 2e 29 20 6f 72 20 78 20 49 53 20 4e   (...) or x IS N
29c0: 55 4c 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ULL */.#define W
29d0: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
29e0: 45 20 30 78 30 30 30 32 30 30 30 30 20 20 2f 2a  E 0x00020000  /*
29f0: 20 78 3c 45 58 50 52 20 61 6e 64 2f 6f 72 20 78   x<EXPR and/or x
2a00: 3e 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65  >EXPR */.#define
2a10: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
2a20: 20 20 20 20 30 78 30 30 30 34 30 30 30 30 20 20      0x00040000  
2a30: 2f 2a 20 78 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f  /* x IN (...) */
2a40: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43  .#define WHERE_C
2a50: 4f 4c 55 4d 4e 5f 4e 55 4c 4c 20 20 30 78 30 30  OLUMN_NULL  0x00
2a60: 30 38 30 30 30 30 20 20 2f 2a 20 78 20 49 53 20  080000  /* x IS 
2a70: 4e 55 4c 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20  NULL */.#define 
2a80: 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 20 20  WHERE_INDEXED   
2a90: 20 20 20 30 78 30 30 30 66 30 30 30 30 20 20 2f     0x000f0000  /
2aa0: 2a 20 41 6e 79 74 68 69 6e 67 20 74 68 61 74 20  * Anything that 
2ab0: 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f  uses an index */
2ac0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4e  .#define WHERE_N
2ad0: 4f 54 5f 46 55 4c 4c 53 43 41 4e 20 30 78 31 30  OT_FULLSCAN 0x10
2ae0: 30 66 33 30 30 30 20 20 2f 2a 20 44 6f 65 73 20  0f3000  /* Does 
2af0: 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 74 61  not do a full ta
2b00: 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 23 64 65 66  ble scan */.#def
2b10: 69 6e 65 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c  ine WHERE_IN_ABL
2b20: 45 20 20 20 20 20 20 30 78 30 38 30 66 31 30 30  E      0x080f100
2b30: 30 20 20 2f 2a 20 41 62 6c 65 20 74 6f 20 73 75  0  /* Able to su
2b40: 70 70 6f 72 74 20 61 6e 20 49 4e 20 6f 70 65 72  pport an IN oper
2b50: 61 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ator */.#define 
2b60: 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
2b70: 20 20 20 30 78 30 30 31 30 30 30 30 30 20 20 2f     0x00100000  /
2b80: 2a 20 78 3c 45 58 50 52 20 6f 72 20 78 3c 3d 45  * x<EXPR or x<=E
2b90: 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  XPR constraint *
2ba0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
2bb0: 42 54 4d 5f 4c 49 4d 49 54 20 20 20 20 30 78 30  BTM_LIMIT    0x0
2bc0: 30 32 30 30 30 30 30 20 20 2f 2a 20 78 3e 45 58  0200000  /* x>EX
2bd0: 50 52 20 6f 72 20 78 3e 3d 45 58 50 52 20 63 6f  PR or x>=EXPR co
2be0: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66  nstraint */.#def
2bf0: 69 6e 65 20 57 48 45 52 45 5f 42 4f 54 48 5f 4c  ine WHERE_BOTH_L
2c00: 49 4d 49 54 20 20 20 30 78 30 30 33 30 30 30 30  IMIT   0x0030000
2c10: 30 20 20 2f 2a 20 42 6f 74 68 20 78 3e 45 58 50  0  /* Both x>EXP
2c20: 52 20 61 6e 64 20 78 3c 45 58 50 52 20 2a 2f 0a  R and x<EXPR */.
2c30: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49 44  #define WHERE_ID
2c40: 58 5f 4f 4e 4c 59 20 20 20 20 20 30 78 30 30 34  X_ONLY     0x004
2c50: 30 30 30 30 30 20 20 2f 2a 20 55 73 65 20 69 6e  00000  /* Use in
2c60: 64 65 78 20 6f 6e 6c 79 20 2d 20 6f 6d 69 74 20  dex only - omit 
2c70: 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65  table */.#define
2c80: 20 57 48 45 52 45 5f 4f 52 44 45 52 45 44 20 20   WHERE_ORDERED  
2c90: 20 20 20 20 30 78 30 30 38 30 30 30 30 30 20 20      0x00800000  
2ca0: 2f 2a 20 4f 75 74 70 75 74 20 77 69 6c 6c 20 61  /* Output will a
2cb0: 70 70 65 61 72 20 69 6e 20 63 6f 72 72 65 63 74  ppear in correct
2cc0: 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e   order */.#defin
2cd0: 65 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 20  e WHERE_REVERSE 
2ce0: 20 20 20 20 20 30 78 30 31 30 30 30 30 30 30 20       0x01000000 
2cf0: 20 2f 2a 20 53 63 61 6e 20 69 6e 20 72 65 76 65   /* Scan in reve
2d00: 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65  rse order */.#de
2d10: 66 69 6e 65 20 57 48 45 52 45 5f 55 4e 49 51 55  fine WHERE_UNIQU
2d20: 45 20 20 20 20 20 20 20 30 78 30 32 30 30 30 30  E       0x020000
2d30: 30 30 20 20 2f 2a 20 53 65 6c 65 63 74 73 20 6e  00  /* Selects n
2d40: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
2d50: 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  row */.#define W
2d60: 48 45 52 45 5f 41 4c 4c 5f 55 4e 49 51 55 45 20  HERE_ALL_UNIQUE 
2d70: 20 20 30 78 30 34 30 30 30 30 30 30 20 20 2f 2a    0x04000000  /*
2d80: 20 54 68 69 73 20 61 6e 64 20 61 6c 6c 20 70 72   This and all pr
2d90: 69 6f 72 20 68 61 76 65 20 6f 6e 65 20 72 6f 77  ior have one row
2da0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
2db0: 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 30  E_VIRTUALTABLE 0
2dc0: 78 30 38 30 30 30 30 30 30 20 20 2f 2a 20 55 73  x08000000  /* Us
2dd0: 65 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 20  e virtual-table 
2de0: 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 23 64  processing */.#d
2df0: 65 66 69 6e 65 20 57 48 45 52 45 5f 4d 55 4c 54  efine WHERE_MULT
2e00: 49 5f 4f 52 20 20 20 20 20 30 78 31 30 30 30 30  I_OR     0x10000
2e10: 30 30 30 20 20 2f 2a 20 4f 52 20 75 73 69 6e 67  000  /* OR using
2e20: 20 6d 75 6c 74 69 70 6c 65 20 69 6e 64 69 63 65   multiple indice
2e30: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  s */.#define WHE
2e40: 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20 20 20  RE_TEMP_INDEX   
2e50: 30 78 32 30 30 30 30 30 30 30 20 20 2f 2a 20 55  0x20000000  /* U
2e60: 73 65 73 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ses an ephemeral
2e70: 20 69 6e 64 65 78 20 2a 2f 0a 23 64 65 66 69 6e   index */.#defin
2e80: 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
2e90: 20 20 20 20 20 30 78 34 30 30 30 30 30 30 30 20       0x40000000 
2ea0: 20 2f 2a 20 43 6f 72 72 65 63 74 20 6f 72 64 65   /* Correct orde
2eb0: 72 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 2a  r for DISTINCT *
2ec0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
2ed0: 43 4f 56 45 52 5f 53 43 41 4e 20 20 20 30 78 38  COVER_SCAN   0x8
2ee0: 30 30 30 30 30 30 30 20 20 2f 2a 20 46 75 6c 6c  0000000  /* Full
2ef0: 20 73 63 61 6e 20 6f 66 20 61 20 63 6f 76 65 72   scan of a cover
2f00: 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 0a 2f 2a  ing index */../*
2f10: 0a 2a 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20  .** This module 
2f20: 63 6f 6e 74 61 69 6e 73 20 6d 61 6e 79 20 73 65  contains many se
2f30: 70 61 72 61 74 65 20 73 75 62 72 6f 75 74 69 6e  parate subroutin
2f40: 65 73 20 74 68 61 74 20 77 6f 72 6b 20 74 6f 67  es that work tog
2f50: 65 74 68 65 72 20 74 6f 0a 2a 2a 20 66 69 6e 64  ether to.** find
2f60: 20 74 68 65 20 62 65 73 74 20 69 6e 64 69 63 65   the best indice
2f70: 73 20 74 6f 20 75 73 65 20 66 6f 72 20 61 63 63  s to use for acc
2f80: 65 73 73 69 6e 67 20 61 20 70 61 72 74 69 63 75  essing a particu
2f90: 6c 61 72 20 74 61 62 6c 65 20 69 6e 20 61 20 71  lar table in a q
2fa0: 75 65 72 79 2e 0a 2a 2a 20 41 6e 20 69 6e 73 74  uery..** An inst
2fb0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
2fc0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
2fd0: 68 6f 6c 64 73 20 63 6f 6e 74 65 78 74 20 69 6e  holds context in
2fe0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
2ff0: 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 73 65 61  the.** index sea
3000: 72 63 68 20 73 6f 20 74 68 61 74 20 69 74 20 63  rch so that it c
3010: 61 6e 20 62 65 20 6d 6f 72 65 20 65 61 73 69 6c  an be more easil
3020: 79 20 70 61 73 73 65 64 20 62 65 74 77 65 65 6e  y passed between
3030: 20 74 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20   the various.** 
3040: 72 6f 75 74 69 6e 65 73 2e 0a 2a 2f 0a 74 79 70  routines..*/.typ
3050: 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72  edef struct Wher
3060: 65 42 65 73 74 49 64 78 20 57 68 65 72 65 42 65  eBestIdx WhereBe
3070: 73 74 49 64 78 3b 0a 73 74 72 75 63 74 20 57 68  stIdx;.struct Wh
3080: 65 72 65 42 65 73 74 49 64 78 20 7b 0a 20 20 50  ereBestIdx {.  P
3090: 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20  arse *pParse;   
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30b0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
30c0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
30d0: 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20  e *pWC;         
30e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
30f0: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
3100: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
3110: 65 6d 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f  em *pSrc;      /
3120: 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
3130: 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68  e term to search
3140: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
3150: 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20  tReady;         
3160: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
3170: 20 63 75 72 73 6f 72 73 20 6e 6f 74 20 61 76 61   cursors not ava
3180: 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 42 69 74 6d  ilable */.  Bitm
3190: 61 73 6b 20 6e 6f 74 56 61 6c 69 64 3b 20 20 20  ask notValid;   
31a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
31b0: 75 72 73 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c  ursors not avail
31c0: 61 62 6c 65 20 66 6f 72 20 61 6e 79 20 70 75 72  able for any pur
31d0: 70 6f 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  pose */.  ExprLi
31e0: 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
31f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
3200: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
3210: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
3220: 70 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20  pDistinct;      
3230: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 65 6c        /* The sel
3240: 65 63 74 2d 6c 69 73 74 20 69 66 20 71 75 65 72  ect-list if quer
3250: 79 20 69 73 20 44 49 53 54 49 4e 43 54 20 2a 2f  y is DISTINCT */
3260: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  .  sqlite3_index
3270: 5f 69 6e 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66  _info **ppIdxInf
3280: 6f 3b 20 2f 2a 20 49 6e 64 65 78 20 69 6e 66 6f  o; /* Index info
3290: 72 6d 61 74 69 6f 6e 20 70 61 73 73 65 64 20 74  rmation passed t
32a0: 6f 20 78 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a  o xBestIndex */.
32b0: 20 20 69 6e 74 20 69 2c 20 6e 3b 20 20 20 20 20    int i, n;     
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d0: 20 20 2f 2a 20 57 68 69 63 68 20 6c 6f 6f 70 20    /* Which loop 
32e0: 69 73 20 62 65 69 6e 67 20 63 6f 64 65 64 3b 20  is being coded; 
32f0: 23 20 6f 66 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20  # of loops */.  
3300: 57 68 65 72 65 4c 65 76 65 6c 20 2a 61 4c 65 76  WhereLevel *aLev
3310: 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
3320: 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6f 75  /* Info about ou
3330: 74 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 57  ter loops */.  W
3340: 68 65 72 65 43 6f 73 74 20 63 6f 73 74 3b 20 20  hereCost cost;  
3350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3360: 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74 20 71 75  * Lowest cost qu
3370: 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 7d 3b 0a 0a  ery plan */.};..
3380: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
3390: 45 20 69 66 20 74 68 65 20 70 72 6f 62 65 20 63  E if the probe c
33a0: 6f 73 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ost is less than
33b0: 20 74 68 65 20 62 61 73 65 6c 69 6e 65 20 63 6f   the baseline co
33c0: 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  st.*/.static int
33d0: 20 63 6f 6d 70 61 72 65 43 6f 73 74 28 63 6f 6e   compareCost(con
33e0: 73 74 20 57 68 65 72 65 43 6f 73 74 20 2a 70 50  st WhereCost *pP
33f0: 72 6f 62 65 2c 20 63 6f 6e 73 74 20 57 68 65 72  robe, const Wher
3400: 65 43 6f 73 74 20 2a 70 42 61 73 65 6c 69 6e 65  eCost *pBaseline
3410: 29 7b 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d  ){.  if( pProbe-
3420: 3e 72 43 6f 73 74 3c 70 42 61 73 65 6c 69 6e 65  >rCost<pBaseline
3430: 2d 3e 72 43 6f 73 74 20 29 20 72 65 74 75 72 6e  ->rCost ) return
3440: 20 31 3b 0a 20 20 69 66 28 20 70 50 72 6f 62 65   1;.  if( pProbe
3450: 2d 3e 72 43 6f 73 74 3e 70 42 61 73 65 6c 69 6e  ->rCost>pBaselin
3460: 65 2d 3e 72 43 6f 73 74 20 29 20 72 65 74 75 72  e->rCost ) retur
3470: 6e 20 30 3b 0a 20 20 69 66 28 20 70 50 72 6f 62  n 0;.  if( pProb
3480: 65 2d 3e 70 6c 61 6e 2e 6e 4f 42 53 61 74 3e 70  e->plan.nOBSat>p
3490: 42 61 73 65 6c 69 6e 65 2d 3e 70 6c 61 6e 2e 6e  Baseline->plan.n
34a0: 4f 42 53 61 74 20 29 20 72 65 74 75 72 6e 20 31  OBSat ) return 1
34b0: 3b 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e  ;.  if( pProbe->
34c0: 70 6c 61 6e 2e 6e 52 6f 77 3c 70 42 61 73 65 6c  plan.nRow<pBasel
34d0: 69 6e 65 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 20 29  ine->plan.nRow )
34e0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
34f0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
3500: 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 70 72 65  Initialize a pre
3510: 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65 43  allocated WhereC
3520: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 2e  lause structure.
3530: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3540: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
3550: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
3560: 70 57 43 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  pWC,        /* T
3570: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 74  he WhereClause t
3580: 6f 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  o be initialized
3590: 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
35a0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rse,           /
35b0: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
35c0: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
35d0: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
35e0: 74 2c 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66  t,  /* Mapping f
35f0: 72 6f 6d 20 74 61 62 6c 65 20 63 75 72 73 6f 72  rom table cursor
3600: 20 6e 75 6d 62 65 72 73 20 74 6f 20 62 69 74 6d   numbers to bitm
3610: 61 73 6b 73 20 2a 2f 0a 20 20 75 31 36 20 77 63  asks */.  u16 wc
3620: 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20  trlFlags        
3630: 20 20 20 2f 2a 20 4d 69 67 68 74 20 69 6e 63 6c     /* Might incl
3640: 75 64 65 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e  ude WHERE_AND_ON
3650: 4c 59 20 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d 3e  LY */.){.  pWC->
3660: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
3670: 0a 20 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74  .  pWC->pMaskSet
3680: 20 3d 20 70 4d 61 73 6b 53 65 74 3b 0a 20 20 70   = pMaskSet;.  p
3690: 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20 30 3b 0a  WC->pOuter = 0;.
36a0: 20 20 70 57 43 2d 3e 6e 54 65 72 6d 20 3d 20 30    pWC->nTerm = 0
36b0: 3b 0a 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d  ;.  pWC->nSlot =
36c0: 20 41 72 72 61 79 53 69 7a 65 28 70 57 43 2d 3e   ArraySize(pWC->
36d0: 61 53 74 61 74 69 63 29 3b 0a 20 20 70 57 43 2d  aStatic);.  pWC-
36e0: 3e 61 20 3d 20 70 57 43 2d 3e 61 53 74 61 74 69  >a = pWC->aStati
36f0: 63 3b 0a 20 20 70 57 43 2d 3e 77 63 74 72 6c 46  c;.  pWC->wctrlF
3700: 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67  lags = wctrlFlag
3710: 73 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  s;.}../* Forward
3720: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
3730: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 43  atic void whereC
3740: 6c 61 75 73 65 43 6c 65 61 72 28 57 68 65 72 65  lauseClear(Where
3750: 43 6c 61 75 73 65 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  Clause*);../*.**
3760: 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20   Deallocate all 
3770: 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
3780: 64 20 77 69 74 68 20 61 20 57 68 65 72 65 4f 72  d with a WhereOr
3790: 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  Info object..*/.
37a0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
37b0: 65 4f 72 49 6e 66 6f 44 65 6c 65 74 65 28 73 71  eOrInfoDelete(sq
37c0: 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
37d0: 4f 72 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68  OrInfo *p){.  wh
37e0: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
37f0: 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65  p->wc);.  sqlite
3800: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
3810: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
3820: 61 74 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ate all memory a
3830: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
3840: 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 6f 62   WhereAndInfo ob
3850: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
3860: 76 6f 69 64 20 77 68 65 72 65 41 6e 64 49 6e 66  void whereAndInf
3870: 6f 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  oDelete(sqlite3 
3880: 2a 64 62 2c 20 57 68 65 72 65 41 6e 64 49 6e 66  *db, WhereAndInf
3890: 6f 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 43 6c  o *p){.  whereCl
38a0: 61 75 73 65 43 6c 65 61 72 28 26 70 2d 3e 77 63  auseClear(&p->wc
38b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
38c0: 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
38d0: 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61  .** Deallocate a
38e0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
38f0: 75 63 74 75 72 65 2e 20 20 54 68 65 20 57 68 65  ucture.  The Whe
3900: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
3910: 72 65 0a 2a 2a 20 69 74 73 65 6c 66 20 69 73 20  re.** itself is 
3920: 6e 6f 74 20 66 72 65 65 64 2e 20 20 54 68 69 73  not freed.  This
3930: 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
3940: 69 6e 76 65 72 73 65 20 6f 66 20 77 68 65 72 65  inverse of where
3950: 43 6c 61 75 73 65 49 6e 69 74 28 29 2e 0a 2a 2f  ClauseInit()..*/
3960: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
3970: 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 57 68  reClauseClear(Wh
3980: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b  ereClause *pWC){
3990: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72  .  int i;.  Wher
39a0: 65 54 65 72 6d 20 2a 61 3b 0a 20 20 73 71 6c 69  eTerm *a;.  sqli
39b0: 74 65 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70  te3 *db = pWC->p
39c0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72  Parse->db;.  for
39d0: 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c  (i=pWC->nTerm-1,
39e0: 20 61 3d 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b   a=pWC->a; i>=0;
39f0: 20 69 2d 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20   i--, a++){.    
3a00: 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26  if( a->wtFlags &
3a10: 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b   TERM_DYNAMIC ){
3a20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
3a30: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e  prDelete(db, a->
3a40: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
3a50: 20 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73    if( a->wtFlags
3a60: 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29   & TERM_ORINFO )
3a70: 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4f 72 49  {.      whereOrI
3a80: 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c 20 61 2d  nfoDelete(db, a-
3a90: 3e 75 2e 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20  >u.pOrInfo);.   
3aa0: 20 7d 65 6c 73 65 20 69 66 28 20 61 2d 3e 77 74   }else if( a->wt
3ab0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 41 4e 44  Flags & TERM_AND
3ac0: 49 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20 77 68  INFO ){.      wh
3ad0: 65 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65  ereAndInfoDelete
3ae0: 28 64 62 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e  (db, a->u.pAndIn
3af0: 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  fo);.    }.  }. 
3b00: 20 69 66 28 20 70 57 43 2d 3e 61 21 3d 70 57 43   if( pWC->a!=pWC
3b10: 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20  ->aStatic ){.   
3b20: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
3b30: 62 2c 20 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a  b, pWC->a);.  }.
3b40: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73  }../*.** Add a s
3b50: 69 6e 67 6c 65 20 6e 65 77 20 57 68 65 72 65 54  ingle new WhereT
3b60: 65 72 6d 20 65 6e 74 72 79 20 74 6f 20 74 68 65  erm entry to the
3b70: 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a   WhereClause obj
3b80: 65 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20  ect pWC..** The 
3b90: 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 6f 62  new WhereTerm ob
3ba0: 6a 65 63 74 20 69 73 20 63 6f 6e 73 74 72 75 63  ject is construc
3bb0: 74 65 64 20 66 72 6f 6d 20 45 78 70 72 20 70 20  ted from Expr p 
3bc0: 61 6e 64 20 77 69 74 68 20 77 74 46 6c 61 67 73  and with wtFlags
3bd0: 2e 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69  ..** The index i
3be0: 6e 20 70 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68  n pWC->a[] of th
3bf0: 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20  e new WhereTerm 
3c00: 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
3c10: 75 63 63 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20  uccess..** 0 is 
3c20: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
3c30: 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 63 6f  new WhereTerm co
3c40: 75 6c 64 20 6e 6f 74 20 62 65 20 61 64 64 65 64  uld not be added
3c50: 20 64 75 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79   due to a memory
3c60: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  .** allocation e
3c70: 72 72 6f 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72  rror.  The memor
3c80: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
3c90: 6c 75 72 65 20 77 69 6c 6c 20 62 65 20 72 65 63  lure will be rec
3ca0: 6f 72 64 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20  orded in.** the 
3cb0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
3cc0: 20 66 6c 61 67 20 73 6f 20 74 68 61 74 20 68 69   flag so that hi
3cd0: 67 68 65 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74  gher-level funct
3ce0: 69 6f 6e 73 20 63 61 6e 20 64 65 74 65 63 74 20  ions can detect 
3cf0: 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  it..**.** This r
3d00: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72  outine will incr
3d10: 65 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66  ease the size of
3d20: 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72   the pWC->a[] ar
3d30: 72 61 79 20 61 73 20 6e 65 63 65 73 73 61 72 79  ray as necessary
3d40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77  ..**.** If the w
3d50: 74 46 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20  tFlags argument 
3d60: 69 6e 63 6c 75 64 65 73 20 54 45 52 4d 5f 44 59  includes TERM_DY
3d70: 4e 41 4d 49 43 2c 20 74 68 65 6e 20 72 65 73 70  NAMIC, then resp
3d80: 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f  onsibility.** fo
3d90: 72 20 66 72 65 65 69 6e 67 20 74 68 65 20 65 78  r freeing the ex
3da0: 70 72 65 73 73 69 6f 6e 20 70 20 69 73 20 61 73  pression p is as
3db0: 73 75 6d 65 64 20 62 79 20 74 68 65 20 57 68 65  sumed by the Whe
3dc0: 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20  reClause object 
3dd0: 70 57 43 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  pWC..** This is 
3de0: 74 72 75 65 20 65 76 65 6e 20 69 66 20 74 68 69  true even if thi
3df0: 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20  s routine fails 
3e00: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  to allocate a ne
3e10: 77 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a  w WhereTerm..**.
3e20: 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 20 54 68 69  ** WARNING:  Thi
3e30: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
3e40: 72 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  reallocate the s
3e50: 70 61 63 65 20 75 73 65 64 20 74 6f 20 73 74 6f  pace used to sto
3e60: 72 65 0a 2a 2a 20 57 68 65 72 65 54 65 72 6d 73  re.** WhereTerms
3e70: 2e 20 20 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20  .  All pointers 
3e80: 74 6f 20 57 68 65 72 65 54 65 72 6d 73 20 73 68  to WhereTerms sh
3e90: 6f 75 6c 64 20 62 65 20 69 6e 76 61 6c 69 64 61  ould be invalida
3ea0: 74 65 64 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c  ted after.** cal
3eb0: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
3ec0: 65 2e 20 20 53 75 63 68 20 70 6f 69 6e 74 65 72  e.  Such pointer
3ed0: 73 20 6d 61 79 20 62 65 20 72 65 69 6e 69 74 69  s may be reiniti
3ee0: 61 6c 69 7a 65 64 20 62 79 20 72 65 66 65 72 65  alized by refere
3ef0: 6e 63 69 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43  ncing.** the pWC
3f00: 2d 3e 61 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  ->a[] array..*/.
3f10: 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
3f20: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 57 68 65  ClauseInsert(Whe
3f30: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45  reClause *pWC, E
3f40: 78 70 72 20 2a 70 2c 20 75 38 20 77 74 46 6c 61  xpr *p, u8 wtFla
3f50: 67 73 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d  gs){.  WhereTerm
3f60: 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69   *pTerm;.  int i
3f70: 64 78 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  dx;.  testcase( 
3f80: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
3f90: 49 52 54 55 41 4c 20 29 3b 20 20 2f 2a 20 45 56  IRTUAL );  /* EV
3fa0: 3a 20 52 2d 30 30 32 31 31 2d 31 35 31 30 30 20  : R-00211-15100 
3fb0: 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e 6e 54  */.  if( pWC->nT
3fc0: 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20  erm>=pWC->nSlot 
3fd0: 29 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  ){.    WhereTerm
3fe0: 20 2a 70 4f 6c 64 20 3d 20 70 57 43 2d 3e 61 3b   *pOld = pWC->a;
3ff0: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
4000: 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 2d 3e   = pWC->pParse->
4010: 64 62 3b 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d  db;.    pWC->a =
4020: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
4030: 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70  Raw(db, sizeof(p
4040: 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e  WC->a[0])*pWC->n
4050: 53 6c 6f 74 2a 32 20 29 3b 0a 20 20 20 20 69 66  Slot*2 );.    if
4060: 28 20 70 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20  ( pWC->a==0 ){. 
4070: 20 20 20 20 20 69 66 28 20 77 74 46 6c 61 67 73       if( wtFlags
4080: 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20   & TERM_DYNAMIC 
4090: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
40a0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
40b0: 20 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   p);.      }.   
40c0: 20 20 20 70 57 43 2d 3e 61 20 3d 20 70 4f 6c 64     pWC->a = pOld
40d0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
40e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
40f0: 70 79 28 70 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c  py(pWC->a, pOld,
4100: 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30   sizeof(pWC->a[0
4110: 5d 29 2a 70 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a  ])*pWC->nTerm);.
4120: 20 20 20 20 69 66 28 20 70 4f 6c 64 21 3d 70 57      if( pOld!=pW
4130: 43 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20  C->aStatic ){.  
4140: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4150: 65 28 64 62 2c 20 70 4f 6c 64 29 3b 0a 20 20 20  e(db, pOld);.   
4160: 20 7d 0a 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f   }.    pWC->nSlo
4170: 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
4180: 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 57 43 2d  locSize(db, pWC-
4190: 3e 61 29 2f 73 69 7a 65 6f 66 28 70 57 43 2d 3e  >a)/sizeof(pWC->
41a0: 61 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 70 54 65  a[0]);.  }.  pTe
41b0: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
41c0: 20 3d 20 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d   = pWC->nTerm++]
41d0: 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  ;.  pTerm->pExpr
41e0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
41f0: 69 70 43 6f 6c 6c 61 74 65 28 70 29 3b 0a 20 20  ipCollate(p);.  
4200: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 3d  pTerm->wtFlags =
4210: 20 77 74 46 6c 61 67 73 3b 0a 20 20 70 54 65 72   wtFlags;.  pTer
4220: 6d 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20  m->pWC = pWC;.  
4230: 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d  pTerm->iParent =
4240: 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 69 64   -1;.  return id
4250: 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  x;.}../*.** This
4260: 20 72 6f 75 74 69 6e 65 20 69 64 65 6e 74 69 66   routine identif
4270: 69 65 73 20 73 75 62 65 78 70 72 65 73 73 69 6f  ies subexpressio
4280: 6e 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ns in the WHERE 
4290: 63 6c 61 75 73 65 20 77 68 65 72 65 0a 2a 2a 20  clause where.** 
42a0: 65 61 63 68 20 73 75 62 65 78 70 72 65 73 73 69  each subexpressi
42b0: 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20  on is separated 
42c0: 62 79 20 74 68 65 20 41 4e 44 20 6f 70 65 72 61  by the AND opera
42d0: 74 6f 72 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  tor or some othe
42e0: 72 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 73 70  r.** operator sp
42f0: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 6f  ecified in the o
4300: 70 20 70 61 72 61 6d 65 74 65 72 2e 20 20 54 68  p parameter.  Th
4310: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
4320: 72 75 63 74 75 72 65 0a 2a 2a 20 69 73 20 66 69  ructure.** is fi
4330: 6c 6c 65 64 20 77 69 74 68 20 70 6f 69 6e 74 65  lled with pointe
4340: 72 73 20 74 6f 20 73 75 62 65 78 70 72 65 73 73  rs to subexpress
4350: 69 6f 6e 73 2e 20 20 46 6f 72 20 65 78 61 6d 70  ions.  For examp
4360: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 57 48 45  le:.**.**    WHE
4370: 52 45 20 20 61 3d 3d 27 68 65 6c 6c 6f 27 20 41  RE  a=='hello' A
4380: 4e 44 20 63 6f 61 6c 65 73 63 65 28 62 2c 31 31  ND coalesce(b,11
4390: 29 3c 31 30 20 41 4e 44 20 28 63 2b 31 32 21 3d  )<10 AND (c+12!=
43a0: 64 20 4f 52 20 63 3d 3d 32 32 29 0a 2a 2a 20 20  d OR c==22).**  
43b0: 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
43c0: 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f  __/     \_______
43d0: 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f  ________/     \_
43e0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
43f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 73  .**            s
4400: 6c 6f 74 5b 30 5d 20 20 20 20 20 20 20 20 20 20  lot[0]          
4410: 20 20 73 6c 6f 74 5b 31 5d 20 20 20 20 20 20 20    slot[1]       
4420: 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 32 5d 0a          slot[2].
4430: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e  **.** The origin
4440: 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  al WHERE clause 
4450: 69 6e 20 70 45 78 70 72 20 69 73 20 75 6e 61 6c  in pExpr is unal
4460: 74 65 72 65 64 2e 20 20 41 6c 6c 20 74 68 69 73  tered.  All this
4470: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73   routine.** does
4480: 20 69 73 20 6d 61 6b 65 20 73 6c 6f 74 5b 5d 20   is make slot[] 
4490: 65 6e 74 72 69 65 73 20 70 6f 69 6e 74 20 74 6f  entries point to
44a0: 20 73 75 62 73 74 72 75 63 74 75 72 65 20 77 69   substructure wi
44b0: 74 68 69 6e 20 70 45 78 70 72 2e 0a 2a 2a 0a 2a  thin pExpr..**.*
44c0: 2a 20 49 6e 20 74 68 65 20 70 72 65 76 69 6f 75  * In the previou
44d0: 73 20 73 65 6e 74 65 6e 63 65 20 61 6e 64 20 69  s sentence and i
44e0: 6e 20 74 68 65 20 64 69 61 67 72 61 6d 2c 20 22  n the diagram, "
44f0: 73 6c 6f 74 5b 5d 22 20 72 65 66 65 72 73 20 74  slot[]" refers t
4500: 6f 0a 2a 2a 20 74 68 65 20 57 68 65 72 65 43 6c  o.** the WhereCl
4510: 61 75 73 65 2e 61 5b 5d 20 61 72 72 61 79 2e 20  ause.a[] array. 
4520: 20 54 68 65 20 73 6c 6f 74 5b 5d 20 61 72 72 61   The slot[] arra
4530: 79 20 67 72 6f 77 73 20 61 73 20 6e 65 65 64 65  y grows as neede
4540: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20  d to contain.** 
4550: 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
4560: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
4570: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
4580: 65 72 65 53 70 6c 69 74 28 57 68 65 72 65 43 6c  ereSplit(WhereCl
4590: 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20  ause *pWC, Expr 
45a0: 2a 70 45 78 70 72 2c 20 69 6e 74 20 6f 70 29 7b  *pExpr, int op){
45b0: 0a 20 20 70 57 43 2d 3e 6f 70 20 3d 20 28 75 38  .  pWC->op = (u8
45c0: 29 6f 70 3b 0a 20 20 69 66 28 20 70 45 78 70 72  )op;.  if( pExpr
45d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
45e0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f  if( pExpr->op!=o
45f0: 70 20 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c  p ){.    whereCl
4600: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
4610: 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d 65 6c  pExpr, 0);.  }el
4620: 73 65 7b 0a 20 20 20 20 77 68 65 72 65 53 70 6c  se{.    whereSpl
4630: 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70  it(pWC, pExpr->p
4640: 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20 20 20 77  Left, op);.    w
4650: 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70  hereSplit(pWC, p
4660: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
4670: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
4680: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20 65 78  Initialize an ex
4690: 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65  pression mask se
46a0: 74 20 28 61 20 57 68 65 72 65 4d 61 73 6b 53 65  t (a WhereMaskSe
46b0: 74 20 6f 62 6a 65 63 74 29 0a 2a 2f 0a 23 64 65  t object).*/.#de
46c0: 66 69 6e 65 20 69 6e 69 74 4d 61 73 6b 53 65 74  fine initMaskSet
46d0: 28 50 29 20 20 6d 65 6d 73 65 74 28 50 2c 20 30  (P)  memset(P, 0
46e0: 2c 20 73 69 7a 65 6f 66 28 2a 50 29 29 0a 0a 2f  , sizeof(*P))../
46f0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
4700: 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20  bitmask for the 
4710: 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d  given cursor num
4720: 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ber.  Return 0 i
4730: 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73 20  f.** iCursor is 
4740: 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e 0a  not in the set..
4750: 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
4760: 6b 20 67 65 74 4d 61 73 6b 28 57 68 65 72 65 4d  k getMask(WhereM
4770: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
4780: 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a  , int iCursor){.
4790: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
47a0: 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3c 3d  t( pMaskSet->n<=
47b0: 28 69 6e 74 29 73 69 7a 65 6f 66 28 42 69 74 6d  (int)sizeof(Bitm
47c0: 61 73 6b 29 2a 38 20 29 3b 0a 20 20 66 6f 72 28  ask)*8 );.  for(
47d0: 69 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d  i=0; i<pMaskSet-
47e0: 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  >n; i++){.    if
47f0: 28 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69  ( pMaskSet->ix[i
4800: 5d 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  ]==iCursor ){.  
4810: 20 20 20 20 72 65 74 75 72 6e 20 28 28 42 69 74      return ((Bit
4820: 6d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 20 20  mask)1)<<i;.    
4830: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
4840: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
4850: 65 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72  e a new mask for
4860: 20 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e   cursor iCursor.
4870: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
4880: 6f 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20 74  one cursor per t
4890: 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
48a0: 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e 75   clause.  The nu
48b0: 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65  mber of.** table
48c0: 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
48d0: 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20  ause is limited 
48e0: 62 79 20 61 20 74 65 73 74 20 65 61 72 6c 79 20  by a test early 
48f0: 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  in the.** sqlite
4900: 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 72 6f  3WhereBegin() ro
4910: 75 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e  utine.  So we kn
4920: 6f 77 20 74 68 61 74 20 74 68 65 20 70 4d 61 73  ow that the pMas
4930: 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72  kSet->ix[].** ar
4940: 72 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f  ray will never o
4950: 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74  verflow..*/.stat
4960: 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61  ic void createMa
4970: 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  sk(WhereMaskSet 
4980: 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69  *pMaskSet, int i
4990: 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65 72  Cursor){.  asser
49a0: 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c  t( pMaskSet->n <
49b0: 20 41 72 72 61 79 53 69 7a 65 28 70 4d 61 73 6b   ArraySize(pMask
49c0: 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d  Set->ix) );.  pM
49d0: 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b  askSet->ix[pMask
49e0: 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72  Set->n++] = iCur
49f0: 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  sor;.}../*.** Th
4a00: 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73  is routine walks
4a10: 20 28 72 65 63 75 72 73 69 76 65 6c 79 29 20 61   (recursively) a
4a20: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
4a30: 65 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 0a  e and generates.
4a40: 2a 2a 20 61 20 62 69 74 6d 61 73 6b 20 69 6e 64  ** a bitmask ind
4a50: 69 63 61 74 69 6e 67 20 77 68 69 63 68 20 74 61  icating which ta
4a60: 62 6c 65 73 20 61 72 65 20 75 73 65 64 20 69 6e  bles are used in
4a70: 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e   that expression
4a80: 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  .** tree..**.** 
4a90: 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69  In order for thi
4aa0: 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 77 6f 72  s routine to wor
4ab0: 6b 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  k, the calling f
4ac0: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 68 61 76  unction must hav
4ad0: 65 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20  e.** previously 
4ae0: 69 6e 76 6f 6b 65 64 20 73 71 6c 69 74 65 33 52  invoked sqlite3R
4af0: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
4b00: 29 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  ) on the express
4b10: 69 6f 6e 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65  ion.  See.** the
4b20: 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20   header comment 
4b30: 6f 6e 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20  on that routine 
4b40: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
4b50: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 54  nformation..** T
4b60: 68 65 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  he sqlite3Resolv
4b70: 65 45 78 70 72 4e 61 6d 65 73 28 29 20 72 6f 75  eExprNames() rou
4b80: 74 69 6e 65 73 20 6c 6f 6f 6b 73 20 66 6f 72 20  tines looks for 
4b90: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64  column names and
4ba0: 0a 2a 2a 20 73 65 74 73 20 74 68 65 69 72 20 6f  .** sets their o
4bb0: 70 63 6f 64 65 73 20 74 6f 20 54 4b 5f 43 4f 4c  pcodes to TK_COL
4bc0: 55 4d 4e 20 61 6e 64 20 74 68 65 69 72 20 45 78  UMN and their Ex
4bd0: 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64 73  pr.iTable fields
4be0: 20 74 6f 0a 2a 2a 20 74 68 65 20 56 44 42 45 20   to.** the VDBE 
4bf0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
4c00: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69   the table.  Thi
4c10: 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 68  s routine just h
4c20: 61 73 20 74 6f 0a 2a 2a 20 74 72 61 6e 73 6c 61  as to.** transla
4c30: 74 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  te the cursor nu
4c40: 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74 6d 61  mbers into bitma
4c50: 73 6b 20 76 61 6c 75 65 73 20 61 6e 64 20 4f 52  sk values and OR
4c60: 20 61 6c 6c 0a 2a 2a 20 74 68 65 20 62 69 74 6d   all.** the bitm
4c70: 61 73 6b 73 20 74 6f 67 65 74 68 65 72 2e 0a 2a  asks together..*
4c80: 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  /.static Bitmask
4c90: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
4ca0: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
4cb0: 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73  *, ExprList*);.s
4cc0: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
4cd0: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
4ce0: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  ge(WhereMaskSet*
4cf0: 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74  , Select*);.stat
4d00: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54  ic Bitmask exprT
4d10: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
4d20: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
4d30: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69  , Expr *p){.  Bi
4d40: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
4d50: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
4d60: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  urn 0;.  if( p->
4d70: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
4d80: 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d  .    mask = getM
4d90: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  ask(pMaskSet, p-
4da0: 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65  >iTable);.    re
4db0: 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20  turn mask;.  }. 
4dc0: 20 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c   mask = exprTabl
4dd0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
4de0: 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d   p->pRight);.  m
4df0: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
4e00: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
4e10: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  p->pLeft);.  if(
4e20: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
4e30: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
4e40: 29 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  ) ){.    mask |=
4e50: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
4e60: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
4e70: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  p->x.pSelect);. 
4e80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b   }else{.    mask
4e90: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
4ea0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
4eb0: 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20   p->x.pList);.  
4ec0: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
4ed0: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
4ee0: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
4ef0: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
4f00: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70  t *pMaskSet, Exp
4f10: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
4f20: 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73   int i;.  Bitmas
4f30: 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66  k mask = 0;.  if
4f40: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
4f50: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
4f60: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
4f70: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
4f80: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
4f90: 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  Set, pList->a[i]
4fa0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  .pExpr);.    }. 
4fb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
4fc0: 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61  ;.}.static Bitma
4fd0: 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  sk exprSelectTab
4fe0: 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73  leUsage(WhereMas
4ff0: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
5000: 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42  Select *pS){.  B
5010: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
5020: 0a 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a  .  while( pS ){.
5030: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
5040: 63 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  c = pS->pSrc;.  
5050: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
5060: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
5070: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73  skSet, pS->pELis
5080: 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  t);.    mask |= 
5090: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
50a0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
50b0: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
50c0: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74  mask |= exprList
50d0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
50e0: 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42  Set, pS->pOrderB
50f0: 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  y);.    mask |= 
5100: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
5110: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68  MaskSet, pS->pWh
5120: 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  ere);.    mask |
5130: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
5140: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
5150: 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66 28  Having);.    if(
5160: 20 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30 29   ALWAYS(pSrc!=0)
5170: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
5180: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
5190: 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  i<pSrc->nSrc; i+
51a0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b  +){.        mask
51b0: 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61   |= exprSelectTa
51c0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
51d0: 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53  t, pSrc->a[i].pS
51e0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
51f0: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
5200: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
5210: 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29   pSrc->a[i].pOn)
5220: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5230: 20 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72      pS = pS->pPr
5240: 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ior;.  }.  retur
5250: 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n mask;.}../*.**
5260: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
5270: 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74  the given operat
5280: 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  or is one of the
5290: 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
52a0: 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f  is.** allowed fo
52b0: 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57  r an indexable W
52c0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
52d0: 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f  .  The allowed o
52e0: 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20  perators are.** 
52f0: 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22  "=", "<", ">", "
5300: 3c 3d 22 2c 20 22 3e 3d 22 2c 20 61 6e 64 20 22  <=", ">=", and "
5310: 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c 45  IN"..**.** IMPLE
5320: 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d  MENTATION-OF: R-
5330: 35 39 39 32 36 2d 32 36 33 39 33 20 54 6f 20 62  59926-26393 To b
5340: 65 20 75 73 61 62 6c 65 20 62 79 20 61 6e 20 69  e usable by an i
5350: 6e 64 65 78 20 61 20 74 65 72 6d 20 6d 75 73 74  ndex a term must
5360: 20 62 65 0a 2a 2a 20 6f 66 20 6f 6e 65 20 6f 66   be.** of one of
5370: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
5380: 6f 72 6d 73 3a 20 63 6f 6c 75 6d 6e 20 3d 20 65  orms: column = e
5390: 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e  xpression column
53a0: 20 3e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a   > expression.**
53b0: 20 63 6f 6c 75 6d 6e 20 3e 3d 20 65 78 70 72 65   column >= expre
53c0: 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e 20 3c 20 65  ssion column < e
53d0: 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e  xpression column
53e0: 20 3c 3d 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a   <= expression.*
53f0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 3d 20 63  * expression = c
5400: 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e  olumn expression
5410: 20 3e 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73   > column expres
5420: 73 69 6f 6e 20 3e 3d 20 63 6f 6c 75 6d 6e 0a 2a  sion >= column.*
5430: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 3c 20 63  * expression < c
5440: 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e  olumn expression
5450: 20 3c 3d 20 63 6f 6c 75 6d 6e 20 63 6f 6c 75 6d   <= column colum
5460: 6e 20 49 4e 0a 2a 2a 20 28 65 78 70 72 65 73 73  n IN.** (express
5470: 69 6f 6e 2d 6c 69 73 74 29 20 63 6f 6c 75 6d 6e  ion-list) column
5480: 20 49 4e 20 28 73 75 62 71 75 65 72 79 29 20 63   IN (subquery) c
5490: 6f 6c 75 6d 6e 20 49 53 20 4e 55 4c 4c 0a 2a 2f  olumn IS NULL.*/
54a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
54b0: 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20  wedOp(int op){. 
54c0: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54   assert( TK_GT>T
54d0: 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b  K_EQ && TK_GT<TK
54e0: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
54f0: 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20   TK_LT>TK_EQ && 
5500: 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_LT<TK_GE );. 
5510: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54   assert( TK_LE>T
5520: 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b  K_EQ && TK_LE<TK
5530: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
5540: 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20   TK_GE==TK_EQ+4 
5550: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d  );.  return op==
5560: 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b  TK_IN || (op>=TK
5570: 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45  _EQ && op<=TK_GE
5580: 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ) || op==TK_ISNU
5590: 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61  LL;.}../*.** Swa
55a0: 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66  p two objects of
55b0: 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23   type TYPE..*/.#
55c0: 64 65 66 69 6e 65 20 53 57 41 50 28 54 59 50 45  define SWAP(TYPE
55d0: 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d 41 3b  ,A,B) {TYPE t=A;
55e0: 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a   A=B; B=t;}../*.
55f0: 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63 6f 6d  ** Commute a com
5600: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
5610: 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f  .  Expressions o
5620: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 6f 70  f the form "X op
5630: 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e 76 65   Y".** are conve
5640: 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f 70 20  rted into "Y op 
5650: 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6c 65 66  X"..**.** If lef
5660: 74 2f 72 69 67 68 74 20 70 72 65 63 65 6e 64 65  t/right precende
5670: 6e 63 65 20 72 75 6c 65 73 20 63 6f 6d 65 20 69  nce rules come i
5680: 6e 74 6f 20 70 6c 61 79 20 77 68 65 6e 20 64 65  nto play when de
5690: 74 65 72 6d 69 6e 69 6e 67 20 74 68 65 0a 2a 2a  termining the.**
56a0: 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 69   collating.** si
56b0: 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  de of the compar
56c0: 69 73 6f 6e 2c 20 69 74 20 72 65 6d 61 69 6e 73  ison, it remains
56d0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
56e0: 20 74 68 65 20 73 61 6d 65 20 73 69 64 65 20 61   the same side a
56f0: 66 74 65 72 0a 2a 2a 20 74 68 65 20 63 6f 6d 6d  fter.** the comm
5700: 75 74 61 74 69 6f 6e 2e 20 53 6f 20 22 59 20 63  utation. So "Y c
5710: 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f 70  ollate NOCASE op
5720: 20 58 22 20 62 65 63 6f 6d 65 73 20 0a 2a 2a 20   X" becomes .** 
5730: 22 58 20 6f 70 20 59 22 2e 20 54 68 69 73 20 69  "X op Y". This i
5740: 73 20 62 65 63 61 75 73 65 20 61 6e 79 20 63 6f  s because any co
5750: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
5760: 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c 65 66 74 20   on.** the left 
5770: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 20 63  hand side of a c
5780: 6f 6d 70 61 72 69 73 6f 6e 20 6f 76 65 72 72 69  omparison overri
5790: 64 65 73 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f  des any collatio
57a0: 6e 20 73 65 71 75 65 6e 63 65 20 0a 2a 2a 20 61  n sequence .** a
57b0: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 72  ttached to the r
57c0: 69 67 68 74 2e 20 46 6f 72 20 74 68 65 20 73 61  ight. For the sa
57d0: 6d 65 20 72 65 61 73 6f 6e 20 74 68 65 20 45 50  me reason the EP
57e0: 5f 43 6f 6c 6c 61 74 65 20 66 6c 61 67 0a 2a 2a  _Collate flag.**
57f0: 20 69 73 20 6e 6f 74 20 63 6f 6d 6d 75 74 65 64   is not commuted
5800: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5810: 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 50 61 72   exprCommute(Par
5820: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
5830: 20 2a 70 45 78 70 72 29 7b 0a 20 20 75 31 36 20   *pExpr){.  u16 
5840: 65 78 70 52 69 67 68 74 20 3d 20 28 70 45 78 70  expRight = (pExp
5850: 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73  r->pRight->flags
5860: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a   & EP_Collate);.
5870: 20 20 75 31 36 20 65 78 70 4c 65 66 74 20 3d 20    u16 expLeft = 
5880: 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66  (pExpr->pLeft->f
5890: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
58a0: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6c  e);.  assert( al
58b0: 6c 6f 77 65 64 4f 70 28 70 45 78 70 72 2d 3e 6f  lowedOp(pExpr->o
58c0: 70 29 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21  p) && pExpr->op!
58d0: 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 69 66 28 20  =TK_IN );.  if( 
58e0: 65 78 70 52 69 67 68 74 3d 3d 65 78 70 4c 65 66  expRight==expLef
58f0: 74 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68  t ){.    /* Eith
5900: 65 72 20 58 20 61 6e 64 20 59 20 62 6f 74 68 20  er X and Y both 
5910: 68 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65  have COLLATE ope
5920: 72 61 74 6f 72 20 6f 72 20 6e 65 69 74 68 65 72  rator or neither
5930: 20 64 6f 20 2a 2f 0a 20 20 20 20 69 66 28 20 65   do */.    if( e
5940: 78 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  xpRight ){.     
5950: 20 2f 2a 20 42 6f 74 68 20 58 20 61 6e 64 20 59   /* Both X and Y
5960: 20 68 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70   have COLLATE op
5970: 65 72 61 74 6f 72 73 2e 20 20 4d 61 6b 65 20 73  erators.  Make s
5980: 75 72 65 20 58 20 69 73 20 61 6c 77 61 79 73 0a  ure X is always.
5990: 20 20 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79        ** used by
59a0: 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 45 50   clearing the EP
59b0: 5f 43 6f 6c 6c 61 74 65 20 66 6c 61 67 20 66 72  _Collate flag fr
59c0: 6f 6d 20 59 2e 20 2a 2f 0a 20 20 20 20 20 20 70  om Y. */.      p
59d0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c  Expr->pRight->fl
59e0: 61 67 73 20 26 3d 20 7e 45 50 5f 43 6f 6c 6c 61  ags &= ~EP_Colla
59f0: 74 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  te;.    }else if
5a00: 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  ( sqlite3ExprCol
5a10: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
5a20: 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b  pr->pLeft)!=0 ){
5a30: 0a 20 20 20 20 20 20 2f 2a 20 4e 65 69 74 68 65  .      /* Neithe
5a40: 72 20 58 20 6e 6f 72 20 59 20 68 61 76 65 20 43  r X nor Y have C
5a50: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73  OLLATE operators
5a60: 2c 20 62 75 74 20 58 20 68 61 73 20 61 20 6e 6f  , but X has a no
5a70: 6e 2d 64 65 66 61 75 6c 74 0a 20 20 20 20 20 20  n-default.      
5a80: 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ** collating seq
5a90: 75 65 6e 63 65 2e 20 20 53 6f 20 61 64 64 20 74  uence.  So add t
5aa0: 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 6d 61  he EP_Collate ma
5ab0: 72 6b 65 72 20 6f 6e 20 58 20 74 6f 20 63 61 75  rker on X to cau
5ac0: 73 65 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 74  se.      ** it t
5ad0: 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 66 69  o be searched fi
5ae0: 72 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70 45  rst. */.      pE
5af0: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  xpr->pLeft->flag
5b00: 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 3b  s |= EP_Collate;
5b10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 53 57 41  .    }.  }.  SWA
5b20: 50 28 45 78 70 72 2a 2c 70 45 78 70 72 2d 3e 70  P(Expr*,pExpr->p
5b30: 52 69 67 68 74 2c 70 45 78 70 72 2d 3e 70 4c 65  Right,pExpr->pLe
5b40: 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  ft);.  if( pExpr
5b50: 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b 0a 20  ->op>=TK_GT ){. 
5b60: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54     assert( TK_LT
5b70: 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a 20 20 20  ==TK_GT+2 );.   
5b80: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d   assert( TK_GE==
5b90: 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20 20 61  TK_LE+2 );.    a
5ba0: 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f  ssert( TK_GT>TK_
5bb0: 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  EQ );.    assert
5bc0: 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20 29 3b  ( TK_GT<TK_LE );
5bd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
5be0: 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 26 26  pr->op>=TK_GT &&
5bf0: 20 70 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b 5f 47   pExpr->op<=TK_G
5c00: 45 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  E );.    pExpr->
5c10: 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70  op = ((pExpr->op
5c20: 2d 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f 47 54  -TK_GT)^2)+TK_GT
5c30: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
5c40: 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20 54 4b  ranslate from TK
5c50: 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  _xx operator to 
5c60: 57 4f 5f 78 78 20 62 69 74 6d 61 73 6b 2e 0a 2a  WO_xx bitmask..*
5c70: 2f 0a 73 74 61 74 69 63 20 75 31 36 20 6f 70 65  /.static u16 ope
5c80: 72 61 74 6f 72 4d 61 73 6b 28 69 6e 74 20 6f 70  ratorMask(int op
5c90: 29 7b 0a 20 20 75 31 36 20 63 3b 0a 20 20 61 73  ){.  u16 c;.  as
5ca0: 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28  sert( allowedOp(
5cb0: 6f 70 29 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d  op) );.  if( op=
5cc0: 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 63 20  =TK_IN ){.    c 
5cd0: 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65  = WO_IN;.  }else
5ce0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55   if( op==TK_ISNU
5cf0: 4c 4c 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f  LL ){.    c = WO
5d00: 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65  _ISNULL;.  }else
5d10: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 57  {.    assert( (W
5d20: 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29  O_EQ<<(op-TK_EQ)
5d30: 29 20 3c 20 30 78 37 66 66 66 20 29 3b 0a 20 20  ) < 0x7fff );.  
5d40: 20 20 63 20 3d 20 28 75 31 36 29 28 57 4f 5f 45    c = (u16)(WO_E
5d50: 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 3b 0a  Q<<(op-TK_EQ));.
5d60: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 70    }.  assert( op
5d70: 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 63  !=TK_ISNULL || c
5d80: 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==WO_ISNULL );. 
5d90: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
5da0: 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e 20 29  IN || c==WO_IN )
5db0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
5dc0: 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f 5f 45  TK_EQ || c==WO_E
5dd0: 51 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  Q );.  assert( o
5de0: 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d 3d 57  p!=TK_LT || c==W
5df0: 4f 5f 4c 54 20 29 3b 0a 20 20 61 73 73 65 72 74  O_LT );.  assert
5e00: 28 20 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 63  ( op!=TK_LE || c
5e10: 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 61 73 73  ==WO_LE );.  ass
5e20: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 54 20 7c  ert( op!=TK_GT |
5e30: 7c 20 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a 20 20  | c==WO_GT );.  
5e40: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47  assert( op!=TK_G
5e50: 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20 29 3b  E || c==WO_GE );
5e60: 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a  .  return c;.}..
5e70: 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72  /*.** Search for
5e80: 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57   a term in the W
5e90: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
5ea0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
5eb0: 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a  "X <op> <expr>".
5ec0: 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61 20  ** where X is a 
5ed0: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
5ee0: 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c   iColumn of tabl
5ef0: 65 20 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e 20  e iCur and <op> 
5f00: 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 65  is one of.** the
5f10: 20 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20   WO_xx operator 
5f20: 63 6f 64 65 73 20 73 70 65 63 69 66 69 65 64 20  codes specified 
5f30: 62 79 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65  by the op parame
5f40: 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ter..** Return a
5f50: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
5f60: 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20  term.  Return 0 
5f70: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
5f80: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 72 65 74  .** The term ret
5f90: 75 72 6e 65 64 20 6d 69 67 68 74 20 62 79 20 59  urned might by Y
5fa0: 3d 3c 65 78 70 72 3e 20 69 66 20 74 68 65 72 65  =<expr> if there
5fb0: 20 69 73 20 61 6e 6f 74 68 65 72 20 63 6f 6e 73   is another cons
5fc0: 74 72 61 69 6e 74 20 69 6e 0a 2a 2a 20 74 68 65  traint in.** the
5fd0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
5fe0: 61 74 20 73 70 65 63 69 66 69 65 73 20 74 68 61  at specifies tha
5ff0: 74 20 58 3d 59 2e 20 20 41 6e 79 20 73 75 63 68  t X=Y.  Any such
6000: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c   constraints wil
6010: 6c 20 62 65 0a 2a 2a 20 69 64 65 6e 74 69 66 69  l be.** identifi
6020: 65 64 20 62 79 20 74 68 65 20 57 4f 5f 45 51 55  ed by the WO_EQU
6030: 49 56 20 62 69 74 20 69 6e 20 74 68 65 20 70 54  IV bit in the pT
6040: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 66  erm->eOperator f
6050: 69 65 6c 64 2e 20 20 54 68 65 0a 2a 2a 20 61 45  ield.  The.** aE
6060: 71 75 69 76 5b 5d 20 61 72 72 61 79 20 68 6f 6c  quiv[] array hol
6070: 64 73 20 58 20 61 6e 64 20 61 6c 6c 20 69 74 73  ds X and all its
6080: 20 65 71 75 69 76 61 6c 65 6e 74 73 2c 20 77 69   equivalents, wi
6090: 74 68 20 65 61 63 68 20 53 51 4c 20 76 61 72 69  th each SQL vari
60a0: 61 62 6c 65 0a 2a 2a 20 74 61 6b 69 6e 67 20 75  able.** taking u
60b0: 70 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 61  p two slots in a
60c0: 45 71 75 69 76 5b 5d 2e 20 20 54 68 65 20 66 69  Equiv[].  The fi
60d0: 72 73 74 20 73 6c 6f 74 20 69 73 20 66 6f 72 20  rst slot is for 
60e0: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
60f0: 72 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 63  r.** and the sec
6100: 6f 6e 64 20 69 73 20 66 6f 72 20 74 68 65 20 63  ond is for the c
6110: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 20 20 54  olumn number.  T
6120: 68 65 72 65 20 61 72 65 20 32 32 20 73 6c 6f 74  here are 22 slot
6130: 73 20 69 6e 20 61 45 71 75 69 76 5b 5d 0a 2a 2a  s in aEquiv[].**
6140: 20 73 6f 20 74 68 61 74 20 6d 65 61 6e 73 20 77   so that means w
6150: 65 20 63 61 6e 20 6c 6f 6f 6b 20 66 6f 72 20 58  e can look for X
6160: 20 70 6c 75 73 20 75 70 20 74 6f 20 31 30 20 6f   plus up to 10 o
6170: 74 68 65 72 20 65 71 75 69 76 61 6c 65 6e 74 20  ther equivalent 
6180: 76 61 6c 75 65 73 2e 0a 2a 2a 20 48 65 6e 63 65  values..** Hence
6190: 20 61 20 73 65 61 72 63 68 20 66 6f 72 20 58 20   a search for X 
61a0: 77 69 6c 6c 20 72 65 74 75 72 6e 20 3c 65 78 70  will return <exp
61b0: 72 3e 20 69 66 20 58 3d 41 31 20 61 6e 64 20 41  r> if X=A1 and A
61c0: 31 3d 41 32 20 61 6e 64 20 41 32 3d 41 33 0a 2a  1=A2 and A2=A3.*
61d0: 2a 20 61 6e 64 20 2e 2e 2e 20 61 6e 64 20 41 39  * and ... and A9
61e0: 3d 41 31 30 20 61 6e 64 20 41 31 30 3d 3c 65 78  =A10 and A10=<ex
61f0: 70 72 3e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  pr>..**.** If th
6200: 65 72 65 20 61 72 65 20 6d 75 6c 74 69 70 6c 65  ere are multiple
6210: 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48   terms in the WH
6220: 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ERE clause of th
6230: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c  e form "X <op> <
6240: 65 78 70 72 3e 22 0a 2a 2a 20 74 68 65 6e 20 74  expr>".** then t
6250: 72 79 20 66 6f 72 20 74 68 65 20 6f 6e 65 20 77  ry for the one w
6260: 69 74 68 20 6e 6f 20 64 65 70 65 6e 64 65 6e 63  ith no dependenc
6270: 69 65 73 20 6f 6e 20 3c 65 78 70 72 3e 20 2d 20  ies on <expr> - 
6280: 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 77  in other words w
6290: 68 65 72 65 0a 2a 2a 20 3c 65 78 70 72 3e 20 69  here.** <expr> i
62a0: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70  s a constant exp
62b0: 72 65 73 73 69 6f 6e 20 6f 66 20 73 6f 6d 65 20  ression of some 
62c0: 6b 69 6e 64 2e 20 20 4f 6e 6c 79 20 72 65 74 75  kind.  Only retu
62d0: 72 6e 20 65 6e 74 72 69 65 73 20 6f 66 0a 2a 2a  rn entries of.**
62e0: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
62f0: 3e 20 59 22 20 77 68 65 72 65 20 59 20 69 73 20  > Y" where Y is 
6300: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74  a column in anot
6310: 68 65 72 20 74 61 62 6c 65 20 69 66 20 6e 6f 20  her table if no 
6320: 74 65 72 6d 73 20 6f 66 0a 2a 2a 20 74 68 65 20  terms of.** the 
6330: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 63 6f  form "X <op> <co
6340: 6e 73 74 2d 65 78 70 72 3e 22 20 65 78 69 73 74  nst-expr>" exist
6350: 2e 20 20 4f 74 68 65 72 20 74 68 61 6e 20 74 68  .  Other than th
6360: 69 73 20 70 72 69 6f 72 69 74 79 2c 20 69 66 20  is priority, if 
6370: 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f  there.** are two
6380: 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 74   or more terms t
6390: 68 61 74 20 6d 61 74 63 68 2c 20 74 68 65 6e 20  hat match, then 
63a0: 74 68 65 20 63 68 6f 69 63 65 20 6f 66 20 77 68  the choice of wh
63b0: 69 63 68 20 74 65 72 6d 20 74 6f 20 72 65 74 75  ich term to retu
63c0: 72 6e 0a 2a 2a 20 69 73 20 61 72 62 69 74 72 61  rn.** is arbitra
63d0: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68  ry..*/.static Wh
63e0: 65 72 65 54 65 72 6d 20 2a 66 69 6e 64 54 65 72  ereTerm *findTer
63f0: 6d 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  m(.  WhereClause
6400: 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68   *pWC,     /* Th
6410: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
6420: 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f  o be searched */
6430: 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20  .  int iCur,    
6440: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
6450: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53  or number of LHS
6460: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
6470: 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  n,          /* C
6480: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20  olumn number of 
6490: 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  LHS */.  Bitmask
64a0: 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f   notReady,     /
64b0: 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f 74 20 6f  * RHS must not o
64c0: 76 65 72 6c 61 70 20 77 69 74 68 20 74 68 69 73  verlap with this
64d0: 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 33 32 20 6f   mask */.  u32 o
64e0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
64f0: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f 5f 78   /* Mask of WO_x
6500: 78 20 76 61 6c 75 65 73 20 64 65 73 63 72 69 62  x values describ
6510: 69 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  ing operator */.
6520: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
6530: 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
6540: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
6550: 74 68 20 74 68 69 73 20 69 6e 64 65 78 2c 20 69  th this index, i
6560: 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  f not NULL */.){
6570: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
6580: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
6590: 2f 2a 20 54 65 72 6d 20 62 65 69 6e 67 20 65 78  /* Term being ex
65a0: 61 6d 69 6e 65 64 20 61 73 20 70 6f 73 73 69 62  amined as possib
65b0: 6c 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 57  le result */.  W
65c0: 68 65 72 65 54 65 72 6d 20 2a 70 52 65 73 75 6c  hereTerm *pResul
65d0: 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54  t = 0;      /* T
65e0: 68 65 20 61 6e 73 77 65 72 20 74 6f 20 72 65 74  he answer to ret
65f0: 75 72 6e 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  urn */.  WhereCl
6600: 61 75 73 65 20 2a 70 57 43 4f 72 69 67 20 3d 20  ause *pWCOrig = 
6610: 70 57 43 3b 20 20 2f 2a 20 4f 72 69 67 69 6e 61  pWC;  /* Origina
6620: 6c 20 70 57 43 20 76 61 6c 75 65 20 2a 2f 0a 20  l pWC value */. 
6630: 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20 20 20 20   int j, k;      
6640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6650: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
6660: 2f 0a 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20  /.  Expr *pX;   
6670: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6680: 50 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 65 78  Pointer to an ex
6690: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 50 61  pression */.  Pa
66a0: 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
66b0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
66c0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
66d0: 6e 74 20 69 4f 72 69 67 43 6f 6c 20 3d 20 69 43  nt iOrigCol = iC
66e0: 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 4f 72 69 67 69  olumn;  /* Origi
66f0: 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 69 43 6f  nal value of iCo
6700: 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  lumn */.  int nE
6710: 71 75 69 76 20 3d 20 32 3b 20 20 20 20 20 20 20  quiv = 2;       
6720: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6730: 65 6e 74 69 72 65 73 20 69 6e 20 61 45 71 75 69  entires in aEqui
6740: 76 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 45 71  v[] */.  int iEq
6750: 75 69 76 20 3d 20 32 3b 20 20 20 20 20 20 20 20  uiv = 2;        
6760: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
6770: 6e 74 72 69 65 73 20 6f 66 20 61 45 71 75 69 76  ntries of aEquiv
6780: 5b 5d 20 70 72 6f 63 65 73 73 65 64 20 73 6f 20  [] processed so 
6790: 66 61 72 20 2a 2f 0a 20 20 69 6e 74 20 61 45 71  far */.  int aEq
67a0: 75 69 76 5b 32 32 5d 3b 20 20 20 20 20 20 20 20  uiv[22];        
67b0: 20 20 2f 2a 20 69 43 75 72 2c 69 43 6f 6c 75 6d    /* iCur,iColum
67c0: 6e 20 61 6e 64 20 75 70 20 74 6f 20 31 30 20 6f  n and up to 10 o
67d0: 74 68 65 72 20 65 71 75 69 76 61 6c 65 6e 74 73  ther equivalents
67e0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
67f0: 43 75 72 3e 3d 30 20 29 3b 0a 20 20 61 45 71 75  Cur>=0 );.  aEqu
6800: 69 76 5b 30 5d 20 3d 20 69 43 75 72 3b 0a 20 20  iv[0] = iCur;.  
6810: 61 45 71 75 69 76 5b 31 5d 20 3d 20 69 43 6f 6c  aEquiv[1] = iCol
6820: 75 6d 6e 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a  umn;.  for(;;){.
6830: 20 20 20 20 66 6f 72 28 70 57 43 3d 70 57 43 4f      for(pWC=pWCO
6840: 72 69 67 3b 20 70 57 43 3b 20 70 57 43 3d 70 57  rig; pWC; pWC=pW
6850: 43 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20 20  C->pOuter){.    
6860: 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
6870: 3e 61 2c 20 6b 3d 70 57 43 2d 3e 6e 54 65 72 6d  >a, k=pWC->nTerm
6880: 3b 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b  ; k; k--, pTerm+
6890: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
68a0: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
68b0: 72 3d 3d 69 43 75 72 0a 20 20 20 20 20 20 20 20  r==iCur.        
68c0: 20 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 6c 65    && pTerm->u.le
68d0: 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d  ftColumn==iColum
68e0: 6e 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  n.        ){.   
68f0: 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
6900: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
6910: 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 0a 20 20   notReady)==0.  
6920: 20 20 20 20 20 20 20 20 20 26 26 20 28 70 54 65           && (pTe
6930: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
6940: 6f 70 20 26 20 57 4f 5f 41 4c 4c 29 21 3d 30 0a  op & WO_ALL)!=0.
6950: 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
6960: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4f 72           if( iOr
6970: 69 67 43 6f 6c 3e 3d 30 20 26 26 20 70 49 64 78  igCol>=0 && pIdx
6980: 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65   && (pTerm->eOpe
6990: 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
69a0: 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  L)==0 ){.       
69b0: 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
69c0: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20  pColl;.         
69d0: 20 20 20 20 20 63 68 61 72 20 69 64 78 61 66 66       char idxaff
69e0: 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 20  ;.      .       
69f0: 20 20 20 20 20 20 20 70 58 20 3d 20 70 54 65 72         pX = pTer
6a00: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
6a10: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 20 3d          pParse =
6a20: 20 70 57 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pWC->pParse;.  
6a30: 20 20 20 20 20 20 20 20 20 20 20 20 69 64 78 61              idxa
6a40: 66 66 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  ff = pIdx->pTabl
6a50: 65 2d 3e 61 43 6f 6c 5b 69 4f 72 69 67 43 6f 6c  e->aCol[iOrigCol
6a60: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  ].affinity;.    
6a70: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73            if( !s
6a80: 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
6a90: 69 74 79 4f 6b 28 70 58 2c 20 69 64 78 61 66 66  ityOk(pX, idxaff
6aa0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
6ab0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
6ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
6ad0: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
6ae0: 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
6af0: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  t the collation 
6b00: 73 65 71 75 65 6e 63 65 20 72 65 71 75 69 72 65  sequence require
6b10: 64 20 66 72 6f 6d 20 61 6e 20 69 6e 64 65 78 20  d from an index 
6b20: 66 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  for.            
6b30: 20 20 2a 2a 20 69 74 20 74 6f 20 62 65 20 75 73    ** it to be us
6b40: 65 66 75 6c 20 66 6f 72 20 6f 70 74 69 6d 69 73  eful for optimis
6b50: 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20 70  ing expression p
6b60: 58 2e 20 53 74 6f 72 65 20 74 68 69 73 0a 20 20  X. Store this.  
6b70: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76              ** v
6b80: 61 6c 75 65 20 69 6e 20 76 61 72 69 61 62 6c 65  alue in variable
6b90: 20 70 43 6f 6c 6c 2e 0a 20 20 20 20 20 20 20 20   pColl..        
6ba0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
6bb0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70 58         assert(pX
6bc0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
6bd0: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
6be0: 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
6bf0: 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  pareCollSeq(pPar
6c00: 73 65 2c 70 58 2d 3e 70 4c 65 66 74 2c 70 58 2d  se,pX->pLeft,pX-
6c10: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
6c20: 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
6c30: 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 70  l==0 ) pColl = p
6c40: 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
6c50: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 0a 20 20 20  Coll;.      .   
6c60: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a             for(j
6c70: 3d 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  =0; pIdx->aiColu
6c80: 6d 6e 5b 6a 5d 21 3d 69 4f 72 69 67 43 6f 6c 3b  mn[j]!=iOrigCol;
6c90: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
6ca0: 20 20 20 20 20 20 20 69 66 28 20 4e 45 56 45 52         if( NEVER
6cb0: 28 6a 3e 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  (j>=pIdx->nColum
6cc0: 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  n) ) return 0;. 
6cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
6ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
6cf0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
6d00: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49  pColl->zName, pI
6d10: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 20 29  dx->azColl[j]) )
6d20: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
6d30: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
6d40: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6d50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6d60: 20 20 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20        pResult = 
6d70: 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20  pTerm;.         
6d80: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72     if( pTerm->pr
6d90: 65 72 65 71 52 69 67 68 74 3d 3d 30 20 29 20 67  ereqRight==0 ) g
6da0: 6f 74 6f 20 66 69 6e 64 54 65 72 6d 5f 73 75 63  oto findTerm_suc
6db0: 63 65 73 73 3b 0a 20 20 20 20 20 20 20 20 20 20  cess;.          
6dc0: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
6dd0: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
6de0: 72 20 26 20 57 4f 5f 45 51 55 49 56 29 21 3d 30  r & WO_EQUIV)!=0
6df0: 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e  .           && n
6e00: 45 71 75 69 76 3c 41 72 72 61 79 53 69 7a 65 28  Equiv<ArraySize(
6e10: 61 45 71 75 69 76 29 0a 20 20 20 20 20 20 20 20  aEquiv).        
6e20: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
6e30: 20 70 58 20 3d 20 73 71 6c 69 74 65 33 45 78 70   pX = sqlite3Exp
6e40: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 54 65  rSkipCollate(pTe
6e50: 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
6e60: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
6e70: 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d  assert( pX->op==
6e80: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
6e90: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
6ea0: 3b 20 6a 3c 6e 45 71 75 69 76 3b 20 6a 2b 3d 32  ; j<nEquiv; j+=2
6eb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
6ec0: 20 69 66 28 20 61 45 71 75 69 76 5b 6a 5d 3d 3d   if( aEquiv[j]==
6ed0: 70 58 2d 3e 69 54 61 62 6c 65 20 26 26 20 61 45  pX->iTable && aE
6ee0: 71 75 69 76 5b 6a 2b 31 5d 3d 3d 70 58 2d 3e 69  quiv[j+1]==pX->i
6ef0: 43 6f 6c 75 6d 6e 20 29 20 62 72 65 61 6b 3b 0a  Column ) break;.
6f00: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
6f10: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d            if( j=
6f20: 3d 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 20  =nEquiv ){.     
6f30: 20 20 20 20 20 20 20 20 20 61 45 71 75 69 76 5b           aEquiv[
6f40: 6a 5d 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b  j] = pX->iTable;
6f50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
6f60: 45 71 75 69 76 5b 6a 2b 31 5d 20 3d 20 70 58 2d  Equiv[j+1] = pX-
6f70: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
6f80: 20 20 20 20 20 20 20 20 6e 45 71 75 69 76 20 2b          nEquiv +
6f90: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 2;.           
6fa0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
6fb0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6fc0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
6fd0: 45 71 75 69 76 3e 3d 6e 45 71 75 69 76 20 29 20  Equiv>=nEquiv ) 
6fe0: 62 72 65 61 6b 3b 0a 20 20 20 20 69 43 75 72 20  break;.    iCur 
6ff0: 3d 20 61 45 71 75 69 76 5b 69 45 71 75 69 76 2b  = aEquiv[iEquiv+
7000: 2b 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20  +];.    iColumn 
7010: 3d 20 61 45 71 75 69 76 5b 69 45 71 75 69 76 2b  = aEquiv[iEquiv+
7020: 2b 5d 3b 0a 20 20 7d 0a 66 69 6e 64 54 65 72 6d  +];.  }.findTerm
7030: 5f 73 75 63 63 65 73 73 3a 0a 20 20 72 65 74 75  _success:.  retu
7040: 72 6e 20 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f  rn pResult;.}../
7050: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
7060: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nce */.static vo
7070: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 53  id exprAnalyze(S
7080: 72 63 4c 69 73 74 2a 2c 20 57 68 65 72 65 43 6c  rcList*, WhereCl
7090: 61 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a  ause*, int);../*
70a0: 0a 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41 6e 61  .** Call exprAna
70b0: 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65 72 6d  lyze on all term
70c0: 73 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61  s in a WHERE cla
70d0: 75 73 65 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2f 0a  use.  .**.**.*/.
70e0: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
70f0: 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20 20 53 72  AnalyzeAll(.  Sr
7100: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
7110: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52         /* the FR
7120: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  OM clause */.  W
7130: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20  hereClause *pWC 
7140: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57          /* the W
7150: 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62  HERE clause to b
7160: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b  e analyzed */.){
7170: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
7180: 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20  i=pWC->nTerm-1; 
7190: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
71a0: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61 62  exprAnalyze(pTab
71b0: 4c 69 73 74 2c 20 70 57 43 2c 20 69 29 3b 0a 20  List, pWC, i);. 
71c0: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
71d0: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
71e0: 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a  PTIMIZATION./*.*
71f0: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
7200: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
7210: 65 73 73 69 6f 6e 20 69 73 20 61 20 4c 49 4b 45  ession is a LIKE
7220: 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f   or GLOB operato
7230: 72 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65  r that.** can be
7240: 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67   optimized using
7250: 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
7260: 74 72 61 69 6e 74 73 2e 20 20 52 65 74 75 72 6e  traints.  Return
7270: 20 54 52 55 45 20 69 66 20 69 74 20 69 73 0a 2a   TRUE if it is.*
7280: 2a 20 73 6f 20 61 6e 64 20 66 61 6c 73 65 20 69  * so and false i
7290: 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  f not..**.** In 
72a0: 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20 6f 70  order for the op
72b0: 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 70 74  erator to be opt
72c0: 69 6d 69 7a 69 62 6c 65 2c 20 74 68 65 20 52 48  imizible, the RH
72d0: 53 20 6d 75 73 74 20 62 65 20 61 20 73 74 72 69  S must be a stri
72e0: 6e 67 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 74 68  ng.** literal th
72f0: 61 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69  at does not begi
7300: 6e 20 77 69 74 68 20 61 20 77 69 6c 64 63 61 72  n with a wildcar
7310: 64 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  d.  .*/.static i
7320: 6e 74 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28  nt isLikeOrGlob(
7330: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
7340: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
7350: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
7360: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
7370: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
7380: 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20     /* Test this 
7390: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
73a0: 45 78 70 72 20 2a 2a 70 70 50 72 65 66 69 78 2c  Expr **ppPrefix,
73b0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
73c0: 54 4b 5f 53 54 52 49 4e 47 20 65 78 70 72 65 73  TK_STRING expres
73d0: 73 69 6f 6e 20 77 69 74 68 20 70 61 74 74 65 72  sion with patter
73e0: 6e 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 69 6e  n prefix */.  in
73f0: 74 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 2c 20  t *pisComplete, 
7400: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6f  /* True if the o
7410: 6e 6c 79 20 77 69 6c 64 63 61 72 64 20 69 73 20  nly wildcard is 
7420: 25 20 69 6e 20 74 68 65 20 6c 61 73 74 20 63 68  % in the last ch
7430: 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 69 6e 74  aracter */.  int
7440: 20 2a 70 6e 6f 43 61 73 65 20 20 20 20 20 20 2f   *pnoCase      /
7450: 2a 20 54 72 75 65 20 69 66 20 75 70 70 65 72 63  * True if upperc
7460: 61 73 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ase is equivalen
7470: 74 20 74 6f 20 6c 6f 77 65 72 63 61 73 65 20 2a  t to lowercase *
7480: 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
7490: 72 20 2a 7a 20 3d 20 30 3b 20 20 20 20 20 20 20  r *z = 0;       
74a0: 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 6e 20 52    /* String on R
74b0: 48 53 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61  HS of LIKE opera
74c0: 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  tor */.  Expr *p
74d0: 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 20 20  Right, *pLeft;  
74e0: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 61 6e 64      /* Right and
74f0: 20 6c 65 66 74 20 73 69 7a 65 20 6f 66 20 4c 49   left size of LI
7500: 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  KE operator */. 
7510: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
7520: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
7530: 69 73 74 20 6f 66 20 6f 70 65 72 61 6e 64 73 20  ist of operands 
7540: 74 6f 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72  to the LIKE oper
7550: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 63 3b  ator */.  int c;
7560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7570: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 68 61 72       /* One char
7580: 61 63 74 65 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a  acter in z[] */.
7590: 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20    int cnt;      
75a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
75b0: 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 77 69  Number of non-wi
75c0: 6c 64 63 61 72 64 20 70 72 65 66 69 78 20 63 68  ldcard prefix ch
75d0: 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 63 68  aracters */.  ch
75e0: 61 72 20 77 63 5b 33 5d 3b 20 20 20 20 20 20 20  ar wc[3];       
75f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 64           /* Wild
7600: 63 61 72 64 20 63 68 61 72 61 63 74 65 72 73 20  card characters 
7610: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
7620: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
7630: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
7640: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  ection */.  sqli
7650: 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20  te3_value *pVal 
7660: 3d 20 30 3b 0a 20 20 69 6e 74 20 6f 70 3b 20 20  = 0;.  int op;  
7670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7680: 20 20 2f 2a 20 4f 70 63 6f 64 65 20 6f 66 20 70    /* Opcode of p
7690: 52 69 67 68 74 20 2a 2f 0a 0a 20 20 69 66 28 20  Right */..  if( 
76a0: 21 73 71 6c 69 74 65 33 49 73 4c 69 6b 65 46 75  !sqlite3IsLikeFu
76b0: 6e 63 74 69 6f 6e 28 64 62 2c 20 70 45 78 70 72  nction(db, pExpr
76c0: 2c 20 70 6e 6f 43 61 73 65 2c 20 77 63 29 20 29  , pnoCase, wc) )
76d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
76e0: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
76f0: 45 5f 45 42 43 44 49 43 0a 20 20 69 66 28 20 2a  E_EBCDIC.  if( *
7700: 70 6e 6f 43 61 73 65 20 29 20 72 65 74 75 72 6e  pnoCase ) return
7710: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4c 69   0;.#endif.  pLi
7720: 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
7730: 69 73 74 3b 0a 20 20 70 4c 65 66 74 20 3d 20 70  ist;.  pLeft = p
7740: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
7750: 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f  ;.  if( pLeft->o
7760: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20  p!=TK_COLUMN .  
7770: 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 41   || sqlite3ExprA
7780: 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 21 3d  ffinity(pLeft)!=
7790: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
77a0: 0a 20 20 20 7c 7c 20 49 73 56 69 72 74 75 61 6c  .   || IsVirtual
77b0: 28 70 4c 65 66 74 2d 3e 70 54 61 62 29 0a 20 20  (pLeft->pTab).  
77c0: 29 7b 0a 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52  ){.    /* IMP: R
77d0: 2d 30 32 30 36 35 2d 34 39 34 36 35 20 54 68 65  -02065-49465 The
77e0: 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20   left-hand side 
77f0: 6f 66 20 74 68 65 20 4c 49 4b 45 20 6f 72 20 47  of the LIKE or G
7800: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 6d 75 73  LOB operator mus
7810: 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20  t.    ** be the 
7820: 6e 61 6d 65 20 6f 66 20 61 6e 20 69 6e 64 65 78  name of an index
7830: 65 64 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 54  ed column with T
7840: 45 58 54 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f  EXT affinity. */
7850: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
7860: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65   }.  assert( pLe
7870: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 28 2d 31  ft->iColumn!=(-1
7880: 29 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  ) ); /* Because 
7890: 49 50 4b 20 6e 65 76 65 72 20 68 61 73 20 41 46  IPK never has AF
78a0: 46 5f 54 45 58 54 20 2a 2f 0a 0a 20 20 70 52 69  F_TEXT */..  pRi
78b0: 67 68 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30  ght = pList->a[0
78c0: 5d 2e 70 45 78 70 72 3b 0a 20 20 6f 70 20 3d 20  ].pExpr;.  op = 
78d0: 70 52 69 67 68 74 2d 3e 6f 70 3b 0a 20 20 69 66  pRight->op;.  if
78e0: 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ( op==TK_REGISTE
78f0: 52 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 70 52  R ){.    op = pR
7900: 69 67 68 74 2d 3e 6f 70 32 3b 0a 20 20 7d 0a 20  ight->op2;.  }. 
7910: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49   if( op==TK_VARI
7920: 41 42 4c 45 20 29 7b 0a 20 20 20 20 56 64 62 65  ABLE ){.    Vdbe
7930: 20 2a 70 52 65 70 72 65 70 61 72 65 20 3d 20 70   *pReprepare = p
7940: 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72  Parse->pReprepar
7950: 65 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  e;.    int iCol 
7960: 3d 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d  = pRight->iColum
7970: 6e 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71  n;.    pVal = sq
7980: 6c 69 74 65 33 56 64 62 65 47 65 74 56 61 6c 75  lite3VdbeGetValu
7990: 65 28 70 52 65 70 72 65 70 61 72 65 2c 20 69 43  e(pReprepare, iC
79a0: 6f 6c 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ol, SQLITE_AFF_N
79b0: 4f 4e 45 29 3b 0a 20 20 20 20 69 66 28 20 70 56  ONE);.    if( pV
79c0: 61 6c 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61  al && sqlite3_va
79d0: 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3d 3d  lue_type(pVal)==
79e0: 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20  SQLITE_TEXT ){. 
79f0: 20 20 20 20 20 7a 20 3d 20 28 63 68 61 72 20 2a       z = (char *
7a00: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
7a10: 65 78 74 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d  ext(pVal);.    }
7a20: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7a30: 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73  SetVarmask(pPars
7a40: 65 2d 3e 70 56 64 62 65 2c 20 69 43 6f 6c 29 3b  e->pVdbe, iCol);
7a50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69  .    assert( pRi
7a60: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49  ght->op==TK_VARI
7a70: 41 42 4c 45 20 7c 7c 20 70 52 69 67 68 74 2d 3e  ABLE || pRight->
7a80: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
7a90: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  );.  }else if( o
7aa0: 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a  p==TK_STRING ){.
7ab0: 20 20 20 20 7a 20 3d 20 70 52 69 67 68 74 2d 3e      z = pRight->
7ac0: 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20 20  u.zToken;.  }.  
7ad0: 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 63 6e 74  if( z ){.    cnt
7ae0: 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
7af0: 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26   (c=z[cnt])!=0 &
7b00: 26 20 63 21 3d 77 63 5b 30 5d 20 26 26 20 63 21  & c!=wc[0] && c!
7b10: 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b  =wc[1] && c!=wc[
7b20: 32 5d 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b  2] ){.      cnt+
7b30: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
7b40: 20 63 6e 74 21 3d 30 20 26 26 20 32 35 35 21 3d   cnt!=0 && 255!=
7b50: 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b 0a  (u8)z[cnt-1] ){.
7b60: 20 20 20 20 20 20 45 78 70 72 20 2a 70 50 72 65        Expr *pPre
7b70: 66 69 78 3b 0a 20 20 20 20 20 20 2a 70 69 73 43  fix;.      *pisC
7b80: 6f 6d 70 6c 65 74 65 20 3d 20 63 3d 3d 77 63 5b  omplete = c==wc[
7b90: 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d  0] && z[cnt+1]==
7ba0: 30 3b 0a 20 20 20 20 20 20 70 50 72 65 66 69 78  0;.      pPrefix
7bb0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
7bc0: 62 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20 7a 29  b, TK_STRING, z)
7bd0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65  ;.      if( pPre
7be0: 66 69 78 20 29 20 70 50 72 65 66 69 78 2d 3e 75  fix ) pPrefix->u
7bf0: 2e 7a 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20 30  .zToken[cnt] = 0
7c00: 3b 0a 20 20 20 20 20 20 2a 70 70 50 72 65 66 69  ;.      *ppPrefi
7c10: 78 20 3d 20 70 50 72 65 66 69 78 3b 0a 20 20 20  x = pPrefix;.   
7c20: 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41     if( op==TK_VA
7c30: 52 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20  RIABLE ){.      
7c40: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
7c50: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 20  se->pVdbe;.     
7c60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
7c70: 74 56 61 72 6d 61 73 6b 28 76 2c 20 70 52 69 67  tVarmask(v, pRig
7c80: 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ht->iColumn);.  
7c90: 20 20 20 20 20 20 69 66 28 20 2a 70 69 73 43 6f        if( *pisCo
7ca0: 6d 70 6c 65 74 65 20 26 26 20 70 52 69 67 68 74  mplete && pRight
7cb0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 20 29 7b  ->u.zToken[1] ){
7cc0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
7cd0: 20 74 68 65 20 72 68 73 20 6f 66 20 74 68 65 20   the rhs of the 
7ce0: 4c 49 4b 45 20 65 78 70 72 65 73 73 69 6f 6e 20  LIKE expression 
7cf0: 69 73 20 61 20 76 61 72 69 61 62 6c 65 2c 20 61  is a variable, a
7d00: 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  nd the current. 
7d10: 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75           ** valu
7d20: 65 20 6f 66 20 74 68 65 20 76 61 72 69 61 62 6c  e of the variabl
7d30: 65 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69 73  e means there is
7d40: 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 76 6f   no need to invo
7d50: 6b 65 20 74 68 65 20 4c 49 4b 45 0a 20 20 20 20  ke the LIKE.    
7d60: 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
7d70: 6e 2c 20 74 68 65 6e 20 6e 6f 20 4f 50 5f 56 61  n, then no OP_Va
7d80: 72 69 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 61  riable will be a
7d90: 64 64 65 64 20 74 6f 20 74 68 65 20 70 72 6f 67  dded to the prog
7da0: 72 61 6d 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ram..          *
7db0: 2a 20 54 68 69 73 20 63 61 75 73 65 73 20 70 72  * This causes pr
7dc0: 6f 62 6c 65 6d 73 20 66 6f 72 20 74 68 65 20 73  oblems for the s
7dd0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
7de0: 6d 65 74 65 72 5f 6e 61 6d 65 28 29 0a 20 20 20  meter_name().   
7df0: 20 20 20 20 20 20 20 2a 2a 20 41 50 49 2e 20 54         ** API. T
7e00: 6f 20 77 6f 72 6b 61 72 6f 75 6e 64 20 74 68 65  o workaround the
7e10: 6d 2c 20 61 64 64 20 61 20 64 75 6d 6d 79 20 4f  m, add a dummy O
7e20: 50 5f 56 61 72 69 61 62 6c 65 20 68 65 72 65 2e  P_Variable here.
7e30: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 20 0a 20  .          */ . 
7e40: 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20           int r1 
7e50: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
7e60: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
7e70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
7e80: 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
7e90: 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 31 29  rse, pRight, r1)
7ea0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
7eb0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
7ec0: 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  v, sqlite3VdbeCu
7ed0: 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20  rrentAddr(v)-1, 
7ee0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  0);.          sq
7ef0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
7f00: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
7f10: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7f20: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
7f30: 20 20 20 20 7a 20 3d 20 30 3b 0a 20 20 20 20 7d      z = 0;.    }
7f40: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56  .  }..  sqlite3V
7f50: 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
7f60: 20 20 72 65 74 75 72 6e 20 28 7a 21 3d 30 29 3b    return (z!=0);
7f70: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
7f80: 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50  ITE_OMIT_LIKE_OP
7f90: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 0a  TIMIZATION */...
7fa0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7fb0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
7fc0: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
7fd0: 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65 6e  see if the given
7fe0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
7ff0: 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a  f the form.**.**
8000: 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20           column 
8010: 4d 41 54 43 48 20 65 78 70 72 0a 2a 2a 0a 2a 2a  MATCH expr.**.**
8020: 20 49 66 20 69 74 20 69 73 20 74 68 65 6e 20 72   If it is then r
8030: 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20  eturn TRUE.  If 
8040: 6e 6f 74 2c 20 72 65 74 75 72 6e 20 46 41 4c 53  not, return FALS
8050: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
8060: 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e   isMatchOfColumn
8070: 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  (.  Expr *pExpr 
8080: 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69       /* Test thi
8090: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  s expression */.
80a0: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
80b0: 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45 78  List;..  if( pEx
80c0: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54  pr->op!=TK_FUNCT
80d0: 49 4f 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ION ){.    retur
80e0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 0;.  }.  if( s
80f0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 45  qlite3StrICmp(pE
8100: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d  xpr->u.zToken,"m
8110: 61 74 63 68 22 29 21 3d 30 20 29 7b 0a 20 20 20  atch")!=0 ){.   
8120: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
8130: 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e   pList = pExpr->
8140: 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  x.pList;.  if( p
8150: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20 29  List->nExpr!=2 )
8160: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
8170: 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d    }.  if( pList-
8180: 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 20  >a[1].pExpr->op 
8190: 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  != TK_COLUMN ){.
81a0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
81b0: 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
81c0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
81d0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
81e0: 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  LE */../*.** If 
81f0: 74 68 65 20 70 42 61 73 65 20 65 78 70 72 65 73  the pBase expres
8200: 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64 20  sion originated 
8210: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
8220: 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a 20  NG clause of.** 
8230: 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72 61  a join, then tra
8240: 6e 73 66 65 72 20 74 68 65 20 61 70 70 72 6f 70  nsfer the approp
8250: 72 69 61 74 65 20 6d 61 72 6b 69 6e 67 73 20 6f  riate markings o
8260: 76 65 72 20 74 6f 20 64 65 72 69 76 65 64 2e 0a  ver to derived..
8270: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
8280: 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69  ransferJoinMarki
8290: 6e 67 73 28 45 78 70 72 20 2a 70 44 65 72 69 76  ngs(Expr *pDeriv
82a0: 65 64 2c 20 45 78 70 72 20 2a 70 42 61 73 65 29  ed, Expr *pBase)
82b0: 7b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e 66 6c  {.  pDerived->fl
82c0: 61 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e 66 6c  ags |= pBase->fl
82d0: 61 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a 6f 69  ags & EP_FromJoi
82e0: 6e 3b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e 69  n;.  pDerived->i
82f0: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d  RightJoinTable =
8300: 20 70 42 61 73 65 2d 3e 69 52 69 67 68 74 4a 6f   pBase->iRightJo
8310: 69 6e 54 61 62 6c 65 3b 0a 7d 0a 0a 23 69 66 20  inTable;.}..#if 
8320: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
8330: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
8340: 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65  TION) && !define
8350: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
8360: 42 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20 41 6e  BQUERY)./*.** An
8370: 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61  alyze a term tha
8380: 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 77  t consists of tw
8390: 6f 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e  o or more OR-con
83a0: 6e 65 63 74 65 64 0a 2a 2a 20 73 75 62 74 65 72  nected.** subter
83b0: 6d 73 2e 20 20 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a  ms.  So in:.**.*
83c0: 2a 20 20 20 20 20 2e 2e 2e 20 57 48 45 52 45 20  *     ... WHERE 
83d0: 20 28 61 3d 35 29 20 41 4e 44 20 28 62 3d 37 20   (a=5) AND (b=7 
83e0: 4f 52 20 63 3d 39 20 4f 52 20 64 3d 31 33 29 20  OR c=9 OR d=13) 
83f0: 41 4e 44 20 28 64 3d 31 33 29 0a 2a 2a 20 20 20  AND (d=13).**   
8400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8410: 20 20 20 20 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e         ^^^^^^^^^
8420: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a  ^^^^^^^^^^^.**.*
8430: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
8440: 6e 61 6c 79 7a 65 73 20 74 65 72 6d 73 20 73 75  nalyzes terms su
8450: 63 68 20 61 73 20 74 68 65 20 6d 69 64 64 6c 65  ch as the middle
8460: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 61 62 6f   term in the abo
8470: 76 65 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a 20 41  ve example..** A
8480: 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a   WhereOrTerm obj
8490: 65 63 74 20 69 73 20 63 6f 6d 70 75 74 65 64 20  ect is computed 
84a0: 61 6e 64 20 61 74 74 61 63 68 65 64 20 74 6f 20  and attached to 
84b0: 74 68 65 20 74 65 72 6d 20 75 6e 64 65 72 0a 2a  the term under.*
84c0: 2a 20 61 6e 61 6c 79 73 69 73 2c 20 72 65 67 61  * analysis, rega
84d0: 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f 75  rdless of the ou
84e0: 74 63 6f 6d 65 20 6f 66 20 74 68 65 20 61 6e 61  tcome of the ana
84f0: 6c 79 73 69 73 2e 20 20 48 65 6e 63 65 3a 0a 2a  lysis.  Hence:.*
8500: 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65  *.**     WhereTe
8510: 72 6d 2e 77 74 46 6c 61 67 73 20 20 20 7c 3d 20  rm.wtFlags   |= 
8520: 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a 20   TERM_ORINFO.** 
8530: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e      WhereTerm.u.
8540: 70 4f 72 49 6e 66 6f 20 20 3d 20 20 61 20 64 79  pOrInfo  =  a dy
8550: 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
8560: 74 65 64 20 57 68 65 72 65 4f 72 54 65 72 6d 20  ted WhereOrTerm 
8570: 6f 62 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65  object.**.** The
8580: 20 74 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c   term being anal
8590: 79 7a 65 64 20 6d 75 73 74 20 68 61 76 65 20 74  yzed must have t
85a0: 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 66 20 4f 52  wo or more of OR
85b0: 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 74 65  -connected subte
85c0: 72 6d 73 2e 0a 2a 2a 20 41 20 73 69 6e 67 6c 65  rms..** A single
85d0: 20 73 75 62 74 65 72 6d 20 6d 69 67 68 74 20 62   subterm might b
85e0: 65 20 61 20 73 65 74 20 6f 66 20 41 4e 44 2d 63  e a set of AND-c
85f0: 6f 6e 6e 65 63 74 65 64 20 73 75 62 2d 73 75 62  onnected sub-sub
8600: 74 65 72 6d 73 2e 0a 2a 2a 20 45 78 61 6d 70 6c  terms..** Exampl
8610: 65 73 20 6f 66 20 74 65 72 6d 73 20 75 6e 64 65  es of terms unde
8620: 72 20 61 6e 61 6c 79 73 69 73 3a 0a 2a 2a 0a 2a  r analysis:.**.*
8630: 2a 20 20 20 20 20 28 41 29 20 20 20 20 20 74 31  *     (A)     t1
8640: 2e 78 3d 74 32 2e 79 20 4f 52 20 74 31 2e 78 3d  .x=t2.y OR t1.x=
8650: 74 32 2e 7a 20 4f 52 20 74 31 2e 79 3d 31 35 20  t2.z OR t1.y=15 
8660: 4f 52 20 74 31 2e 7a 3d 74 33 2e 61 2b 35 0a 2a  OR t1.z=t3.a+5.*
8670: 2a 20 20 20 20 20 28 42 29 20 20 20 20 20 78 3d  *     (B)     x=
8680: 65 78 70 72 31 20 4f 52 20 65 78 70 72 32 3d 78  expr1 OR expr2=x
8690: 20 4f 52 20 78 3d 65 78 70 72 33 0a 2a 2a 20 20   OR x=expr3.**  
86a0: 20 20 20 28 43 29 20 20 20 20 20 74 31 2e 78 3d     (C)     t1.x=
86b0: 74 32 2e 79 20 4f 52 20 28 74 31 2e 78 3d 74 32  t2.y OR (t1.x=t2
86c0: 2e 7a 20 41 4e 44 20 74 31 2e 79 3d 31 35 29 0a  .z AND t1.y=15).
86d0: 2a 2a 20 20 20 20 20 28 44 29 20 20 20 20 20 78  **     (D)     x
86e0: 3d 65 78 70 72 31 20 4f 52 20 28 79 3e 31 31 20  =expr1 OR (y>11 
86f0: 41 4e 44 20 79 3c 32 32 20 41 4e 44 20 7a 20 4c  AND y<22 AND z L
8700: 49 4b 45 20 27 2a 68 65 6c 6c 6f 2a 27 29 0a 2a  IKE '*hello*').*
8710: 2a 20 20 20 20 20 28 45 29 20 20 20 20 20 28 70  *     (E)     (p
8720: 2e 61 3d 31 20 41 4e 44 20 71 2e 62 3d 32 20 41  .a=1 AND q.b=2 A
8730: 4e 44 20 72 2e 63 3d 33 29 20 4f 52 20 28 70 2e  ND r.c=3) OR (p.
8740: 78 3d 34 20 41 4e 44 20 71 2e 79 3d 35 20 41 4e  x=4 AND q.y=5 AN
8750: 44 20 72 2e 7a 3d 36 29 0a 2a 2a 0a 2a 2a 20 43  D r.z=6).**.** C
8760: 41 53 45 20 31 3a 0a 2a 2a 0a 2a 2a 20 49 66 20  ASE 1:.**.** If 
8770: 61 6c 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65  all subterms are
8780: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 54 2e 43   of the form T.C
8790: 3d 65 78 70 72 20 66 6f 72 20 73 6f 6d 65 20 73  =expr for some s
87a0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
87b0: 43 20 61 6e 64 0a 2a 2a 20 61 20 73 69 6e 67 6c  C and.** a singl
87c0: 65 20 74 61 62 6c 65 20 54 20 28 61 73 20 73 68  e table T (as sh
87d0: 6f 77 6e 20 69 6e 20 65 78 61 6d 70 6c 65 20 42  own in example B
87e0: 20 61 62 6f 76 65 29 20 74 68 65 6e 20 63 72 65   above) then cre
87f0: 61 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61  ate a new virtua
8800: 6c 0a 2a 2a 20 74 65 72 6d 20 74 68 61 74 20 69  l.** term that i
8810: 73 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20  s an equivalent 
8820: 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  IN expression.  
8830: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
8840: 69 66 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 62  if the term.** b
8850: 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 69 73  eing analyzed is
8860: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 3d  :.**.**      x =
8870: 20 65 78 70 72 31 20 20 4f 52 20 20 65 78 70 72   expr1  OR  expr
8880: 32 20 3d 20 78 20 20 4f 52 20 20 78 20 3d 20 65  2 = x  OR  x = e
8890: 78 70 72 33 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20  xpr3.**.** then 
88a0: 63 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72  create a new vir
88b0: 74 75 61 6c 20 74 65 72 6d 20 6c 69 6b 65 20 74  tual term like t
88c0: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
88d0: 78 20 49 4e 20 28 65 78 70 72 31 2c 65 78 70 72  x IN (expr1,expr
88e0: 32 2c 65 78 70 72 33 29 0a 2a 2a 0a 2a 2a 20 43  2,expr3).**.** C
88f0: 41 53 45 20 32 3a 0a 2a 2a 0a 2a 2a 20 49 66 20  ASE 2:.**.** If 
8900: 61 6c 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65  all subterms are
8910: 20 69 6e 64 65 78 61 62 6c 65 20 62 79 20 61 20   indexable by a 
8920: 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 2c 20  single table T, 
8930: 74 68 65 6e 20 73 65 74 0a 2a 2a 0a 2a 2a 20 20  then set.**.**  
8940: 20 20 20 57 68 65 72 65 54 65 72 6d 2e 65 4f 70     WhereTerm.eOp
8950: 65 72 61 74 6f 72 20 20 20 20 20 20 20 20 20 20  erator          
8960: 20 20 20 20 3d 20 20 57 4f 5f 4f 52 0a 2a 2a 20      =  WO_OR.** 
8970: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e      WhereTerm.u.
8980: 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62  pOrInfo->indexab
8990: 6c 65 20 20 7c 3d 20 20 74 68 65 20 63 75 72 73  le  |=  the curs
89a0: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61  or number for ta
89b0: 62 6c 65 20 54 0a 2a 2a 0a 2a 2a 20 41 20 73 75  ble T.**.** A su
89c0: 62 74 65 72 6d 20 69 73 20 22 69 6e 64 65 78 61  bterm is "indexa
89d0: 62 6c 65 22 20 69 66 20 69 74 20 69 73 20 6f 66  ble" if it is of
89e0: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 54 2e   the form.** "T.
89f0: 43 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77  C <op> <expr>" w
8a00: 68 65 72 65 20 43 20 69 73 20 61 6e 79 20 63 6f  here C is any co
8a10: 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 54 20  lumn of table T 
8a20: 61 6e 64 20 0a 2a 2a 20 3c 6f 70 3e 20 69 73 20  and .** <op> is 
8a30: 6f 6e 65 20 6f 66 20 22 3d 22 2c 20 22 3c 22 2c  one of "=", "<",
8a40: 20 22 3c 3d 22 2c 20 22 3e 22 2c 20 22 3e 3d 22   "<=", ">", ">="
8a50: 2c 20 22 49 53 20 4e 55 4c 4c 22 2c 20 6f 72 20  , "IS NULL", or 
8a60: 22 49 4e 22 2e 0a 2a 2a 20 41 20 73 75 62 74 65  "IN"..** A subte
8a70: 72 6d 20 69 73 20 61 6c 73 6f 20 69 6e 64 65 78  rm is also index
8a80: 61 62 6c 65 20 69 66 20 69 74 20 69 73 20 61 6e  able if it is an
8a90: 20 41 4e 44 20 6f 66 20 74 77 6f 20 6f 72 20 6d   AND of two or m
8aa0: 6f 72 65 0a 2a 2a 20 73 75 62 73 75 62 74 65 72  ore.** subsubter
8ab0: 6d 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ms at least one 
8ac0: 6f 66 20 77 68 69 63 68 20 69 73 20 69 6e 64 65  of which is inde
8ad0: 78 61 62 6c 65 2e 20 20 49 6e 64 65 78 61 62 6c  xable.  Indexabl
8ae0: 65 20 41 4e 44 20 0a 2a 2a 20 73 75 62 74 65 72  e AND .** subter
8af0: 6d 73 20 68 61 76 65 20 74 68 65 69 72 20 65 4f  ms have their eO
8b00: 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f 20 57  perator set to W
8b10: 4f 5f 41 4e 44 20 61 6e 64 20 74 68 65 79 20 68  O_AND and they h
8b20: 61 76 65 0a 2a 2a 20 75 2e 70 41 6e 64 49 6e 66  ave.** u.pAndInf
8b30: 6f 20 73 65 74 20 74 6f 20 61 20 64 79 6e 61 6d  o set to a dynam
8b40: 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
8b50: 20 57 68 65 72 65 41 6e 64 54 65 72 6d 20 6f 62   WhereAndTerm ob
8b60: 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d  ject..**.** From
8b70: 20 61 6e 6f 74 68 65 72 20 70 6f 69 6e 74 20 6f   another point o
8b80: 66 20 76 69 65 77 2c 20 22 69 6e 64 65 78 61 62  f view, "indexab
8b90: 6c 65 22 20 6d 65 61 6e 73 20 74 68 61 74 20 74  le" means that t
8ba0: 68 65 20 73 75 62 74 65 72 6d 20 63 6f 75 6c 64  he subterm could
8bb0: 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20  .** potentially 
8bc0: 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20  be used with an 
8bd0: 69 6e 64 65 78 20 69 66 20 61 6e 20 61 70 70 72  index if an appr
8be0: 6f 70 72 69 61 74 65 20 69 6e 64 65 78 20 65 78  opriate index ex
8bf0: 69 73 74 73 2e 0a 2a 2a 20 54 68 69 73 20 61 6e  ists..** This an
8c00: 61 6c 79 73 69 73 20 64 6f 65 73 20 6e 6f 74 20  alysis does not 
8c10: 63 6f 6e 73 69 64 65 72 20 77 68 65 74 68 65 72  consider whether
8c20: 20 6f 72 20 6e 6f 74 20 74 68 65 20 69 6e 64 65   or not the inde
8c30: 78 20 65 78 69 73 74 73 3b 20 74 68 61 74 0a 2a  x exists; that.*
8c40: 2a 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 74  * is something t
8c50: 68 65 20 62 65 73 74 49 6e 64 65 78 28 29 20 72  he bestIndex() r
8c60: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 65 74 65  outine will dete
8c70: 72 6d 69 6e 65 2e 20 20 54 68 69 73 20 61 6e 61  rmine.  This ana
8c80: 6c 79 73 69 73 0a 2a 2a 20 6f 6e 6c 79 20 6c 6f  lysis.** only lo
8c90: 6f 6b 73 20 61 74 20 77 68 65 74 68 65 72 20 73  oks at whether s
8ca0: 75 62 74 65 72 6d 73 20 61 70 70 72 6f 70 72 69  ubterms appropri
8cb0: 61 74 65 20 66 6f 72 20 69 6e 64 65 78 69 6e 67  ate for indexing
8cc0: 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c   exist..**.** Al
8cd0: 6c 20 65 78 61 6d 70 6c 65 73 20 41 20 74 68 72  l examples A thr
8ce0: 6f 75 67 68 20 45 20 61 62 6f 76 65 20 61 6c 6c  ough E above all
8cf0: 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32 2e   satisfy case 2.
8d00: 20 20 42 75 74 20 69 66 20 61 20 74 65 72 6d 0a    But if a term.
8d10: 2a 2a 20 61 6c 73 6f 20 73 74 61 74 69 73 66 69  ** also statisfi
8d20: 65 73 20 63 61 73 65 20 31 20 28 73 75 63 68 20  es case 1 (such 
8d30: 61 73 20 42 29 20 77 65 20 6b 6e 6f 77 20 74 68  as B) we know th
8d40: 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72  at the optimizer
8d50: 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77 61 79 73 20   will.** always 
8d60: 70 72 65 66 65 72 20 63 61 73 65 20 31 2c 20 73  prefer case 1, s
8d70: 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65 20 77  o in that case w
8d80: 65 20 70 72 65 74 65 6e 64 20 74 68 61 74 20 63  e pretend that c
8d90: 61 73 65 20 32 20 69 73 20 6e 6f 74 0a 2a 2a 20  ase 2 is not.** 
8da0: 73 61 74 69 73 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  satisfied..**.**
8db0: 20 49 74 20 6d 69 67 68 74 20 62 65 20 74 68 65   It might be the
8dc0: 20 63 61 73 65 20 74 68 61 74 20 6d 75 6c 74 69   case that multi
8dd0: 70 6c 65 20 74 61 62 6c 65 73 20 61 72 65 20 69  ple tables are i
8de0: 6e 64 65 78 61 62 6c 65 2e 20 20 46 6f 72 20 65  ndexable.  For e
8df0: 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28 45 29 20 61  xample,.** (E) a
8e00: 62 6f 76 65 20 69 73 20 69 6e 64 65 78 61 62 6c  bove is indexabl
8e10: 65 20 6f 6e 20 74 61 62 6c 65 73 20 50 2c 20 51  e on tables P, Q
8e20: 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a 20 54  , and R..**.** T
8e30: 65 72 6d 73 20 74 68 61 74 20 73 61 74 69 73 66  erms that satisf
8e40: 79 20 63 61 73 65 20 32 20 61 72 65 20 63 61 6e  y case 2 are can
8e50: 64 69 64 61 74 65 73 20 66 6f 72 20 6c 6f 6f 6b  didates for look
8e60: 75 70 20 62 79 20 75 73 69 6e 67 0a 2a 2a 20 73  up by using.** s
8e70: 65 70 61 72 61 74 65 20 69 6e 64 69 63 65 73 20  eparate indices 
8e80: 74 6f 20 66 69 6e 64 20 72 6f 77 69 64 73 20 66  to find rowids f
8e90: 6f 72 20 65 61 63 68 20 73 75 62 74 65 72 6d 20  or each subterm 
8ea0: 61 6e 64 20 63 6f 6d 70 6f 73 69 6e 67 0a 2a 2a  and composing.**
8eb0: 20 74 68 65 20 75 6e 69 6f 6e 20 6f 66 20 61 6c   the union of al
8ec0: 6c 20 72 6f 77 69 64 73 20 75 73 69 6e 67 20 61  l rowids using a
8ed0: 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 2e 20   RowSet object. 
8ee0: 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72   This is similar
8ef0: 0a 2a 2a 20 74 6f 20 22 62 69 74 6d 61 70 20 69  .** to "bitmap i
8f00: 6e 64 69 63 65 73 22 20 69 6e 20 6f 74 68 65 72  ndices" in other
8f10: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
8f20: 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48 45 52 57 49  s..**.** OTHERWI
8f30: 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69  SE:.**.** If nei
8f40: 74 68 65 72 20 63 61 73 65 20 31 20 6e 6f 72 20  ther case 1 nor 
8f50: 63 61 73 65 20 32 20 61 70 70 6c 79 2c 20 74 68  case 2 apply, th
8f60: 65 6e 20 6c 65 61 76 65 20 74 68 65 20 65 4f 70  en leave the eOp
8f70: 65 72 61 74 6f 72 20 73 65 74 20 74 6f 0a 2a 2a  erator set to.**
8f80: 20 7a 65 72 6f 2e 20 20 54 68 69 73 20 74 65 72   zero.  This ter
8f90: 6d 20 69 73 20 6e 6f 74 20 75 73 65 66 75 6c 20  m is not useful 
8fa0: 66 6f 72 20 73 65 61 72 63 68 2e 0a 2a 2f 0a 73  for search..*/.s
8fb0: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41  tatic void exprA
8fc0: 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 0a 20 20  nalyzeOrTerm(.  
8fd0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
8fe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65            /* the
8ff0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
9000: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
9010: 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  WC,         /* t
9020: 68 65 20 63 6f 6d 70 6c 65 74 65 20 57 48 45 52  he complete WHER
9030: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  E clause */.  in
9040: 74 20 69 64 78 54 65 72 6d 20 20 20 20 20 20 20  t idxTerm       
9050: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
9060: 20 6f 66 20 74 68 65 20 4f 52 2d 74 65 72 6d 20   of the OR-term 
9070: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
9080: 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  /.){.  Parse *pP
9090: 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72  arse = pWC->pPar
90a0: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  se;            /
90b0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
90c0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
90d0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
90e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
90f0: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
9100: 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54  tion */.  WhereT
9110: 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70 57  erm *pTerm = &pW
9120: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 20 20  C->a[idxTerm];  
9130: 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74 6f    /* The term to
9140: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
9150: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
9160: 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 20 20 20  pTerm->pExpr;   
9170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
9180: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74   expression of t
9190: 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65  he term */.  Whe
91a0: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
91b0: 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b  Set = pWC->pMask
91c0: 53 65 74 3b 20 2f 2a 20 54 61 62 6c 65 20 75 73  Set; /* Table us
91d0: 65 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 69 6e 74  e masks */.  int
91e0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
91f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9200: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
9210: 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65  nters */.  Where
9220: 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20  Clause *pOrWc;  
9230: 20 20 20 20 20 2f 2a 20 42 72 65 61 6b 75 70 20       /* Breakup 
9240: 6f 66 20 70 54 65 72 6d 20 69 6e 74 6f 20 73 75  of pTerm into su
9250: 62 74 65 72 6d 73 20 2a 2f 0a 20 20 57 68 65 72  bterms */.  Wher
9260: 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 20  eTerm *pOrTerm; 
9270: 20 20 20 20 20 20 2f 2a 20 41 20 53 75 62 2d 74        /* A Sub-t
9280: 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20 70  erm within the p
9290: 4f 72 57 63 20 2a 2f 0a 20 20 57 68 65 72 65 4f  OrWc */.  WhereO
92a0: 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20  rInfo *pOrInfo; 
92b0: 20 20 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61      /* Additiona
92c0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 73  l information as
92d0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
92e0: 65 72 6d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  erm */.  Bitmask
92f0: 20 63 68 6e 67 54 6f 49 4e 3b 20 20 20 20 20 20   chngToIN;      
9300: 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61     /* Tables tha
9310: 74 20 6d 69 67 68 74 20 73 61 74 69 73 66 79 20  t might satisfy 
9320: 63 61 73 65 20 31 20 2a 2f 0a 20 20 42 69 74 6d  case 1 */.  Bitm
9330: 61 73 6b 20 69 6e 64 65 78 61 62 6c 65 3b 20 20  ask indexable;  
9340: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
9350: 74 68 61 74 20 61 72 65 20 69 6e 64 65 78 61 62  that are indexab
9360: 6c 65 2c 20 73 61 74 69 73 66 79 69 6e 67 20 63  le, satisfying c
9370: 61 73 65 20 32 20 2a 2f 0a 0a 20 20 2f 2a 0a 20  ase 2 */..  /*. 
9380: 20 2a 2a 20 42 72 65 61 6b 20 74 68 65 20 4f 52   ** Break the OR
9390: 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 69 74 73   clause into its
93a0: 20 73 65 70 61 72 61 74 65 20 73 75 62 74 65 72   separate subter
93b0: 6d 73 2e 20 20 54 68 65 20 73 75 62 74 65 72 6d  ms.  The subterm
93c0: 73 20 61 72 65 0a 20 20 2a 2a 20 73 74 6f 72 65  s are.  ** store
93d0: 64 20 69 6e 20 61 20 57 68 65 72 65 43 6c 61 75  d in a WhereClau
93e0: 73 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  se structure con
93f0: 74 61 69 6e 69 6e 67 20 77 69 74 68 69 6e 20 74  taining within t
9400: 68 65 20 57 68 65 72 65 4f 72 49 6e 66 6f 0a 20  he WhereOrInfo. 
9410: 20 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20   ** object that 
9420: 69 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  is attached to t
9430: 68 65 20 6f 72 69 67 69 6e 61 6c 20 4f 52 20 63  he original OR c
9440: 6c 61 75 73 65 20 74 65 72 6d 2e 0a 20 20 2a 2f  lause term..  */
9450: 0a 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72  .  assert( (pTer
9460: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
9470: 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f  RM_DYNAMIC|TERM_
9480: 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f 41 4e 44 49  ORINFO|TERM_ANDI
9490: 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73  NFO))==0 );.  as
94a0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
94b0: 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 70 54 65 72  =TK_OR );.  pTer
94c0: 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 20 3d 20 70  m->u.pOrInfo = p
94d0: 4f 72 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  OrInfo = sqlite3
94e0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
94f0: 20 73 69 7a 65 6f 66 28 2a 70 4f 72 49 6e 66 6f   sizeof(*pOrInfo
9500: 29 29 3b 0a 20 20 69 66 28 20 70 4f 72 49 6e 66  ));.  if( pOrInf
9510: 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  o==0 ) return;. 
9520: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
9530: 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 3b 0a  |= TERM_ORINFO;.
9540: 20 20 70 4f 72 57 63 20 3d 20 26 70 4f 72 49 6e    pOrWc = &pOrIn
9550: 66 6f 2d 3e 77 63 3b 0a 20 20 77 68 65 72 65 43  fo->wc;.  whereC
9560: 6c 61 75 73 65 49 6e 69 74 28 70 4f 72 57 63 2c  lauseInit(pOrWc,
9570: 20 70 57 43 2d 3e 70 50 61 72 73 65 2c 20 70 4d   pWC->pParse, pM
9580: 61 73 6b 53 65 74 2c 20 70 57 43 2d 3e 77 63 74  askSet, pWC->wct
9590: 72 6c 46 6c 61 67 73 29 3b 0a 20 20 77 68 65 72  rlFlags);.  wher
95a0: 65 53 70 6c 69 74 28 70 4f 72 57 63 2c 20 70 45  eSplit(pOrWc, pE
95b0: 78 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20 65  xpr, TK_OR);.  e
95c0: 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53  xprAnalyzeAll(pS
95d0: 72 63 2c 20 70 4f 72 57 63 29 3b 0a 20 20 69 66  rc, pOrWc);.  if
95e0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
95f0: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  ed ) return;.  a
9600: 73 73 65 72 74 28 20 70 4f 72 57 63 2d 3e 6e 54  ssert( pOrWc->nT
9610: 65 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f 2a 0a  erm>=2 );..  /*.
9620: 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    ** Compute the
9630: 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74   set of tables t
9640: 68 61 74 20 6d 69 67 68 74 20 73 61 74 69 73 66  hat might satisf
9650: 79 20 63 61 73 65 73 20 31 20 6f 72 20 32 2e 0a  y cases 1 or 2..
9660: 20 20 2a 2f 0a 20 20 69 6e 64 65 78 61 62 6c 65    */.  indexable
9670: 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
9680: 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 7e 28 42    chngToIN = ~(B
9690: 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28  itmask)0;.  for(
96a0: 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31  i=pOrWc->nTerm-1
96b0: 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d  , pOrTerm=pOrWc-
96c0: 3e 61 3b 20 69 3e 3d 30 20 26 26 20 69 6e 64 65  >a; i>=0 && inde
96d0: 78 61 62 6c 65 3b 20 69 2d 2d 2c 20 70 4f 72 54  xable; i--, pOrT
96e0: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
96f0: 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61  (pOrTerm->eOpera
9700: 74 6f 72 20 26 20 57 4f 5f 53 49 4e 47 4c 45 29  tor & WO_SINGLE)
9710: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65  ==0 ){.      Whe
9720: 72 65 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49  reAndInfo *pAndI
9730: 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nfo;.      asser
9740: 74 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46  t( (pOrTerm->wtF
9750: 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 41 4e 44  lags & (TERM_AND
9760: 49 4e 46 4f 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f  INFO|TERM_ORINFO
9770: 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63  ))==0 );.      c
9780: 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20  hngToIN = 0;.   
9790: 20 20 20 70 41 6e 64 49 6e 66 6f 20 3d 20 73 71     pAndInfo = sq
97a0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
97b0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 41 6e  (db, sizeof(*pAn
97c0: 64 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 69  dInfo));.      i
97d0: 66 28 20 70 41 6e 64 49 6e 66 6f 20 29 7b 0a 20  f( pAndInfo ){. 
97e0: 20 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75         WhereClau
97f0: 73 65 20 2a 70 41 6e 64 57 43 3b 0a 20 20 20 20  se *pAndWC;.    
9800: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
9810: 41 6e 64 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  AndTerm;.       
9820: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
9830: 42 69 74 6d 61 73 6b 20 62 20 3d 20 30 3b 0a 20  Bitmask b = 0;. 
9840: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
9850: 75 2e 70 41 6e 64 49 6e 66 6f 20 3d 20 70 41 6e  u.pAndInfo = pAn
9860: 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70  dInfo;.        p
9870: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
9880: 7c 3d 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 3b  |= TERM_ANDINFO;
9890: 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d  .        pOrTerm
98a0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f  ->eOperator = WO
98b0: 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 70 41  _AND;.        pA
98c0: 6e 64 57 43 20 3d 20 26 70 41 6e 64 49 6e 66 6f  ndWC = &pAndInfo
98d0: 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 77 68  ->wc;.        wh
98e0: 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70 41  ereClauseInit(pA
98f0: 6e 64 57 43 2c 20 70 57 43 2d 3e 70 50 61 72 73  ndWC, pWC->pPars
9900: 65 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70 57 43  e, pMaskSet, pWC
9910: 2d 3e 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20  ->wctrlFlags);. 
9920: 20 20 20 20 20 20 20 77 68 65 72 65 53 70 6c 69         whereSpli
9930: 74 28 70 41 6e 64 57 43 2c 20 70 4f 72 54 65 72  t(pAndWC, pOrTer
9940: 6d 2d 3e 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44  m->pExpr, TK_AND
9950: 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 41  );.        exprA
9960: 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20  nalyzeAll(pSrc, 
9970: 70 41 6e 64 57 43 29 3b 0a 20 20 20 20 20 20 20  pAndWC);.       
9980: 20 70 41 6e 64 57 43 2d 3e 70 4f 75 74 65 72 20   pAndWC->pOuter 
9990: 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20 74  = pWC;.        t
99a0: 65 73 74 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c  estcase( db->mal
99b0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
99c0: 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61       if( !db->ma
99d0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
99e0: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c          for(j=0,
99f0: 20 70 41 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43   pAndTerm=pAndWC
9a00: 2d 3e 61 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e  ->a; j<pAndWC->n
9a10: 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54  Term; j++, pAndT
9a20: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
9a30: 20 20 20 20 61 73 73 65 72 74 28 20 70 41 6e 64      assert( pAnd
9a40: 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20  Term->pExpr );. 
9a50: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61             if( a
9a60: 6c 6c 6f 77 65 64 4f 70 28 70 41 6e 64 54 65 72  llowedOp(pAndTer
9a70: 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b  m->pExpr->op) ){
9a80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
9a90: 20 7c 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73   |= getMask(pMas
9aa0: 6b 53 65 74 2c 20 70 41 6e 64 54 65 72 6d 2d 3e  kSet, pAndTerm->
9ab0: 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20  leftCursor);.   
9ac0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
9ad0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
9ae0: 0a 20 20 20 20 20 20 20 20 69 6e 64 65 78 61 62  .        indexab
9af0: 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d  le &= b;.      }
9b00: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
9b10: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
9b20: 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 7b  & TERM_COPIED ){
9b30: 0a 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 74  .      /* Skip t
9b40: 68 69 73 20 74 65 72 6d 20 66 6f 72 20 6e 6f 77  his term for now
9b50: 2e 20 20 57 65 20 72 65 76 69 73 69 74 20 69 74  .  We revisit it
9b60: 20 77 68 65 6e 20 77 65 20 70 72 6f 63 65 73 73   when we process
9b70: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f   the.      ** co
9b80: 72 72 65 73 70 6f 6e 64 69 6e 67 20 54 45 52 4d  rresponding TERM
9b90: 5f 56 49 52 54 55 41 4c 20 74 65 72 6d 20 2a 2f  _VIRTUAL term */
9ba0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9bb0: 20 20 42 69 74 6d 61 73 6b 20 62 3b 0a 20 20 20    Bitmask b;.   
9bc0: 20 20 20 62 20 3d 20 67 65 74 4d 61 73 6b 28 70     b = getMask(p
9bd0: 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d  MaskSet, pOrTerm
9be0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20  ->leftCursor);. 
9bf0: 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d       if( pOrTerm
9c00: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
9c10: 5f 56 49 52 54 55 41 4c 20 29 7b 0a 20 20 20 20  _VIRTUAL ){.    
9c20: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
9c30: 4f 74 68 65 72 20 3d 20 26 70 4f 72 57 63 2d 3e  Other = &pOrWc->
9c40: 61 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65  a[pOrTerm->iPare
9c50: 6e 74 5d 3b 0a 20 20 20 20 20 20 20 20 62 20 7c  nt];.        b |
9c60: 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  = getMask(pMaskS
9c70: 65 74 2c 20 70 4f 74 68 65 72 2d 3e 6c 65 66 74  et, pOther->left
9c80: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d  Cursor);.      }
9c90: 0a 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65  .      indexable
9ca0: 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 69 66 28   &= b;.      if(
9cb0: 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72   (pOrTerm->eOper
9cc0: 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 3d 3d 30  ator & WO_EQ)==0
9cd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67   ){.        chng
9ce0: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20  ToIN = 0;.      
9cf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
9d00: 68 6e 67 54 6f 49 4e 20 26 3d 20 62 3b 0a 20 20  hngToIN &= b;.  
9d10: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9d20: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 63 6f 72  .  /*.  ** Recor
9d30: 64 20 74 68 65 20 73 65 74 20 6f 66 20 74 61 62  d the set of tab
9d40: 6c 65 73 20 74 68 61 74 20 73 61 74 69 73 66 79  les that satisfy
9d50: 20 63 61 73 65 20 32 2e 20 20 54 68 65 20 73 65   case 2.  The se
9d60: 74 20 6d 69 67 68 74 20 62 65 0a 20 20 2a 2a 20  t might be.  ** 
9d70: 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 70 4f  empty..  */.  pO
9d80: 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65  rInfo->indexable
9d90: 20 3d 20 69 6e 64 65 78 61 62 6c 65 3b 0a 20 20   = indexable;.  
9da0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
9db0: 20 3d 20 69 6e 64 65 78 61 62 6c 65 3d 3d 30 20   = indexable==0 
9dc0: 3f 20 30 20 3a 20 57 4f 5f 4f 52 3b 0a 0a 20 20  ? 0 : WO_OR;..  
9dd0: 2f 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e  /*.  ** chngToIN
9de0: 20 68 6f 6c 64 73 20 61 20 73 65 74 20 6f 66 20   holds a set of 
9df0: 74 61 62 6c 65 73 20 74 68 61 74 20 2a 6d 69 67  tables that *mig
9e00: 68 74 2a 20 73 61 74 69 73 66 79 20 63 61 73 65  ht* satisfy case
9e10: 20 31 2e 20 20 42 75 74 0a 20 20 2a 2a 20 77 65   1.  But.  ** we
9e20: 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65   have to do some
9e30: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 68 65 63   additional chec
9e40: 6b 69 6e 67 20 74 6f 20 73 65 65 20 69 66 20 63  king to see if c
9e50: 61 73 65 20 31 20 72 65 61 6c 6c 79 0a 20 20 2a  ase 1 really.  *
9e60: 2a 20 69 73 20 73 61 74 69 73 66 69 65 64 2e 0a  * is satisfied..
9e70: 20 20 2a 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f    **.  ** chngTo
9e80: 49 4e 20 77 69 6c 6c 20 68 6f 6c 64 20 65 69 74  IN will hold eit
9e90: 68 65 72 20 30 2c 20 31 2c 20 6f 72 20 32 20 62  her 0, 1, or 2 b
9ea0: 69 74 73 2e 20 20 54 68 65 20 30 2d 62 69 74 20  its.  The 0-bit 
9eb0: 63 61 73 65 20 6d 65 61 6e 73 0a 20 20 2a 2a 20  case means.  ** 
9ec0: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
9ed0: 20 70 6f 73 73 69 62 69 6c 69 74 79 20 6f 66 20   possibility of 
9ee0: 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65  transforming the
9ef0: 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20   OR clause into 
9f00: 61 6e 0a 20 20 2a 2a 20 49 4e 20 6f 70 65 72 61  an.  ** IN opera
9f10: 74 6f 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20  tor because one 
9f20: 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 69 6e  or more terms in
9f30: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 63   the OR clause c
9f40: 6f 6e 74 61 69 6e 0a 20 20 2a 2a 20 73 6f 6d 65  ontain.  ** some
9f50: 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
9f60: 20 3d 3d 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20   == on a column 
9f70: 69 6e 20 74 68 65 20 73 69 6e 67 6c 65 20 74 61  in the single ta
9f80: 62 6c 65 2e 20 20 54 68 65 20 31 2d 62 69 74 0a  ble.  The 1-bit.
9f90: 20 20 2a 2a 20 63 61 73 65 20 6d 65 61 6e 73 20    ** case means 
9fa0: 74 68 61 74 20 65 76 65 72 79 20 74 65 72 6d 20  that every term 
9fb0: 6f 66 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  of the OR clause
9fc0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a   is of the form.
9fd0: 20 20 2a 2a 20 22 74 61 62 6c 65 2e 63 6f 6c 75    ** "table.colu
9fe0: 6d 6e 3d 65 78 70 72 22 20 66 6f 72 20 73 6f 6d  mn=expr" for som
9ff0: 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20  e single table. 
a000: 20 54 68 65 20 6f 6e 65 20 62 69 74 20 74 68 61   The one bit tha
a010: 74 20 69 73 20 73 65 74 0a 20 20 2a 2a 20 77 69  t is set.  ** wi
a020: 6c 6c 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ll correspond to
a030: 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c   the common tabl
a040: 65 2e 20 20 57 65 20 73 74 69 6c 6c 20 6e 65 65  e.  We still nee
a050: 64 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 6d 61  d to check to ma
a060: 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 74 68 65  ke.  ** sure the
a070: 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 73 20   same column is 
a080: 75 73 65 64 20 6f 6e 20 61 6c 6c 20 74 65 72 6d  used on all term
a090: 73 2e 20 20 54 68 65 20 32 2d 62 69 74 20 63 61  s.  The 2-bit ca
a0a0: 73 65 20 69 73 20 77 68 65 6e 0a 20 20 2a 2a 20  se is when.  ** 
a0b0: 74 68 65 20 61 6c 6c 20 74 65 72 6d 73 20 61 72  the all terms ar
a0c0: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 74  e of the form "t
a0d0: 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 3d 74 61 62  able1.column=tab
a0e0: 6c 65 32 2e 63 6f 6c 75 6d 6e 22 2e 20 20 49 74  le2.column".  It
a0f0: 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 70  .  ** might be p
a100: 6f 73 73 69 62 6c 65 20 74 6f 20 66 6f 72 6d 20  ossible to form 
a110: 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77  an IN operator w
a120: 69 74 68 20 65 69 74 68 65 72 20 74 61 62 6c 65  ith either table
a130: 31 2e 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 72  1.column.  ** or
a140: 20 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 20 61   table2.column a
a150: 73 20 74 68 65 20 4c 48 53 20 69 66 20 65 69 74  s the LHS if eit
a160: 68 65 72 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f  her is common to
a170: 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 0a 20   every term of. 
a180: 20 2a 2a 20 74 68 65 20 4f 52 20 63 6c 61 75 73   ** the OR claus
a190: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74  e..  **.  ** Not
a1a0: 65 20 74 68 61 74 20 74 65 72 6d 73 20 6f 66 20  e that terms of 
a1b0: 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 2e  the form "table.
a1c0: 63 6f 6c 75 6d 6e 31 3d 74 61 62 6c 65 2e 63 6f  column1=table.co
a1d0: 6c 75 6d 6e 32 22 20 28 74 68 65 0a 20 20 2a 2a  lumn2" (the.  **
a1e0: 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 6e 20 62   same table on b
a1f0: 6f 74 68 20 73 69 7a 65 73 20 6f 66 20 74 68 65  oth sizes of the
a200: 20 3d 3d 29 20 63 61 6e 6e 6f 74 20 62 65 20 6f   ==) cannot be o
a210: 70 74 69 6d 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  ptimized..  */. 
a220: 20 69 66 28 20 63 68 6e 67 54 6f 49 4e 20 29 7b   if( chngToIN ){
a230: 0a 20 20 20 20 69 6e 74 20 6f 6b 54 6f 43 68 6e  .    int okToChn
a240: 67 54 6f 49 4e 20 3d 20 30 3b 20 20 20 20 20 2f  gToIN = 0;     /
a250: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 63 6f  * True if the co
a260: 6e 76 65 72 73 69 6f 6e 20 74 6f 20 49 4e 20 69  nversion to IN i
a270: 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 20 20 69  s valid */.    i
a280: 6e 74 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  nt iColumn = -1;
a290: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
a2a0: 6d 6e 20 69 6e 64 65 78 20 6f 6e 20 6c 68 73 20  mn index on lhs 
a2b0: 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  of IN operator *
a2c0: 2f 0a 20 20 20 20 69 6e 74 20 69 43 75 72 73 6f  /.    int iCurso
a2d0: 72 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  r = -1;         
a2e0: 2f 2a 20 54 61 62 6c 65 20 63 75 72 73 6f 72 20  /* Table cursor 
a2f0: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 74 65  common to all te
a300: 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a  rms */.    int j
a310: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
a320: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
a330: 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  nter */..    /* 
a340: 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 61 62  Search for a tab
a350: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 74 68  le and column th
a360: 61 74 20 61 70 70 65 61 72 73 20 6f 6e 20 6f 6e  at appears on on
a370: 65 20 73 69 64 65 20 6f 72 20 74 68 65 0a 20 20  e side or the.  
a380: 20 20 2a 2a 20 6f 74 68 65 72 20 6f 66 20 74 68    ** other of th
a390: 65 20 3d 3d 20 6f 70 65 72 61 74 6f 72 20 69 6e  e == operator in
a3a0: 20 65 76 65 72 79 20 73 75 62 74 65 72 6d 2e 20   every subterm. 
a3b0: 20 54 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20   That table and 
a3c0: 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2a 20 77 69  column.    ** wi
a3d0: 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20 69  ll be recorded i
a3e0: 6e 20 69 43 75 72 73 6f 72 20 61 6e 64 20 69 43  n iCursor and iC
a3f0: 6f 6c 75 6d 6e 2e 20 20 54 68 65 72 65 20 6d 69  olumn.  There mi
a400: 67 68 74 20 6e 6f 74 20 62 65 20 61 6e 79 0a 20  ght not be any. 
a410: 20 20 20 2a 2a 20 73 75 63 68 20 74 61 62 6c 65     ** such table
a420: 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 53 65   and column.  Se
a430: 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69  t okToChngToIN i
a440: 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  f an appropriate
a450: 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 61 6e   table.    ** an
a460: 64 20 63 6f 6c 75 6d 6e 20 69 73 20 66 6f 75 6e  d column is foun
a470: 64 20 62 75 74 20 6c 65 61 76 65 20 6f 6b 54 6f  d but leave okTo
a480: 43 68 6e 67 54 6f 49 4e 20 66 61 6c 73 65 20 69  ChngToIN false i
a490: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 20  f not found..   
a4a0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   */.    for(j=0;
a4b0: 20 6a 3c 32 20 26 26 20 21 6f 6b 54 6f 43 68 6e   j<2 && !okToChn
a4c0: 67 54 6f 49 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  gToIN; j++){.   
a4d0: 20 20 20 70 4f 72 54 65 72 6d 20 3d 20 70 4f 72     pOrTerm = pOr
a4e0: 57 63 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72  Wc->a;.      for
a4f0: 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d  (i=pOrWc->nTerm-
a500: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f  1; i>=0; i--, pO
a510: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
a520: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
a530: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
a540: 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20  O_EQ );.        
a550: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
a560: 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b   &= ~TERM_OR_OK;
a570: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72  .        if( pOr
a580: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
a590: 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ==iCursor ){.   
a5a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69         /* This i
a5b0: 73 20 74 68 65 20 32 2d 62 69 74 20 63 61 73 65  s the 2-bit case
a5c0: 20 61 6e 64 20 77 65 20 61 72 65 20 6f 6e 20 74   and we are on t
a5d0: 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74  he second iterat
a5e0: 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ion and.        
a5f0: 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 65 72    ** current ter
a600: 6d 20 69 73 20 66 72 6f 6d 20 74 68 65 20 66 69  m is from the fi
a610: 72 73 74 20 69 74 65 72 61 74 69 6f 6e 2e 20 20  rst iteration.  
a620: 53 6f 20 73 6b 69 70 20 74 68 69 73 20 74 65 72  So skip this ter
a630: 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  m. */.          
a640: 61 73 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a  assert( j==1 );.
a650: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
a660: 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
a670: 20 20 20 20 20 20 69 66 28 20 28 63 68 6e 67 54        if( (chngT
a680: 6f 49 4e 20 26 20 67 65 74 4d 61 73 6b 28 70 4d  oIN & getMask(pM
a690: 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d  askSet, pOrTerm-
a6a0: 3e 6c 65 66 74 43 75 72 73 6f 72 29 29 3d 3d 30  >leftCursor))==0
a6b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
a6c0: 20 54 68 69 73 20 74 65 72 6d 20 6d 75 73 74 20   This term must 
a6d0: 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 74  be of the form t
a6e0: 31 2e 61 3d 3d 74 32 2e 62 20 77 68 65 72 65 20  1.a==t2.b where 
a6f0: 74 32 20 69 73 20 69 6e 20 74 68 65 0a 20 20 20  t2 is in the.   
a700: 20 20 20 20 20 20 20 2a 2a 20 63 68 6e 67 54 6f         ** chngTo
a710: 49 4e 20 73 65 74 20 62 75 74 20 74 31 20 69 73  IN set but t1 is
a720: 20 6e 6f 74 2e 20 20 54 68 69 73 20 74 65 72 6d   not.  This term
a730: 20 77 69 6c 6c 20 62 65 20 65 69 74 68 65 72 20   will be either 
a740: 70 72 65 63 65 65 64 65 64 0a 20 20 20 20 20 20  preceeded.      
a750: 20 20 20 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77 65      ** or follwe
a760: 64 20 62 79 20 61 6e 20 69 6e 76 65 72 74 65 64  d by an inverted
a770: 20 63 6f 70 79 20 28 74 32 2e 62 3d 3d 74 31 2e   copy (t2.b==t1.
a780: 61 29 2e 20 20 53 6b 69 70 20 74 68 69 73 20 74  a).  Skip this t
a790: 65 72 6d 20 0a 20 20 20 20 20 20 20 20 20 20 2a  erm .          *
a7a0: 2a 20 61 6e 64 20 75 73 65 20 69 74 73 20 69 6e  * and use its in
a7b0: 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  version. */.    
a7c0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
a7d0: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
a7e0: 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29   & TERM_COPIED )
a7f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
a800: 63 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77  case( pOrTerm->w
a810: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
a820: 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 20  RTUAL );.       
a830: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
a840: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
a850: 45 52 4d 5f 43 4f 50 49 45 44 7c 54 45 52 4d 5f  ERM_COPIED|TERM_
a860: 56 49 52 54 55 41 4c 29 20 29 3b 0a 20 20 20 20  VIRTUAL) );.    
a870: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
a880: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a890: 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72 54    iColumn = pOrT
a8a0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
a8b0: 6e 3b 0a 20 20 20 20 20 20 20 20 69 43 75 72 73  n;.        iCurs
a8c0: 6f 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c 65  or = pOrTerm->le
a8d0: 66 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  ftCursor;.      
a8e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
a8f0: 0a 20 20 20 20 20 20 69 66 28 20 69 3c 30 20 29  .      if( i<0 )
a900: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20  {.        /* No 
a910: 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65 2b  candidate table+
a920: 63 6f 6c 75 6d 6e 20 77 61 73 20 66 6f 75 6e 64  column was found
a930: 2e 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  .  This can only
a940: 20 6f 63 63 75 72 0a 20 20 20 20 20 20 20 20 2a   occur.        *
a950: 2a 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  * on the second 
a960: 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  iteration */.   
a970: 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d       assert( j==
a980: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  1 );.        ass
a990: 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77  ert( IsPowerOfTw
a9a0: 6f 28 63 68 6e 67 54 6f 49 4e 29 20 29 3b 0a 20  o(chngToIN) );. 
a9b0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63         assert( c
a9c0: 68 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d 61 73 6b  hngToIN==getMask
a9d0: 28 70 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 73  (pMaskSet, iCurs
a9e0: 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 62  or) );.        b
a9f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
aa00: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d      testcase( j=
aa10: 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  =1 );..      /* 
aa20: 57 65 20 68 61 76 65 20 66 6f 75 6e 64 20 61 20  We have found a 
aa30: 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65 20  candidate table 
aa40: 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 43 68 65  and column.  Che
aa50: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 61  ck to see if tha
aa60: 74 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65  t.      ** table
aa70: 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20 63   and column is c
aa80: 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74  ommon to every t
aa90: 65 72 6d 20 69 6e 20 74 68 65 20 4f 52 20 63 6c  erm in the OR cl
aaa0: 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 6f 6b  ause */.      ok
aab0: 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a  ToChngToIN = 1;.
aac0: 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3e 3d 30        for(; i>=0
aad0: 20 26 26 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e   && okToChngToIN
aae0: 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b  ; i--, pOrTerm++
aaf0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
ab00: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  t( pOrTerm->eOpe
ab10: 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b  rator & WO_EQ );
ab20: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72  .        if( pOr
ab30: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
ab40: 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  !=iCursor ){.   
ab50: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
ab60: 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d  wtFlags &= ~TERM
ab70: 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  _OR_OK;.        
ab80: 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72  }else if( pOrTer
ab90: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 21  m->u.leftColumn!
aba0: 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  =iColumn ){.    
abb0: 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f        okToChngTo
abc0: 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  IN = 0;.        
abd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
abe0: 20 69 6e 74 20 61 66 66 4c 65 66 74 2c 20 61 66   int affLeft, af
abf0: 66 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  fRight;.        
ac00: 20 20 2f 2a 20 49 66 20 74 68 65 20 72 69 67 68    /* If the righ
ac10: 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61  t-hand side is a
ac20: 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68  lso a column, th
ac30: 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 69 65  en the affinitie
ac40: 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f  s.          ** o
ac50: 66 20 62 6f 74 68 20 72 69 67 68 74 20 61 6e 64  f both right and
ac60: 20 6c 65 66 74 20 73 69 64 65 73 20 6d 75 73 74   left sides must
ac70: 20 62 65 20 73 75 63 68 20 74 68 61 74 20 6e 6f   be such that no
ac80: 20 74 79 70 65 0a 20 20 20 20 20 20 20 20 20 20   type.          
ac90: 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61  ** conversions a
aca0: 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20 74  re required on t
acb0: 68 65 20 72 69 67 68 74 2e 20 20 28 54 69 63 6b  he right.  (Tick
acc0: 65 74 20 23 32 32 34 39 29 0a 20 20 20 20 20 20  et #2249).      
acd0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
ace0: 20 61 66 66 52 69 67 68 74 20 3d 20 73 71 6c 69   affRight = sqli
acf0: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
ad00: 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  pOrTerm->pExpr->
ad10: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
ad20: 20 20 20 61 66 66 4c 65 66 74 20 3d 20 73 71 6c     affLeft = sql
ad30: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
ad40: 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d  (pOrTerm->pExpr-
ad50: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20  >pLeft);.       
ad60: 20 20 20 69 66 28 20 61 66 66 52 69 67 68 74 21     if( affRight!
ad70: 3d 30 20 26 26 20 61 66 66 52 69 67 68 74 21 3d  =0 && affRight!=
ad80: 61 66 66 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  affLeft ){.     
ad90: 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54         okToChngT
ada0: 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  oIN = 0;.       
adb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
adc0: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77        pOrTerm->w
add0: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f  tFlags |= TERM_O
ade0: 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  R_OK;.          
adf0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
ae00: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
ae10: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
ae20: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 73   okToChngToIN is
ae30: 20 74 72 75 65 20 69 66 20 6f 72 69 67 69 6e 61   true if origina
ae40: 6c 20 70 54 65 72 6d 20 73 61 74 69 73 66 69 65  l pTerm satisfie
ae50: 73 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 31 2e  s.    ** case 1.
ae60: 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20    In that case, 
ae70: 63 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  construct a new 
ae80: 76 69 72 74 75 61 6c 20 74 65 72 6d 20 74 68 61  virtual term tha
ae90: 74 20 69 73 20 0a 20 20 20 20 2a 2a 20 70 54 65  t is .    ** pTe
aea0: 72 6d 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  rm converted int
aeb0: 6f 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  o an IN operator
aec0: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
aed0: 45 56 3a 20 52 2d 30 30 32 31 31 2d 31 35 31 30  EV: R-00211-1510
aee0: 30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  0.    */.    if(
aef0: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 29 7b   okToChngToIN ){
af00: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44 75  .      Expr *pDu
af10: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
af20: 20 41 20 74 72 61 6e 73 69 65 6e 74 20 64 75 70   A transient dup
af30: 6c 69 63 61 74 65 20 65 78 70 72 65 73 73 69 6f  licate expressio
af40: 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c  n */.      ExprL
af50: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b 20  ist *pList = 0; 
af60: 20 20 2f 2a 20 54 68 65 20 52 48 53 20 6f 66 20    /* The RHS of 
af70: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
af80: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
af90: 4c 65 66 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Left = 0;       
afa0: 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20 74 68  /* The LHS of th
afb0: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  e IN operator */
afc0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
afd0: 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  w;            /*
afe0: 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 49 4e   The complete IN
aff0: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20   operator */..  
b000: 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d      for(i=pOrWc-
b010: 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72  >nTerm-1, pOrTer
b020: 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30  m=pOrWc->a; i>=0
b030: 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b  ; i--, pOrTerm++
b040: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
b050: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
b060: 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d   & TERM_OR_OK)==
b070: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
b080: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
b090: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
b0a0: 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20   & WO_EQ );.    
b0b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
b0c0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
b0d0: 3d 69 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  =iCursor );.    
b0e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
b0f0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
b100: 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  n==iColumn );.  
b110: 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c        pDup = sql
b120: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
b130: 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  pOrTerm->pExpr->
b140: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
b150: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
b160: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
b170: 64 28 70 57 43 2d 3e 70 50 61 72 73 65 2c 20 70  d(pWC->pParse, p
b180: 4c 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20 20  List, pDup);.   
b190: 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4f 72       pLeft = pOr
b1a0: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65  Term->pExpr->pLe
b1b0: 66 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ft;.      }.    
b1c0: 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 21    assert( pLeft!
b1d0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44 75 70  =0 );.      pDup
b1e0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
b1f0: 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b  p(db, pLeft, 0);
b200: 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71  .      pNew = sq
b210: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
b220: 65 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20  e, TK_IN, pDup, 
b230: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
b240: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
b250: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
b260: 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69       transferJoi
b270: 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20  nMarkings(pNew, 
b280: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
b290: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
b2a0: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
b2b0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
b2c0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e          pNew->x.
b2d0: 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20  pList = pList;. 
b2e0: 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20         idxNew = 
b2f0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
b300: 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 52  t(pWC, pNew, TER
b310: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
b320: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20  YNAMIC);.       
b330: 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
b340: 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  w==0 );.        
b350: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
b360: 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a  , pWC, idxNew);.
b370: 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
b380: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
b390: 3b 0a 20 20 20 20 20 20 20 20 70 57 43 2d 3e 61  ;.        pWC->a
b3a0: 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74  [idxNew].iParent
b3b0: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
b3c0: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
b3d0: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  d = 1;.      }el
b3e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
b3f0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
b400: 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
b410: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 65 72      }.      pTer
b420: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57  m->eOperator = W
b430: 4f 5f 4e 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65  O_NOOP;  /* case
b440: 20 31 20 74 72 75 6d 70 73 20 63 61 73 65 20 32   1 trumps case 2
b450: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   */.    }.  }.}.
b460: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
b470: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
b480: 5a 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49 54  ZATION && !SQLIT
b490: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
b4a0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e  */../*.** The in
b4b0: 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74  put to this rout
b4c0: 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65 54  ine is an WhereT
b4d0: 65 72 6d 20 73 74 72 75 63 74 75 72 65 20 77 69  erm structure wi
b4e0: 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22  th only the.** "
b4f0: 70 45 78 70 72 22 20 66 69 65 6c 64 20 66 69 6c  pExpr" field fil
b500: 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62  led in.  The job
b510: 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
b520: 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74   is to analyze t
b530: 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73 73  he.** subexpress
b540: 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ion and populate
b550: 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 66   all the other f
b560: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68 65  ields of the Whe
b570: 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74  reTerm.** struct
b580: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ure..**.** If th
b590: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
b5a0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65 78  of the form "<ex
b5b0: 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20 67  pr> <op> X" it g
b5c0: 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20  ets commuted.** 
b5d0: 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  to the standard 
b5e0: 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20  form of "X <op> 
b5f0: 3c 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49  <expr>"..**.** I
b600: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
b610: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
b620: 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65  "X <op> Y" where
b630: 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61 72   both X and Y ar
b640: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68  e.** columns, th
b650: 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  en the original 
b660: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e  expression is un
b670: 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e 65  changed and a ne
b680: 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72  w virtual.** ter
b690: 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 59  m of the form "Y
b6a0: 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65   <op> X" is adde
b6b0: 64 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  d to the WHERE c
b6c0: 6c 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61  lause and.** ana
b6d0: 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c 79  lyzed separately
b6e0: 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  .  The original 
b6f0: 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77  term is marked w
b700: 69 74 68 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a  ith TERM_COPIED.
b710: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 74  ** and the new t
b720: 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69  erm is marked wi
b730: 74 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20  th TERM_DYNAMIC 
b740: 28 62 65 63 61 75 73 65 20 69 74 27 73 20 70 45  (because it's pE
b750: 78 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20  xpr.** needs to 
b760: 62 65 20 66 72 65 65 64 20 77 69 74 68 20 74 68  be freed with th
b770: 65 20 57 68 65 72 65 43 6c 61 75 73 65 29 20 61  e WhereClause) a
b780: 6e 64 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20  nd TERM_VIRTUAL 
b790: 28 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20 69  (because it.** i
b7a0: 73 20 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70  s a commuted cop
b7b0: 79 20 6f 66 20 61 20 70 72 69 6f 72 20 74 65 72  y of a prior ter
b7c0: 6d 2e 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61  m.)  The origina
b7d0: 6c 20 74 65 72 6d 20 68 61 73 20 6e 43 68 69 6c  l term has nChil
b7e0: 64 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63  d=1.** and the c
b7f0: 6f 70 79 20 68 61 73 20 69 64 78 50 61 72 65 6e  opy has idxParen
b800: 74 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  t set to the ind
b810: 65 78 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ex of the origin
b820: 61 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74  al term..*/.stat
b830: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
b840: 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  yze(.  SrcList *
b850: 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20  pSrc,           
b860: 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   /* the FROM cla
b870: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
b880: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
b890: 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20     /* the WHERE 
b8a0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
b8b0: 69 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20  idxTerm         
b8c0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
b8d0: 66 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65  f the term to be
b8e0: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a   analyzed */.){.
b8f0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
b900: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
b910: 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74     /* The term t
b920: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  o be analyzed */
b930: 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  .  WhereMaskSet 
b940: 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 20 20  *pMaskSet;      
b950: 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 74 61      /* Set of ta
b960: 62 6c 65 20 69 6e 64 65 78 20 6d 61 73 6b 73 20  ble index masks 
b970: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
b980: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b990: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
b9a0: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e  ression to be an
b9b0: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42 69 74 6d  alyzed */.  Bitm
b9c0: 61 73 6b 20 70 72 65 72 65 71 4c 65 66 74 3b 20  ask prereqLeft; 
b9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b9e0: 50 72 65 72 65 71 75 65 73 69 74 65 73 20 6f 66  Prerequesites of
b9f0: 20 74 68 65 20 70 45 78 70 72 2d 3e 70 4c 65 66   the pExpr->pLef
ba00: 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70  t */.  Bitmask p
ba10: 72 65 72 65 71 41 6c 6c 3b 20 20 20 20 20 20 20  rereqAll;       
ba20: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65          /* Prere
ba30: 71 75 65 73 69 74 65 73 20 6f 66 20 70 45 78 70  quesites of pExp
ba40: 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65  r */.  Bitmask e
ba50: 78 74 72 61 52 69 67 68 74 20 3d 20 30 3b 20 20  xtraRight = 0;  
ba60: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
ba70: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e   dependencies on
ba80: 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20   LEFT JOIN */.  
ba90: 45 78 70 72 20 2a 70 53 74 72 31 20 3d 20 30 3b  Expr *pStr1 = 0;
baa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bab0: 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f   /* RHS of LIKE/
bac0: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f  GLOB operator */
bad0: 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74  .  int isComplet
bae0: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
baf0: 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49      /* RHS of LI
bb00: 4b 45 2f 47 4c 4f 42 20 65 6e 64 73 20 77 69 74  KE/GLOB ends wit
bb10: 68 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20  h wildcard */.  
bb20: 69 6e 74 20 6e 6f 43 61 73 65 20 3d 20 30 3b 20  int noCase = 0; 
bb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb40: 20 2f 2a 20 4c 49 4b 45 2f 47 4c 4f 42 20 64 69   /* LIKE/GLOB di
bb50: 73 74 69 6e 67 75 69 73 68 65 73 20 63 61 73 65  stinguishes case
bb60: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
bb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb80: 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 2d 6c 65         /* Top-le
bb90: 76 65 6c 20 6f 70 65 72 61 74 6f 72 2e 20 20 70  vel operator.  p
bba0: 45 78 70 72 2d 3e 6f 70 20 2a 2f 0a 20 20 50 61  Expr->op */.  Pa
bbb0: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
bbc0: 43 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 2f  C->pParse;     /
bbd0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
bbe0: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
bbf0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
bc00: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
bc10: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
bc20: 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  /..  if( db->mal
bc30: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
bc40: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
bc50: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
bc60: 64 78 54 65 72 6d 5d 3b 0a 20 20 70 4d 61 73 6b  dxTerm];.  pMask
bc70: 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b  Set = pWC->pMask
bc80: 53 65 74 3b 0a 20 20 70 45 78 70 72 20 3d 20 70  Set;.  pExpr = p
bc90: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 61  Term->pExpr;.  a
bca0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
bcb0: 21 3d 54 4b 5f 41 53 20 26 26 20 70 45 78 70 72  !=TK_AS && pExpr
bcc0: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op!=TK_COLLATE
bcd0: 20 29 3b 0a 20 20 70 72 65 72 65 71 4c 65 66 74   );.  prereqLeft
bce0: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
bcf0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
bd00: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6f 70 20  r->pLeft);.  op 
bd10: 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69  = pExpr->op;.  i
bd20: 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a  f( op==TK_IN ){.
bd30: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
bd40: 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
bd50: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
bd60: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
bd70: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
bd80: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65        pTerm->pre
bd90: 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 53  reqRight = exprS
bda0: 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28  electTableUsage(
bdb0: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
bdc0: 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  >x.pSelect);.   
bdd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
bde0: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
bdf0: 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65   = exprListTable
be00: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
be10: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b  pExpr->x.pList);
be20: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
be30: 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  f( op==TK_ISNULL
be40: 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70   ){.    pTerm->p
be50: 72 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b 0a  rereqRight = 0;.
be60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 65    }else{.    pTe
be70: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
be80: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
be90: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
bea0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20  ->pRight);.  }. 
beb0: 20 70 72 65 72 65 71 41 6c 6c 20 3d 20 65 78 70   prereqAll = exp
bec0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
bed0: 6b 53 65 74 2c 20 70 45 78 70 72 29 3b 0a 20 20  kSet, pExpr);.  
bee0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
bef0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
bf00: 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 42  omJoin) ){.    B
bf10: 69 74 6d 61 73 6b 20 78 20 3d 20 67 65 74 4d 61  itmask x = getMa
bf20: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  sk(pMaskSet, pEx
bf30: 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  pr->iRightJoinTa
bf40: 62 6c 65 29 3b 0a 20 20 20 20 70 72 65 72 65 71  ble);.    prereq
bf50: 41 6c 6c 20 7c 3d 20 78 3b 0a 20 20 20 20 65 78  All |= x;.    ex
bf60: 74 72 61 52 69 67 68 74 20 3d 20 78 2d 31 3b 20  traRight = x-1; 
bf70: 20 2f 2a 20 4f 4e 20 63 6c 61 75 73 65 20 74 65   /* ON clause te
bf80: 72 6d 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 75  rms may not be u
bf90: 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65  sed with an inde
bfa0: 78 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x.              
bfb0: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 6c           ** on l
bfc0: 65 66 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c  eft table of a L
bfd0: 45 46 54 20 4a 4f 49 4e 2e 20 20 54 69 63 6b 65  EFT JOIN.  Ticke
bfe0: 74 20 23 33 30 31 35 20 2a 2f 0a 20 20 7d 0a 20  t #3015 */.  }. 
bff0: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c   pTerm->prereqAl
c000: 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20  l = prereqAll;. 
c010: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
c020: 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d  or = -1;.  pTerm
c030: 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a  ->iParent = -1;.
c040: 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74    pTerm->eOperat
c050: 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c  or = 0;.  if( al
c060: 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 7b 0a 20  lowedOp(op) ){. 
c070: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
c080: 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
c090: 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 2d 3e 70  Collate(pExpr->p
c0a0: 4c 65 66 74 29 3b 0a 20 20 20 20 45 78 70 72 20  Left);.    Expr 
c0b0: 2a 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  *pRight = sqlite
c0c0: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
c0d0: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b  (pExpr->pRight);
c0e0: 0a 20 20 20 20 75 31 36 20 6f 70 4d 61 73 6b 20  .    u16 opMask 
c0f0: 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  = (pTerm->prereq
c100: 52 69 67 68 74 20 26 20 70 72 65 72 65 71 4c 65  Right & prereqLe
c110: 66 74 29 3d 3d 30 20 3f 20 57 4f 5f 41 4c 4c 20  ft)==0 ? WO_ALL 
c120: 3a 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20  : WO_EQUIV;.    
c130: 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  if( pLeft->op==T
c140: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
c150: 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72    pTerm->leftCur
c160: 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61  sor = pLeft->iTa
c170: 62 6c 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  ble;.      pTerm
c180: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d  ->u.leftColumn =
c190: 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b   pLeft->iColumn;
c1a0: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f  .      pTerm->eO
c1b0: 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74  perator = operat
c1c0: 6f 72 4d 61 73 6b 28 6f 70 29 20 26 20 6f 70 4d  orMask(op) & opM
c1d0: 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ask;.    }.    i
c1e0: 66 28 20 70 52 69 67 68 74 20 26 26 20 70 52 69  f( pRight && pRi
c1f0: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ght->op==TK_COLU
c200: 4d 4e 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  MN ){.      Wher
c210: 65 54 65 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20  eTerm *pNew;.   
c220: 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b 0a 20     Expr *pDup;. 
c230: 20 20 20 20 20 75 31 36 20 65 45 78 74 72 61 4f       u16 eExtraO
c240: 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  p = 0;        /*
c250: 20 45 78 74 72 61 20 62 69 74 73 20 66 6f 72 20   Extra bits for 
c260: 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pNew->eOperator 
c270: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  */.      if( pTe
c280: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3e 3d  rm->leftCursor>=
c290: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
c2a0: 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20   idxNew;.       
c2b0: 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45   pDup = sqlite3E
c2c0: 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
c2d0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
c2e0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
c2f0: 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ed ){.          
c300: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
c310: 65 28 64 62 2c 20 70 44 75 70 29 3b 0a 20 20 20  e(db, pDup);.   
c320: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
c330: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c340: 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
c350: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
c360: 20 70 44 75 70 2c 20 54 45 52 4d 5f 56 49 52 54   pDup, TERM_VIRT
c370: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
c380: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
c390: 64 78 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72  dxNew==0 ) retur
c3a0: 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  n;.        pNew 
c3b0: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77  = &pWC->a[idxNew
c3c0: 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ];.        pNew-
c3d0: 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  >iParent = idxTe
c3e0: 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  rm;.        pTer
c3f0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
c400: 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70 54  erm];.        pT
c410: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
c420: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  .        pTerm->
c430: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
c440: 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 20 20  COPIED;.        
c450: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
c460: 4b 5f 45 51 0a 20 20 20 20 20 20 20 20 20 26 26  K_EQ.         &&
c470: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
c480: 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
c490: 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20 20 20 26  Join).         &
c4a0: 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
c4b0: 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
c4c0: 5f 54 72 61 6e 73 69 74 69 76 65 29 0a 20 20 20  _Transitive).   
c4d0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
c4e0: 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74    pTerm->eOperat
c4f0: 6f 72 20 7c 3d 20 57 4f 5f 45 51 55 49 56 3b 0a  or |= WO_EQUIV;.
c500: 20 20 20 20 20 20 20 20 20 20 65 45 78 74 72 61            eExtra
c510: 4f 70 20 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20  Op = WO_EQUIV;. 
c520: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
c530: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
c540: 75 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  up = pExpr;.    
c550: 20 20 20 20 70 4e 65 77 20 3d 20 70 54 65 72 6d      pNew = pTerm
c560: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c570: 65 78 70 72 43 6f 6d 6d 75 74 65 28 70 50 61 72  exprCommute(pPar
c580: 73 65 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20  se, pDup);.     
c590: 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   pLeft = sqlite3
c5a0: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
c5b0: 70 44 75 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  pDup->pLeft);.  
c5c0: 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75      pNew->leftCu
c5d0: 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54  rsor = pLeft->iT
c5e0: 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77  able;.      pNew
c5f0: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d  ->u.leftColumn =
c600: 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b   pLeft->iColumn;
c610: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
c620: 20 28 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65   (prereqLeft | e
c630: 78 74 72 61 52 69 67 68 74 29 20 21 3d 20 70 72  xtraRight) != pr
c640: 65 72 65 71 4c 65 66 74 20 29 3b 0a 20 20 20 20  ereqLeft );.    
c650: 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 52 69    pNew->prereqRi
c660: 67 68 74 20 3d 20 70 72 65 72 65 71 4c 65 66 74  ght = prereqLeft
c670: 20 7c 20 65 78 74 72 61 52 69 67 68 74 3b 0a 20   | extraRight;. 
c680: 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
c690: 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c  qAll = prereqAll
c6a0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f  ;.      pNew->eO
c6b0: 70 65 72 61 74 6f 72 20 3d 20 28 6f 70 65 72 61  perator = (opera
c6c0: 74 6f 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70  torMask(pDup->op
c6d0: 29 20 2b 20 65 45 78 74 72 61 4f 70 29 20 26 20  ) + eExtraOp) & 
c6e0: 6f 70 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20  opMask;.    }.  
c6f0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
c700: 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f  E_OMIT_BETWEEN_O
c710: 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a  PTIMIZATION.  /*
c720: 20 49 66 20 61 20 74 65 72 6d 20 69 73 20 74 68   If a term is th
c730: 65 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74  e BETWEEN operat
c740: 6f 72 2c 20 63 72 65 61 74 65 20 74 77 6f 20 6e  or, create two n
c750: 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  ew virtual terms
c760: 0a 20 20 2a 2a 20 74 68 61 74 20 64 65 66 69 6e  .  ** that defin
c770: 65 20 74 68 65 20 72 61 6e 67 65 20 74 68 61 74  e the range that
c780: 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 6d 70   the BETWEEN imp
c790: 6c 65 6d 65 6e 74 73 2e 20 20 46 6f 72 20 65 78  lements.  For ex
c7a0: 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
c7b0: 20 20 20 20 20 20 61 20 42 45 54 57 45 45 4e 20        a BETWEEN 
c7c0: 62 20 41 4e 44 20 63 0a 20 20 2a 2a 0a 20 20 2a  b AND c.  **.  *
c7d0: 2a 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 69  * is converted i
c7e0: 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  nto:.  **.  **  
c7f0: 20 20 20 20 28 61 20 42 45 54 57 45 45 4e 20 62      (a BETWEEN b
c800: 20 41 4e 44 20 63 29 20 41 4e 44 20 28 61 3e 3d   AND c) AND (a>=
c810: 62 29 20 41 4e 44 20 28 61 3c 3d 63 29 0a 20 20  b) AND (a<=c).  
c820: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 74 77 6f 20  **.  ** The two 
c830: 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20 61 64  new terms are ad
c840: 64 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ded onto the end
c850: 20 6f 66 20 74 68 65 20 57 68 65 72 65 43 6c 61   of the WhereCla
c860: 75 73 65 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a  use object..  **
c870: 20 54 68 65 20 6e 65 77 20 74 65 72 6d 73 20 61   The new terms a
c880: 72 65 20 22 64 79 6e 61 6d 69 63 22 20 61 6e 64  re "dynamic" and
c890: 20 61 72 65 20 63 68 69 6c 64 72 65 6e 20 6f 66   are children of
c8a0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 42 45   the original BE
c8b0: 54 57 45 45 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e  TWEEN.  ** term.
c8c0: 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68 61    That means tha
c8d0: 74 20 69 66 20 74 68 65 20 42 45 54 57 45 45 4e  t if the BETWEEN
c8e0: 20 74 65 72 6d 20 69 73 20 63 6f 64 65 64 2c 20   term is coded, 
c8f0: 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65  the children are
c900: 0a 20 20 2a 2a 20 73 6b 69 70 70 65 64 2e 20 20  .  ** skipped.  
c910: 4f 72 2c 20 69 66 20 74 68 65 20 63 68 69 6c 64  Or, if the child
c920: 72 65 6e 20 61 72 65 20 73 61 74 69 73 66 69 65  ren are satisfie
c930: 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2c 20 74  d by an index, t
c940: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a  he original.  **
c950: 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20 69 73   BETWEEN term is
c960: 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20   skipped..  */. 
c970: 20 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d   else if( pExpr-
c980: 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20  >op==TK_BETWEEN 
c990: 26 26 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41  && pWC->op==TK_A
c9a0: 4e 44 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  ND ){.    ExprLi
c9b0: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
c9c0: 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
c9d0: 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 61 74 69  int i;.    stati
c9e0: 63 20 63 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d  c const u8 ops[]
c9f0: 20 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45   = {TK_GE, TK_LE
ca00: 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  };.    assert( p
ca10: 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61  List!=0 );.    a
ca20: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
ca30: 78 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f  xpr==2 );.    fo
ca40: 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29  r(i=0; i<2; i++)
ca50: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  {.      Expr *pN
ca60: 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e  ewExpr;.      in
ca70: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20  t idxNew;.      
ca80: 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74  pNewExpr = sqlit
ca90: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
caa0: 6f 70 73 5b 69 5d 2c 20 0a 20 20 20 20 20 20 20  ops[i], .       
cab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cac0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
cad0: 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2d 3e  rDup(db, pExpr->
cae0: 70 4c 65 66 74 2c 20 30 29 2c 0a 20 20 20 20 20  pLeft, 0),.     
caf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
cb10: 78 70 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74  xprDup(db, pList
cb20: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29  ->a[i].pExpr, 0)
cb30: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64 78 4e  , 0);.      idxN
cb40: 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  ew = whereClause
cb50: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
cb60: 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55  Expr, TERM_VIRTU
cb70: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29  AL|TERM_DYNAMIC)
cb80: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
cb90: 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20  ( idxNew==0 );. 
cba0: 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65       exprAnalyze
cbb0: 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e  (pSrc, pWC, idxN
cbc0: 65 77 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  ew);.      pTerm
cbd0: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
cbe0: 72 6d 5d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e  rm];.      pWC->
cbf0: 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e  a[idxNew].iParen
cc00: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
cc10: 20 7d 0a 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43   }.    pTerm->nC
cc20: 68 69 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a 23 65  hild = 2;.  }.#e
cc30: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
cc40: 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49  MIT_BETWEEN_OPTI
cc50: 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66  MIZATION */..#if
cc60: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
cc70: 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
cc80: 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e  ATION) && !defin
cc90: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
cca0: 55 42 51 55 45 52 59 29 0a 20 20 2f 2a 20 41 6e  UBQUERY).  /* An
ccb0: 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61  alyze a term tha
ccc0: 74 20 69 73 20 63 6f 6d 70 6f 73 65 64 20 6f 66  t is composed of
ccd0: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62   two or more sub
cce0: 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20  terms connected 
ccf0: 62 79 0a 20 20 2a 2a 20 61 6e 20 4f 52 20 6f 70  by.  ** an OR op
cd00: 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65  erator..  */.  e
cd10: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  lse if( pExpr->o
cd20: 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20  p==TK_OR ){.    
cd30: 61 73 73 65 72 74 28 20 70 57 43 2d 3e 6f 70 3d  assert( pWC->op=
cd40: 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 65  =TK_AND );.    e
cd50: 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d  xprAnalyzeOrTerm
cd60: 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 54  (pSrc, pWC, idxT
cd70: 65 72 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d 20  erm);.    pTerm 
cd80: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
cd90: 6d 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  m];.  }.#endif /
cda0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52  * SQLITE_OMIT_OR
cdb0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
cdc0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
cdd0: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
cde0: 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41 64 64  IZATION.  /* Add
cdf0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
ce00: 72 65 64 75 63 65 20 74 68 65 20 73 65 61 72 63  reduce the searc
ce10: 68 20 73 70 61 63 65 20 6f 6e 20 61 20 4c 49 4b  h space on a LIK
ce20: 45 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f  E or GLOB.  ** o
ce30: 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20  perator..  **.  
ce40: 2a 2a 20 41 20 6c 69 6b 65 20 70 61 74 74 65 72  ** A like patter
ce50: 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78  n of the form "x
ce60: 20 4c 49 4b 45 20 27 61 62 63 25 27 22 20 69 73   LIKE 'abc%'" is
ce70: 20 63 68 61 6e 67 65 64 20 69 6e 74 6f 20 63 6f   changed into co
ce80: 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 0a 20  nstraints.  **. 
ce90: 20 2a 2a 20 20 20 20 20 20 20 20 20 20 78 3e 3d   **          x>=
cea0: 27 61 62 63 27 20 41 4e 44 20 78 3c 27 61 62 64  'abc' AND x<'abd
ceb0: 27 20 41 4e 44 20 78 20 4c 49 4b 45 20 27 61 62  ' AND x LIKE 'ab
cec0: 63 25 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  c%'.  **.  ** Th
ced0: 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72  e last character
cee0: 20 6f 66 20 74 68 65 20 70 72 65 66 69 78 20 22   of the prefix "
cef0: 61 62 63 22 20 69 73 20 69 6e 63 72 65 6d 65 6e  abc" is incremen
cf00: 74 65 64 20 74 6f 20 66 6f 72 6d 20 74 68 65 0a  ted to form the.
cf10: 20 20 2a 2a 20 74 65 72 6d 69 6e 61 74 69 6f 6e    ** termination
cf20: 20 63 6f 6e 64 69 74 69 6f 6e 20 22 61 62 64 22   condition "abd"
cf30: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 43  ..  */.  if( pWC
cf40: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 0a 20 20  ->op==TK_AND .  
cf50: 20 26 26 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62   && isLikeOrGlob
cf60: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
cf70: 26 70 53 74 72 31 2c 20 26 69 73 43 6f 6d 70 6c  &pStr1, &isCompl
cf80: 65 74 65 2c 20 26 6e 6f 43 61 73 65 29 0a 20 20  ete, &noCase).  
cf90: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65  ){.    Expr *pLe
cfa0: 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 48 53  ft;       /* LHS
cfb0: 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70   of LIKE/GLOB op
cfc0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78  erator */.    Ex
cfd0: 70 72 20 2a 70 53 74 72 32 3b 20 20 20 20 20 20  pr *pStr2;      
cfe0: 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 53 74 72   /* Copy of pStr
cff0: 31 20 2d 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f  1 - RHS of LIKE/
d000: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f  GLOB operator */
d010: 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45  .    Expr *pNewE
d020: 78 70 72 31 3b 0a 20 20 20 20 45 78 70 72 20 2a  xpr1;.    Expr *
d030: 70 4e 65 77 45 78 70 72 32 3b 0a 20 20 20 20 69  pNewExpr2;.    i
d040: 6e 74 20 69 64 78 4e 65 77 31 3b 0a 20 20 20 20  nt idxNew1;.    
d050: 69 6e 74 20 69 64 78 4e 65 77 32 3b 0a 20 20 20  int idxNew2;.   
d060: 20 54 6f 6b 65 6e 20 73 43 6f 6c 6c 53 65 71 4e   Token sCollSeqN
d070: 61 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame;  /* Name of
d080: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
d090: 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 70 4c 65 66  nce */..    pLef
d0a0: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
d0b0: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
d0c0: 20 20 20 20 70 53 74 72 32 20 3d 20 73 71 6c 69      pStr2 = sqli
d0d0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
d0e0: 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 69 66  Str1, 0);.    if
d0f0: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
d100: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 75 38 20  led ){.      u8 
d110: 63 2c 20 2a 70 43 3b 20 20 20 20 20 20 20 2f 2a  c, *pC;       /*
d120: 20 4c 61 73 74 20 63 68 61 72 61 63 74 65 72 20   Last character 
d130: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
d140: 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 20   wildcard */.   
d150: 20 20 20 70 43 20 3d 20 28 75 38 2a 29 26 70 53     pC = (u8*)&pS
d160: 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 73 71  tr2->u.zToken[sq
d170: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 53  lite3Strlen30(pS
d180: 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2d 31  tr2->u.zToken)-1
d190: 5d 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 70 43  ];.      c = *pC
d1a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61  ;.      if( noCa
d1b0: 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  se ){.        /*
d1c0: 20 54 68 65 20 70 6f 69 6e 74 20 69 73 20 74 6f   The point is to
d1d0: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6c   increment the l
d1e0: 61 73 74 20 63 68 61 72 61 63 74 65 72 20 62 65  ast character be
d1f0: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a 20  fore the first. 
d200: 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 64 63 61         ** wildca
d210: 72 64 2e 20 20 42 75 74 20 69 66 20 77 65 20 69  rd.  But if we i
d220: 6e 63 72 65 6d 65 6e 74 20 27 40 27 2c 20 74 68  ncrement '@', th
d230: 61 74 20 77 69 6c 6c 20 70 75 73 68 20 69 74 20  at will push it 
d240: 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  into the.       
d250: 20 2a 2a 20 61 6c 70 68 61 62 65 74 69 63 20 72   ** alphabetic r
d260: 61 6e 67 65 20 77 68 65 72 65 20 63 61 73 65 20  ange where case 
d270: 63 6f 6e 76 65 72 73 69 6f 6e 73 20 77 69 6c 6c  conversions will
d280: 20 6d 65 73 73 20 75 70 20 74 68 65 20 0a 20 20   mess up the .  
d290: 20 20 20 20 20 20 2a 2a 20 69 6e 65 71 75 61 6c        ** inequal
d2a0: 69 74 79 2e 20 20 54 6f 20 61 76 6f 69 64 20 74  ity.  To avoid t
d2b0: 68 69 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  his, make sure t
d2c0: 6f 20 61 6c 73 6f 20 72 75 6e 20 74 68 65 20 66  o also run the f
d2d0: 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 4c  ull.        ** L
d2e0: 49 4b 45 20 6f 6e 20 61 6c 6c 20 63 61 6e 64 69  IKE on all candi
d2f0: 64 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73  date expressions
d300: 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68 65   by clearing the
d310: 20 69 73 43 6f 6d 70 6c 65 74 65 20 66 6c 61 67   isComplete flag
d320: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
d330: 20 20 20 20 69 66 28 20 63 3d 3d 27 41 27 2d 31      if( c=='A'-1
d340: 20 29 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20   ) isComplete = 
d350: 30 3b 20 20 20 2f 2a 20 45 56 3a 20 52 2d 36 34  0;   /* EV: R-64
d360: 33 33 39 2d 30 38 32 30 37 20 2a 2f 0a 0a 0a 20  339-08207 */... 
d370: 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74         c = sqlit
d380: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63  e3UpperToLower[c
d390: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
d3a0: 20 2a 70 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20   *pC = c + 1;.  
d3b0: 20 20 7d 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71    }.    sCollSeq
d3c0: 4e 61 6d 65 2e 7a 20 3d 20 6e 6f 43 61 73 65 20  Name.z = noCase 
d3d0: 3f 20 22 4e 4f 43 41 53 45 22 20 3a 20 22 42 49  ? "NOCASE" : "BI
d3e0: 4e 41 52 59 22 3b 0a 20 20 20 20 73 43 6f 6c 6c  NARY";.    sColl
d3f0: 53 65 71 4e 61 6d 65 2e 6e 20 3d 20 36 3b 0a 20  SeqName.n = 6;. 
d400: 20 20 20 70 4e 65 77 45 78 70 72 31 20 3d 20 73     pNewExpr1 = s
d410: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
d420: 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20  , pLeft, 0);.   
d430: 20 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c   pNewExpr1 = sql
d440: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
d450: 2c 20 54 4b 5f 47 45 2c 20 0a 20 20 20 20 20 20  , TK_GE, .      
d460: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
d470: 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28  AddCollateToken(
d480: 70 50 61 72 73 65 2c 70 4e 65 77 45 78 70 72 31  pParse,pNewExpr1
d490: 2c 26 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c  ,&sCollSeqName),
d4a0: 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 74 72  .           pStr
d4b0: 31 2c 20 30 29 3b 0a 20 20 20 20 69 64 78 4e 65  1, 0);.    idxNe
d4c0: 77 31 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  w1 = whereClause
d4d0: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
d4e0: 45 78 70 72 31 2c 20 54 45 52 4d 5f 56 49 52 54  Expr1, TERM_VIRT
d4f0: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
d500: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
d510: 20 69 64 78 4e 65 77 31 3d 3d 30 20 29 3b 0a 20   idxNew1==0 );. 
d520: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70     exprAnalyze(p
d530: 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77  Src, pWC, idxNew
d540: 31 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72  1);.    pNewExpr
d550: 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  2 = sqlite3ExprD
d560: 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29  up(db, pLeft, 0)
d570: 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32 20  ;.    pNewExpr2 
d580: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
d590: 50 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 0a 20 20  Parse, TK_LT,.  
d5a0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d5b0: 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f  ExprAddCollateTo
d5c0: 6b 65 6e 28 70 50 61 72 73 65 2c 70 4e 65 77 45  ken(pParse,pNewE
d5d0: 78 70 72 32 2c 26 73 43 6f 6c 6c 53 65 71 4e 61  xpr2,&sCollSeqNa
d5e0: 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  me),.           
d5f0: 70 53 74 72 32 2c 20 30 29 3b 0a 20 20 20 20 69  pStr2, 0);.    i
d600: 64 78 4e 65 77 32 20 3d 20 77 68 65 72 65 43 6c  dxNew2 = whereCl
d610: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
d620: 70 4e 65 77 45 78 70 72 32 2c 20 54 45 52 4d 5f  pNewExpr2, TERM_
d630: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
d640: 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73 74 63  AMIC);.    testc
d650: 61 73 65 28 20 69 64 78 4e 65 77 32 3d 3d 30 20  ase( idxNew2==0 
d660: 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79  );.    exprAnaly
d670: 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  ze(pSrc, pWC, id
d680: 78 4e 65 77 32 29 3b 0a 20 20 20 20 70 54 65 72  xNew2);.    pTer
d690: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
d6a0: 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20 69 73  erm];.    if( is
d6b0: 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20  Complete ){.    
d6c0: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31    pWC->a[idxNew1
d6d0: 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ].iParent = idxT
d6e0: 65 72 6d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e  erm;.      pWC->
d6f0: 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61 72 65  a[idxNew2].iPare
d700: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
d710: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
d720: 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 2;.    }.  }
d730: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
d740: 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49  E_OMIT_LIKE_OPTI
d750: 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66  MIZATION */..#if
d760: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d770: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
d780: 2f 2a 20 41 64 64 20 61 20 57 4f 5f 4d 41 54 43  /* Add a WO_MATC
d790: 48 20 61 75 78 69 6c 69 61 72 79 20 74 65 72 6d  H auxiliary term
d7a0: 20 74 6f 20 74 68 65 20 63 6f 6e 73 74 72 61 69   to the constrai
d7b0: 6e 74 20 73 65 74 20 69 66 20 74 68 65 0a 20 20  nt set if the.  
d7c0: 2a 2a 20 63 75 72 72 65 6e 74 20 65 78 70 72 65  ** current expre
d7d0: 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ssion is of the 
d7e0: 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41  form:  column MA
d7f0: 54 43 48 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54  TCH expr..  ** T
d800: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
d810: 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 78  is used by the x
d820: 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64  BestIndex method
d830: 73 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74 75 61  s of.  ** virtua
d840: 6c 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20 6e  l tables.  The n
d850: 61 74 69 76 65 20 71 75 65 72 79 20 6f 70 74 69  ative query opti
d860: 6d 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20 61  mizer does not a
d870: 74 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64  ttempt.  ** to d
d880: 6f 20 61 6e 79 74 68 69 6e 67 20 77 69 74 68 20  o anything with 
d890: 4d 41 54 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e  MATCH functions.
d8a0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61  .  */.  if( isMa
d8b0: 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70  tchOfColumn(pExp
d8c0: 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64  r) ){.    int id
d8d0: 78 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 20 2a  xNew;.    Expr *
d8e0: 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a  pRight, *pLeft;.
d8f0: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
d900: 4e 65 77 54 65 72 6d 3b 0a 20 20 20 20 42 69 74  NewTerm;.    Bit
d910: 6d 61 73 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d  mask prereqColum
d920: 6e 2c 20 70 72 65 72 65 71 45 78 70 72 3b 0a 0a  n, prereqExpr;..
d930: 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78      pRight = pEx
d940: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30  pr->x.pList->a[0
d950: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 4c 65  ].pExpr;.    pLe
d960: 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ft = pExpr->x.pL
d970: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
d980: 0a 20 20 20 20 70 72 65 72 65 71 45 78 70 72 20  .    prereqExpr 
d990: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
d9a0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 69 67 68  (pMaskSet, pRigh
d9b0: 74 29 3b 0a 20 20 20 20 70 72 65 72 65 71 43 6f  t);.    prereqCo
d9c0: 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61 62 6c 65  lumn = exprTable
d9d0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
d9e0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20  pLeft);.    if( 
d9f0: 28 70 72 65 72 65 71 45 78 70 72 20 26 20 70 72  (prereqExpr & pr
da00: 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29  ereqColumn)==0 )
da10: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  {.      Expr *pN
da20: 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e  ewExpr;.      pN
da30: 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ewExpr = sqlite3
da40: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
da50: 5f 4d 41 54 43 48 2c 20 0a 20 20 20 20 20 20 20  _MATCH, .       
da60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da70: 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74 65         0, sqlite
da80: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 52 69  3ExprDup(db, pRi
da90: 67 68 74 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20  ght, 0), 0);.   
daa0: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
dab0: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
dac0: 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52  C, pNewExpr, TER
dad0: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
dae0: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74  YNAMIC);.      t
daf0: 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d  estcase( idxNew=
db00: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  =0 );.      pNew
db10: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
db20: 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e  dxNew];.      pN
db30: 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  ewTerm->prereqRi
db40: 67 68 74 20 3d 20 70 72 65 72 65 71 45 78 70 72  ght = prereqExpr
db50: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
db60: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70  ->leftCursor = p
db70: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Left->iTable;.  
db80: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e      pNewTerm->u.
db90: 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65  leftColumn = pLe
dba0: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ft->iColumn;.   
dbb0: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70     pNewTerm->eOp
dbc0: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d 41 54 43  erator = WO_MATC
dbd0: 48 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  H;.      pNewTer
dbe0: 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  m->iParent = idx
dbf0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72  Term;.      pTer
dc00: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
dc10: 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65 72  erm];.      pTer
dc20: 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20  m->nChild = 1;. 
dc30: 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
dc40: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49  ags |= TERM_COPI
dc50: 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  ED;.      pNewTe
dc60: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20  rm->prereqAll = 
dc70: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
dc80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
dc90: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
dca0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
dcb0: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
dcc0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20 20  _ENABLE_STAT3.  
dcd0: 2f 2a 20 57 68 65 6e 20 73 71 6c 69 74 65 5f 73  /* When sqlite_s
dce0: 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64  tat3 histogram d
dcf0: 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ata is available
dd00: 20 61 6e 20 6f 70 65 72 61 74 6f 72 20 6f 66 20   an operator of 
dd10: 74 68 65 0a 20 20 2a 2a 20 66 6f 72 6d 20 22 78  the.  ** form "x
dd20: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 63 61   IS NOT NULL" ca
dd30: 6e 20 73 6f 6d 65 74 69 6d 65 73 20 62 65 20 65  n sometimes be e
dd40: 76 61 6c 75 61 74 65 64 20 6d 6f 72 65 20 65 66  valuated more ef
dd50: 66 69 63 69 65 6e 74 6c 79 0a 20 20 2a 2a 20 61  ficiently.  ** a
dd60: 73 20 22 78 3e 4e 55 4c 4c 22 20 69 66 20 78 20  s "x>NULL" if x 
dd70: 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45  is not an INTEGE
dd80: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20  R PRIMARY KEY.  
dd90: 53 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 0a 20  So construct a. 
dda0: 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 65 72 6d   ** virtual term
ddb0: 20 6f 66 20 74 68 61 74 20 66 6f 72 6d 2e 0a 20   of that form.. 
ddc0: 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68   **.  ** Note th
ddd0: 61 74 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  at the virtual t
dde0: 65 72 6d 20 6d 75 73 74 20 62 65 20 74 61 67 67  erm must be tagg
ddf0: 65 64 20 77 69 74 68 20 54 45 52 4d 5f 56 4e 55  ed with TERM_VNU
de00: 4c 4c 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 54  LL.  This.  ** T
de10: 45 52 4d 5f 56 4e 55 4c 4c 20 74 61 67 20 77 69  ERM_VNULL tag wi
de20: 6c 6c 20 73 75 70 70 72 65 73 73 20 74 68 65 20  ll suppress the 
de30: 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61  not-null check a
de40: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a  t the beginning.
de50: 20 20 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 70    ** of the loop
de60: 2e 20 20 57 69 74 68 6f 75 74 20 74 68 65 20 54  .  Without the T
de70: 45 52 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c 20  ERM_VNULL flag, 
de80: 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65  the not-null che
de90: 63 6b 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 73  ck at.  ** the s
dea0: 74 61 72 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70  tart of the loop
deb0: 20 77 69 6c 6c 20 70 72 65 76 65 6e 74 20 61 6e   will prevent an
dec0: 79 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 62  y results from b
ded0: 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0a 20  eing returned.. 
dee0: 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d   */.  if( pExpr-
def0: 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a  >op==TK_NOTNULL.
df00: 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65     && pExpr->pLe
df10: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  ft->op==TK_COLUM
df20: 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70  N.   && pExpr->p
df30: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30  Left->iColumn>=0
df40: 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  .  ){.    Expr *
df50: 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 45 78  pNewExpr;.    Ex
df60: 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
df70: 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 69 6e  r->pLeft;.    in
df80: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 57 68  t idxNew;.    Wh
df90: 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 54 65 72  ereTerm *pNewTer
dfa0: 6d 3b 0a 0a 20 20 20 20 70 4e 65 77 45 78 70 72  m;..    pNewExpr
dfb0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
dfc0: 70 50 61 72 73 65 2c 20 54 4b 5f 47 54 2c 0a 20  pParse, TK_GT,. 
dfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfe0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
dff0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c  e3ExprDup(db, pL
e000: 65 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20  eft, 0),.       
e010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e020: 20 20 20 20 20 73 71 6c 69 74 65 33 50 45 78 70       sqlite3PExp
e030: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e 55 4c  r(pParse, TK_NUL
e040: 4c 2c 20 30 2c 20 30 2c 20 30 29 2c 20 30 29 3b  L, 0, 0, 0), 0);
e050: 0a 0a 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77  ..    idxNew = w
e060: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
e070: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 0a  (pWC, pNewExpr,.
e080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 45                TE
e0a0: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
e0b0: 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 56 4e 55  DYNAMIC|TERM_VNU
e0c0: 4c 4c 29 3b 0a 20 20 20 20 69 66 28 20 69 64 78  LL);.    if( idx
e0d0: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  New ){.      pNe
e0e0: 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  wTerm = &pWC->a[
e0f0: 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70  idxNew];.      p
e100: 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  NewTerm->prereqR
e110: 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  ight = 0;.      
e120: 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75  pNewTerm->leftCu
e130: 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54  rsor = pLeft->iT
e140: 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77  able;.      pNew
e150: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
e160: 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c  mn = pLeft->iCol
e170: 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  umn;.      pNewT
e180: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
e190: 20 57 4f 5f 47 54 3b 0a 20 20 20 20 20 20 70 4e   WO_GT;.      pN
e1a0: 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20  ewTerm->iParent 
e1b0: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
e1c0: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
e1d0: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20  [idxTerm];.     
e1e0: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
e1f0: 20 31 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d   1;.      pTerm-
e200: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
e210: 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 70  _COPIED;.      p
e220: 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  NewTerm->prereqA
e230: 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72  ll = pTerm->prer
e240: 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d  eqAll;.    }.  }
e250: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
e260: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 20 2a 2f  E_ENABLE_STAT */
e270: 0a 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 4f  ..  /* Prevent O
e280: 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f  N clause terms o
e290: 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 66 72  f a LEFT JOIN fr
e2a0: 6f 6d 20 62 65 69 6e 67 20 75 73 65 64 20 74 6f  om being used to
e2b0: 20 64 72 69 76 65 0a 20 20 2a 2a 20 61 6e 20 69   drive.  ** an i
e2c0: 6e 64 65 78 20 66 6f 72 20 74 61 62 6c 65 73 20  ndex for tables 
e2d0: 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74  to the left of t
e2e0: 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20  he join..  */.  
e2f0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
e300: 68 74 20 7c 3d 20 65 78 74 72 61 52 69 67 68 74  ht |= extraRight
e310: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
e320: 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63 68 65  function searche
e330: 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  s the expression
e340: 20 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20   list passed as 
e350: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
e360: 65 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 20 65 78  ent.** for an ex
e370: 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 79 70 65  pression of type
e380: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 74 68 61 74 20   TK_COLUMN that 
e390: 72 65 66 65 72 73 20 74 6f 20 74 68 65 20 73 61  refers to the sa
e3a0: 6d 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 0a 2a 2a  me column and.**
e3b0: 20 75 73 65 73 20 74 68 65 20 73 61 6d 65 20 63   uses the same c
e3c0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
e3d0: 65 20 61 73 20 74 68 65 20 69 43 6f 6c 27 74 68  e as the iCol'th
e3e0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   column of index
e3f0: 20 70 49 64 78 2e 0a 2a 2a 20 41 72 67 75 6d 65   pIdx..** Argume
e400: 6e 74 20 69 42 61 73 65 20 69 73 20 74 68 65 20  nt iBase is the 
e410: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 75 73  cursor number us
e420: 65 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ed for the table
e430: 20 74 68 61 74 20 70 49 64 78 20 72 65 66 65 72   that pIdx refer
e440: 73 0a 2a 2a 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 49  s.** to..**.** I
e450: 66 20 73 75 63 68 20 61 6e 20 65 78 70 72 65 73  f such an expres
e460: 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 69  sion is found, i
e470: 74 73 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73  ts index in pLis
e480: 74 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75 72 6e  t->a[] is return
e490: 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 78 70  ed. If.** no exp
e4a0: 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64  ression is found
e4b0: 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64  , -1 is returned
e4c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e4d0: 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a 20 20  findIndexCol(.  
e4e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
e4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e500: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
e510: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
e520: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  pList,          
e530: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
e540: 69 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65 61 72  ion list to sear
e550: 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73  ch */.  int iBas
e560: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
e570: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
e580: 72 20 66 6f 72 20 74 61 62 6c 65 20 61 73 73 6f  r for table asso
e590: 63 69 61 74 65 64 20 77 69 74 68 20 70 49 64 78  ciated with pIdx
e5a0: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
e5b0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
e5c0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
e5d0: 6f 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 6f  o match column o
e5e0: 66 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20  f */.  int iCol 
e5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e600: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
e610: 20 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d 61 74   of index to mat
e620: 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ch */.){.  int i
e630: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
e640: 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a  zColl = pIdx->az
e650: 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66  Coll[iCol];..  f
e660: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
e670: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
e680: 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
e690: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
e6a0: 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  te(pList->a[i].p
e6b0: 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Expr);.    if( p
e6c0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
e6d0: 20 20 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75       && p->iColu
e6e0: 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75  mn==pIdx->aiColu
e6f0: 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26 26  mn[iCol].     &&
e700: 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73   p->iTable==iBas
e710: 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 43  e.    ){.      C
e720: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
e730: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
e740: 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  eq(pParse, pList
e750: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
e760: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
e770: 70 43 6f 6c 6c 29 20 26 26 20 30 3d 3d 73 71 6c  pColl) && 0==sql
e780: 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
e790: 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29  l->zName, zColl)
e7a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
e7b0: 72 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn i;.      }.  
e7c0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
e7d0: 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n -1;.}../*.** T
e7e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 65 74 65  his routine dete
e7f0: 72 6d 69 6e 65 73 20 69 66 20 70 49 64 78 20 63  rmines if pIdx c
e800: 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 73  an be used to as
e810: 73 69 73 74 20 69 6e 20 70 72 6f 63 65 73 73 69  sist in processi
e820: 6e 67 20 61 0a 2a 2a 20 44 49 53 54 49 4e 43 54  ng a.** DISTINCT
e830: 20 71 75 61 6c 69 66 69 65 72 2e 20 49 6e 20 6f   qualifier. In o
e840: 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74 20 74  ther words, it t
e850: 65 73 74 73 20 77 68 65 74 68 65 72 20 6f 72 20  ests whether or 
e860: 6e 6f 74 20 75 73 69 6e 67 20 74 68 69 73 0a 2a  not using this.*
e870: 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20  * index for the 
e880: 6f 75 74 65 72 20 6c 6f 6f 70 20 67 75 61 72 61  outer loop guara
e890: 6e 74 65 65 73 20 74 68 61 74 20 72 6f 77 73 20  ntees that rows 
e8a0: 77 69 74 68 20 65 71 75 61 6c 20 76 61 6c 75 65  with equal value
e8b0: 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 65 78 70  s for.** all exp
e8c0: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
e8d0: 70 44 69 73 74 69 6e 63 74 20 6c 69 73 74 20 61  pDistinct list a
e8e0: 72 65 20 64 65 6c 69 76 65 72 65 64 20 67 72 6f  re delivered gro
e8f0: 75 70 65 64 20 74 6f 67 65 74 68 65 72 2e 0a 2a  uped together..*
e900: 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
e910: 2c 20 74 68 65 20 71 75 65 72 79 20 0a 2a 2a 0a  , the query .**.
e920: 2a 2a 20 20 20 53 45 4c 45 43 54 20 44 49 53 54  **   SELECT DIST
e930: 49 4e 43 54 20 61 2c 20 62 2c 20 63 20 46 52 4f  INCT a, b, c FRO
e940: 4d 20 74 62 6c 20 57 48 45 52 45 20 61 20 3d 20  M tbl WHERE a = 
e950: 3f 0a 2a 2a 0a 2a 2a 20 63 61 6e 20 62 65 6e 65  ?.**.** can bene
e960: 66 69 74 20 66 72 6f 6d 20 61 6e 79 20 69 6e 64  fit from any ind
e970: 65 78 20 6f 6e 20 63 6f 6c 75 6d 6e 73 20 22 62  ex on columns "b
e980: 22 20 61 6e 64 20 22 63 22 2e 0a 2a 2f 0a 73 74  " and "c"..*/.st
e990: 61 74 69 63 20 69 6e 74 20 69 73 44 69 73 74 69  atic int isDisti
e9a0: 6e 63 74 49 6e 64 65 78 28 0a 20 20 50 61 72 73  nctIndex(.  Pars
e9b0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
e9c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
e9d0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
e9e0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
e9f0: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20  *pWC,           
ea00: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
ea10: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 49 6e 64   clause */.  Ind
ea20: 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20  ex *pIdx,       
ea30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ea40: 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20  The index being 
ea50: 63 6f 6e 73 69 64 65 72 65 64 20 2a 2f 0a 20 20  considered */.  
ea60: 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20 20  int base,       
ea70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea80: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
ea90: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 70   for the table p
eaa0: 49 64 78 20 69 73 20 6f 6e 20 2a 2f 0a 20 20 45  Idx is on */.  E
eab0: 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e  xprList *pDistin
eac0: 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ct,            /
ead0: 2a 20 54 68 65 20 44 49 53 54 49 4e 43 54 20 65  * The DISTINCT e
eae0: 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 20 20  xpressions */.  
eaf0: 69 6e 74 20 6e 45 71 43 6f 6c 20 20 20 20 20 20  int nEqCol      
eb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb10: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64  /* Number of ind
eb20: 65 78 20 63 6f 6c 75 6d 6e 73 20 77 69 74 68 20  ex columns with 
eb30: 3d 3d 20 2a 2f 0a 29 7b 0a 20 20 42 69 74 6d 61  == */.){.  Bitma
eb40: 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 20 20 20 20  sk mask = 0;    
eb50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
eb60: 73 6b 20 6f 66 20 75 6e 61 63 63 6f 75 6e 74 65  sk of unaccounte
eb70: 64 20 66 6f 72 20 70 44 69 73 74 69 6e 63 74 20  d for pDistinct 
eb80: 65 78 70 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  exprs */.  int i
eb90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
eba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
ebb0: 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
ebc0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44  */..  assert( pD
ebd0: 69 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a 20 20  istinct!=0 );.  
ebe0: 69 66 28 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 3d  if( pIdx->zName=
ebf0: 3d 30 20 7c 7c 20 70 44 69 73 74 69 6e 63 74 2d  =0 || pDistinct-
ec00: 3e 6e 45 78 70 72 3e 3d 42 4d 53 20 29 20 72 65  >nExpr>=BMS ) re
ec10: 74 75 72 6e 20 30 3b 0a 20 20 74 65 73 74 63 61  turn 0;.  testca
ec20: 73 65 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 6e  se( pDistinct->n
ec30: 45 78 70 72 3d 3d 42 4d 53 2d 31 20 29 3b 0a 0a  Expr==BMS-1 );..
ec40: 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
ec50: 68 20 61 6c 6c 20 74 68 65 20 65 78 70 72 65 73  h all the expres
ec60: 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 64 69 73  sions in the dis
ec70: 74 69 6e 63 74 20 6c 69 73 74 2e 20 49 66 20 61  tinct list. If a
ec80: 6e 79 20 6f 66 20 74 68 65 6d 0a 20 20 2a 2a 20  ny of them.  ** 
ec90: 61 72 65 20 6e 6f 74 20 73 69 6d 70 6c 65 20 63  are not simple c
eca0: 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 73  olumn references
ecb0: 2c 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20  , return early. 
ecc0: 4f 74 68 65 72 77 69 73 65 2c 20 74 65 73 74 20  Otherwise, test 
ecd0: 69 66 20 74 68 65 0a 20 20 2a 2a 20 57 48 45 52  if the.  ** WHER
ece0: 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  E clause contain
ecf0: 73 20 61 20 22 63 6f 6c 3d 58 22 20 63 6c 61 75  s a "col=X" clau
ed00: 73 65 2e 20 49 66 20 69 74 20 64 6f 65 73 2c 20  se. If it does, 
ed10: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  the expression. 
ed20: 20 2a 2a 20 63 61 6e 20 62 65 20 69 67 6e 6f 72   ** can be ignor
ed30: 65 64 2e 20 49 66 20 69 74 20 64 6f 65 73 20 6e  ed. If it does n
ed40: 6f 74 2c 20 61 6e 64 20 74 68 65 20 63 6f 6c 75  ot, and the colu
ed50: 6d 6e 20 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f  mn does not belo
ed60: 6e 67 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73  ng to the.  ** s
ed70: 61 6d 65 20 74 61 62 6c 65 20 61 73 20 69 6e 64  ame table as ind
ed80: 65 78 20 70 49 64 78 2c 20 72 65 74 75 72 6e 20  ex pIdx, return 
ed90: 65 61 72 6c 79 2e 20 46 69 6e 61 6c 6c 79 2c 20  early. Finally, 
eda0: 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 0a 20  if there is no. 
edb0: 20 2a 2a 20 6d 61 74 63 68 69 6e 67 20 22 63 6f   ** matching "co
edc0: 6c 3d 58 22 20 65 78 70 72 65 73 73 69 6f 6e 20  l=X" expression 
edd0: 61 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  and the column i
ede0: 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61  s on the same ta
edf0: 62 6c 65 20 61 73 20 70 49 64 78 2c 0a 20 20 2a  ble as pIdx,.  *
ee00: 2a 20 73 65 74 20 74 68 65 20 63 6f 72 72 65 73  * set the corres
ee10: 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 76  ponding bit in v
ee20: 61 72 69 61 62 6c 65 20 6d 61 73 6b 2e 0a 20 20  ariable mask..  
ee30: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
ee40: 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72  pDistinct->nExpr
ee50: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72  ; i++){.    Wher
ee60: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
ee70: 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
ee80: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
ee90: 74 65 28 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b  te(pDistinct->a[
eea0: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  i].pExpr);.    i
eeb0: 66 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  f( p->op!=TK_COL
eec0: 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  UMN ) return 0;.
eed0: 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64      pTerm = find
eee0: 54 65 72 6d 28 70 57 43 2c 20 70 2d 3e 69 54 61  Term(pWC, p->iTa
eef0: 62 6c 65 2c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 2c  ble, p->iColumn,
ef00: 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f   ~(Bitmask)0, WO
ef10: 5f 45 51 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  _EQ, 0);.    if(
ef20: 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20   pTerm ){.      
ef30: 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
ef40: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 43  ->pExpr;.      C
ef50: 6f 6c 6c 53 65 71 20 2a 70 31 20 3d 20 73 71 6c  ollSeq *p1 = sql
ef60: 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
ef70: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
ef80: 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e   pX->pLeft, pX->
ef90: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 43  pRight);.      C
efa0: 6f 6c 6c 53 65 71 20 2a 70 32 20 3d 20 73 71 6c  ollSeq *p2 = sql
efb0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
efc0: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
efd0: 20 20 69 66 28 20 70 31 3d 3d 70 32 20 29 20 63    if( p1==p2 ) c
efe0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
eff0: 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 6c 65     if( p->iTable
f000: 21 3d 62 61 73 65 20 29 20 72 65 74 75 72 6e 20  !=base ) return 
f010: 30 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 28  0;.    mask |= (
f020: 28 28 42 69 74 6d 61 73 6b 29 31 29 20 3c 3c 20  ((Bitmask)1) << 
f030: 69 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69  i);.  }..  for(i
f040: 3d 6e 45 71 43 6f 6c 3b 20 6d 61 73 6b 20 26 26  =nEqCol; mask &&
f050: 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   i<pIdx->nColumn
f060: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
f070: 69 45 78 70 72 20 3d 20 66 69 6e 64 49 6e 64 65  iExpr = findInde
f080: 78 43 6f 6c 28 70 50 61 72 73 65 2c 20 70 44 69  xCol(pParse, pDi
f090: 73 74 69 6e 63 74 2c 20 62 61 73 65 2c 20 70 49  stinct, base, pI
f0a0: 64 78 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20  dx, i);.    if( 
f0b0: 69 45 78 70 72 3c 30 20 29 20 62 72 65 61 6b 3b  iExpr<0 ) break;
f0c0: 0a 20 20 20 20 6d 61 73 6b 20 26 3d 20 7e 28 28  .    mask &= ~((
f0d0: 28 42 69 74 6d 61 73 6b 29 31 29 20 3c 3c 20 69  (Bitmask)1) << i
f0e0: 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  Expr);.  }..  re
f0f0: 74 75 72 6e 20 28 6d 61 73 6b 3d 3d 30 29 3b 0a  turn (mask==0);.
f100: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  }.../*.** Return
f110: 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49 53   true if the DIS
f120: 54 49 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e  TINCT expression
f130: 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20  -list passed as 
f140: 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  the third argume
f150: 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64 61  nt.** is redunda
f160: 6e 74 2e 20 41 20 44 49 53 54 49 4e 43 54 20 6c  nt. A DISTINCT l
f170: 69 73 74 20 69 73 20 72 65 64 75 6e 64 61 6e 74  ist is redundant
f180: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
f190: 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 55   contains a.** U
f1a0: 4e 49 51 55 45 20 69 6e 64 65 78 20 74 68 61 74  NIQUE index that
f1b0: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
f1c0: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
f1d0: 68 65 20 71 75 65 72 79 20 77 69 6c 6c 20 62 65  he query will be
f1e0: 20 64 69 73 74 69 6e 63 74 0a 2a 2a 20 61 6e 79   distinct.** any
f1f0: 77 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  way..*/.static i
f200: 6e 74 20 69 73 44 69 73 74 69 6e 63 74 52 65 64  nt isDistinctRed
f210: 75 6e 64 61 6e 74 28 0a 20 20 50 61 72 73 65 20  undant(.  Parse 
f220: 2a 70 50 61 72 73 65 2c 0a 20 20 53 72 63 4c 69  *pParse,.  SrcLi
f230: 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 0a 20 20  st *pTabList,.  
f240: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
f250: 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44  ,.  ExprList *pD
f260: 69 73 74 69 6e 63 74 0a 29 7b 0a 20 20 54 61 62  istinct.){.  Tab
f270: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65  le *pTab;.  Inde
f280: 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69  x *pIdx;.  int i
f290: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f2a0: 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e             .  in
f2b0: 74 20 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49  t iBase;..  /* I
f2c0: 66 20 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20  f there is more 
f2d0: 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f  than one table o
f2e0: 72 20 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 20  r sub-select in 
f2f0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
f300: 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 71 75 65  of.  ** this que
f310: 72 79 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c  ry, then it will
f320: 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
f330: 20 74 6f 20 73 68 6f 77 20 74 68 61 74 20 74 68   to show that th
f340: 65 20 44 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a  e DISTINCT .  **
f350: 20 63 6c 61 75 73 65 20 69 73 20 72 65 64 75 6e   clause is redun
f360: 64 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  dant. */.  if( p
f370: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31  TabList->nSrc!=1
f380: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
f390: 42 61 73 65 20 3d 20 70 54 61 62 4c 69 73 74 2d  Base = pTabList-
f3a0: 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20  >a[0].iCursor;. 
f3b0: 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   pTab = pTabList
f3c0: 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20  ->a[0].pTab;..  
f3d0: 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65  /* If any of the
f3e0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 73 20   expressions is 
f3f0: 61 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e  an IPK column on
f400: 20 74 61 62 6c 65 20 69 42 61 73 65 2c 20 74 68   table iBase, th
f410: 65 6e 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20  en return .  ** 
f420: 74 72 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20  true. Note: The 
f430: 28 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73  (p->iTable==iBas
f440: 65 29 20 70 61 72 74 20 6f 66 20 74 68 69 73 20  e) part of this 
f450: 74 65 73 74 20 6d 61 79 20 62 65 20 66 61 6c 73  test may be fals
f460: 65 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75  e if the.  ** cu
f470: 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 73 20  rrent SELECT is 
f480: 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
f490: 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66  -query..  */.  f
f4a0: 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69 73 74 69  or(i=0; i<pDisti
f4b0: 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  nct->nExpr; i++)
f4c0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
f4d0: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
f4e0: 6f 6c 6c 61 74 65 28 70 44 69 73 74 69 6e 63 74  ollate(pDistinct
f4f0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
f500: 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
f510: 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54  _COLUMN && p->iT
f520: 61 62 6c 65 3d 3d 69 42 61 73 65 20 26 26 20 70  able==iBase && p
f530: 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65  ->iColumn<0 ) re
f540: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
f550: 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  * Loop through a
f560: 6c 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68  ll indices on th
f570: 65 20 74 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e  e table, checkin
f580: 67 20 65 61 63 68 20 74 6f 20 73 65 65 20 69 66  g each to see if
f590: 20 69 74 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74   it makes.  ** t
f5a0: 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c  he DISTINCT qual
f5b0: 69 66 69 65 72 20 72 65 64 75 6e 64 61 6e 74 2e  ifier redundant.
f5c0: 20 49 74 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a   It does so if:.
f5d0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54    **.  **   1. T
f5e0: 68 65 20 69 6e 64 65 78 20 69 73 20 69 74 73 65  he index is itse
f5f0: 6c 66 20 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20  lf UNIQUE, and. 
f600: 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c   **.  **   2. Al
f610: 6c 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  l of the columns
f620: 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 61 72   in the index ar
f630: 65 20 65 69 74 68 65 72 20 70 61 72 74 20 6f 66  e either part of
f640: 20 74 68 65 20 70 44 69 73 74 69 6e 63 74 0a 20   the pDistinct. 
f650: 20 2a 2a 20 20 20 20 20 20 6c 69 73 74 2c 20 6f   **      list, o
f660: 72 20 65 6c 73 65 20 74 68 65 20 57 48 45 52 45  r else the WHERE
f670: 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
f680: 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66   a term of the f
f690: 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a  orm "col=X",.  *
f6a0: 2a 20 20 20 20 20 20 77 68 65 72 65 20 58 20 69  *      where X i
f6b0: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c  s a constant val
f6c0: 75 65 2e 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f  ue. The collatio
f6d0: 6e 20 73 65 71 75 65 6e 63 65 73 20 6f 66 20 74  n sequences of t
f6e0: 68 65 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d  he.  **      com
f6f0: 70 61 72 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65  parison and sele
f700: 63 74 2d 6c 69 73 74 20 65 78 70 72 65 73 73 69  ct-list expressi
f710: 6f 6e 73 20 6d 75 73 74 20 6d 61 74 63 68 20 74  ons must match t
f720: 68 6f 73 65 20 6f 66 20 74 68 65 20 69 6e 64 65  hose of the inde
f730: 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33  x..  **.  **   3
f740: 2e 20 41 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69  . All of those i
f750: 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72  ndex columns for
f760: 20 77 68 69 63 68 20 74 68 65 20 57 48 45 52 45   which the WHERE
f770: 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74   clause does not
f780: 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61  .  **      conta
f790: 69 6e 20 61 20 22 63 6f 6c 3d 58 22 20 74 65 72  in a "col=X" ter
f7a0: 6d 20 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f  m are subject to
f7b0: 20 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73   a NOT NULL cons
f7c0: 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66  traint..  */.  f
f7d0: 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
f7e0: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
f7f0: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
f800: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45     if( pIdx->onE
f810: 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20  rror==OE_None ) 
f820: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f  continue;.    fo
f830: 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
f840: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
f850: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
f860: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
f870: 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 66  ;.      if( 0==f
f880: 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 42 61  indTerm(pWC, iBa
f890: 73 65 2c 20 69 43 6f 6c 2c 20 7e 28 42 69 74 6d  se, iCol, ~(Bitm
f8a0: 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20 70 49  ask)0, WO_EQ, pI
f8b0: 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  dx) ){.        i
f8c0: 6e 74 20 69 49 64 78 43 6f 6c 20 3d 20 66 69 6e  nt iIdxCol = fin
f8d0: 64 49 6e 64 65 78 43 6f 6c 28 70 50 61 72 73 65  dIndexCol(pParse
f8e0: 2c 20 70 44 69 73 74 69 6e 63 74 2c 20 69 42 61  , pDistinct, iBa
f8f0: 73 65 2c 20 70 49 64 78 2c 20 69 29 3b 0a 20 20  se, pIdx, i);.  
f900: 20 20 20 20 20 20 69 66 28 20 69 49 64 78 43 6f        if( iIdxCo
f910: 6c 3c 30 20 7c 7c 20 70 54 61 62 2d 3e 61 43 6f  l<0 || pTab->aCo
f920: 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  l[pIdx->aiColumn
f930: 5b 69 5d 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20  [i]].notNull==0 
f940: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ){.          bre
f950: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
f960: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
f970: 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f  if( i==pIdx->nCo
f980: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 2f 2a  lumn ){.      /*
f990: 20 54 68 69 73 20 69 6e 64 65 78 20 69 6d 70 6c   This index impl
f9a0: 69 65 73 20 74 68 61 74 20 74 68 65 20 44 49 53  ies that the DIS
f9b0: 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20  TINCT qualifier 
f9c0: 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f  is redundant. */
f9d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
f9e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
f9f0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
fa00: 20 50 72 65 70 61 72 65 20 61 20 63 72 75 64 65   Prepare a crude
fa10: 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
fa20: 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68   logarithm of th
fa30: 65 20 69 6e 70 75 74 20 76 61 6c 75 65 2e 0a 2a  e input value..*
fa40: 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6e 65  * The results ne
fa50: 65 64 20 6e 6f 74 20 62 65 20 65 78 61 63 74 2e  ed not be exact.
fa60: 20 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 75    This is only u
fa70: 73 65 64 20 66 6f 72 20 65 73 74 69 6d 61 74 69  sed for estimati
fa80: 6e 67 0a 2a 2a 20 74 68 65 20 74 6f 74 61 6c 20  ng.** the total 
fa90: 63 6f 73 74 20 6f 66 20 70 65 72 66 6f 72 6d 69  cost of performi
faa0: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 69  ng operations wi
fab0: 74 68 20 4f 28 6c 6f 67 4e 29 20 6f 72 20 4f 28  th O(logN) or O(
fac0: 4e 6c 6f 67 4e 29 0a 2a 2a 20 63 6f 6d 70 6c 65  NlogN).** comple
fad0: 78 69 74 79 2e 20 20 42 65 63 61 75 73 65 20 4e  xity.  Because N
fae0: 20 69 73 20 6a 75 73 74 20 61 20 67 75 65 73 73   is just a guess
faf0: 2c 20 69 74 20 69 73 20 6e 6f 20 67 72 65 61 74  , it is no great
fb00: 20 74 72 61 67 65 64 79 20 69 66 0a 2a 2a 20 6c   tragedy if.** l
fb10: 6f 67 4e 20 69 73 20 61 20 6c 69 74 74 6c 65 20  ogN is a little 
fb20: 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 64  off..*/.static d
fb30: 6f 75 62 6c 65 20 65 73 74 4c 6f 67 28 64 6f 75  ouble estLog(dou
fb40: 62 6c 65 20 4e 29 7b 0a 20 20 64 6f 75 62 6c 65  ble N){.  double
fb50: 20 6c 6f 67 4e 20 3d 20 31 3b 0a 20 20 64 6f 75   logN = 1;.  dou
fb60: 62 6c 65 20 78 20 3d 20 31 30 3b 0a 20 20 77 68  ble x = 10;.  wh
fb70: 69 6c 65 28 20 4e 3e 78 20 29 7b 0a 20 20 20 20  ile( N>x ){.    
fb80: 6c 6f 67 4e 20 2b 3d 20 31 3b 0a 20 20 20 20 78  logN += 1;.    x
fb90: 20 2a 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 72 65   *= 10;.  }.  re
fba0: 74 75 72 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a 2f 2a  turn logN;.}../*
fbb0: 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65 73  .** Two routines
fbc0: 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 74 68   for printing th
fbd0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20  e content of an 
fbe0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
fbf0: 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  fo.** structure.
fc00: 20 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69    Used for testi
fc10: 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
fc20: 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74 68   only.  If neith
fc30: 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53  er.** SQLITE_TES
fc40: 54 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 42 55  T or SQLITE_DEBU
fc50: 47 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20 74  G are defined, t
fc60: 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69 6e  hen these routin
fc70: 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73  es.** are no-ops
fc80: 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  ..*/.#if !define
fc90: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
fca0: 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64  RTUALTABLE) && d
fcb0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
fcc0: 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64  BUG).static void
fcd0: 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54   TRACE_IDX_INPUT
fce0: 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  S(sqlite3_index_
fcf0: 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20  info *p){.  int 
fd00: 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  i;.  if( !sqlite
fd10: 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65  3WhereTrace ) re
fd20: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
fd30: 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
fd40: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  t; i++){.    sql
fd50: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
fd60: 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64  "  constraint[%d
fd70: 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64  ]: col=%d termid
fd80: 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c 65  =%d op=%d usable
fd90: 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d=%d\n",.       
fda0: 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  i,.       p->aCo
fdb0: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c  nstraint[i].iCol
fdc0: 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  umn,.       p->a
fdd0: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54  Constraint[i].iT
fde0: 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20 20  ermOffset,.     
fdf0: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
fe00: 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70  [i].op,.       p
fe10: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
fe20: 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20  .usable);.  }.  
fe30: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
fe40: 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
fe50: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
fe60: 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79 5b  intf("  orderby[
fe70: 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63  %d]: col=%d desc
fe80: 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69  =%d\n",.       i
fe90: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64  ,.       p->aOrd
fea0: 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c  erBy[i].iColumn,
feb0: 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65  .       p->aOrde
fec0: 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20  rBy[i].desc);.  
fed0: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
fee0: 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
fef0: 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  S(sqlite3_index_
ff00: 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20  info *p){.  int 
ff10: 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  i;.  if( !sqlite
ff20: 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65  3WhereTrace ) re
ff30: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
ff40: 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
ff50: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  t; i++){.    sql
ff60: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
ff70: 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61 72  "  usage[%d]: ar
ff80: 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64  gvIdx=%d omit=%d
ff90: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
ffa0: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
ffb0: 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67  aintUsage[i].arg
ffc0: 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 70  vIndex,.       p
ffd0: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
ffe0: 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d  ge[i].omit);.  }
fff0: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
10000 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d 3d  rintf("  idxNum=
10010 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d  %d\n", p->idxNum
10020 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
10030 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 53 74  gPrintf("  idxSt
10040 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53  r=%s\n", p->idxS
10050 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  tr);.  sqlite3De
10060 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64  bugPrintf("  ord
10070 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c  erByConsumed=%d\
10080 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f  n", p->orderByCo
10090 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74  nsumed);.  sqlit
100a0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
100b0 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d 25   estimatedCost=%
100c0 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74  g\n", p->estimat
100d0 65 64 43 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73 65  edCost);.}.#else
100e0 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49  .#define TRACE_I
100f0 44 58 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65  DX_INPUTS(A).#de
10100 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f  fine TRACE_IDX_O
10110 55 54 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66  UTPUTS(A).#endif
10120 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 71 75 69 72 65  ../* .** Require
10130 64 20 62 65 63 61 75 73 65 20 62 65 73 74 49 6e  d because bestIn
10140 64 65 78 28 29 20 69 73 20 63 61 6c 6c 65 64 20  dex() is called 
10150 62 79 20 62 65 73 74 4f 72 43 6c 61 75 73 65 49  by bestOrClauseI
10160 6e 64 65 78 28 29 20 0a 2a 2f 0a 73 74 61 74 69  ndex() .*/.stati
10170 63 20 76 6f 69 64 20 62 65 73 74 49 6e 64 65 78  c void bestIndex
10180 28 57 68 65 72 65 42 65 73 74 49 64 78 2a 29 3b  (WhereBestIdx*);
10190 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
101a0 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
101b0 20 66 69 6e 64 20 61 6e 20 73 63 61 6e 6e 69 6e   find an scannin
101c0 67 20 73 74 72 61 74 65 67 79 20 74 68 61 74 20  g strategy that 
101d0 63 61 6e 20 62 65 20 75 73 65 64 20 0a 2a 2a 20  can be used .** 
101e0 74 6f 20 6f 70 74 69 6d 69 7a 65 20 61 6e 20 27  to optimize an '
101f0 4f 52 27 20 65 78 70 72 65 73 73 69 6f 6e 20 74  OR' expression t
10200 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
10210 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 0a   WHERE clause. .
10220 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  **.** The table 
10230 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
10240 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
10250 20 70 53 72 63 20 6d 61 79 20 62 65 20 65 69 74   pSrc may be eit
10260 68 65 72 20 61 0a 2a 2a 20 72 65 67 75 6c 61 72  her a.** regular
10270 20 42 2d 54 72 65 65 20 74 61 62 6c 65 20 6f 72   B-Tree table or
10280 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
10290 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
102a0 20 62 65 73 74 4f 72 43 6c 61 75 73 65 49 6e 64   bestOrClauseInd
102b0 65 78 28 57 68 65 72 65 42 65 73 74 49 64 78 20  ex(WhereBestIdx 
102c0 2a 70 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  *p){.#ifndef SQL
102d0 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49  ITE_OMIT_OR_OPTI
102e0 4d 49 5a 41 54 49 4f 4e 0a 20 20 57 68 65 72 65  MIZATION.  Where
102f0 43 6c 61 75 73 65 20 2a 70 57 43 20 3d 20 70 2d  Clause *pWC = p-
10300 3e 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20  >pWC;           
10310 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
10320 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
10330 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
10340 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 2f 2a  rc = p->pSrc; /*
10350 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
10360 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20   term to search 
10370 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  */.  const int i
10380 43 75 72 20 3d 20 70 53 72 63 2d 3e 69 43 75 72  Cur = pSrc->iCur
10390 73 6f 72 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  sor;      /* The
103a0 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74   cursor of the t
103b0 61 62 6c 65 20 20 2a 2f 0a 20 20 63 6f 6e 73 74  able  */.  const
103c0 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 53 72 63   Bitmask maskSrc
103d0 20 3d 20 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e   = getMask(pWC->
103e0 70 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b  pMaskSet, iCur);
103f0 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 66 6f 72    /* Bitmask for
10400 20 70 53 72 63 20 2a 2f 0a 20 20 57 68 65 72 65   pSrc */.  Where
10410 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 57 43  Term * const pWC
10420 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57  End = &pWC->a[pW
10430 43 2d 3e 6e 54 65 72 6d 5d 3b 20 20 20 20 20 20  C->nTerm];      
10440 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d    /* End of pWC-
10450 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54  >a[] */.  WhereT
10460 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
10470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10480 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  * A single term 
10490 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
104a0 75 73 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  use */..  /* The
104b0 20 4f 52 2d 63 6c 61 75 73 65 20 6f 70 74 69 6d   OR-clause optim
104c0 69 7a 61 74 69 6f 6e 20 69 73 20 64 69 73 61 6c  ization is disal
104d0 6c 6f 77 65 64 20 69 66 20 74 68 65 20 49 4e 44  lowed if the IND
104e0 45 58 45 44 20 42 59 20 6f 72 0a 20 20 2a 2a 20  EXED BY or.  ** 
104f0 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75  NOT INDEXED clau
10500 73 65 73 20 61 72 65 20 75 73 65 64 20 6f 72 20  ses are used or 
10510 69 66 20 74 68 65 20 57 48 45 52 45 5f 41 4e 44  if the WHERE_AND
10520 5f 4f 4e 4c 59 20 62 69 74 20 69 73 20 73 65 74  _ONLY bit is set
10530 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d  . */.  if( pSrc-
10540 3e 6e 6f 74 49 6e 64 65 78 65 64 20 7c 7c 20 70  >notIndexed || p
10550 53 72 63 2d 3e 70 49 6e 64 65 78 21 3d 30 20 29  Src->pIndex!=0 )
10560 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
10570 7d 0a 20 20 69 66 28 20 70 57 43 2d 3e 77 63 74  }.  if( pWC->wct
10580 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
10590 41 4e 44 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20  AND_ONLY ){.    
105a0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  return;.  }..  /
105b0 2a 20 53 65 61 72 63 68 20 74 68 65 20 57 48 45  * Search the WHE
105c0 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
105d0 66 6f 72 20 61 20 75 73 61 62 6c 65 20 57 4f 5f  for a usable WO_
105e0 4f 52 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 66 6f  OR term. */.  fo
105f0 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  r(pTerm=pWC->a; 
10600 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54  pTerm<pWCEnd; pT
10610 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
10620 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
10630 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20  r & WO_OR)!=0.  
10640 20 20 20 26 26 20 28 28 70 54 65 72 6d 2d 3e 70     && ((pTerm->p
10650 72 65 72 65 71 41 6c 6c 20 26 20 7e 6d 61 73 6b  rereqAll & ~mask
10660 53 72 63 29 20 26 20 70 2d 3e 6e 6f 74 52 65 61  Src) & p->notRea
10670 64 79 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 28  dy)==0.     && (
10680 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
10690 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 6d 61  ->indexable & ma
106a0 73 6b 53 72 63 29 21 3d 30 20 0a 20 20 20 20 29  skSrc)!=0 .    )
106b0 7b 0a 20 20 20 20 20 20 57 68 65 72 65 43 6c 61  {.      WhereCla
106c0 75 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57  use * const pOrW
106d0 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f  C = &pTerm->u.pO
106e0 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20  rInfo->wc;.     
106f0 20 57 68 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e   WhereTerm * con
10700 73 74 20 70 4f 72 57 43 45 6e 64 20 3d 20 26 70  st pOrWCEnd = &p
10710 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e  OrWC->a[pOrWC->n
10720 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65  Term];.      Whe
10730 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b  reTerm *pOrTerm;
10740 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73  .      int flags
10750 20 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   = WHERE_MULTI_O
10760 52 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20  R;.      double 
10770 72 54 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20  rTotal = 0;.    
10780 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77 20 3d 20    double nRow = 
10790 30 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  0;.      Bitmask
107a0 20 75 73 65 64 20 3d 20 30 3b 0a 20 20 20 20 20   used = 0;.     
107b0 20 57 68 65 72 65 42 65 73 74 49 64 78 20 73 42   WhereBestIdx sB
107c0 4f 49 3b 0a 0a 20 20 20 20 20 20 73 42 4f 49 20  OI;..      sBOI 
107d0 3d 20 2a 70 3b 0a 20 20 20 20 20 20 73 42 4f 49  = *p;.      sBOI
107e0 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  .pOrderBy = 0;. 
107f0 20 20 20 20 20 73 42 4f 49 2e 70 44 69 73 74 69       sBOI.pDisti
10800 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  nct = 0;.      s
10810 42 4f 49 2e 70 70 49 64 78 49 6e 66 6f 20 3d 20  BOI.ppIdxInfo = 
10820 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4f 72  0;.      for(pOr
10830 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70  Term=pOrWC->a; p
10840 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b  OrTerm<pOrWCEnd;
10850 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
10860 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
10870 28 22 2e 2e 2e 20 4d 75 6c 74 69 2d 69 6e 64 65  ("... Multi-inde
10880 78 20 4f 52 20 74 65 73 74 69 6e 67 20 66 6f 72  x OR testing for
10890 20 74 65 72 6d 20 25 64 20 6f 66 20 25 64 2e 2e   term %d of %d..
108a0 2e 2e 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  ..\n", .        
108b0 20 20 28 70 4f 72 54 65 72 6d 20 2d 20 70 4f 72    (pOrTerm - pOr
108c0 57 43 2d 3e 61 29 2c 20 28 70 54 65 72 6d 20 2d  WC->a), (pTerm -
108d0 20 70 57 43 2d 3e 61 29 0a 20 20 20 20 20 20 20   pWC->a).       
108e0 20 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   ));.        if(
108f0 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72   (pOrTerm->eOper
10900 61 74 6f 72 26 20 57 4f 5f 41 4e 44 29 21 3d 30  ator& WO_AND)!=0
10910 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 42   ){.          sB
10920 4f 49 2e 70 57 43 20 3d 20 26 70 4f 72 54 65 72  OI.pWC = &pOrTer
10930 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77  m->u.pAndInfo->w
10940 63 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65 73  c;.          bes
10950 74 49 6e 64 65 78 28 26 73 42 4f 49 29 3b 0a 20  tIndex(&sBOI);. 
10960 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
10970 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
10980 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20  rsor==iCur ){.  
10990 20 20 20 20 20 20 20 20 57 68 65 72 65 43 6c 61          WhereCla
109a0 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20 20 20  use tempWC;.    
109b0 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 50 61        tempWC.pPa
109c0 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73  rse = pWC->pPars
109d0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  e;.          tem
109e0 70 57 43 2e 70 4d 61 73 6b 53 65 74 20 3d 20 70  pWC.pMaskSet = p
109f0 57 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a 20 20  WC->pMaskSet;.  
10a00 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70          tempWC.p
10a10 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20  Outer = pWC;.   
10a20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70         tempWC.op
10a30 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20   = TK_AND;.     
10a40 20 20 20 20 20 74 65 6d 70 57 43 2e 61 20 3d 20       tempWC.a = 
10a50 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  pOrTerm;.       
10a60 20 20 20 74 65 6d 70 57 43 2e 77 63 74 72 6c 46     tempWC.wctrlF
10a70 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  lags = 0;.      
10a80 20 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d      tempWC.nTerm
10a90 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
10aa0 73 42 4f 49 2e 70 57 43 20 3d 20 26 74 65 6d 70  sBOI.pWC = &temp
10ab0 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65  WC;.          be
10ac0 73 74 49 6e 64 65 78 28 26 73 42 4f 49 29 3b 0a  stIndex(&sBOI);.
10ad0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
10ae0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
10af0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
10b00 20 20 20 20 20 72 54 6f 74 61 6c 20 2b 3d 20 73       rTotal += s
10b10 42 4f 49 2e 63 6f 73 74 2e 72 43 6f 73 74 3b 0a  BOI.cost.rCost;.
10b20 20 20 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20          nRow += 
10b30 73 42 4f 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e 6e  sBOI.cost.plan.n
10b40 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 75 73 65  Row;.        use
10b50 64 20 7c 3d 20 73 42 4f 49 2e 63 6f 73 74 2e 75  d |= sBOI.cost.u
10b60 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28  sed;.        if(
10b70 20 72 54 6f 74 61 6c 3e 3d 70 2d 3e 63 6f 73 74   rTotal>=p->cost
10b80 2e 72 43 6f 73 74 20 29 20 62 72 65 61 6b 3b 0a  .rCost ) break;.
10b90 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
10ba0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
10bb0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
10bc0 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 73  , increase the s
10bd0 63 61 6e 20 63 6f 73 74 20 74 6f 20 61 63 63 6f  can cost to acco
10be0 75 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 66 6f  unt .      ** fo
10bf0 72 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68  r the cost of th
10c00 65 20 73 6f 72 74 2e 20 2a 2f 0a 20 20 20 20 20  e sort. */.     
10c10 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
10c20 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 57  !=0 ){.        W
10c30 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20  HERETRACE(("... 
10c40 73 6f 72 74 69 6e 67 20 69 6e 63 72 65 61 73 65  sorting increase
10c50 73 20 4f 52 20 63 6f 73 74 20 25 2e 39 67 20 74  s OR cost %.9g t
10c60 6f 20 25 2e 39 67 5c 6e 22 2c 0a 20 20 20 20 20  o %.9g\n",.     
10c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
10c80 54 6f 74 61 6c 2c 20 72 54 6f 74 61 6c 2b 6e 52  Total, rTotal+nR
10c90 6f 77 2a 65 73 74 4c 6f 67 28 6e 52 6f 77 29 29  ow*estLog(nRow))
10ca0 29 3b 0a 20 20 20 20 20 20 20 20 72 54 6f 74 61  );.        rTota
10cb0 6c 20 2b 3d 20 6e 52 6f 77 2a 65 73 74 4c 6f 67  l += nRow*estLog
10cc0 28 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 7d 0a  (nRow);.      }.
10cd0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
10ce0 20 63 6f 73 74 20 6f 66 20 73 63 61 6e 6e 69 6e   cost of scannin
10cf0 67 20 75 73 69 6e 67 20 74 68 69 73 20 4f 52 20  g using this OR 
10d00 74 65 72 6d 20 66 6f 72 20 6f 70 74 69 6d 69 7a  term for optimiz
10d10 61 74 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a  ation is.      *
10d20 2a 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  * less than the 
10d30 63 75 72 72 65 6e 74 20 63 6f 73 74 20 73 74 6f  current cost sto
10d40 72 65 64 20 69 6e 20 70 43 6f 73 74 2c 20 72 65  red in pCost, re
10d50 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65 6e  place the conten
10d60 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70  ts.      ** of p
10d70 43 6f 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 57  Cost. */.      W
10d80 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20  HERETRACE(("... 
10d90 6d 75 6c 74 69 2d 69 6e 64 65 78 20 4f 52 20 63  multi-index OR c
10da0 6f 73 74 3d 25 2e 39 67 20 6e 72 6f 77 3d 25 2e  ost=%.9g nrow=%.
10db0 39 67 5c 6e 22 2c 20 72 54 6f 74 61 6c 2c 20 6e  9g\n", rTotal, n
10dc0 52 6f 77 29 29 3b 0a 20 20 20 20 20 20 69 66 28  Row));.      if(
10dd0 20 72 54 6f 74 61 6c 3c 70 2d 3e 63 6f 73 74 2e   rTotal<p->cost.
10de0 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 20  rCost ){.       
10df0 20 70 2d 3e 63 6f 73 74 2e 72 43 6f 73 74 20 3d   p->cost.rCost =
10e00 20 72 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 20   rTotal;.       
10e10 20 70 2d 3e 63 6f 73 74 2e 75 73 65 64 20 3d 20   p->cost.used = 
10e20 75 73 65 64 3b 0a 20 20 20 20 20 20 20 20 70 2d  used;.        p-
10e30 3e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77 20  >cost.plan.nRow 
10e40 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20  = nRow;.        
10e50 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 4f 42  p->cost.plan.nOB
10e60 53 61 74 20 3d 20 70 2d 3e 69 20 3f 20 70 2d 3e  Sat = p->i ? p->
10e70 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d 2e 70  aLevel[p->i-1].p
10e80 6c 61 6e 2e 6e 4f 42 53 61 74 20 3a 20 30 3b 0a  lan.nOBSat : 0;.
10e90 20 20 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e          p->cost.
10ea0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 66  plan.wsFlags = f
10eb0 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 70 2d  lags;.        p-
10ec0 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 54 65  >cost.plan.u.pTe
10ed0 72 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  rm = pTerm;.    
10ee0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
10ef0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
10f00 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
10f10 49 4f 4e 20 2a 2f 0a 7d 0a 0a 23 69 66 6e 64 65  ION */.}..#ifnde
10f20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
10f30 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a  TOMATIC_INDEX./*
10f40 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
10f50 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  if the WHERE cla
10f60 75 73 65 20 74 65 72 6d 20 70 54 65 72 6d 20 69  use term pTerm i
10f70 73 20 6f 66 20 61 20 66 6f 72 6d 20 77 68 65 72  s of a form wher
10f80 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65  e it.** could be
10f90 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e   used with an in
10fa0 64 65 78 20 74 6f 20 61 63 63 65 73 73 20 70 53  dex to access pS
10fb0 72 63 2c 20 61 73 73 75 6d 69 6e 67 20 61 6e 20  rc, assuming an 
10fc0 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69  appropriate.** i
10fd0 6e 64 65 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f  ndex existed..*/
10fe0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 72 6d  .static int term
10ff0 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 0a 20  CanDriveIndex(. 
11000 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
11010 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
11020 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
11030 74 65 72 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f  term to check */
11040 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
11050 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20  t_item *pSrc,   
11060 20 20 2f 2a 20 54 61 62 6c 65 20 77 65 20 61 72    /* Table we ar
11070 65 20 74 72 79 69 6e 67 20 74 6f 20 61 63 63 65  e trying to acce
11080 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ss */.  Bitmask 
11090 6e 6f 74 52 65 61 64 79 20 20 20 20 20 20 20 20  notReady        
110a0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73         /* Tables
110b0 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20   in outer loops 
110c0 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29  of the join */.)
110d0 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20  {.  char aff;.  
110e0 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
110f0 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75  ursor!=pSrc->iCu
11100 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b  rsor ) return 0;
11110 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65  .  if( (pTerm->e
11120 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
11130 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
11140 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70  .  if( (pTerm->p
11150 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74  rereqRight & not
11160 52 65 61 64 79 29 21 3d 30 20 29 20 72 65 74 75  Ready)!=0 ) retu
11170 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20 70 53  rn 0;.  aff = pS
11180 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  rc->pTab->aCol[p
11190 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
111a0 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  mn].affinity;.  
111b0 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65  if( !sqlite3Inde
111c0 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 54 65 72  xAffinityOk(pTer
111d0 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66 29 20 29  m->pExpr, aff) )
111e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
111f0 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
11200 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11210 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
11220 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  NDEX./*.** If th
11230 65 20 71 75 65 72 79 20 70 6c 61 6e 20 66 6f 72  e query plan for
11240 20 70 53 72 63 20 73 70 65 63 69 66 69 65 64 20   pSrc specified 
11250 69 6e 20 70 43 6f 73 74 20 69 73 20 61 20 66 75  in pCost is a fu
11260 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2a  ll table scan.**
11270 20 61 6e 64 20 69 6e 64 65 78 69 6e 67 20 69 73   and indexing is
11280 20 61 6c 6c 6f 77 73 20 28 69 66 20 74 68 65 72   allows (if ther
11290 65 20 69 73 20 6e 6f 20 4e 4f 54 20 49 4e 44 45  e is no NOT INDE
112a0 58 45 44 20 63 6c 61 75 73 65 29 20 61 6e 64 20  XED clause) and 
112b0 69 74 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74  it.** possible t
112c0 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 20 74 72  o construct a tr
112d0 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 74 68  ansient index th
112e0 61 74 20 77 6f 75 6c 64 20 70 65 72 66 6f 72 6d  at would perform
112f0 20 62 65 74 74 65 72 0a 2a 2a 20 74 68 61 6e 20   better.** than 
11300 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  a full table sca
11310 6e 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 20  n even when the 
11320 63 6f 73 74 20 6f 66 20 63 6f 6e 73 74 72 75 63  cost of construc
11330 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78 0a 2a  ting the index.*
11340 2a 20 69 73 20 74 61 6b 65 6e 20 69 6e 74 6f 20  * is taken into 
11350 61 63 63 6f 75 6e 74 2c 20 74 68 65 6e 20 61 6c  account, then al
11360 74 65 72 20 74 68 65 20 71 75 65 72 79 20 70 6c  ter the query pl
11370 61 6e 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a  an to use the.**
11380 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78   transient index
11390 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
113a0 20 62 65 73 74 41 75 74 6f 6d 61 74 69 63 49 6e   bestAutomaticIn
113b0 64 65 78 28 57 68 65 72 65 42 65 73 74 49 64 78  dex(WhereBestIdx
113c0 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *p){.  Parse *p
113d0 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73  Parse = p->pPars
113e0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
113f0 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
11400 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43  text */.  WhereC
11410 6c 61 75 73 65 20 2a 70 57 43 20 3d 20 70 2d 3e  lause *pWC = p->
11420 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 20  pWC;            
11430 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
11440 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
11450 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
11460 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20 2f  rc = p->pSrc;  /
11470 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
11480 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68  e term to search
11490 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e 54 61   */.  double nTa
114a0 62 6c 65 52 6f 77 3b 20 20 20 20 20 20 20 20 20  bleRow;         
114b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
114c0 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74  ows in the input
114d0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 64 6f 75 62   table */.  doub
114e0 6c 65 20 6c 6f 67 4e 3b 20 20 20 20 20 20 20 20  le logN;        
114f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11500 20 20 2f 2a 20 6c 6f 67 28 6e 54 61 62 6c 65 52    /* log(nTableR
11510 6f 77 29 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20  ow) */.  double 
11520 63 6f 73 74 54 65 6d 70 49 64 78 3b 20 20 20 20  costTempIdx;    
11530 20 20 20 20 20 2f 2a 20 70 65 72 2d 71 75 65 72       /* per-quer
11540 79 20 63 6f 73 74 20 6f 66 20 74 68 65 20 74 72  y cost of the tr
11550 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f  ansient index */
11560 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
11570 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  erm;           /
11580 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  * A single term 
11590 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
115a0 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  use */.  WhereTe
115b0 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20  rm *pWCEnd;     
115c0 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70       /* End of p
115d0 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 54 61 62  WC->a[] */.  Tab
115e0 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20 20 20 20  le *pTable;     
115f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
11600 65 20 74 68 74 20 6d 69 67 68 74 20 62 65 20 69  e tht might be i
11610 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 69 66 28  ndexed */..  if(
11620 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
11630 6f 6f 70 3c 3d 28 64 6f 75 62 6c 65 29 31 20 29  oop<=(double)1 )
11640 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69  {.    /* There i
11650 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 62 75  s no point in bu
11660 69 6c 64 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61  ilding an automa
11670 74 69 63 20 69 6e 64 65 78 20 66 6f 72 20 61 20  tic index for a 
11680 73 69 6e 67 6c 65 20 73 63 61 6e 20 2a 2f 0a 20  single scan */. 
11690 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
116a0 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e 64 62   if( (pParse->db
116b0 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
116c0 5f 41 75 74 6f 49 6e 64 65 78 29 3d 3d 30 20 29  _AutoIndex)==0 )
116d0 7b 0a 20 20 20 20 2f 2a 20 41 75 74 6f 6d 61 74  {.    /* Automat
116e0 69 63 20 69 6e 64 69 63 65 73 20 61 72 65 20 64  ic indices are d
116f0 69 73 61 62 6c 65 64 20 61 74 20 72 75 6e 2d 74  isabled at run-t
11700 69 6d 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ime */.    retur
11710 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d  n;.  }.  if( (p-
11720 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61  >cost.plan.wsFla
11730 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46  gs & WHERE_NOT_F
11740 55 4c 4c 53 43 41 4e 29 21 3d 30 0a 20 20 20 26  ULLSCAN)!=0.   &
11750 26 20 28 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e  & (p->cost.plan.
11760 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
11770 43 4f 56 45 52 5f 53 43 41 4e 29 3d 3d 30 0a 20  COVER_SCAN)==0. 
11780 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 6c   ){.    /* We al
11790 72 65 61 64 79 20 68 61 76 65 20 73 6f 6d 65 20  ready have some 
117a0 6b 69 6e 64 20 6f 66 20 69 6e 64 65 78 20 69 6e  kind of index in
117b0 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 71 75   use for this qu
117c0 65 72 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ery. */.    retu
117d0 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  rn;.  }.  if( pS
117e0 72 63 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65  rc->viaCoroutine
117f0 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 6e 6e 6f   ){.    /* Canno
11800 74 20 69 6e 64 65 78 20 61 20 63 6f 2d 72 6f 75  t index a co-rou
11810 74 69 6e 65 20 2a 2f 0a 20 20 20 20 72 65 74 75  tine */.    retu
11820 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  rn;.  }.  if( pS
11830 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 29  rc->notIndexed )
11840 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 4e 4f 54  {.    /* The NOT
11850 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20   INDEXED clause 
11860 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 20 53  appears in the S
11870 51 4c 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  QL. */.    retur
11880 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72  n;.  }.  if( pSr
11890 63 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 20  c->isCorrelated 
118a0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 6f  ){.    /* The so
118b0 75 72 63 65 20 69 73 20 61 20 63 6f 72 72 65 6c  urce is a correl
118c0 61 74 65 64 20 73 75 62 2d 71 75 65 72 79 2e 20  ated sub-query. 
118d0 4e 6f 20 70 6f 69 6e 74 20 69 6e 20 69 6e 64 65  No point in inde
118e0 78 69 6e 67 20 69 74 2e 20 2a 2f 0a 20 20 20 20  xing it. */.    
118f0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61  return;.  }..  a
11900 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
11910 51 75 65 72 79 4c 6f 6f 70 20 3e 3d 20 28 64 6f  QueryLoop >= (do
11920 75 62 6c 65 29 31 20 29 3b 0a 20 20 70 54 61 62  uble)1 );.  pTab
11930 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b  le = pSrc->pTab;
11940 0a 20 20 6e 54 61 62 6c 65 52 6f 77 20 3d 20 70  .  nTableRow = p
11950 54 61 62 6c 65 2d 3e 6e 52 6f 77 45 73 74 3b 0a  Table->nRowEst;.
11960 20 20 6c 6f 67 4e 20 3d 20 65 73 74 4c 6f 67 28    logN = estLog(
11970 6e 54 61 62 6c 65 52 6f 77 29 3b 0a 20 20 63 6f  nTableRow);.  co
11980 73 74 54 65 6d 70 49 64 78 20 3d 20 32 2a 6c 6f  stTempIdx = 2*lo
11990 67 4e 2a 28 6e 54 61 62 6c 65 52 6f 77 2f 70 50  gN*(nTableRow/pP
119a0 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
119b0 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 63 6f 73   + 1);.  if( cos
119c0 74 54 65 6d 70 49 64 78 3e 3d 70 2d 3e 63 6f 73  tTempIdx>=p->cos
119d0 74 2e 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 2f  t.rCost ){.    /
119e0 2a 20 54 68 65 20 63 6f 73 74 20 6f 66 20 63 72  * The cost of cr
119f0 65 61 74 69 6e 67 20 74 68 65 20 74 72 61 6e 73  eating the trans
11a00 69 65 6e 74 20 74 61 62 6c 65 20 77 6f 75 6c 64  ient table would
11a10 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
11a20 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68  .    ** doing th
11a30 65 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  e full table sca
11a40 6e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b  n */.    return;
11a50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
11a60 68 20 66 6f 72 20 61 6e 79 20 65 71 75 61 6c 69  h for any equali
11a70 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 74 65  ty comparison te
11a80 72 6d 20 2a 2f 0a 20 20 70 57 43 45 6e 64 20 3d  rm */.  pWCEnd =
11a90 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54   &pWC->a[pWC->nT
11aa0 65 72 6d 5d 3b 0a 20 20 66 6f 72 28 70 54 65 72  erm];.  for(pTer
11ab0 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
11ac0 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
11ad0 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61  {.    if( termCa
11ae0 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72  nDriveIndex(pTer
11af0 6d 2c 20 70 53 72 63 2c 20 70 2d 3e 6e 6f 74 52  m, pSrc, p->notR
11b00 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20 57  eady) ){.      W
11b10 48 45 52 45 54 52 41 43 45 28 28 22 61 75 74 6f  HERETRACE(("auto
11b20 2d 69 6e 64 65 78 20 72 65 64 75 63 65 73 20 63  -index reduces c
11b30 6f 73 74 20 66 72 6f 6d 20 25 2e 31 66 20 74 6f  ost from %.1f to
11b40 20 25 2e 31 66 5c 6e 22 2c 0a 20 20 20 20 20 20   %.1f\n",.      
11b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
11b60 3e 63 6f 73 74 2e 72 43 6f 73 74 2c 20 63 6f 73  >cost.rCost, cos
11b70 74 54 65 6d 70 49 64 78 29 29 3b 0a 20 20 20 20  tTempIdx));.    
11b80 20 20 70 2d 3e 63 6f 73 74 2e 72 43 6f 73 74 20    p->cost.rCost 
11b90 3d 20 63 6f 73 74 54 65 6d 70 49 64 78 3b 0a 20  = costTempIdx;. 
11ba0 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61       p->cost.pla
11bb0 6e 2e 6e 52 6f 77 20 3d 20 6c 6f 67 4e 20 2b 20  n.nRow = logN + 
11bc0 31 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f 73 74  1;.      p->cost
11bd0 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20  .plan.wsFlags = 
11be0 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58  WHERE_TEMP_INDEX
11bf0 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e  ;.      p->cost.
11c00 75 73 65 64 20 3d 20 70 54 65 72 6d 2d 3e 70 72  used = pTerm->pr
11c10 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20  ereqRight;.     
11c20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
11c30 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
11c40 6e 65 20 62 65 73 74 41 75 74 6f 6d 61 74 69 63  ne bestAutomatic
11c50 49 6e 64 65 78 28 41 29 20 20 2f 2a 20 6e 6f 2d  Index(A)  /* no-
11c60 6f 70 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  op */.#endif /* 
11c70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
11c80 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a  MATIC_INDEX */..
11c90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11ca0 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
11cb0 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  NDEX./*.** Gener
11cc0 61 74 65 20 63 6f 64 65 20 74 6f 20 63 6f 6e 73  ate code to cons
11cd0 74 72 75 63 74 20 74 68 65 20 49 6e 64 65 78 20  truct the Index 
11ce0 6f 62 6a 65 63 74 20 66 6f 72 20 61 6e 20 61 75  object for an au
11cf0 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 2a 2a  tomatic index.**
11d00 20 61 6e 64 20 74 6f 20 73 65 74 20 75 70 20 74   and to set up t
11d10 68 65 20 57 68 65 72 65 4c 65 76 65 6c 20 6f 62  he WhereLevel ob
11d20 6a 65 63 74 20 70 4c 65 76 65 6c 20 73 6f 20 74  ject pLevel so t
11d30 68 61 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e  hat the code gen
11d40 65 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20  erator.** makes 
11d50 75 73 65 20 6f 66 20 74 68 65 20 61 75 74 6f 6d  use of the autom
11d60 61 74 69 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73  atic index..*/.s
11d70 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 73 74  tatic void const
11d80 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64  ructAutomaticInd
11d90 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
11da0 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
11db0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
11dc0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
11dd0 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
11de0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11df0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
11e00 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
11e10 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f  t_item *pSrc,  /
11e20 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
11e30 65 20 74 65 72 6d 20 74 6f 20 67 65 74 20 74 68  e term to get th
11e40 65 20 6e 65 78 74 20 69 6e 64 65 78 20 2a 2f 0a  e next index */.
11e50 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
11e60 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dy,           /*
11e70 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73   Mask of cursors
11e80 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76   that are not av
11e90 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65  ailable */.  Whe
11ea0 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20  reLevel *pLevel 
11eb0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
11ec0 65 20 6e 65 77 20 69 6e 64 65 78 20 68 65 72 65  e new index here
11ed0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6f   */.){.  int nCo
11ee0 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 20  lumn;           
11ef0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
11f00 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
11f10 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 64   constructed ind
11f20 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  ex */.  WhereTer
11f30 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
11f40 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
11f50 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
11f60 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  E clause */.  Wh
11f70 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b  ereTerm *pWCEnd;
11f80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
11f90 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a   of pWC->a[] */.
11fa0 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
11fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11fc0 20 42 79 74 65 20 6f 66 20 6d 65 6d 6f 72 79 20   Byte of memory 
11fd0 6e 65 65 64 65 64 20 66 6f 72 20 70 49 64 78 20  needed for pIdx 
11fe0 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
11ff0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12000 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73 63 72   /* Object descr
12010 69 62 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69  ibing the transi
12020 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56  ent index */.  V
12030 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
12040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
12050 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
12060 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
12070 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ion */.  int add
12080 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20  rInit;          
12090 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
120a0 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  of the initializ
120b0 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a 75 6d  ation bypass jum
120c0 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  p */.  Table *pT
120d0 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  able;           
120e0 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
120f0 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f  being indexed */
12100 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
12110 69 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f  info;          /
12120 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f  * Key informatio
12130 6e 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20  n for the index 
12140 2a 2f 20 20 20 0a 20 20 69 6e 74 20 61 64 64 72  */   .  int addr
12150 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Top;            
12160 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68      /* Top of th
12170 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f  e index fill loo
12180 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  p */.  int regRe
12190 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20  cord;           
121a0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
121b0 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  olding an index 
121c0 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
121d0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
121e0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
121f0 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  n counter */.  i
12200 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
12210 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
12220 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
12230 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20  int mxBitCol;   
12240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
12250 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e  aximum column in
12260 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a   pSrc->colUsed *
12270 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  /.  CollSeq *pCo
12280 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
12290 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
122a0 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f  uence to on a co
122b0 6c 75 6d 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73  lumn */.  Bitmas
122c0 6b 20 69 64 78 43 6f 6c 73 3b 20 20 20 20 20 20  k idxCols;      
122d0 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20        /* Bitmap 
122e0 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20  of columns used 
122f0 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a  for indexing */.
12300 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61 43    Bitmask extraC
12310 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ols;          /*
12320 20 42 69 74 6d 61 70 20 6f 66 20 61 64 64 69 74   Bitmap of addit
12330 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f  ional columns */
12340 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
12350 63 6f 64 65 20 74 6f 20 73 6b 69 70 20 6f 76 65  code to skip ove
12360 72 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 61  r the creation a
12370 6e 64 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  nd initializatio
12380 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 74 72  n of the.  ** tr
12390 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e  ansient index on
123a0 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75   2nd and subsequ
123b0 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 73 20 6f  ent iterations o
123c0 66 20 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20  f the loop. */. 
123d0 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
123e0 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  be;.  assert( v!
123f0 3d 30 20 29 3b 0a 20 20 61 64 64 72 49 6e 69 74  =0 );.  addrInit
12400 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e   = sqlite3CodeOn
12410 63 65 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f  ce(pParse);..  /
12420 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
12430 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68  er of columns th
12440 61 74 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64  at will be added
12450 20 74 6f 20 74 68 65 20 69 6e 64 65 78 0a 20 20   to the index.  
12460 2a 2a 20 61 6e 64 20 75 73 65 64 20 74 6f 20 6d  ** and used to m
12470 61 74 63 68 20 57 48 45 52 45 20 63 6c 61 75 73  atch WHERE claus
12480 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  e constraints */
12490 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a  .  nColumn = 0;.
124a0 20 20 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d    pTable = pSrc-
124b0 3e 70 54 61 62 3b 0a 20 20 70 57 43 45 6e 64 20  >pTab;.  pWCEnd 
124c0 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e  = &pWC->a[pWC->n
124d0 54 65 72 6d 5d 3b 0a 20 20 69 64 78 43 6f 6c 73  Term];.  idxCols
124e0 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72   = 0;.  for(pTer
124f0 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
12500 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
12510 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61  {.    if( termCa
12520 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72  nDriveIndex(pTer
12530 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  m, pSrc, notRead
12540 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  y) ){.      int 
12550 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  iCol = pTerm->u.
12560 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
12570 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20    Bitmask cMask 
12580 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 28 28  = iCol>=BMS ? ((
12590 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53  Bitmask)1)<<(BMS
125a0 2d 31 29 20 3a 20 28 28 42 69 74 6d 61 73 6b 29  -1) : ((Bitmask)
125b0 31 29 3c 3c 69 43 6f 6c 3b 0a 20 20 20 20 20 20  1)<<iCol;.      
125c0 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
125d0 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  BMS );.      tes
125e0 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53  tcase( iCol==BMS
125f0 2d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  -1 );.      if( 
12600 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b  (idxCols & cMask
12610 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
12620 6e 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20  nColumn++;.     
12630 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d     idxCols |= cM
12640 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ask;.      }.   
12650 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
12660 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 3b 0a 20 20   nColumn>0 );.  
12670 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71  pLevel->plan.nEq
12680 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 2f   = nColumn;..  /
12690 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
126a0 65 72 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c  er of additional
126b0 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20   columns needed 
126c0 74 6f 20 63 72 65 61 74 65 20 61 0a 20 20 2a 2a  to create a.  **
126d0 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e   covering index.
126e0 20 20 41 20 22 63 6f 76 65 72 69 6e 67 20 69 6e    A "covering in
126f0 64 65 78 22 20 69 73 20 61 6e 20 69 6e 64 65 78  dex" is an index
12700 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
12710 6c 6c 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20  ll.  ** columns 
12720 74 68 61 74 20 61 72 65 20 6e 65 65 64 65 64 20  that are needed 
12730 62 79 20 74 68 65 20 71 75 65 72 79 2e 20 20 57  by the query.  W
12740 69 74 68 20 61 20 63 6f 76 65 72 69 6e 67 20 69  ith a covering i
12750 6e 64 65 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f  ndex, the.  ** o
12760 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65  riginal table ne
12770 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ver needs to be 
12780 61 63 63 65 73 73 65 64 2e 20 20 41 75 74 6f 6d  accessed.  Autom
12790 61 74 69 63 20 69 6e 64 69 63 65 73 20 6d 75 73  atic indices mus
127a0 74 0a 20 20 2a 2a 20 62 65 20 61 20 63 6f 76 65  t.  ** be a cove
127b0 72 69 6e 67 20 69 6e 64 65 78 20 62 65 63 61 75  ring index becau
127c0 73 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c  se the index wil
127d0 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64  l not be updated
127e0 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69   if the.  ** ori
127f0 67 69 6e 61 6c 20 74 61 62 6c 65 20 63 68 61 6e  ginal table chan
12800 67 65 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ges and the inde
12810 78 20 61 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e  x and table cann
12820 6f 74 20 62 6f 74 68 20 62 65 20 75 73 65 64 0a  ot both be used.
12830 20 20 2a 2a 20 69 66 20 74 68 65 79 20 67 6f 20    ** if they go 
12840 6f 75 74 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a  out of sync..  *
12850 2f 0a 20 20 65 78 74 72 61 43 6f 6c 73 20 3d 20  /.  extraCols = 
12860 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20  pSrc->colUsed & 
12870 28 7e 69 64 78 43 6f 6c 73 20 7c 20 28 28 28 42  (~idxCols | (((B
12880 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d  itmask)1)<<(BMS-
12890 31 29 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c  1)));.  mxBitCol
128a0 20 3d 20 28 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c   = (pTable->nCol
128b0 20 3e 3d 20 42 4d 53 2d 31 29 20 3f 20 42 4d 53   >= BMS-1) ? BMS
128c0 2d 31 20 3a 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  -1 : pTable->nCo
128d0 6c 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  l;.  testcase( p
128e0 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53  Table->nCol==BMS
128f0 2d 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  -1 );.  testcase
12900 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d  ( pTable->nCol==
12910 42 4d 53 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69  BMS-2 );.  for(i
12920 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20  =0; i<mxBitCol; 
12930 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78  i++){.    if( ex
12940 74 72 61 43 6f 6c 73 20 26 20 28 28 28 42 69 74  traCols & (((Bit
12950 6d 61 73 6b 29 31 29 3c 3c 69 29 20 29 20 6e 43  mask)1)<<i) ) nC
12960 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69  olumn++;.  }.  i
12970 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  f( pSrc->colUsed
12980 20 26 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29   & (((Bitmask)1)
12990 3c 3c 28 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20  <<(BMS-1)) ){.  
129a0 20 20 6e 43 6f 6c 75 6d 6e 20 2b 3d 20 70 54 61    nColumn += pTa
129b0 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20  ble->nCol - BMS 
129c0 2b 20 31 3b 0a 20 20 7d 0a 20 20 70 4c 65 76 65  + 1;.  }.  pLeve
129d0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
129e0 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
129f0 45 51 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f  EQ | WHERE_IDX_O
12a00 4e 4c 59 20 7c 20 57 4f 5f 45 51 3b 0a 0a 20 20  NLY | WO_EQ;..  
12a10 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65  /* Construct the
12a20 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f   Index object to
12a30 20 64 65 73 63 72 69 62 65 20 74 68 69 73 20 69   describe this i
12a40 6e 64 65 78 20 2a 2f 0a 20 20 6e 42 79 74 65 20  ndex */.  nByte 
12a50 3d 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 3b  = sizeof(Index);
12a60 0a 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c  .  nByte += nCol
12a70 75 6d 6e 2a 73 69 7a 65 6f 66 28 69 6e 74 29 3b  umn*sizeof(int);
12a80 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69       /* Index.ai
12a90 43 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 6e 42 79 74  Column */.  nByt
12aa0 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a  e += nColumn*siz
12ab0 65 6f 66 28 63 68 61 72 2a 29 3b 20 20 20 2f 2a  eof(char*);   /*
12ac0 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 2a 2f   Index.azColl */
12ad0 0a 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c  .  nByte += nCol
12ae0 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  umn;            
12af0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53       /* Index.aS
12b00 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 49  ortOrder */.  pI
12b10 64 78 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  dx = sqlite3DbMa
12b20 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
12b30 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69  >db, nByte);.  i
12b40 66 28 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74  f( pIdx==0 ) ret
12b50 75 72 6e 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 70  urn;.  pLevel->p
12b60 6c 61 6e 2e 75 2e 70 49 64 78 20 3d 20 70 49 64  lan.u.pIdx = pId
12b70 78 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  x;.  pIdx->azCol
12b80 6c 20 3d 20 28 63 68 61 72 2a 2a 29 26 70 49 64  l = (char**)&pId
12b90 78 5b 31 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 69  x[1];.  pIdx->ai
12ba0 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26  Column = (int*)&
12bb0 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f  pIdx->azColl[nCo
12bc0 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e 61  lumn];.  pIdx->a
12bd0 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
12be0 29 26 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  )&pIdx->aiColumn
12bf0 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64  [nColumn];.  pId
12c00 78 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f  x->zName = "auto
12c10 2d 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78 2d  -index";.  pIdx-
12c20 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 75  >nColumn = nColu
12c30 6d 6e 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61 62  mn;.  pIdx->pTab
12c40 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e  le = pTable;.  n
12c50 20 3d 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20   = 0;.  idxCols 
12c60 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d  = 0;.  for(pTerm
12c70 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70  =pWC->a; pTerm<p
12c80 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  WCEnd; pTerm++){
12c90 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e  .    if( termCan
12ca0 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d  DriveIndex(pTerm
12cb0 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79  , pSrc, notReady
12cc0 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
12cd0 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  Col = pTerm->u.l
12ce0 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
12cf0 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d   Bitmask cMask =
12d00 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 28 28 42   iCol>=BMS ? ((B
12d10 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d  itmask)1)<<(BMS-
12d20 31 29 20 3a 20 28 28 42 69 74 6d 61 73 6b 29 31  1) : ((Bitmask)1
12d30 29 3c 3c 69 43 6f 6c 3b 0a 20 20 20 20 20 20 69  )<<iCol;.      i
12d40 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d  f( (idxCols & cM
12d50 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
12d60 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54     Expr *pX = pT
12d70 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
12d80 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63      idxCols |= c
12d90 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 49  Mask;.        pI
12da0 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20  dx->aiColumn[n] 
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 20 20 70  olumn;.        p
12dd0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  Coll = sqlite3Bi
12de0 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
12df0 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  eq(pParse, pX->p
12e00 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74  Left, pX->pRight
12e10 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  );.        pIdx-
12e20 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 41 4c 57  >azColl[n] = ALW
12e30 41 59 53 28 70 43 6f 6c 6c 29 20 3f 20 70 43 6f  AYS(pColl) ? pCo
12e40 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 42 49 4e  ll->zName : "BIN
12e50 41 52 59 22 3b 0a 20 20 20 20 20 20 20 20 6e 2b  ARY";.        n+
12e60 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
12e70 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
12e80 75 33 32 29 6e 3d 3d 70 4c 65 76 65 6c 2d 3e 70  u32)n==pLevel->p
12e90 6c 61 6e 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a  lan.nEq );..  /*
12ea0 20 41 64 64 20 61 64 64 69 74 69 6f 6e 61 6c 20   Add additional 
12eb0 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74  columns needed t
12ec0 6f 20 6d 61 6b 65 20 74 68 65 20 61 75 74 6f 6d  o make the autom
12ed0 61 74 69 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a  atic index into.
12ee0 20 20 2a 2a 20 61 20 63 6f 76 65 72 69 6e 67 20    ** a covering 
12ef0 69 6e 64 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69  index */.  for(i
12f00 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20  =0; i<mxBitCol; 
12f10 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78  i++){.    if( ex
12f20 74 72 61 43 6f 6c 73 20 26 20 28 28 28 42 69 74  traCols & (((Bit
12f30 6d 61 73 6b 29 31 29 3c 3c 69 29 20 29 7b 0a 20  mask)1)<<i) ){. 
12f40 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c       pIdx->aiCol
12f50 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20  umn[n] = i;.    
12f60 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e    pIdx->azColl[n
12f70 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20  ] = "BINARY";.  
12f80 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20      n++;.    }. 
12f90 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63   }.  if( pSrc->c
12fa0 6f 6c 55 73 65 64 20 26 20 28 28 28 42 69 74 6d  olUsed & (((Bitm
12fb0 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29  ask)1)<<(BMS-1))
12fc0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d   ){.    for(i=BM
12fd0 53 2d 31 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e  S-1; i<pTable->n
12fe0 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
12ff0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
13000 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49  n] = i;.      pI
13010 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
13020 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20  "BINARY";.      
13030 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n++;.    }.  }. 
13040 20 61 73 73 65 72 74 28 20 6e 3d 3d 6e 43 6f 6c   assert( n==nCol
13050 75 6d 6e 20 29 3b 0a 0a 20 20 2f 2a 20 43 72 65  umn );..  /* Cre
13060 61 74 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ate the automati
13070 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70 4b 65  c index */.  pKe
13080 79 69 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 49  yinfo = sqlite3I
13090 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72  ndexKeyinfo(pPar
130a0 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 61 73 73  se, pIdx);.  ass
130b0 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ert( pLevel->iId
130c0 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 73 71 6c  xCur>=0 );.  sql
130d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
130e0 2c 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64  , OP_OpenAutoind
130f0 65 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  ex, pLevel->iIdx
13100 43 75 72 2c 20 6e 43 6f 6c 75 6d 6e 2b 31 2c 20  Cur, nColumn+1, 
13110 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
13120 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
13130 65 79 69 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyinfo, P4_KEYIN
13140 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 56  FO_HANDOFF);.  V
13150 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
13160 66 6f 72 20 25 73 22 2c 20 70 54 61 62 6c 65 2d  for %s", pTable-
13170 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20  >zName));..  /* 
13180 46 69 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61 74  Fill the automat
13190 69 63 20 69 6e 64 65 78 20 77 69 74 68 20 63 6f  ic index with co
131a0 6e 74 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 54  ntent */.  addrT
131b0 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
131c0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77  AddOp1(v, OP_Rew
131d0 69 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  ind, pLevel->iTa
131e0 62 43 75 72 29 3b 0a 20 20 72 65 67 52 65 63 6f  bCur);.  regReco
131f0 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
13200 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
13210 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74    sqlite3Generat
13220 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65  eIndexKey(pParse
13230 2c 20 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e  , pIdx, pLevel->
13240 69 54 61 62 43 75 72 2c 20 72 65 67 52 65 63 6f  iTabCur, regReco
13250 72 64 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65  rd, 1);.  sqlite
13260 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13270 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4c 65  P_IdxInsert, pLe
13280 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72 65  vel->iIdxCur, re
13290 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69  gRecord);.  sqli
132a0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
132b0 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
132c0 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69  KRESULT);.  sqli
132d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
132e0 20 4f 50 5f 4e 65 78 74 2c 20 70 4c 65 76 65 6c   OP_Next, pLevel
132f0 2d 3e 69 54 61 62 43 75 72 2c 20 61 64 64 72 54  ->iTabCur, addrT
13300 6f 70 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  op+1);.  sqlite3
13310 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
13320 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
13330 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20  S_AUTOINDEX);.  
13340 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
13350 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b  ere(v, addrTop);
13360 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
13370 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
13380 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 0a   regRecord);.  .
13390 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77    /* Jump here w
133a0 68 65 6e 20 73 6b 69 70 70 69 6e 67 20 74 68 65  hen skipping the
133b0 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
133c0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
133d0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
133e0 49 6e 69 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  Init);.}.#endif 
133f0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  /* SQLITE_OMIT_A
13400 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a  UTOMATIC_INDEX *
13410 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
13420 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
13430 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  BLE./*.** Alloca
13440 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20  te and populate 
13450 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  an sqlite3_index
13460 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  _info structure.
13470 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72   It is the .** r
13480 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
13490 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
134a0 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73  ventually releas
134b0 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 0a  e the structure.
134c0 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20 74 68  ** by passing th
134d0 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
134e0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
134f0 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f 66  ion to sqlite3_f
13500 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ree()..*/.static
13510 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
13520 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64  nfo *allocateInd
13530 65 78 49 6e 66 6f 28 57 68 65 72 65 42 65 73 74  exInfo(WhereBest
13540 49 64 78 20 2a 70 29 7b 0a 20 20 50 61 72 73 65  Idx *p){.  Parse
13550 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50   *pParse = p->pP
13560 61 72 73 65 3b 20 0a 20 20 57 68 65 72 65 43 6c  arse; .  WhereCl
13570 61 75 73 65 20 2a 70 57 43 20 3d 20 70 2d 3e 70  ause *pWC = p->p
13580 57 43 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  WC;.  struct Src
13590 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 20  List_item *pSrc 
135a0 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 45 78 70  = p->pSrc;.  Exp
135b0 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
135c0 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
135d0 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
135e0 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75 63 74   nTerm;.  struct
135f0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
13600 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43  onstraint *pIdxC
13610 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71  ons;.  struct sq
13620 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
13630 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72 42 79  rby *pIdxOrderBy
13640 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
13650 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
13660 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67  int_usage *pUsag
13670 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  e;.  WhereTerm *
13680 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72  pTerm;.  int nOr
13690 64 65 72 42 79 3b 0a 20 20 73 71 6c 69 74 65 33  derBy;.  sqlite3
136a0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64  _index_info *pId
136b0 78 49 6e 66 6f 3b 0a 0a 20 20 57 48 45 52 45 54  xInfo;..  WHERET
136c0 52 41 43 45 28 28 22 52 65 63 6f 6d 70 75 74 69  RACE(("Recomputi
136d0 6e 67 20 69 6e 64 65 78 20 69 6e 66 6f 20 66 6f  ng index info fo
136e0 72 20 25 73 2e 2e 2e 5c 6e 22 2c 20 70 53 72 63  r %s...\n", pSrc
136f0 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
13700 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65  ..  /* Count the
13710 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73 73 69   number of possi
13720 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ble WHERE clause
13730 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 66   constraints ref
13740 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74  erring.  ** to t
13750 68 69 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c  his virtual tabl
13760 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54 65  e */.  for(i=nTe
13770 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  rm=0, pTerm=pWC-
13780 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
13790 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
137a0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
137b0 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53  leftCursor != pS
137c0 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f  rc->iCursor ) co
137d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
137e0 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f  rt( IsPowerOfTwo
137f0 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
13800 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20 29  r & ~WO_EQUIV) )
13810 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
13820 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
13830 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20   & WO_IN );.    
13840 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
13850 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
13860 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 69 66  ISNULL );.    if
13870 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
13880 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 29  or & (WO_ISNULL)
13890 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
138a0 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
138b0 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
138c0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
138d0 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20   nTerm++;.  }.. 
138e0 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52   /* If the ORDER
138f0 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e 74 61   BY clause conta
13900 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73  ins only columns
13910 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
13920 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61  .  ** virtual ta
13930 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  ble then allocat
13940 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
13950 61 4f 72 64 65 72 42 79 20 70 61 72 74 20 6f 66  aOrderBy part of
13960 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  .  ** the sqlite
13970 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
13980 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e  ucture..  */.  n
13990 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 69  OrderBy = 0;.  i
139a0 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
139b0 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f 72 64 65     int n = pOrde
139c0 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  rBy->nExpr;.    
139d0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
139e0 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
139f0 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79  pExpr = pOrderBy
13a00 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
13a10 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
13a20 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p!=TK_COLUMN || 
13a30 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70  pExpr->iTable!=p
13a40 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 62  Src->iCursor ) b
13a50 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
13a60 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20 20 20 20  if( i==n){.     
13a70 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e 3b 0a 20   nOrderBy = n;. 
13a80 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
13a90 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69  llocate the sqli
13aa0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
13ab0 74 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20  tructure.  */.  
13ac0 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pIdxInfo = sqlit
13ad0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
13ae0 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
13af0 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20 20 20  f(*pIdxInfo).   
13b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b10 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a 65 6f          + (sizeo
13b20 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20 73  f(*pIdxCons) + s
13b30 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29 29 2a  izeof(*pUsage))*
13b40 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20  nTerm.          
13b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b60 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f   + sizeof(*pIdxO
13b70 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42 79  rderBy)*nOrderBy
13b80 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e   );.  if( pIdxIn
13b90 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  fo==0 ){.    sql
13ba0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
13bb0 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d  rse, "out of mem
13bc0 6f 72 79 22 29 3b 0a 20 20 20 20 2f 2a 20 28 64  ory");.    /* (d
13bd0 6f 75 62 6c 65 29 30 20 49 6e 20 63 61 73 65 20  ouble)0 In case 
13be0 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  of SQLITE_OMIT_F
13bf0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e  LOATING_POINT...
13c00 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30   */.    return 0
13c10 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74  ;.  }..  /* Init
13c20 69 61 6c 69 7a 65 20 74 68 65 20 73 74 72 75 63  ialize the struc
13c30 74 75 72 65 2e 20 20 54 68 65 20 73 71 6c 69 74  ture.  The sqlit
13c40 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
13c50 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
13c60 0a 20 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64  .  ** many field
13c70 73 20 74 68 61 74 20 61 72 65 20 64 65 63 6c 61  s that are decla
13c80 72 65 64 20 22 63 6f 6e 73 74 22 20 74 6f 20 70  red "const" to p
13c90 72 65 76 65 6e 74 20 78 42 65 73 74 49 6e 64 65  revent xBestInde
13ca0 78 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e  x from.  ** chan
13cb0 67 69 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68  ging them.  We h
13cc0 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66  ave to do some f
13cd0 75 6e 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20  unky casting in 
13ce0 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e  order to.  ** in
13cf0 69 74 69 61 6c 69 7a 65 20 74 68 6f 73 65 20 66  itialize those f
13d00 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49  ields..  */.  pI
13d10 64 78 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74  dxCons = (struct
13d20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
13d30 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70 49 64 78  onstraint*)&pIdx
13d40 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f  Info[1];.  pIdxO
13d50 72 64 65 72 42 79 20 3d 20 28 73 74 72 75 63 74  rderBy = (struct
13d60 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f   sqlite3_index_o
13d70 72 64 65 72 62 79 2a 29 26 70 49 64 78 43 6f 6e  rderby*)&pIdxCon
13d80 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61  s[nTerm];.  pUsa
13d90 67 65 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  ge = (struct sql
13da0 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
13db0 72 61 69 6e 74 5f 75 73 61 67 65 2a 29 26 70 49  raint_usage*)&pI
13dc0 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65 72  dxOrderBy[nOrder
13dd0 42 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70  By];.  *(int*)&p
13de0 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
13df0 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20  aint = nTerm;.  
13e00 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f  *(int*)&pIdxInfo
13e10 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72  ->nOrderBy = nOr
13e20 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63  derBy;.  *(struc
13e30 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
13e40 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49  constraint**)&pI
13e50 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
13e60 69 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a  int = pIdxCons;.
13e70 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74    *(struct sqlit
13e80 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
13e90 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f  **)&pIdxInfo->aO
13ea0 72 64 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64  rderBy = pIdxOrd
13eb0 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74  erBy;.  *(struct
13ec0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
13ed0 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a  onstraint_usage*
13ee0 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
13ef0 6e 73 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a  nstraintUsage =.
13f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f40 20 20 20 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f     pUsage;..  fo
13f50 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70  r(i=j=0, pTerm=p
13f60 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
13f70 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
13f80 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20  +){.    u8 op;. 
13f90 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
13fa0 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63  ftCursor != pSrc
13fb0 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74  ->iCursor ) cont
13fc0 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
13fd0 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70  ( IsPowerOfTwo(p
13fe0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
13ff0 26 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a  & ~WO_EQUIV) );.
14000 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
14010 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
14020 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65   WO_IN );.    te
14030 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
14040 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
14050 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20  NULL );.    if( 
14060 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
14070 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29   & (WO_ISNULL) )
14080 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
14090 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
140a0 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29  s & TERM_VNULL )
140b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
140c0 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75  IdxCons[j].iColu
140d0 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  mn = pTerm->u.le
140e0 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49  ftColumn;.    pI
140f0 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f  dxCons[j].iTermO
14100 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 20 20 6f  ffset = i;.    o
14110 70 20 3d 20 28 75 38 29 70 54 65 72 6d 2d 3e 65  p = (u8)pTerm->e
14120 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c  Operator & WO_AL
14130 4c 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 57  L;.    if( op==W
14140 4f 5f 49 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45  O_IN ) op = WO_E
14150 51 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b  Q;.    pIdxCons[
14160 6a 5d 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 20 20  j].op = op;.    
14170 2f 2a 20 54 68 65 20 64 69 72 65 63 74 20 61 73  /* The direct as
14180 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20  signment in the 
14190 70 72 65 76 69 6f 75 73 20 6c 69 6e 65 20 69 73  previous line is
141a0 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62   possible only b
141b0 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68  ecause.    ** th
141c0 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45  e WO_ and SQLITE
141d0 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
141e0 54 5f 20 63 6f 64 65 73 20 61 72 65 20 69 64 65  T_ codes are ide
141f0 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a 20 20 20  ntical.  The.   
14200 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73   ** following as
14210 73 65 72 74 73 20 76 65 72 69 66 79 20 74 68 69  serts verify thi
14220 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 20 20 61  s fact. */.    a
14230 73 73 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51  ssert( WO_EQ==SQ
14240 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
14250 52 41 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20  RAINT_EQ );.    
14260 61 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53  assert( WO_LT==S
14270 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
14280 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20  TRAINT_LT );.   
14290 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d   assert( WO_LE==
142a0 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
142b0 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20  STRAINT_LE );.  
142c0 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 54 3d    assert( WO_GT=
142d0 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
142e0 4e 53 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20  NSTRAINT_GT );. 
142f0 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 45     assert( WO_GE
14300 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
14310 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a  ONSTRAINT_GE );.
14320 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4d      assert( WO_M
14330 41 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  ATCH==SQLITE_IND
14340 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41  EX_CONSTRAINT_MA
14350 54 43 48 20 29 3b 0a 20 20 20 20 61 73 73 65 72  TCH );.    asser
14360 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  t( pTerm->eOpera
14370 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f  tor & (WO_IN|WO_
14380 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57  EQ|WO_LT|WO_LE|W
14390 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41  O_GT|WO_GE|WO_MA
143a0 54 43 48 29 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b  TCH) );.    j++;
143b0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
143c0 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
143d0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
143e0 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  r = pOrderBy->a[
143f0 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 49  i].pExpr;.    pI
14400 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f  dxOrderBy[i].iCo
14410 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43  lumn = pExpr->iC
14420 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f  olumn;.    pIdxO
14430 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d  rderBy[i].desc =
14440 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
14450 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a  sortOrder;.  }..
14460 20 20 72 65 74 75 72 6e 20 70 49 64 78 49 6e 66    return pIdxInf
14470 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  o;.}../*.** The 
14480 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 66  table object ref
14490 65 72 65 6e 63 65 20 70 61 73 73 65 64 20 61 73  erence passed as
144a0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
144b0 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
144c0 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65  ction.** must re
144d0 70 72 65 73 65 6e 74 20 61 20 76 69 72 74 75 61  present a virtua
144e0 6c 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75  l table. This fu
144f0 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74  nction invokes t
14500 68 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 0a  he xBestIndex().
14510 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  ** method of the
14520 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77   virtual table w
14530 69 74 68 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ith the sqlite3_
14540 69 6e 64 65 78 5f 69 6e 66 6f 20 70 6f 69 6e 74  index_info point
14550 65 72 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20  er passed.** as 
14560 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  the argument..**
14570 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
14580 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65 20 69  occurs, pParse i
14590 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
145a0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
145b0 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a  e and a.** non-z
145c0 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72 65 74  ero value is ret
145d0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
145e0 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 20  , 0 is returned 
145f0 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  and the output.*
14600 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 71  * part of the sq
14610 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
14620 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6c 65   structure is le
14630 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a  ft populated..**
14640 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e  .** Whether or n
14650 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  ot an error is r
14660 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73 20 74  eturned, it is t
14670 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
14680 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  y of the.** call
14690 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
146a0 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74 72 20   free p->idxStr 
146b0 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65  if p->needToFree
146c0 49 64 78 53 74 72 20 69 6e 64 69 63 61 74 65 73  IdxStr indicates
146d0 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69 73  .** that this is
146e0 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74   required..*/.st
146f0 61 74 69 63 20 69 6e 74 20 76 74 61 62 42 65 73  atic int vtabBes
14700 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  tIndex(Parse *pP
14710 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
14720 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  b, sqlite3_index
14730 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c  _info *p){.  sql
14740 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
14750 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54 61   = sqlite3GetVTa
14760 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
14770 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20  pTab)->pVtab;.  
14780 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b  int i;.  int rc;
14790 0a 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28  ..  WHERETRACE((
147a0 22 78 42 65 73 74 49 6e 64 65 78 20 66 6f 72 20  "xBestIndex for 
147b0 25 73 5c 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  %s\n", pTab->zNa
147c0 6d 65 29 29 3b 0a 20 20 54 52 41 43 45 5f 49 44  me));.  TRACE_ID
147d0 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20 72  X_INPUTS(p);.  r
147e0 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75  c = pVtab->pModu
147f0 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28 70  le->xBestIndex(p
14800 56 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41 43  Vtab, p);.  TRAC
14810 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70 29  E_IDX_OUTPUTS(p)
14820 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  ;..  if( rc!=SQL
14830 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
14840 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
14850 45 4d 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  EM ){.      pPar
14860 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
14870 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65  iled = 1;.    }e
14880 6c 73 65 20 69 66 28 20 21 70 56 74 61 62 2d 3e  lse if( !pVtab->
14890 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
148a0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
148b0 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 73  (pParse, "%s", s
148c0 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29  qlite3ErrStr(rc)
148d0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
148e0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
148f0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22  Msg(pParse, "%s"
14900 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  , pVtab->zErrMsg
14910 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
14920 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61  qlite3_free(pVta
14930 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  b->zErrMsg);.  p
14940 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  Vtab->zErrMsg = 
14950 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  0;..  for(i=0; i
14960 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  <p->nConstraint;
14970 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21   i++){.    if( !
14980 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
14990 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e 61  ].usable && p->a
149a0 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
149b0 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29  i].argvIndex>0 )
149c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
149d0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
149e0 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c  .          "tabl
149f0 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65 78  e %s: xBestIndex
14a00 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e 76   returned an inv
14a10 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61 62  alid plan", pTab
14a20 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
14a30 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 50    }..  return pP
14a40 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 0a 0a  arse->nErr;.}...
14a50 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
14a60 65 20 62 65 73 74 20 69 6e 64 65 78 20 66 6f 72  e best index for
14a70 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
14a80 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 65 73 74  ..**.** The best
14a90 20 69 6e 64 65 78 20 69 73 20 63 6f 6d 70 75 74   index is comput
14aa0 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49  ed by the xBestI
14ab0 6e 64 65 78 20 6d 65 74 68 6f 64 20 6f 66 20 74  ndex method of t
14ac0 68 65 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61  he virtual.** ta
14ad0 62 6c 65 20 6d 6f 64 75 6c 65 2e 20 20 54 68 69  ble module.  Thi
14ae0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 61  s routine is rea
14af0 6c 6c 79 20 6a 75 73 74 20 61 20 77 72 61 70 70  lly just a wrapp
14b00 65 72 20 74 68 61 74 20 73 65 74 73 20 75 70 0a  er that sets up.
14b10 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ** the sqlite3_i
14b20 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
14b30 75 72 65 20 74 68 61 74 20 69 73 20 75 73 65 64  ure that is used
14b40 20 74 6f 20 63 6f 6d 6d 75 6e 69 63 61 74 65 20   to communicate 
14b50 77 69 74 68 0a 2a 2a 20 78 42 65 73 74 49 6e 64  with.** xBestInd
14b60 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 20 6a  ex..**.** In a j
14b70 6f 69 6e 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  oin, this routin
14b80 65 20 6d 69 67 68 74 20 62 65 20 63 61 6c 6c 65  e might be calle
14b90 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  d multiple times
14ba0 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 61 6d 65   for the.** same
14bb0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
14bc0 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   The sqlite3_ind
14bd0 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
14be0 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
14bf0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  and initialized 
14c00 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69 6e 76  on the first inv
14c10 6f 63 61 74 69 6f 6e 20 61 6e 64 20 72 65 75 73  ocation and reus
14c20 65 64 20 6f 6e 20 61 6c 6c 20 73 75 62 73 65 71  ed on all subseq
14c30 75 65 6e 74 0a 2a 2a 20 69 6e 76 6f 63 61 74 69  uent.** invocati
14c40 6f 6e 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ons.  The sqlite
14c50 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
14c60 75 63 74 75 72 65 20 69 73 20 61 6c 73 6f 20 75  ucture is also u
14c70 73 65 64 20 77 68 65 6e 0a 2a 2a 20 63 6f 64 65  sed when.** code
14c80 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f   is generated to
14c90 20 61 63 63 65 73 73 20 74 68 65 20 76 69 72 74   access the virt
14ca0 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 20  ual table.  The 
14cb0 77 68 65 72 65 49 6e 66 6f 44 65 6c 65 74 65 28  whereInfoDelete(
14cc0 29 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 61  ) .** routine ta
14cd0 6b 65 73 20 63 61 72 65 20 6f 66 20 66 72 65 65  kes care of free
14ce0 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ing the sqlite3_
14cf0 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
14d00 74 75 72 65 20 61 66 74 65 72 0a 2a 2a 20 65 76  ture after.** ev
14d10 65 72 79 62 6f 64 79 20 68 61 73 20 66 69 6e 69  erybody has fini
14d20 73 68 65 64 20 77 69 74 68 20 69 74 2e 0a 2a 2f  shed with it..*/
14d30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65 73  .static void bes
14d40 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28 57 68  tVirtualIndex(Wh
14d50 65 72 65 42 65 73 74 49 64 78 20 2a 70 29 7b 0a  ereBestIdx *p){.
14d60 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
14d70 3d 20 70 2d 3e 70 50 61 72 73 65 3b 20 20 20 20  = p->pParse;    
14d80 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
14d90 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
14da0 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20 3d  ereClause *pWC =
14db0 20 70 2d 3e 70 57 43 3b 20 20 20 20 20 20 2f 2a   p->pWC;      /*
14dc0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
14dd0 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
14de0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
14df0 20 3d 20 70 2d 3e 70 53 72 63 3b 20 2f 2a 20 54   = p->pSrc; /* T
14e00 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
14e10 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  erm to search */
14e20 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
14e30 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 73   pSrc->pTab;.  s
14e40 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
14e50 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73  o *pIdxInfo;.  s
14e60 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
14e70 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a  dex_constraint *
14e80 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75  pIdxCons;.  stru
14e90 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
14ea0 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
14eb0 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65  e *pUsage;.  Whe
14ec0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
14ed0 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
14ee0 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74   nOrderBy;.  int
14ef0 20 62 41 6c 6c 6f 77 49 4e 3b 20 20 20 20 20 20   bAllowIN;      
14f00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14f10 41 6c 6c 6f 77 20 49 4e 20 6f 70 74 69 6d 69 7a  Allow IN optimiz
14f20 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 64 6f 75 62  ations */.  doub
14f30 6c 65 20 72 43 6f 73 74 3b 0a 0a 20 20 2f 2a 20  le rCost;..  /* 
14f40 4d 61 6b 65 20 73 75 72 65 20 77 73 46 6c 61 67  Make sure wsFlag
14f50 73 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  s is initialized
14f60 20 74 6f 20 73 6f 6d 65 20 73 61 6e 65 20 76 61   to some sane va
14f70 6c 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  lue. Otherwise, 
14f80 69 66 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61 6c  if the .  ** mal
14f90 6c 6f 63 20 69 6e 20 61 6c 6c 6f 63 61 74 65 49  loc in allocateI
14fa0 6e 64 65 78 49 6e 66 6f 28 29 20 66 61 69 6c 73  ndexInfo() fails
14fb0 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69   and this functi
14fc0 6f 6e 20 72 65 74 75 72 6e 73 20 6c 65 61 76 69  on returns leavi
14fd0 6e 67 0a 20 20 2a 2a 20 77 73 46 6c 61 67 73 20  ng.  ** wsFlags 
14fe0 69 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69  in an uninitiali
14ff0 7a 65 64 20 73 74 61 74 65 2c 20 74 68 65 20 63  zed state, the c
15000 61 6c 6c 65 72 20 6d 61 79 20 62 65 68 61 76 65  aller may behave
15010 20 75 6e 70 72 65 64 69 63 74 61 62 6c 79 2e 0a   unpredictably..
15020 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70    */.  memset(&p
15030 2d 3e 63 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f  ->cost, 0, sizeo
15040 66 28 70 2d 3e 63 6f 73 74 29 29 3b 0a 20 20 70  f(p->cost));.  p
15050 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c  ->cost.plan.wsFl
15060 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54  ags = WHERE_VIRT
15070 55 41 4c 54 41 42 4c 45 3b 0a 0a 20 20 2f 2a 20  UALTABLE;..  /* 
15080 49 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  If the sqlite3_i
15090 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
150a0 75 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ure has not been
150b0 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20 2a 2a   previously.  **
150c0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69   allocated and i
150d0 6e 69 74 69 61 6c 69 7a 65 64 2c 20 74 68 65 6e  nitialized, then
150e0 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e   allocate and in
150f0 69 74 69 61 6c 69 7a 65 20 69 74 20 6e 6f 77 2e  itialize it now.
15100 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f  .  */.  pIdxInfo
15110 20 3d 20 2a 70 2d 3e 70 70 49 64 78 49 6e 66 6f   = *p->ppIdxInfo
15120 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  ;.  if( pIdxInfo
15130 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 2d 3e 70  ==0 ){.    *p->p
15140 70 49 64 78 49 6e 66 6f 20 3d 20 70 49 64 78 49  pIdxInfo = pIdxI
15150 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e  nfo = allocateIn
15160 64 65 78 49 6e 66 6f 28 70 29 3b 0a 20 20 7d 0a  dexInfo(p);.  }.
15170 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d    if( pIdxInfo==
15180 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
15190 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68  .  }..  /* At th
151a0 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 73 71  is point, the sq
151b0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
151c0 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
151d0 70 49 64 78 49 6e 66 6f 20 70 6f 69 6e 74 73 0a  pIdxInfo points.
151e0 20 20 2a 2a 20 74 6f 20 77 69 6c 6c 20 68 61 76    ** to will hav
151f0 65 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a  e been initializ
15200 65 64 2c 20 65 69 74 68 65 72 20 64 75 72 69 6e  ed, either durin
15210 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e  g the current in
15220 76 6f 63 61 74 69 6f 6e 20 6f 72 0a 20 20 2a 2a  vocation or.  **
15230 20 64 75 72 69 6e 67 20 73 6f 6d 65 20 70 72 69   during some pri
15240 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 20  or invocation.  
15250 4e 6f 77 20 77 65 20 6a 75 73 74 20 68 61 76 65  Now we just have
15260 20 74 6f 20 63 75 73 74 6f 6d 69 7a 65 20 74 68   to customize th
15270 65 0a 20 20 2a 2a 20 64 65 74 61 69 6c 73 20 6f  e.  ** details o
15280 66 20 70 49 64 78 49 6e 66 6f 20 66 6f 72 20 74  f pIdxInfo for t
15290 68 65 20 63 75 72 72 65 6e 74 20 69 6e 76 6f 63  he current invoc
152a0 61 74 69 6f 6e 20 61 6e 64 20 70 61 73 73 20 69  ation and pass i
152b0 74 20 74 6f 0a 20 20 2a 2a 20 78 42 65 73 74 49  t to.  ** xBestI
152c0 6e 64 65 78 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a  ndex..  */..  /*
152d0 20 54 68 65 20 6d 6f 64 75 6c 65 20 6e 61 6d 65   The module name
152e0 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65 64   must be defined
152f0 2e 20 41 6c 73 6f 2c 20 62 79 20 74 68 69 73 20  . Also, by this 
15300 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 75 73 74  point there must
15310 0a 20 20 2a 2a 20 62 65 20 61 20 70 6f 69 6e 74  .  ** be a point
15320 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
15330 5f 76 74 61 62 20 73 74 72 75 63 74 75 72 65 2e  _vtab structure.
15340 20 4f 74 68 65 72 77 69 73 65 0a 20 20 2a 2a 20   Otherwise.  ** 
15350 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
15360 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 77 6f 75 6c  lumnNames() woul
15370 64 20 68 61 76 65 20 70 69 63 6b 65 64 20 75 70  d have picked up
15380 20 74 68 65 20 65 72 72 6f 72 2e 20 0a 20 20 2a   the error. .  *
15390 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  /.  assert( pTab
153a0 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 20 26 26  ->azModuleArg &&
153b0 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41   pTab->azModuleA
153c0 72 67 5b 30 5d 20 29 3b 0a 20 20 61 73 73 65 72  rg[0] );.  asser
153d0 74 28 20 73 71 6c 69 74 65 33 47 65 74 56 54 61  t( sqlite3GetVTa
153e0 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
153f0 70 54 61 62 29 20 29 3b 0a 0a 20 20 2f 2a 20 54  pTab) );..  /* T
15400 72 79 20 6f 6e 63 65 20 6f 72 20 74 77 69 63 65  ry once or twice
15410 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20  .  On the first 
15420 61 74 74 65 6d 70 74 2c 20 61 6c 6c 6f 77 20 49  attempt, allow I
15430 4e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e  N optimizations.
15440 0a 20 20 2a 2a 20 49 66 20 61 6e 20 49 4e 20 6f  .  ** If an IN o
15450 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61  ptimization is a
15460 63 63 65 70 74 65 64 20 62 79 20 74 68 65 20 76  ccepted by the v
15470 69 72 74 75 61 6c 20 74 61 62 6c 65 20 78 42 65  irtual table xBe
15480 73 74 49 6e 64 65 78 0a 20 20 2a 2a 20 6d 65 74  stIndex.  ** met
15490 68 6f 64 2c 20 62 75 74 20 74 68 65 20 20 70 49  hod, but the  pI
154a0 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 55  nfo->aConstrainU
154b0 73 61 67 65 2e 6f 6d 69 74 20 66 6c 61 67 20 69  sage.omit flag i
154c0 73 20 6e 6f 74 20 73 65 74 2c 20 74 68 65 6e 0a  s not set, then.
154d0 20 20 2a 2a 20 74 68 65 20 71 75 65 72 79 20 77    ** the query w
154e0 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 62 65 63  ill not work bec
154f0 61 75 73 65 20 69 74 20 6d 69 67 68 74 20 61 6c  ause it might al
15500 6c 6f 77 20 64 75 70 6c 69 63 61 74 65 20 72 6f  low duplicate ro
15510 77 73 20 69 6e 0a 20 20 2a 2a 20 6f 75 74 70 75  ws in.  ** outpu
15520 74 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  t.  In that case
15530 2c 20 72 75 6e 20 74 68 65 20 78 42 65 73 74 49  , run the xBestI
15540 6e 64 65 78 20 6d 65 74 68 6f 64 20 61 20 73 65  ndex method a se
15550 63 6f 6e 64 20 74 69 6d 65 0a 20 20 2a 2a 20 77  cond time.  ** w
15560 69 74 68 6f 75 74 20 74 68 65 20 49 4e 20 63 6f  ithout the IN co
15570 6e 73 74 72 61 69 6e 74 73 2e 20 20 55 73 75 61  nstraints.  Usua
15580 6c 6c 79 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e  lly this loop on
15590 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20  ly runs once..  
155a0 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 77 69 6c 6c  ** The loop will
155b0 20 65 78 69 74 20 75 73 69 6e 67 20 61 20 22 62   exit using a "b
155c0 72 65 61 6b 22 20 73 74 61 74 65 6d 65 6e 74 2e  reak" statement.
155d0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 62 41 6c 6c  .  */.  for(bAll
155e0 6f 77 49 4e 3d 31 3b 20 31 3b 20 62 41 6c 6c 6f  owIN=1; 1; bAllo
155f0 77 49 4e 2d 2d 29 7b 0a 20 20 20 20 61 73 73 65  wIN--){.    asse
15600 72 74 28 20 62 41 6c 6c 6f 77 49 4e 3d 3d 30 20  rt( bAllowIN==0 
15610 7c 7c 20 62 41 6c 6c 6f 77 49 4e 3d 3d 31 20 29  || bAllowIN==1 )
15620 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  ;..    /* Set th
15630 65 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e  e aConstraint[].
15640 75 73 61 62 6c 65 20 66 69 65 6c 64 73 20 61 6e  usable fields an
15650 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6c 6c  d initialize all
15660 20 0a 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20   .    ** output 
15670 76 61 72 69 61 62 6c 65 73 20 74 6f 20 7a 65 72  variables to zer
15680 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  o..    **.    **
15690 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e 75   aConstraint[].u
156a0 73 61 62 6c 65 20 69 73 20 74 72 75 65 20 66 6f  sable is true fo
156b0 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 68  r constraints wh
156c0 65 72 65 20 74 68 65 20 72 69 67 68 74 2d 68 61  ere the right-ha
156d0 6e 64 0a 20 20 20 20 2a 2a 20 73 69 64 65 20 63  nd.    ** side c
156e0 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 72 65 66  ontains only ref
156f0 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62 6c 65  erences to table
15700 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
15710 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20   the current.   
15720 20 2a 2a 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f   ** table.  In o
15730 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74  ther words, if t
15740 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  he constraint is
15750 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20   of the form:.  
15760 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
15770 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 3d 20 65        column = e
15780 78 70 72 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  xpr.    **.    *
15790 2a 20 61 6e 64 20 77 65 20 61 72 65 20 65 76 61  * and we are eva
157a0 6c 75 61 74 69 6e 67 20 61 20 6a 6f 69 6e 2c 20  luating a join, 
157b0 74 68 65 6e 20 74 68 65 20 63 6f 6e 73 74 72 61  then the constra
157c0 69 6e 74 20 6f 6e 20 63 6f 6c 75 6d 6e 20 69 73  int on column is
157d0 20 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 76 61   .    ** only va
157e0 6c 69 64 20 69 66 20 61 6c 6c 20 74 61 62 6c 65  lid if all table
157f0 73 20 72 65 66 65 72 65 6e 63 65 64 20 69 6e 20  s referenced in 
15800 65 78 70 72 20 6f 63 63 75 72 20 74 6f 20 74 68  expr occur to th
15810 65 20 6c 65 66 74 0a 20 20 20 20 2a 2a 20 6f 66  e left.    ** of
15820 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61   the table conta
15830 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2e 0a 20 20  ining column..  
15840 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
15850 61 43 6f 6e 73 74 72 61 69 6e 74 73 5b 5d 20 61  aConstraints[] a
15860 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 65 6e  rray contains en
15870 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f  tries for all co
15880 6e 73 74 72 61 69 6e 74 73 0a 20 20 20 20 2a 2a  nstraints.    **
15890 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
158a0 74 61 62 6c 65 2e 20 20 54 68 61 74 20 77 61 79  table.  That way
158b0 20 77 65 20 6f 6e 6c 79 20 68 61 76 65 20 74 6f   we only have to
158c0 20 63 6f 6d 70 75 74 65 20 69 74 20 6f 6e 63 65   compute it once
158d0 0a 20 20 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f  .    ** even tho
158e0 75 67 68 20 77 65 20 6d 69 67 68 74 20 74 72 79  ugh we might try
158f0 20 74 6f 20 70 69 63 6b 20 74 68 65 20 62 65 73   to pick the bes
15900 74 20 69 6e 64 65 78 20 6d 75 6c 74 69 70 6c 65  t index multiple
15910 20 74 69 6d 65 73 2e 0a 20 20 20 20 2a 2a 20 46   times..    ** F
15920 6f 72 20 65 61 63 68 20 61 74 74 65 6d 70 74 20  or each attempt 
15930 61 74 20 70 69 63 6b 69 6e 67 20 61 6e 20 69 6e  at picking an in
15940 64 65 78 2c 20 74 68 65 20 6f 72 64 65 72 20 6f  dex, the order o
15950 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 0a  f tables in the.
15960 20 20 20 20 2a 2a 20 6a 6f 69 6e 20 6d 69 67 68      ** join migh
15970 74 20 62 65 20 64 69 66 66 65 72 65 6e 74 20 73  t be different s
15980 6f 20 77 65 20 68 61 76 65 20 74 6f 20 72 65 63  o we have to rec
15990 6f 6d 70 75 74 65 20 74 68 65 20 75 73 61 62 6c  ompute the usabl
159a0 65 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20 65 61  e flag.    ** ea
159b0 63 68 20 74 69 6d 65 2e 0a 20 20 20 20 2a 2f 0a  ch time..    */.
159c0 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a      pIdxCons = *
159d0 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
159e0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
159f0 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
15a00 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 70  onstraint;.    p
15a10 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66 6f  Usage = pIdxInfo
15a20 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
15a30 67 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ge;.    for(i=0;
15a40 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f   i<pIdxInfo->nCo
15a50 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70  nstraint; i++, p
15a60 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20  IdxCons++){.    
15a70 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e    j = pIdxCons->
15a80 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20  iTermOffset;.   
15a90 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
15aa0 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28  >a[j];.      if(
15ab0 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
15ac0 69 67 68 74 26 70 2d 3e 6e 6f 74 52 65 61 64 79  ight&p->notReady
15ad0 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28  )==0.       && (
15ae0 62 41 6c 6c 6f 77 49 4e 20 7c 7c 20 28 70 54 65  bAllowIN || (pTe
15af0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
15b00 57 4f 5f 49 4e 29 3d 3d 30 29 0a 20 20 20 20 20  WO_IN)==0).     
15b10 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78   ){.        pIdx
15b20 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31  Cons->usable = 1
15b30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
15b40 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
15b50 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  >usable = 0;.   
15b60 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6d     }.    }.    m
15b70 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30 2c  emset(pUsage, 0,
15b80 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b 30   sizeof(pUsage[0
15b90 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f  ])*pIdxInfo->nCo
15ba0 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 69  nstraint);.    i
15bb0 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65  f( pIdxInfo->nee
15bc0 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 7b  dToFreeIdxStr ){
15bd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
15be0 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64  ree(pIdxInfo->id
15bf0 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  xStr);.    }.   
15c00 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74   pIdxInfo->idxSt
15c10 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49  r = 0;.    pIdxI
15c20 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b  nfo->idxNum = 0;
15c30 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e  .    pIdxInfo->n
15c40 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
15c50 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  = 0;.    pIdxInf
15c60 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  o->orderByConsum
15c70 65 64 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 28  ed = 0;.    /* (
15c80 28 64 6f 75 62 6c 65 29 32 29 20 49 6e 20 63 61  (double)2) In ca
15c90 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49  se of SQLITE_OMI
15ca0 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
15cb0 2e 2e 2e 20 2a 2f 0a 20 20 20 20 70 49 64 78 49  ... */.    pIdxI
15cc0 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
15cd0 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f  st = SQLITE_BIG_
15ce0 44 42 4c 20 2f 20 28 28 64 6f 75 62 6c 65 29 32  DBL / ((double)2
15cf0 29 3b 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20  );.    nOrderBy 
15d00 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64  = pIdxInfo->nOrd
15d10 65 72 42 79 3b 0a 20 20 20 20 69 66 28 20 21 70  erBy;.    if( !p
15d20 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
15d30 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f      pIdxInfo->nO
15d40 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
15d50 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 76 74 61  }.  .    if( vta
15d60 62 42 65 73 74 49 6e 64 65 78 28 70 50 61 72 73  bBestIndex(pPars
15d70 65 2c 20 70 54 61 62 2c 20 70 49 64 78 49 6e 66  e, pTab, pIdxInf
15d80 6f 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  o) ){.      retu
15d90 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  rn;.    }.  .   
15da0 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74   pIdxCons = *(st
15db0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
15dc0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29  ex_constraint**)
15dd0 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
15de0 74 72 61 69 6e 74 3b 0a 20 20 20 20 66 6f 72 28  traint;.    for(
15df0 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d  i=0; i<pIdxInfo-
15e00 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
15e10 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a  +, pIdxCons++){.
15e20 20 20 20 20 20 20 69 66 28 20 70 55 73 61 67 65        if( pUsage
15e30 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20  [i].argvIndex>0 
15e40 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70  ){.        j = p
15e50 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66  IdxCons->iTermOf
15e60 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 70 54  fset;.        pT
15e70 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d  erm = &pWC->a[j]
15e80 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 6f 73  ;.        p->cos
15e90 74 2e 75 73 65 64 20 7c 3d 20 70 54 65 72 6d 2d  t.used |= pTerm-
15ea0 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20  >prereqRight;.  
15eb0 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
15ec0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
15ed0 5f 49 4e 29 21 3d 30 20 26 26 20 70 55 73 61 67  _IN)!=0 && pUsag
15ee0 65 5b 69 5d 2e 6f 6d 69 74 3d 3d 30 20 29 7b 0a  e[i].omit==0 ){.
15ef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
15f00 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 75  not attempt to u
15f10 73 65 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61  se an IN constra
15f20 69 6e 74 20 69 66 20 74 68 65 20 76 69 72 74 75  int if the virtu
15f30 61 6c 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20  al table.       
15f40 20 20 20 2a 2a 20 73 61 79 73 20 74 68 61 74 20     ** says that 
15f50 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 45  the equivalent E
15f60 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e  Q constraint can
15f70 6e 6f 74 20 62 65 20 73 61 66 65 6c 79 20 6f 6d  not be safely om
15f80 69 74 74 65 64 2e 0a 20 20 20 20 20 20 20 20 20  itted..         
15f90 20 2a 2a 20 49 66 20 77 65 20 64 6f 20 61 74 74   ** If we do att
15fa0 65 6d 70 74 20 74 6f 20 75 73 65 20 73 75 63 68  empt to use such
15fb0 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 73   a constraint, s
15fc0 6f 6d 65 20 72 6f 77 73 20 6d 69 67 68 74 20 62  ome rows might b
15fd0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72  e.          ** r
15fe0 65 70 65 61 74 65 64 20 69 6e 20 74 68 65 20 6f  epeated in the o
15ff0 75 74 70 75 74 2e 20 2a 2f 0a 20 20 20 20 20 20  utput. */.      
16000 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
16010 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
16020 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 70 49   }.    if( i>=pI
16030 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
16040 69 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  int ) break;.  }
16050 0a 20 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  .  .  /* If ther
16060 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
16070 20 63 6c 61 75 73 65 2c 20 61 6e 64 20 74 68 65   clause, and the
16080 20 73 65 6c 65 63 74 65 64 20 76 69 72 74 75 61   selected virtua
16090 6c 20 74 61 62 6c 65 20 69 6e 64 65 78 0a 20 20  l table index.  
160a0 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73 61 74 69  ** does not sati
160b0 73 66 79 20 69 74 2c 20 69 6e 63 72 65 61 73 65  sfy it, increase
160c0 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65   the cost of the
160d0 20 73 63 61 6e 20 61 63 63 6f 72 64 69 6e 67 6c   scan accordingl
160e0 79 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6d 61 74  y. This.  ** mat
160f0 63 68 65 73 20 74 68 65 20 70 72 6f 63 65 73 73  ches the process
16100 69 6e 67 20 66 6f 72 20 6e 6f 6e 2d 76 69 72 74  ing for non-virt
16110 75 61 6c 20 74 61 62 6c 65 73 20 69 6e 20 62 65  ual tables in be
16120 73 74 42 74 72 65 65 49 6e 64 65 78 28 29 2e 0a  stBtreeIndex()..
16130 20 20 2a 2f 0a 20 20 72 43 6f 73 74 20 3d 20 70    */.  rCost = p
16140 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
16150 65 64 43 6f 73 74 3b 0a 20 20 69 66 28 20 70 2d  edCost;.  if( p-
16160 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70 49 64  >pOrderBy && pId
16170 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
16180 6e 73 75 6d 65 64 3d 3d 30 20 29 7b 0a 20 20 20  nsumed==0 ){.   
16190 20 72 43 6f 73 74 20 2b 3d 20 65 73 74 4c 6f 67   rCost += estLog
161a0 28 72 43 6f 73 74 29 2a 72 43 6f 73 74 3b 0a 20  (rCost)*rCost;. 
161b0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 73   }..  /* The cos
161c0 74 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  t is not allowed
161d0 20 74 6f 20 62 65 20 6c 61 72 67 65 72 20 74 68   to be larger th
161e0 61 6e 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42  an SQLITE_BIG_DB
161f0 4c 20 28 74 68 65 0a 20 20 2a 2a 20 69 6e 69 74  L (the.  ** init
16200 61 6c 20 76 61 6c 75 65 20 6f 66 20 6c 6f 77 65  al value of lowe
16210 73 74 43 6f 73 74 20 69 6e 20 74 68 69 73 20 6c  stCost in this l
16220 6f 6f 70 2e 20 49 66 20 69 74 20 69 73 2c 20 74  oop. If it is, t
16230 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 28 63 6f  hen the.  ** (co
16240 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74 29 20 74  st<lowestCost) t
16250 65 73 74 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e  est below will n
16260 65 76 65 72 20 62 65 20 74 72 75 65 2e 0a 20 20  ever be true..  
16270 2a 2a 20 0a 20 20 2a 2a 20 55 73 65 20 22 28 64  ** .  ** Use "(d
16280 6f 75 62 6c 65 29 32 22 20 69 6e 73 74 65 61 64  ouble)2" instead
16290 20 6f 66 20 22 32 2e 30 22 20 69 6e 20 63 61 73   of "2.0" in cas
162a0 65 20 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  e OMIT_FLOATING_
162b0 50 4f 49 4e 54 20 0a 20 20 2a 2a 20 69 73 20 64  POINT .  ** is d
162c0 65 66 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  efined..  */.  i
162d0 66 28 20 28 53 51 4c 49 54 45 5f 42 49 47 5f 44  f( (SQLITE_BIG_D
162e0 42 4c 2f 28 28 64 6f 75 62 6c 65 29 32 29 29 3c  BL/((double)2))<
162f0 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e  rCost ){.    p->
16300 63 6f 73 74 2e 72 43 6f 73 74 20 3d 20 28 53 51  cost.rCost = (SQ
16310 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f 28 28 64  LITE_BIG_DBL/((d
16320 6f 75 62 6c 65 29 32 29 29 3b 0a 20 20 7d 65 6c  ouble)2));.  }el
16330 73 65 7b 0a 20 20 20 20 70 2d 3e 63 6f 73 74 2e  se{.    p->cost.
16340 72 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20  rCost = rCost;. 
16350 20 7d 0a 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61   }.  p->cost.pla
16360 6e 2e 75 2e 70 56 74 61 62 49 64 78 20 3d 20 70  n.u.pVtabIdx = p
16370 49 64 78 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70  IdxInfo;.  if( p
16380 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
16390 43 6f 6e 73 75 6d 65 64 20 29 7b 0a 20 20 20 20  Consumed ){.    
163a0 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46  p->cost.plan.wsF
163b0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 52  lags |= WHERE_OR
163c0 44 45 52 45 44 3b 0a 20 20 20 20 70 2d 3e 63 6f  DERED;.    p->co
163d0 73 74 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 3d  st.plan.nOBSat =
163e0 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 7d 65 6c   nOrderBy;.  }el
163f0 73 65 7b 0a 20 20 20 20 70 2d 3e 63 6f 73 74 2e  se{.    p->cost.
16400 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 3d 20 70 2d  plan.nOBSat = p-
16410 3e 69 20 3f 20 70 2d 3e 61 4c 65 76 65 6c 5b 70  >i ? p->aLevel[p
16420 2d 3e 69 2d 31 5d 2e 70 6c 61 6e 2e 6e 4f 42 53  ->i-1].plan.nOBS
16430 61 74 20 3a 20 30 3b 0a 20 20 7d 0a 20 20 70 2d  at : 0;.  }.  p-
16440 3e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 45 71 20 3d  >cost.plan.nEq =
16450 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   0;.  pIdxInfo->
16460 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65  nOrderBy = nOrde
16470 72 42 79 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74  rBy;..  /* Try t
16480 6f 20 66 69 6e 64 20 61 20 6d 6f 72 65 20 65 66  o find a more ef
16490 66 69 63 69 65 6e 74 20 61 63 63 65 73 73 20 70  ficient access p
164a0 61 74 74 65 72 6e 20 62 79 20 75 73 69 6e 67 20  attern by using 
164b0 6d 75 6c 74 69 70 6c 65 20 69 6e 64 65 78 65 73  multiple indexes
164c0 0a 20 20 2a 2a 20 74 6f 20 6f 70 74 69 6d 69 7a  .  ** to optimiz
164d0 65 20 61 6e 20 4f 52 20 65 78 70 72 65 73 73 69  e an OR expressi
164e0 6f 6e 20 77 69 74 68 69 6e 20 74 68 65 20 57 48  on within the WH
164f0 45 52 45 20 63 6c 61 75 73 65 2e 20 0a 20 20 2a  ERE clause. .  *
16500 2f 0a 20 20 62 65 73 74 4f 72 43 6c 61 75 73 65  /.  bestOrClause
16510 49 6e 64 65 78 28 70 29 3b 0a 7d 0a 23 65 6e 64  Index(p);.}.#end
16520 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
16530 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
16540 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
16550 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 2f 2a  _ENABLE_STAT3./*
16560 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
16570 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 70   location of a p
16580 61 72 74 69 63 75 6c 61 72 20 6b 65 79 20 61 6d  articular key am
16590 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20 69 6e 20  ong all keys in 
165a0 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 53 74  an.** index.  St
165b0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
165c0 69 6e 20 61 53 74 61 74 20 61 73 20 66 6f 6c 6c  in aStat as foll
165d0 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 53  ows:.**.**    aS
165e0 74 61 74 5b 30 5d 20 20 20 20 20 20 45 73 74 2e  tat[0]      Est.
165f0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
16600 6c 65 73 73 20 74 68 61 6e 20 70 56 61 6c 0a 2a  less than pVal.*
16610 2a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 20 20  *    aStat[1]   
16620 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f     Est. number o
16630 66 20 72 6f 77 73 20 65 71 75 61 6c 20 74 6f 20  f rows equal to 
16640 70 56 61 6c 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  pVal.**.** Retur
16650 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
16660 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69  uccess..*/.stati
16670 63 20 69 6e 74 20 77 68 65 72 65 4b 65 79 53 74  c int whereKeySt
16680 61 74 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ats(.  Parse *pP
16690 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
166a0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
166b0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49  onnection */.  I
166c0 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
166d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
166e0 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65 72 20  dex to consider 
166f0 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 73  domain of */.  s
16700 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
16710 61 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 56 61  al,        /* Va
16720 6c 75 65 20 74 6f 20 63 6f 6e 73 69 64 65 72 20  lue to consider 
16730 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55 70  */.  int roundUp
16740 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16750 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69 66 20   /* Round up if 
16760 74 72 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77  true.  Round dow
16770 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20  n if false */.  
16780 74 52 6f 77 63 6e 74 20 2a 61 53 74 61 74 20 20  tRowcnt *aStat  
16790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
167a0 55 54 3a 20 73 74 61 74 73 20 77 72 69 74 74 65  UT: stats writte
167b0 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 74  n here */.){.  t
167c0 52 6f 77 63 6e 74 20 6e 3b 0a 20 20 49 6e 64 65  Rowcnt n;.  Inde
167d0 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65  xSample *aSample
167e0 3b 0a 20 20 69 6e 74 20 69 2c 20 65 54 79 70 65  ;.  int i, eType
167f0 3b 0a 20 20 69 6e 74 20 69 73 45 71 20 3d 20 30  ;.  int isEq = 0
16800 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20 64 6f 75  ;.  i64 v;.  dou
16810 62 6c 65 20 72 2c 20 72 53 3b 0a 0a 20 20 61 73  ble r, rS;..  as
16820 73 65 72 74 28 20 72 6f 75 6e 64 55 70 3d 3d 30  sert( roundUp==0
16830 20 7c 7c 20 72 6f 75 6e 64 55 70 3d 3d 31 20 29   || roundUp==1 )
16840 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  ;.  assert( pIdx
16850 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20  ->nSample>0 );. 
16860 20 69 66 28 20 70 56 61 6c 3d 3d 30 20 29 20 72   if( pVal==0 ) r
16870 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
16880 4f 52 3b 0a 20 20 6e 20 3d 20 70 49 64 78 2d 3e  OR;.  n = pIdx->
16890 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 61  aiRowEst[0];.  a
168a0 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61  Sample = pIdx->a
168b0 53 61 6d 70 6c 65 3b 0a 20 20 65 54 79 70 65 20  Sample;.  eType 
168c0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
168d0 74 79 70 65 28 70 56 61 6c 29 3b 0a 0a 20 20 69  type(pVal);..  i
168e0 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  f( eType==SQLITE
168f0 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
16900 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  v = sqlite3_valu
16910 65 5f 69 6e 74 36 34 28 70 56 61 6c 29 3b 0a 20  e_int64(pVal);. 
16920 20 20 20 72 20 3d 20 28 69 36 34 29 76 3b 0a 20     r = (i64)v;. 
16930 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
16940 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b  dx->nSample; i++
16950 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53 61  ){.      if( aSa
16960 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53  mple[i].eType==S
16970 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 63 6f 6e  QLITE_NULL ) con
16980 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
16990 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70   aSample[i].eTyp
169a0 65 3e 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29  e>=SQLITE_TEXT )
169b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
169c0 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79  ( aSample[i].eTy
169d0 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47  pe==SQLITE_INTEG
169e0 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ER ){.        if
169f0 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 69  ( aSample[i].u.i
16a00 3e 3d 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=v ){.         
16a10 20 69 73 45 71 20 3d 20 61 53 61 6d 70 6c 65 5b   isEq = aSample[
16a20 69 5d 2e 75 2e 69 3d 3d 76 3b 0a 20 20 20 20 20  i].u.i==v;.     
16a30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16a40 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
16a50 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
16a60 74 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54  t( aSample[i].eT
16a70 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41  ype==SQLITE_FLOA
16a80 54 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  T );.        if(
16a90 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3e   aSample[i].u.r>
16aa0 3d 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =r ){.          
16ab0 69 73 45 71 20 3d 20 61 53 61 6d 70 6c 65 5b 69  isEq = aSample[i
16ac0 5d 2e 75 2e 72 3d 3d 72 3b 0a 20 20 20 20 20 20  ].u.r==r;.      
16ad0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
16ae0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
16af0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65   }.  }else if( e
16b00 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f  Type==SQLITE_FLO
16b10 41 54 20 29 7b 0a 20 20 20 20 72 20 3d 20 73 71  AT ){.    r = sq
16b20 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
16b30 6c 65 28 70 56 61 6c 29 3b 0a 20 20 20 20 66 6f  le(pVal);.    fo
16b40 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
16b50 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20  Sample; i++){.  
16b60 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b      if( aSample[
16b70 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  i].eType==SQLITE
16b80 5f 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65  _NULL ) continue
16b90 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53 61 6d  ;.      if( aSam
16ba0 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3e 3d 53 51  ple[i].eType>=SQ
16bb0 4c 49 54 45 5f 54 45 58 54 20 29 20 62 72 65 61  LITE_TEXT ) brea
16bc0 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53 61  k;.      if( aSa
16bd0 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53  mple[i].eType==S
16be0 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20  QLITE_FLOAT ){. 
16bf0 20 20 20 20 20 20 20 72 53 20 3d 20 61 53 61 6d         rS = aSam
16c00 70 6c 65 5b 69 5d 2e 75 2e 72 3b 0a 20 20 20 20  ple[i].u.r;.    
16c10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16c20 20 72 53 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d   rS = aSample[i]
16c30 2e 75 2e 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  .u.i;.      }.  
16c40 20 20 20 20 69 66 28 20 72 53 3e 3d 72 20 29 7b      if( rS>=r ){
16c50 0a 20 20 20 20 20 20 20 20 69 73 45 71 20 3d 20  .        isEq = 
16c60 72 53 3d 3d 72 3b 0a 20 20 20 20 20 20 20 20 62  rS==r;.        b
16c70 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
16c80 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
16c90 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55  eType==SQLITE_NU
16ca0 4c 4c 20 29 7b 0a 20 20 20 20 69 20 3d 20 30 3b  LL ){.    i = 0;
16cb0 0a 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65  .    if( aSample
16cc0 5b 30 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54  [0].eType==SQLIT
16cd0 45 5f 4e 55 4c 4c 20 29 20 69 73 45 71 20 3d 20  E_NULL ) isEq = 
16ce0 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
16cf0 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53  assert( eType==S
16d00 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c 20 65 54  QLITE_TEXT || eT
16d10 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42  ype==SQLITE_BLOB
16d20 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
16d30 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65   i<pIdx->nSample
16d40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
16d50 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79  ( aSample[i].eTy
16d60 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20  pe==SQLITE_TEXT 
16d70 7c 7c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54  || aSample[i].eT
16d80 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42  ype==SQLITE_BLOB
16d90 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
16da0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
16db0 0a 20 20 20 20 69 66 28 20 69 3c 70 49 64 78 2d  .    if( i<pIdx-
16dc0 3e 6e 53 61 6d 70 6c 65 20 29 7b 20 20 20 20 20  >nSample ){     
16dd0 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20   .      sqlite3 
16de0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
16df0 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  ;.      CollSeq 
16e00 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 63 6f  *pColl;.      co
16e10 6e 73 74 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20  nst u8 *z;.     
16e20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49   if( eType==SQLI
16e30 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20  TE_BLOB ){.     
16e40 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 38     z = (const u8
16e50 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   *)sqlite3_value
16e60 5f 62 6c 6f 62 28 70 56 61 6c 29 3b 0a 20 20 20  _blob(pVal);.   
16e70 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d       pColl = db-
16e80 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
16e90 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
16ea0 6c 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  l->enc==SQLITE_U
16eb0 54 46 38 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c  TF8 );.      }el
16ec0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  se{.        pCol
16ed0 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f  l = sqlite3GetCo
16ee0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 53 51  llSeq(pParse, SQ
16ef0 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 2a 70  LITE_UTF8, 0, *p
16f00 49 64 78 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 20 20  Idx->azColl);.  
16f10 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d        if( pColl=
16f20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
16f30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
16f40 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROR;.        }. 
16f50 20 20 20 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73         z = (cons
16f60 74 20 75 38 20 2a 29 73 71 6c 69 74 65 33 56 61  t u8 *)sqlite3Va
16f70 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20 70 43  lueText(pVal, pC
16f80 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 20  oll->enc);.     
16f90 20 20 20 69 66 28 20 21 7a 20 29 7b 0a 20 20 20     if( !z ){.   
16fa0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
16fb0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
16fc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
16fd0 73 65 72 74 28 20 7a 20 26 26 20 70 43 6f 6c 6c  sert( z && pColl
16fe0 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20   && pColl->xCmp 
16ff0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
17000 20 6e 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75   n = sqlite3Valu
17010 65 42 79 74 65 73 28 70 56 61 6c 2c 20 70 43 6f  eBytes(pVal, pCo
17020 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 0a 20 20 20  ll->enc);.  .   
17030 20 20 20 66 6f 72 28 3b 20 69 3c 70 49 64 78 2d     for(; i<pIdx-
17040 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a  >nSample; i++){.
17050 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20          int c;. 
17060 20 20 20 20 20 20 20 69 6e 74 20 65 53 61 6d 70         int eSamp
17070 6c 65 74 79 70 65 20 3d 20 61 53 61 6d 70 6c 65  letype = aSample
17080 5b 69 5d 2e 65 54 79 70 65 3b 0a 20 20 20 20 20  [i].eType;.     
17090 20 20 20 69 66 28 20 65 53 61 6d 70 6c 65 74 79     if( eSamplety
170a0 70 65 3c 65 54 79 70 65 20 29 20 63 6f 6e 74 69  pe<eType ) conti
170b0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
170c0 20 65 53 61 6d 70 6c 65 74 79 70 65 21 3d 65 54   eSampletype!=eT
170d0 79 70 65 20 29 20 62 72 65 61 6b 3b 0a 23 69 66  ype ) break;.#if
170e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
170f0 5f 55 54 46 31 36 0a 20 20 20 20 20 20 20 20 69  _UTF16.        i
17100 66 28 20 70 43 6f 6c 6c 2d 3e 65 6e 63 21 3d 53  f( pColl->enc!=S
17110 51 4c 49 54 45 5f 55 54 46 38 20 29 7b 0a 20 20  QLITE_UTF8 ){.  
17120 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 61 6d          int nSam
17130 70 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ple;.          c
17140 68 61 72 20 2a 7a 53 61 6d 70 6c 65 20 3d 20 73  har *zSample = s
17150 71 6c 69 74 65 33 55 74 66 38 74 6f 31 36 28 0a  qlite3Utf8to16(.
17160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 62                db
17170 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 2c 20 61 53  , pColl->enc, aS
17180 61 6d 70 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 61 53  ample[i].u.z, aS
17190 61 6d 70 6c 65 5b 69 5d 2e 6e 42 79 74 65 2c 20  ample[i].nByte, 
171a0 26 6e 53 61 6d 70 6c 65 0a 20 20 20 20 20 20 20  &nSample.       
171b0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
171c0 69 66 28 20 21 7a 53 61 6d 70 6c 65 20 29 7b 0a  if( !zSample ){.
171d0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
171e0 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
171f0 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
17200 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17210 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
17220 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
17230 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70   = pColl->xCmp(p
17240 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e 53 61  Coll->pUser, nSa
17250 6d 70 6c 65 2c 20 7a 53 61 6d 70 6c 65 2c 20 6e  mple, zSample, n
17260 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , z);.          
17270 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
17280 2c 20 7a 53 61 6d 70 6c 65 29 3b 0a 20 20 20 20  , zSample);.    
17290 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
172a0 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
172b0 20 20 20 20 20 63 20 3d 20 70 43 6f 6c 6c 2d 3e       c = pColl->
172c0 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65  xCmp(pColl->pUse
172d0 72 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 42  r, aSample[i].nB
172e0 79 74 65 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  yte, aSample[i].
172f0 75 2e 7a 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20  u.z, n, z);.    
17300 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
17310 28 20 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( c>=0 ){.      
17320 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20 69      if( c==0 ) i
17330 73 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  sEq = 1;.       
17340 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
17350 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
17360 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74  }.  }..  /* At t
17370 68 69 73 20 70 6f 69 6e 74 2c 20 61 53 61 6d 70  his point, aSamp
17380 6c 65 5b 69 5d 20 69 73 20 74 68 65 20 66 69 72  le[i] is the fir
17390 73 74 20 73 61 6d 70 6c 65 20 74 68 61 74 20 69  st sample that i
173a0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 20  s greater than. 
173b0 20 2a 2a 20 6f 72 20 65 71 75 61 6c 20 74 6f 20   ** or equal to 
173c0 70 56 61 6c 2e 20 20 4f 72 20 69 66 20 69 3d 3d  pVal.  Or if i==
173d0 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20 74  pIdx->nSample, t
173e0 68 65 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20  hen all samples 
173f0 61 72 65 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68  are less.  ** th
17400 61 6e 20 70 56 61 6c 2e 20 20 49 66 20 61 53 61  an pVal.  If aSa
17410 6d 70 6c 65 5b 69 5d 3d 3d 70 56 61 6c 2c 20 74  mple[i]==pVal, t
17420 68 65 6e 20 69 73 45 71 3d 3d 31 2e 0a 20 20 2a  hen isEq==1..  *
17430 2f 0a 20 20 69 66 28 20 69 73 45 71 20 29 7b 0a  /.  if( isEq ){.
17440 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70 49      assert( i<pI
17450 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20  dx->nSample );. 
17460 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 61 53     aStat[0] = aS
17470 61 6d 70 6c 65 5b 69 5d 2e 6e 4c 74 3b 0a 20 20  ample[i].nLt;.  
17480 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 61 53 61    aStat[1] = aSa
17490 6d 70 6c 65 5b 69 5d 2e 6e 45 71 3b 0a 20 20 7d  mple[i].nEq;.  }
174a0 65 6c 73 65 7b 0a 20 20 20 20 74 52 6f 77 63 6e  else{.    tRowcn
174b0 74 20 69 4c 6f 77 65 72 2c 20 69 55 70 70 65 72  t iLower, iUpper
174c0 2c 20 69 47 61 70 3b 0a 20 20 20 20 69 66 28 20  , iGap;.    if( 
174d0 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4c  i==0 ){.      iL
174e0 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ower = 0;.      
174f0 69 55 70 70 65 72 20 3d 20 61 53 61 6d 70 6c 65  iUpper = aSample
17500 5b 30 5d 2e 6e 4c 74 3b 0a 20 20 20 20 7d 65 6c  [0].nLt;.    }el
17510 73 65 7b 0a 20 20 20 20 20 20 69 55 70 70 65 72  se{.      iUpper
17520 20 3d 20 69 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d   = i>=pIdx->nSam
17530 70 6c 65 20 3f 20 6e 20 3a 20 61 53 61 6d 70 6c  ple ? n : aSampl
17540 65 5b 69 5d 2e 6e 4c 74 3b 0a 20 20 20 20 20 20  e[i].nLt;.      
17550 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c 65  iLower = aSample
17560 5b 69 2d 31 5d 2e 6e 45 71 20 2b 20 61 53 61 6d  [i-1].nEq + aSam
17570 70 6c 65 5b 69 2d 31 5d 2e 6e 4c 74 3b 0a 20 20  ple[i-1].nLt;.  
17580 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 31 5d    }.    aStat[1]
17590 20 3d 20 70 49 64 78 2d 3e 61 76 67 45 71 3b 0a   = pIdx->avgEq;.
175a0 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d      if( iLower>=
175b0 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20  iUpper ){.      
175c0 69 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65  iGap = 0;.    }e
175d0 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20  lse{.      iGap 
175e0 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65  = iUpper - iLowe
175f0 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
17600 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20 20   roundUp ){.    
17610 20 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a 32    iGap = (iGap*2
17620 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  )/3;.    }else{.
17630 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 47 61        iGap = iGa
17640 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  p/3;.    }.    a
17650 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72  Stat[0] = iLower
17660 20 2b 20 69 47 61 70 3b 0a 20 20 7d 0a 20 20 72   + iGap;.  }.  r
17670 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17680 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
17690 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
176a0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78   */../*.** If ex
176b0 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 72  pression pExpr r
176c0 65 70 72 65 73 65 6e 74 73 20 61 20 6c 69 74 65  epresents a lite
176d0 72 61 6c 20 76 61 6c 75 65 2c 20 73 65 74 20 2a  ral value, set *
176e0 70 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a  pp to point to.*
176f0 2a 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c  * an sqlite3_val
17700 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ue structure con
17710 74 61 69 6e 69 6e 67 20 74 68 65 20 73 61 6d 65  taining the same
17720 20 76 61 6c 75 65 2c 20 77 69 74 68 20 61 66 66   value, with aff
17730 69 6e 69 74 79 0a 2a 2a 20 61 66 66 20 61 70 70  inity.** aff app
17740 6c 69 65 64 20 74 6f 20 69 74 2c 20 62 65 66 6f  lied to it, befo
17750 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 49 74  re returning. It
17760 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
17770 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 0a 2a  bility of the .*
17780 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  * caller to even
17790 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74  tually release t
177a0 68 69 73 20 73 74 72 75 63 74 75 72 65 20 62 79  his structure by
177b0 20 70 61 73 73 69 6e 67 20 69 74 20 74 6f 20 0a   passing it to .
177c0 2a 2a 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  ** sqlite3ValueF
177d0 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ree()..**.** If 
177e0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 72 73  the current pars
177f0 65 20 69 73 20 61 20 72 65 63 6f 6d 70 69 6c 65  e is a recompile
17800 20 28 73 71 6c 69 74 65 33 52 65 70 72 65 70 61   (sqlite3Reprepa
17810 72 65 28 29 29 20 61 6e 64 20 70 45 78 70 72 0a  re()) and pExpr.
17820 2a 2a 20 69 73 20 61 6e 20 53 51 4c 20 76 61 72  ** is an SQL var
17830 69 61 62 6c 65 20 74 68 61 74 20 63 75 72 72 65  iable that curre
17840 6e 74 6c 79 20 68 61 73 20 61 20 6e 6f 6e 2d 4e  ntly has a non-N
17850 55 4c 4c 20 76 61 6c 75 65 20 62 6f 75 6e 64 20  ULL value bound 
17860 74 6f 20 69 74 2c 0a 2a 2a 20 63 72 65 61 74 65  to it,.** create
17870 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   an sqlite3_valu
17880 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  e structure cont
17890 61 69 6e 69 6e 67 20 74 68 69 73 20 76 61 6c 75  aining this valu
178a0 65 2c 20 61 67 61 69 6e 20 77 69 74 68 0a 2a 2a  e, again with.**
178b0 20 61 66 66 69 6e 69 74 79 20 61 66 66 20 61 70   affinity aff ap
178c0 70 6c 69 65 64 20 74 6f 20 69 74 2c 20 69 6e 73  plied to it, ins
178d0 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  tead..**.** If n
178e0 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 61 62  either of the ab
178f0 6f 76 65 20 61 70 70 6c 79 2c 20 73 65 74 20 2a  ove apply, set *
17900 70 70 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  pp to NULL..**.*
17910 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
17920 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20  curs, return an 
17930 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65  error code. Othe
17940 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
17950 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
17960 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a  TE_ENABLE_STAT3.
17970 73 74 61 74 69 63 20 69 6e 74 20 76 61 6c 75 65  static int value
17980 46 72 6f 6d 45 78 70 72 28 0a 20 20 50 61 72 73  FromExpr(.  Pars
17990 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45 78  e *pParse, .  Ex
179a0 70 72 20 2a 70 45 78 70 72 2c 20 0a 20 20 75 38  pr *pExpr, .  u8
179b0 20 61 66 66 2c 20 0a 20 20 73 71 6c 69 74 65 33   aff, .  sqlite3
179c0 5f 76 61 6c 75 65 20 2a 2a 70 70 0a 29 7b 0a 20  _value **pp.){. 
179d0 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
179e0 54 4b 5f 56 41 52 49 41 42 4c 45 0a 20 20 20 7c  TK_VARIABLE.   |
179f0 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  | (pExpr->op==TK
17a00 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 45 78  _REGISTER && pEx
17a10 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 56 41 52 49  pr->op2==TK_VARI
17a20 41 42 4c 45 29 0a 20 20 29 7b 0a 20 20 20 20 69  ABLE).  ){.    i
17a30 6e 74 20 69 56 61 72 20 3d 20 70 45 78 70 72 2d  nt iVar = pExpr-
17a40 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71  >iColumn;.    sq
17a50 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d  lite3VdbeSetVarm
17a60 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62  ask(pParse->pVdb
17a70 65 2c 20 69 56 61 72 29 3b 0a 20 20 20 20 2a 70  e, iVar);.    *p
17a80 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  p = sqlite3VdbeG
17a90 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2d 3e  etValue(pParse->
17aa0 70 52 65 70 72 65 70 61 72 65 2c 20 69 56 61 72  pReprepare, iVar
17ab0 2c 20 61 66 66 29 3b 0a 20 20 20 20 72 65 74 75  , aff);.    retu
17ac0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
17ad0 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  }.  return sqlit
17ae0 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  e3ValueFromExpr(
17af0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70  pParse->db, pExp
17b00 72 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  r, SQLITE_UTF8, 
17b10 61 66 66 2c 20 70 70 29 3b 0a 7d 0a 23 65 6e 64  aff, pp);.}.#end
17b20 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
17b30 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
17b40 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  to estimate the 
17b50 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
17b60 68 61 74 20 77 69 6c 6c 20 62 65 20 76 69 73 69  hat will be visi
17b70 74 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69  ted.** by scanni
17b80 6e 67 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20  ng an index for 
17b90 61 20 72 61 6e 67 65 20 6f 66 20 76 61 6c 75 65  a range of value
17ba0 73 2e 20 54 68 65 20 72 61 6e 67 65 20 6d 61 79  s. The range may
17bb0 20 68 61 76 65 20 61 6e 20 75 70 70 65 72 0a 2a   have an upper.*
17bc0 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72  * bound, a lower
17bd0 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e   bound, or both.
17be0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
17bf0 65 20 74 65 72 6d 73 20 74 68 61 74 20 73 65 74  e terms that set
17c00 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e   the upper.** an
17c10 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20 61  d lower bounds a
17c20 72 65 20 72 65 70 72 65 73 65 6e 74 65 64 20 62  re represented b
17c30 79 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70  y pLower and pUp
17c40 70 65 72 20 72 65 73 70 65 63 74 69 76 65 6c 79  per respectively
17c50 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65  . For.** example
17c60 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20  , assuming that 
17c70 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31  index p is on t1
17c80 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e  (a):.**.**   ...
17c90 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
17ca0 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e   > ? AND a < ? .
17cb0 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ...**           
17cc0 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c           |_____|
17cd0 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20     |_____|.**   
17ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cf0 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c 0a      |         |.
17d00 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
17d10 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20 20 20         pLower   
17d20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66   pUpper.**.** If
17d30 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 75   either of the u
17d40 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f  pper or lower bo
17d50 75 6e 64 20 69 73 20 6e 6f 74 20 70 72 65 73 65  und is not prese
17d60 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73  nt, then NULL is
17d70 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c   passed in.** pl
17d80 61 63 65 20 6f 66 20 74 68 65 20 63 6f 72 72 65  ace of the corre
17d90 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 54 65  sponding WhereTe
17da0 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45  rm..**.** The nE
17db0 71 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 70  q parameter is p
17dc0 61 73 73 65 64 20 74 68 65 20 69 6e 64 65 78 20  assed the index 
17dd0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c  of the index col
17de0 75 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f 20 74  umn subject to t
17df0 68 65 0a 2a 2a 20 72 61 6e 67 65 20 63 6f 6e 73  he.** range cons
17e00 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69  traint. Or, equi
17e10 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75  valently, the nu
17e20 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69 74 79  mber of equality
17e30 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20   constraints.** 
17e40 6f 70 74 69 6d 69 7a 65 64 20 62 79 20 74 68 65  optimized by the
17e50 20 70 72 6f 70 6f 73 65 64 20 69 6e 64 65 78 20   proposed index 
17e60 73 63 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c  scan. For exampl
17e70 65 2c 20 61 73 73 75 6d 69 6e 67 20 69 6e 64 65  e, assuming inde
17e80 78 20 70 20 69 73 0a 2a 2a 20 6f 6e 20 74 31 28  x p is.** on t1(
17e90 61 2c 20 62 29 2c 20 61 6e 64 20 74 68 65 20 53  a, b), and the S
17ea0 51 4c 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a  QL query is:.**.
17eb0 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  **   ... FROM t1
17ec0 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44   WHERE a = ? AND
17ed0 20 62 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f   b > ? AND b < ?
17ee0 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20   ....**.** then 
17ef0 6e 45 71 20 73 68 6f 75 6c 64 20 62 65 20 70 61  nEq should be pa
17f00 73 73 65 64 20 74 68 65 20 76 61 6c 75 65 20 31  ssed the value 1
17f10 20 28 61 73 20 74 68 65 20 72 61 6e 67 65 20 72   (as the range r
17f20 65 73 74 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e  estricted column
17f30 2c 0a 2a 2a 20 62 2c 20 69 73 20 74 68 65 20 73  ,.** b, is the s
17f40 65 63 6f 6e 64 20 6c 65 66 74 2d 6d 6f 73 74 20  econd left-most 
17f50 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
17f60 64 65 78 29 2e 20 4f 72 2c 20 69 66 20 74 68 65  dex). Or, if the
17f70 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a   query is:.**.**
17f80 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57     ... FROM t1 W
17f90 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61  HERE a > ? AND a
17fa0 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74   < ? ....**.** t
17fb0 68 65 6e 20 6e 45 71 20 73 68 6f 75 6c 64 20 62  hen nEq should b
17fc0 65 20 70 61 73 73 65 64 20 30 2e 0a 2a 2a 0a 2a  e passed 0..**.*
17fd0 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
17fe0 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 74 65 67  alue is an integ
17ff0 65 72 20 64 69 76 69 73 6f 72 20 74 6f 20 72 65  er divisor to re
18000 64 75 63 65 20 74 68 65 20 65 73 74 69 6d 61 74  duce the estimat
18010 65 64 0a 2a 2a 20 73 65 61 72 63 68 20 73 70 61  ed.** search spa
18020 63 65 2e 20 20 41 20 72 65 74 75 72 6e 20 76 61  ce.  A return va
18030 6c 75 65 20 6f 66 20 31 20 6d 65 61 6e 73 20 74  lue of 1 means t
18040 68 61 74 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  hat range constr
18050 61 69 6e 74 73 20 61 72 65 0a 2a 2a 20 6e 6f 20  aints are.** no 
18060 68 65 6c 70 20 61 74 20 61 6c 6c 2e 20 20 41 20  help at all.  A 
18070 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
18080 32 20 6d 65 61 6e 73 20 72 61 6e 67 65 20 63 6f  2 means range co
18090 6e 73 74 72 61 69 6e 74 73 20 61 72 65 0a 2a 2a  nstraints are.**
180a0 20 65 78 70 65 63 74 65 64 20 74 6f 20 72 65 64   expected to red
180b0 75 63 65 20 74 68 65 20 73 65 61 72 63 68 20 73  uce the search s
180c0 70 61 63 65 20 62 79 20 68 61 6c 66 2e 20 20 41  pace by half.  A
180d0 6e 64 20 73 6f 20 66 6f 72 74 68 2e 2e 2e 0a 2a  nd so forth....*
180e0 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62 73 65  *.** In the abse
180f0 6e 63 65 20 6f 66 20 73 71 6c 69 74 65 5f 73 74  nce of sqlite_st
18100 61 74 33 20 41 4e 41 4c 59 5a 45 20 64 61 74 61  at3 ANALYZE data
18110 2c 20 65 61 63 68 20 72 61 6e 67 65 20 69 6e 65  , each range ine
18120 71 75 61 6c 69 74 79 0a 2a 2a 20 72 65 64 75 63  quality.** reduc
18130 65 73 20 74 68 65 20 73 65 61 72 63 68 20 73 70  es the search sp
18140 61 63 65 20 62 79 20 61 20 66 61 63 74 6f 72 20  ace by a factor 
18150 6f 66 20 34 2e 20 20 48 65 6e 63 65 20 61 20 73  of 4.  Hence a s
18160 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74  ingle constraint
18170 20 28 78 3e 3f 29 0a 2a 2a 20 72 65 73 75 6c 74   (x>?).** result
18180 73 20 69 6e 20 61 20 72 65 74 75 72 6e 20 6f 66  s in a return of
18190 20 34 20 61 6e 64 20 61 20 72 61 6e 67 65 20 63   4 and a range c
181a0 6f 6e 73 74 72 61 69 6e 74 20 28 78 3e 3f 20 41  onstraint (x>? A
181b0 4e 44 20 78 3c 3f 29 20 72 65 73 75 6c 74 73 0a  ND x<?) results.
181c0 2a 2a 20 69 6e 20 61 20 72 65 74 75 72 6e 20 6f  ** in a return o
181d0 66 20 31 36 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  f 16..*/.static 
181e0 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65 53 63  int whereRangeSc
181f0 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a  anEst(.  Parse *
18200 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
18210 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20   Parsing & code 
18220 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
18230 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  xt */.  Index *p
18240 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
18250 54 68 65 20 69 6e 64 65 78 20 63 6f 6e 74 61 69  The index contai
18260 6e 69 6e 67 20 74 68 65 20 72 61 6e 67 65 2d 63  ning the range-c
18270 6f 6d 70 61 72 65 64 20 63 6f 6c 75 6d 6e 3b 20  ompared column; 
18280 22 78 22 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71  "x" */.  int nEq
18290 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
182a0 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 2d 3e 61   index into p->a
182b0 43 6f 6c 5b 5d 20 6f 66 20 74 68 65 20 72 61 6e  Col[] of the ran
182c0 67 65 2d 63 6f 6d 70 61 72 65 64 20 63 6f 6c 75  ge-compared colu
182d0 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  mn */.  WhereTer
182e0 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20  m *pLower,   /* 
182f0 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74  Lower bound on t
18300 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78  he range. ex: "x
18310 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e  >123" Might be N
18320 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ULL */.  WhereTe
18330 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a  rm *pUpper,   /*
18340 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20   Upper bound on 
18350 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22  the range. ex: "
18360 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65 20  x<455" Might be 
18370 4e 55 4c 4c 20 2a 2f 0a 20 20 64 6f 75 62 6c 65  NULL */.  double
18380 20 2a 70 52 61 6e 67 65 44 69 76 20 20 20 2f 2a   *pRangeDiv   /*
18390 20 4f 55 54 3a 20 52 65 64 75 63 65 20 73 65 61   OUT: Reduce sea
183a0 72 63 68 20 73 70 61 63 65 20 62 79 20 74 68 69  rch space by thi
183b0 73 20 64 69 76 69 73 6f 72 20 2a 2f 0a 29 7b 0a  s divisor */.){.
183c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
183d0 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66 20 53 51  E_OK;..#ifdef SQ
183e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
183f0 33 0a 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30 20  3..  if( nEq==0 
18400 26 26 20 70 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b  && p->nSample ){
18410 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  .    sqlite3_val
18420 75 65 20 2a 70 52 61 6e 67 65 56 61 6c 3b 0a 20  ue *pRangeVal;. 
18430 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65     tRowcnt iLowe
18440 72 20 3d 20 30 3b 0a 20 20 20 20 74 52 6f 77 63  r = 0;.    tRowc
18450 6e 74 20 69 55 70 70 65 72 20 3d 20 70 2d 3e 61  nt iUpper = p->a
18460 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20  iRowEst[0];.    
18470 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20  tRowcnt a[2];.  
18480 20 20 75 38 20 61 66 66 20 3d 20 70 2d 3e 70 54    u8 aff = p->pT
18490 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69  able->aCol[p->ai
184a0 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e  Column[0]].affin
184b0 69 74 79 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c  ity;..    if( pL
184c0 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 45 78  ower ){.      Ex
184d0 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77  pr *pExpr = pLow
184e0 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  er->pExpr->pRigh
184f0 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 76 61  t;.      rc = va
18500 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72  lueFromExpr(pPar
18510 73 65 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20  se, pExpr, aff, 
18520 26 70 52 61 6e 67 65 56 61 6c 29 3b 0a 20 20 20  &pRangeVal);.   
18530 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 77     assert( (pLow
18540 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
18550 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29 21 3d  (WO_GT|WO_GE))!=
18560 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  0 );.      if( r
18570 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  c==SQLITE_OK.   
18580 20 20 20 20 26 26 20 77 68 65 72 65 4b 65 79 53      && whereKeyS
18590 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
185a0 70 52 61 6e 67 65 56 61 6c 2c 20 30 2c 20 61 29  pRangeVal, 0, a)
185b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20  ==SQLITE_OK.    
185c0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 6f    ){.        iLo
185d0 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20  wer = a[0];.    
185e0 20 20 20 20 69 66 28 20 28 70 4c 6f 77 65 72 2d      if( (pLower-
185f0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
18600 47 54 29 21 3d 30 20 29 20 69 4c 6f 77 65 72 20  GT)!=0 ) iLower 
18610 2b 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d  += a[1];.      }
18620 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61  .      sqlite3Va
18630 6c 75 65 46 72 65 65 28 70 52 61 6e 67 65 56 61  lueFree(pRangeVa
18640 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  l);.    }.    if
18650 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18660 26 26 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20  && pUpper ){.   
18670 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
18680 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e   pUpper->pExpr->
18690 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 72 63  pRight;.      rc
186a0 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72   = valueFromExpr
186b0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
186c0 61 66 66 2c 20 26 70 52 61 6e 67 65 56 61 6c 29  aff, &pRangeVal)
186d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
186e0 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74  (pUpper->eOperat
186f0 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c  or & (WO_LT|WO_L
18700 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  E))!=0 );.      
18710 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18720 4b 0a 20 20 20 20 20 20 20 26 26 20 77 68 65 72  K.       && wher
18730 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65  eKeyStats(pParse
18740 2c 20 70 2c 20 70 52 61 6e 67 65 56 61 6c 2c 20  , p, pRangeVal, 
18750 31 2c 20 61 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1, a)==SQLITE_OK
18760 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
18770 20 20 69 55 70 70 65 72 20 3d 20 61 5b 30 5d 3b    iUpper = a[0];
18780 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 55  .        if( (pU
18790 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pper->eOperator 
187a0 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29 20 69 55  & WO_LE)!=0 ) iU
187b0 70 70 65 72 20 2b 3d 20 61 5b 31 5d 3b 0a 20 20  pper += a[1];.  
187c0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
187d0 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 52 61  te3ValueFree(pRa
187e0 6e 67 65 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20  ngeVal);.    }. 
187f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18800 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
18810 28 20 69 55 70 70 65 72 3c 3d 69 4c 6f 77 65 72  ( iUpper<=iLower
18820 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 61   ){.        *pRa
18830 6e 67 65 44 69 76 20 3d 20 28 64 6f 75 62 6c 65  ngeDiv = (double
18840 29 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b  )p->aiRowEst[0];
18850 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
18860 20 20 20 20 20 20 2a 70 52 61 6e 67 65 44 69 76        *pRangeDiv
18870 20 3d 20 28 64 6f 75 62 6c 65 29 70 2d 3e 61 69   = (double)p->ai
18880 52 6f 77 45 73 74 5b 30 5d 2f 28 64 6f 75 62 6c  RowEst[0]/(doubl
18890 65 29 28 69 55 70 70 65 72 20 2d 20 69 4c 6f 77  e)(iUpper - iLow
188a0 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
188b0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22     WHERETRACE(("
188c0 72 61 6e 67 65 20 73 63 61 6e 20 72 65 67 69 6f  range scan regio
188d0 6e 73 3a 20 25 75 2e 2e 25 75 20 20 64 69 76 3d  ns: %u..%u  div=
188e0 25 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %g\n",.         
188f0 20 20 20 20 20 20 20 20 20 28 75 33 32 29 69 4c           (u32)iL
18900 6f 77 65 72 2c 20 28 75 33 32 29 69 55 70 70 65  ower, (u32)iUppe
18910 72 2c 20 2a 70 52 61 6e 67 65 44 69 76 29 29 3b  r, *pRangeDiv));
18920 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
18930 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
18940 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45   }.#else.  UNUSE
18950 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 72  D_PARAMETER(pPar
18960 73 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  se);.  UNUSED_PA
18970 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 55 4e  RAMETER(p);.  UN
18980 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
18990 45 71 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  Eq);.#endif.  as
189a0 73 65 72 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20  sert( pLower || 
189b0 70 55 70 70 65 72 20 29 3b 0a 20 20 2a 70 52 61  pUpper );.  *pRa
189c0 6e 67 65 44 69 76 20 3d 20 28 64 6f 75 62 6c 65  ngeDiv = (double
189d0 29 31 3b 0a 20 20 69 66 28 20 70 4c 6f 77 65 72  )1;.  if( pLower
189e0 20 26 26 20 28 70 4c 6f 77 65 72 2d 3e 77 74 46   && (pLower->wtF
189f0 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
18a00 4c 29 3d 3d 30 20 29 20 2a 70 52 61 6e 67 65 44  L)==0 ) *pRangeD
18a10 69 76 20 2a 3d 20 28 64 6f 75 62 6c 65 29 34 3b  iv *= (double)4;
18a20 0a 20 20 69 66 28 20 70 55 70 70 65 72 20 29 20  .  if( pUpper ) 
18a30 2a 70 52 61 6e 67 65 44 69 76 20 2a 3d 20 28 64  *pRangeDiv *= (d
18a40 6f 75 62 6c 65 29 34 3b 0a 20 20 72 65 74 75 72  ouble)4;.  retur
18a50 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
18a60 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
18a70 41 54 33 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  AT3./*.** Estima
18a80 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
18a90 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20   rows that will 
18aa0 62 65 20 72 65 74 75 72 6e 65 64 20 62 61 73 65  be returned base
18ab0 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c  d on.** an equal
18ac0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 78  ity constraint x
18ad0 3d 56 41 4c 55 45 20 61 6e 64 20 77 68 65 72 65  =VALUE and where
18ae0 20 74 68 61 74 20 56 41 4c 55 45 20 6f 63 63 75   that VALUE occu
18af0 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73  rs in.** the his
18b00 74 6f 67 72 61 6d 20 64 61 74 61 2e 20 20 54 68  togram data.  Th
18b10 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68  is only works wh
18b20 65 6e 20 78 20 69 73 20 74 68 65 20 6c 65 66 74  en x is the left
18b30 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  -most.** column 
18b40 6f 66 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20  of an index and 
18b50 73 71 6c 69 74 65 5f 73 74 61 74 33 20 68 69 73  sqlite_stat3 his
18b60 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73 20 61  togram data is a
18b70 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20  vailable.** for 
18b80 74 68 61 74 20 69 6e 64 65 78 2e 20 20 57 68 65  that index.  Whe
18b90 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c 20 74 68  n pExpr==NULL th
18ba0 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6e  at means the con
18bb0 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a 20 22 78  straint is.** "x
18bc0 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73 74 65 61   IS NULL" instea
18bd0 64 20 6f 66 20 22 78 3d 56 41 4c 55 45 22 2e 0a  d of "x=VALUE"..
18be0 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
18bf0 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f  estimated row co
18c00 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20  unt into *pnRow 
18c10 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
18c20 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61  E_OK. .** If una
18c30 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65  ble to make an e
18c40 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a  stimate, leave *
18c50 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20  pnRow unchanged 
18c60 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f  and return.** no
18c70 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  n-zero..**.** Th
18c80 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66  is routine can f
18c90 61 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61  ail if it is una
18ca0 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f  ble to load a co
18cb0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
18cc0 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72  .** required for
18cd0 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73   string comparis
18ce0 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65  on, or if unable
18cf0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
18d00 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46  ory.** for a UTF
18d10 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75   conversion requ
18d20 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69  ired for compari
18d30 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20  son.  The error 
18d40 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  is stored.** in 
18d50 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
18d60 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
18d70 69 6e 74 20 77 68 65 72 65 45 71 75 61 6c 53 63  int whereEqualSc
18d80 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a  anEst(.  Parse *
18d90 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
18da0 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20   Parsing & code 
18db0 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
18dc0 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  xt */.  Index *p
18dd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
18de0 54 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65 20  The index whose 
18df0 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
18e00 20 69 73 20 70 54 65 72 6d 20 2a 2f 0a 20 20 45   is pTerm */.  E
18e10 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
18e20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
18e30 6e 20 66 6f 72 20 56 41 4c 55 45 20 69 6e 20 74  n for VALUE in t
18e40 68 65 20 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74  he x=VALUE const
18e50 72 61 69 6e 74 20 2a 2f 0a 20 20 64 6f 75 62 6c  raint */.  doubl
18e60 65 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 20  e *pnRow        
18e70 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76  /* Write the rev
18e80 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74  ised row estimat
18e90 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73  e here */.){.  s
18ea0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52  qlite3_value *pR
18eb0 68 73 20 3d 20 30 3b 20 20 2f 2a 20 56 41 4c 55  hs = 0;  /* VALU
18ec0 45 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20  E on right-hand 
18ed0 73 69 64 65 20 6f 66 20 70 54 65 72 6d 20 2a 2f  side of pTerm */
18ee0 0a 20 20 75 38 20 61 66 66 3b 20 20 20 20 20 20  .  u8 aff;      
18ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18f00 43 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20  Column affinity 
18f10 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
18f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18f30 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65  * Subfunction re
18f40 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74  turn code */.  t
18f50 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20  Rowcnt a[2];    
18f60 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
18f70 69 73 74 69 63 73 20 2a 2f 0a 0a 20 20 61 73 73  istics */..  ass
18f80 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21  ert( p->aSample!
18f90 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
18fa0 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a  p->nSample>0 );.
18fb0 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c    aff = p->pTabl
18fc0 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c  e->aCol[p->aiCol
18fd0 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e 69 74 79  umn[0]].affinity
18fe0 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 29 7b  ;.  if( pExpr ){
18ff0 0a 20 20 20 20 72 63 20 3d 20 76 61 6c 75 65 46  .    rc = valueF
19000 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20  romExpr(pParse, 
19010 70 45 78 70 72 2c 20 61 66 66 2c 20 26 70 52 68  pExpr, aff, &pRh
19020 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  s);.    if( rc )
19030 20 67 6f 74 6f 20 77 68 65 72 65 45 71 75 61 6c   goto whereEqual
19040 53 63 61 6e 45 73 74 5f 63 61 6e 63 65 6c 3b 0a  ScanEst_cancel;.
19050 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 68    }else{.    pRh
19060 73 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  s = sqlite3Value
19070 4e 65 77 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  New(pParse->db);
19080 0a 20 20 7d 0a 20 20 69 66 28 20 70 52 68 73 3d  .  }.  if( pRhs=
19090 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
190a0 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 72  TE_NOTFOUND;.  r
190b0 63 20 3d 20 77 68 65 72 65 4b 65 79 53 74 61 74  c = whereKeyStat
190c0 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 68  s(pParse, p, pRh
190d0 73 2c 20 30 2c 20 61 29 3b 0a 20 20 69 66 28 20  s, 0, a);.  if( 
190e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
190f0 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
19100 28 22 65 71 75 61 6c 69 74 79 20 73 63 61 6e 20  ("equality scan 
19110 72 65 67 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20  regions: %d\n", 
19120 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20 20 20  (int)a[1]));.   
19130 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a   *pnRow = a[1];.
19140 20 20 7d 0a 77 68 65 72 65 45 71 75 61 6c 53 63    }.whereEqualSc
19150 61 6e 45 73 74 5f 63 61 6e 63 65 6c 3a 0a 20 20  anEst_cancel:.  
19160 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
19170 28 70 52 68 73 29 3b 0a 20 20 72 65 74 75 72 6e  (pRhs);.  return
19180 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
19190 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
191a0 45 4e 41 42 4c 45 5f 53 54 41 54 33 29 20 2a 2f  ENABLE_STAT3) */
191b0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
191c0 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 2f 2a 0a  ENABLE_STAT3./*.
191d0 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
191e0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
191f0 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75  hat will be retu
19200 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  rned based on.**
19210 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   an IN constrain
19220 74 20 77 68 65 72 65 20 74 68 65 20 72 69 67 68  t where the righ
19230 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
19240 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a  he IN operator.*
19250 2a 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 76  * is a list of v
19260 61 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a  alues.  Example:
19270 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57 48  .**.**        WH
19280 45 52 45 20 78 20 49 4e 20 28 31 2c 32 2c 33 2c  ERE x IN (1,2,3,
19290 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  4).**.** Write t
192a0 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77  he estimated row
192b0 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52   count into *pnR
192c0 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ow and return SQ
192d0 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20  LITE_OK. .** If 
192e0 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61  unable to make a
192f0 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76  n estimate, leav
19300 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67  e *pnRow unchang
19310 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ed and return.**
19320 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a   non-zero..**.**
19330 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
19340 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20  n fail if it is 
19350 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61  unable to load a
19360 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
19370 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20  nce.** required 
19380 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61  for string compa
19390 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61  rison, or if una
193a0 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ble to allocate 
193b0 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20  memory.** for a 
193c0 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72  UTF conversion r
193d0 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70  equired for comp
193e0 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72  arison.  The err
193f0 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20  or is stored.** 
19400 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
19410 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
19420 69 63 20 69 6e 74 20 77 68 65 72 65 49 6e 53 63  ic int whereInSc
19430 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a  anEst(.  Parse *
19440 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
19450 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20   Parsing & code 
19460 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
19470 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  xt */.  Index *p
19480 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
19490 54 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65 20  The index whose 
194a0 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
194b0 20 69 73 20 70 54 65 72 6d 20 2a 2f 0a 20 20 45   is pTerm */.  E
194c0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
194d0 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65      /* The value
194e0 20 6c 69 73 74 20 6f 6e 20 74 68 65 20 52 48 53   list on the RHS
194f0 20 6f 66 20 22 78 20 49 4e 20 28 76 31 2c 76 32   of "x IN (v1,v2
19500 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a 20 20 64  ,v3,...)" */.  d
19510 6f 75 62 6c 65 20 2a 70 6e 52 6f 77 20 20 20 20  ouble *pnRow    
19520 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
19530 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74   revised row est
19540 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b  imate here */.){
19550 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
19560 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f  TE_OK;         /
19570 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65  * Subfunction re
19580 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 64  turn code */.  d
19590 6f 75 62 6c 65 20 6e 45 73 74 3b 20 20 20 20 20  ouble nEst;     
195a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
195b0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 66 6f 72  mber of rows for
195c0 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 2a   a single term *
195d0 2f 0a 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77 45  /.  double nRowE
195e0 73 74 20 3d 20 28 64 6f 75 62 6c 65 29 30 3b 20  st = (double)0; 
195f0 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61 74 65 20  /* New estimate 
19600 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
19610 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69   rows */.  int i
19620 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19630 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
19640 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ounter */..  ass
19650 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21  ert( p->aSample!
19660 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  =0 );.  for(i=0;
19670 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
19680 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  & i<pList->nExpr
19690 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 45 73 74  ; i++){.    nEst
196a0 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30   = p->aiRowEst[0
196b0 5d 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72  ];.    rc = wher
196c0 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50  eEqualScanEst(pP
196d0 61 72 73 65 2c 20 70 2c 20 70 4c 69 73 74 2d 3e  arse, p, pList->
196e0 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e 45 73  a[i].pExpr, &nEs
196f0 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20  t);.    nRowEst 
19700 2b 3d 20 6e 45 73 74 3b 0a 20 20 7d 0a 20 20 69  += nEst;.  }.  i
19710 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19720 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 6f 77   ){.    if( nRow
19730 45 73 74 20 3e 20 70 2d 3e 61 69 52 6f 77 45 73  Est > p->aiRowEs
19740 74 5b 30 5d 20 29 20 6e 52 6f 77 45 73 74 20 3d  t[0] ) nRowEst =
19750 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b   p->aiRowEst[0];
19760 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 6e 52  .    *pnRow = nR
19770 6f 77 45 73 74 3b 0a 20 20 20 20 57 48 45 52 45  owEst;.    WHERE
19780 54 52 41 43 45 28 28 22 49 4e 20 72 6f 77 20 65  TRACE(("IN row e
19790 73 74 69 6d 61 74 65 3a 20 65 73 74 3d 25 67 5c  stimate: est=%g\
197a0 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 20  n", nRowEst));. 
197b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
197c0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  }.#endif /* defi
197d0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
197e0 45 5f 53 54 41 54 33 29 20 2a 2f 0a 0a 2f 2a 0a  E_STAT3) */../*.
197f0 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
19800 69 66 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 20 6f  if column iCol o
19810 66 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  f the table with
19820 20 63 75 72 73 6f 72 20 69 54 61 62 20 77 69 6c   cursor iTab wil
19830 6c 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 73  l appear.** in s
19840 6f 72 74 65 64 20 6f 72 64 65 72 20 61 63 63 6f  orted order acco
19850 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 75 72  rding to the cur
19860 72 65 6e 74 20 71 75 65 72 79 20 70 6c 61 6e 2e  rent query plan.
19870 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61  .**.** Return va
19880 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 30  lues:.**.**    0
19890 20 20 20 69 43 6f 6c 20 69 73 20 6e 6f 74 20 6f     iCol is not o
198a0 72 64 65 72 65 64 0a 2a 2a 20 20 20 20 31 20 20  rdered.**    1  
198b0 20 69 43 6f 6c 20 68 61 73 20 6f 6e 6c 79 20 61   iCol has only a
198c0 20 73 69 6e 67 6c 65 20 76 61 6c 75 65 0a 2a 2a   single value.**
198d0 20 20 20 20 32 20 20 20 69 43 6f 6c 20 69 73 20      2   iCol is 
198e0 69 6e 20 41 53 43 20 6f 72 64 65 72 0a 2a 2a 20  in ASC order.** 
198f0 20 20 20 33 20 20 20 69 43 6f 6c 20 69 73 20 69     3   iCol is i
19900 6e 20 44 45 53 43 20 6f 72 64 65 72 0a 2a 2f 0a  n DESC order.*/.
19910 73 74 61 74 69 63 20 69 6e 74 20 69 73 4f 72 64  static int isOrd
19920 65 72 65 64 43 6f 6c 75 6d 6e 28 0a 20 20 57 68  eredColumn(.  Wh
19930 65 72 65 42 65 73 74 49 64 78 20 2a 70 2c 0a 20  ereBestIdx *p,. 
19940 20 69 6e 74 20 69 54 61 62 2c 0a 20 20 69 6e 74   int iTab,.  int
19950 20 69 43 6f 6c 0a 29 7b 0a 20 20 69 6e 74 20 69   iCol.){.  int i
19960 2c 20 6a 3b 0a 20 20 57 68 65 72 65 4c 65 76 65  , j;.  WhereLeve
19970 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 26 70 2d 3e  l *pLevel = &p->
19980 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d 3b 0a  aLevel[p->i-1];.
19990 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
199a0 20 75 38 20 73 6f 72 74 4f 72 64 65 72 3b 0a 20   u8 sortOrder;. 
199b0 20 66 6f 72 28 69 3d 70 2d 3e 69 2d 31 3b 20 69   for(i=p->i-1; i
199c0 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4c 65 76 65 6c  >=0; i--, pLevel
199d0 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 65  --){.    if( pLe
199e0 76 65 6c 2d 3e 69 54 61 62 43 75 72 21 3d 69 54  vel->iTabCur!=iT
199f0 61 62 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ab ) continue;. 
19a00 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e     if( (pLevel->
19a10 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
19a20 48 45 52 45 5f 41 4c 4c 5f 55 4e 49 51 55 45 29  HERE_ALL_UNIQUE)
19a30 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=0 ){.      ret
19a40 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
19a50 20 61 73 73 65 72 74 28 20 28 70 4c 65 76 65 6c   assert( (pLevel
19a60 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
19a70 20 57 48 45 52 45 5f 4f 52 44 45 52 45 44 29 21   WHERE_ORDERED)!
19a80 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  =0 );.    if( (p
19a90 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c  Idx = pLevel->pl
19aa0 61 6e 2e 75 2e 70 49 64 78 29 21 3d 30 20 29 7b  an.u.pIdx)!=0 ){
19ab0 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
19ac0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 6f 72  0 ){.        sor
19ad0 74 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  tOrder = 0;.    
19ae0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
19af0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
19b00 61 67 73 20 26 20 57 48 45 52 45 5f 52 45 56 45  ags & WHERE_REVE
19b10 52 53 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  RSE)!=0 );.     
19b20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
19b30 69 6e 74 20 6e 20 3d 20 70 49 64 78 2d 3e 6e 43  int n = pIdx->nC
19b40 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 66  olumn;.        f
19b50 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b  or(j=0; j<n; j++
19b60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
19b70 20 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e 61 69 43   iCol==pIdx->aiC
19b80 6f 6c 75 6d 6e 5b 6a 5d 20 29 20 62 72 65 61 6b  olumn[j] ) break
19b90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
19ba0 20 20 20 20 69 66 28 20 6a 3e 3d 6e 20 29 20 72      if( j>=n ) r
19bb0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
19bc0 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 49 64   sortOrder = pId
19bd0 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d  x->aSortOrder[j]
19be0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
19bf0 73 65 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  se( (pLevel->pla
19c00 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
19c10 45 5f 52 45 56 45 52 53 45 29 21 3d 30 20 29 3b  E_REVERSE)!=0 );
19c20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
19c30 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43  se{.      if( iC
19c40 6f 6c 21 3d 28 2d 31 29 20 29 20 72 65 74 75 72  ol!=(-1) ) retur
19c50 6e 20 30 3b 0a 20 20 20 20 20 20 73 6f 72 74 4f  n 0;.      sortO
19c60 72 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rder = 0;.      
19c70 74 65 73 74 63 61 73 65 28 20 28 70 4c 65 76 65  testcase( (pLeve
19c80 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
19c90 26 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 29  & WHERE_REVERSE)
19ca0 21 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  !=0 );.    }.   
19cb0 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c   if( (pLevel->pl
19cc0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
19cd0 52 45 5f 52 45 56 45 52 53 45 29 21 3d 30 20 29  RE_REVERSE)!=0 )
19ce0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
19cf0 73 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20  sortOrder==0 || 
19d00 73 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29 3b 0a  sortOrder==1 );.
19d10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19d20 73 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29 3b 0a  sortOrder==1 );.
19d30 20 20 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20        sortOrder 
19d40 3d 20 31 20 2d 20 73 6f 72 74 4f 72 64 65 72 3b  = 1 - sortOrder;
19d50 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
19d60 6e 20 73 6f 72 74 4f 72 64 65 72 2b 32 3b 0a 20  n sortOrder+2;. 
19d70 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
19d80 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
19d90 74 69 6e 65 20 64 65 63 69 64 65 73 20 69 66 20  tine decides if 
19da0 70 49 64 78 20 63 61 6e 20 62 65 20 75 73 65 64  pIdx can be used
19db0 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 20   to satisfy the 
19dc0 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63 6c 61 75  ORDER BY.** clau
19dd0 73 65 2c 20 65 69 74 68 65 72 20 69 6e 20 77 68  se, either in wh
19de0 6f 6c 65 20 6f 72 20 69 6e 20 70 61 72 74 2e 20  ole or in part. 
19df0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
19e00 65 20 69 73 20 74 68 65 20 0a 2a 2a 20 63 75 6d  e is the .** cum
19e10 75 6c 61 74 69 76 65 20 6e 75 6d 62 65 72 20 6f  ulative number o
19e20 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  f terms in the O
19e30 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
19e40 68 61 74 20 61 72 65 20 73 61 74 69 73 66 69 65  hat are satisfie
19e50 64 0a 2a 2a 20 62 79 20 74 68 65 20 69 6e 64 65  d.** by the inde
19e60 78 20 70 49 64 78 20 61 6e 64 20 6f 74 68 65 72  x pIdx and other
19e70 20 69 6e 64 69 63 65 73 20 69 6e 20 6f 75 74 65   indices in oute
19e80 72 20 6c 6f 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 54  r loops..**.** T
19e90 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 71  he table being q
19ea0 75 65 72 69 65 64 20 68 61 73 20 61 20 63 75 72  ueried has a cur
19eb0 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 22 62  sor number of "b
19ec0 61 73 65 22 2e 20 20 70 49 64 78 20 69 73 20 74  ase".  pIdx is t
19ed0 68 65 0a 2a 2a 20 69 6e 64 65 78 20 74 68 61 74  he.** index that
19ee0 20 69 73 20 70 6f 73 74 75 6c 61 74 65 64 20 66   is postulated f
19ef0 6f 72 20 75 73 65 20 74 6f 20 61 63 63 65 73 73  or use to access
19f00 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
19f10 2a 20 54 68 65 20 2a 70 62 52 65 76 20 76 61 6c  * The *pbRev val
19f20 75 65 20 69 73 20 73 65 74 20 74 6f 20 30 20 6f  ue is set to 0 o
19f30 72 64 65 72 20 31 20 64 65 70 65 6e 64 69 6e 67  rder 1 depending
19f40 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
19f50 6f 74 0a 2a 2a 20 70 49 64 78 20 73 68 6f 75 6c  ot.** pIdx shoul
19f60 64 20 62 65 20 72 75 6e 20 69 6e 20 74 68 65 20  d be run in the 
19f70 66 6f 72 77 61 72 64 20 6f 72 64 65 72 20 6f 72  forward order or
19f80 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
19f90 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
19fa0 20 69 73 53 6f 72 74 69 6e 67 49 6e 64 65 78 28   isSortingIndex(
19fb0 0a 20 20 57 68 65 72 65 42 65 73 74 49 64 78 20  .  WhereBestIdx 
19fc0 2a 70 2c 20 20 20 20 2f 2a 20 42 65 73 74 20 69  *p,    /* Best i
19fd0 6e 64 65 78 20 73 65 61 72 63 68 20 63 6f 6e 74  ndex search cont
19fe0 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ext */.  Index *
19ff0 70 49 64 78 2c 20 20 20 20 20 20 20 20 2f 2a 20  pIdx,        /* 
1a000 54 68 65 20 69 6e 64 65 78 20 77 65 20 61 72 65  The index we are
1a010 20 74 65 73 74 69 6e 67 20 2a 2f 0a 20 20 69 6e   testing */.  in
1a020 74 20 62 61 73 65 2c 20 20 20 20 20 20 20 20 20  t base,         
1a030 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
1a040 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  er for the table
1a050 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f   to be sorted */
1a060 0a 20 20 69 6e 74 20 2a 70 62 52 65 76 20 20 20  .  int *pbRev   
1a070 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f         /* Set to
1a080 20 31 20 66 6f 72 20 72 65 76 65 72 73 65 2d 6f   1 for reverse-o
1a090 72 64 65 72 20 73 63 61 6e 20 6f 66 20 70 49 64  rder scan of pId
1a0a0 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  x */.){.  int i;
1a0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1a0d0 72 20 6f 66 20 70 49 64 78 20 74 65 72 6d 73 20  r of pIdx terms 
1a0e0 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b  used */.  int j;
1a0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a100 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1a110 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65  r of ORDER BY te
1a120 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 2a 2f  rms satisfied */
1a130 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72  .  int sortOrder
1a140 20 3d 20 32 3b 20 20 20 20 20 20 20 20 20 20 20   = 2;           
1a150 20 2f 2a 20 30 3a 20 66 6f 72 77 61 72 64 2e 20   /* 0: forward. 
1a160 20 31 3a 20 62 61 63 6b 77 61 72 64 2e 20 20 32   1: backward.  2
1a170 3a 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 69  : unknown */.  i
1a180 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
1a190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a1a0 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20  Number of ORDER 
1a1b0 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 73 74  BY terms */.  st
1a1c0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
1a1d0 65 6d 20 2a 70 4f 42 49 74 65 6d 3b 2f 2a 20 41  em *pOBItem;/* A
1a1e0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44   term of the ORD
1a1f0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
1a200 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
1a210 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 20 20 20  pIdx->pTable;   
1a220 2f 2a 20 54 61 62 6c 65 20 74 68 61 74 20 6f 77  /* Table that ow
1a230 6e 73 20 69 6e 64 65 78 20 70 49 64 78 20 2a 2f  ns index pIdx */
1a240 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
1a250 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 20  derBy;          
1a260 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
1a270 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 50 61 72   clause */.  Par
1a280 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e  se *pParse = p->
1a290 70 50 61 72 73 65 3b 20 20 20 20 2f 2a 20 50 61  pParse;    /* Pa
1a2a0 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
1a2b0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1a2c0 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
1a2d0 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
1a2e0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
1a2f0 6e 50 72 69 6f 72 53 61 74 3b 20 20 20 20 20 20  nPriorSat;      
1a300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 52 44            /* ORD
1a310 45 52 20 42 59 20 74 65 72 6d 73 20 73 61 74 69  ER BY terms sati
1a320 73 66 69 65 64 20 62 79 20 6f 75 74 65 72 20 6c  sfied by outer l
1a330 6f 6f 70 73 20 2a 2f 0a 20 20 69 6e 74 20 73 65  oops */.  int se
1a340 65 6e 52 6f 77 69 64 20 3d 20 30 3b 20 20 20 20  enRowid = 0;    
1a350 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1a360 69 66 20 61 6e 20 4f 52 44 45 52 20 42 59 20 72  if an ORDER BY r
1a370 6f 77 69 64 20 74 65 72 6d 20 69 73 20 73 65 65  owid term is see
1a380 6e 20 2a 2f 0a 20 20 69 6e 74 20 75 6e 69 71 75  n */.  int uniqu
1a390 65 4e 6f 74 4e 75 6c 6c 3b 20 20 20 20 20 20 20  eNotNull;       
1a3a0 20 20 20 20 20 2f 2a 20 70 49 64 78 20 69 73 20       /* pIdx is 
1a3b0 55 4e 49 51 55 45 20 77 69 74 68 20 61 6c 6c 20  UNIQUE with all 
1a3c0 74 65 72 6d 73 20 61 72 65 20 4e 4f 54 20 4e 55  terms are NOT NU
1a3d0 4c 4c 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e  LL */..  if( p->
1a3e0 69 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 50 72 69  i==0 ){.    nPri
1a3f0 6f 72 53 61 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  orSat = 0;.  }el
1a400 73 65 7b 0a 20 20 20 20 6e 50 72 69 6f 72 53 61  se{.    nPriorSa
1a410 74 20 3d 20 70 2d 3e 61 4c 65 76 65 6c 5b 70 2d  t = p->aLevel[p-
1a420 3e 69 2d 31 5d 2e 70 6c 61 6e 2e 6e 4f 42 53 61  >i-1].plan.nOBSa
1a430 74 3b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 61  t;.    if( (p->a
1a440 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d 2e 70 6c  Level[p->i-1].pl
1a450 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
1a460 52 45 5f 4f 52 44 45 52 45 44 29 3d 3d 30 20 29  RE_ORDERED)==0 )
1a470 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
1a480 6c 6f 6f 70 20 63 61 6e 6e 6f 74 20 62 65 20 6f  loop cannot be o
1a490 72 64 65 72 65 64 20 75 6e 6c 65 73 73 20 74 68  rdered unless th
1a4a0 65 20 6e 65 78 74 20 6f 75 74 65 72 20 6c 6f 6f  e next outer loo
1a4b0 70 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c  p is.      ** al
1a4c0 73 6f 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20  so ordered */.  
1a4d0 20 20 20 20 72 65 74 75 72 6e 20 6e 50 72 69 6f      return nPrio
1a4e0 72 53 61 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rSat;.    }.    
1a4f0 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
1a500 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  Disabled(db, SQL
1a510 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f  ITE_OrderByIdxJo
1a520 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  in) ){.      /* 
1a530 4f 6e 6c 79 20 6c 6f 6f 6b 20 61 74 20 74 68 65  Only look at the
1a540 20 6f 75 74 65 72 2d 6d 6f 73 74 20 6c 6f 6f 70   outer-most loop
1a550 20 69 66 20 74 68 65 20 4f 72 64 65 72 42 79 49   if the OrderByI
1a560 64 78 4a 6f 69 6e 0a 20 20 20 20 20 20 2a 2a 20  dxJoin.      ** 
1a570 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
1a580 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 20 20  disabled */.    
1a590 20 20 72 65 74 75 72 6e 20 6e 50 72 69 6f 72 53    return nPriorS
1a5a0 61 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  at;.    }.  }.  
1a5b0 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
1a5c0 72 64 65 72 42 79 3b 0a 20 20 61 73 73 65 72 74  rderBy;.  assert
1a5d0 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b  ( pOrderBy!=0 );
1a5e0 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 62 55 6e  .  if( pIdx->bUn
1a5f0 6f 72 64 65 72 65 64 20 29 7b 0a 20 20 20 20 2f  ordered ){.    /
1a600 2a 20 48 61 73 68 20 69 6e 64 69 63 65 73 20 28  * Hash indices (
1a610 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65  indicated by the
1a620 20 22 75 6e 6f 72 64 65 72 65 64 22 20 74 61 67   "unordered" tag
1a630 20 6f 6e 20 73 71 6c 69 74 65 5f 73 74 61 74 31   on sqlite_stat1
1a640 29 20 63 61 6e 6e 6f 74 0a 20 20 20 20 2a 2a 20  ) cannot.    ** 
1a650 62 65 20 75 73 65 64 20 66 6f 72 20 73 6f 72 74  be used for sort
1a660 69 6e 67 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ing */.    retur
1a670 6e 20 6e 50 72 69 6f 72 53 61 74 3b 0a 20 20 7d  n nPriorSat;.  }
1a680 0a 20 20 6e 54 65 72 6d 20 3d 20 70 4f 72 64 65  .  nTerm = pOrde
1a690 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 75 6e  rBy->nExpr;.  un
1a6a0 69 71 75 65 4e 6f 74 4e 75 6c 6c 20 3d 20 70 49  iqueNotNull = pI
1a6b0 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  dx->onError!=OE_
1a6c0 4e 6f 6e 65 3b 0a 20 20 61 73 73 65 72 74 28 20  None;.  assert( 
1a6d0 6e 54 65 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f 2a  nTerm>0 );..  /*
1a6e0 20 41 72 67 75 6d 65 6e 74 20 70 49 64 78 20 6d   Argument pIdx m
1a6f0 75 73 74 20 65 69 74 68 65 72 20 70 6f 69 6e 74  ust either point
1a700 20 74 6f 20 61 20 27 72 65 61 6c 27 20 6e 61 6d   to a 'real' nam
1a710 65 64 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  ed index structu
1a720 72 65 2c 20 0a 20 20 2a 2a 20 6f 72 20 61 6e 20  re, .  ** or an 
1a730 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  index structure 
1a740 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65  allocated on the
1a750 20 73 74 61 63 6b 20 62 79 20 62 65 73 74 42 74   stack by bestBt
1a760 72 65 65 49 6e 64 65 78 28 29 20 74 6f 0a 20 20  reeIndex() to.  
1a770 2a 2a 20 72 65 70 72 65 73 65 6e 74 20 74 68 65  ** represent the
1a780 20 72 6f 77 69 64 20 69 6e 64 65 78 20 74 68 61   rowid index tha
1a790 74 20 69 73 20 70 61 72 74 20 6f 66 20 65 76 65  t is part of eve
1a7a0 72 79 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ry table.  */.  
1a7b0 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 7a 4e  assert( pIdx->zN
1a7c0 61 6d 65 20 7c 7c 20 28 70 49 64 78 2d 3e 6e 43  ame || (pIdx->nC
1a7d0 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20 70 49 64 78  olumn==1 && pIdx
1a7e0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 2d  ->aiColumn[0]==-
1a7f0 31 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 74 63  1) );..  /* Matc
1a800 68 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f  h terms of the O
1a810 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
1a820 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 6f  gainst columns o
1a830 66 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78  f.  ** the index
1a840 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65  ..  **.  ** Note
1a850 20 74 68 61 74 20 69 6e 64 69 63 65 73 20 68 61   that indices ha
1a860 76 65 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  ve pIdx->nColumn
1a870 20 72 65 67 75 6c 61 72 20 63 6f 6c 75 6d 6e 73   regular columns
1a880 20 70 6c 75 73 0a 20 20 2a 2a 20 6f 6e 65 20 61   plus.  ** one a
1a890 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
1a8a0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
1a8b0 72 6f 77 69 64 2e 20 20 54 68 65 20 72 6f 77 69  rowid.  The rowi
1a8c0 64 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 66  d column.  ** of
1a8d0 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 61 6c   the index is al
1a8e0 73 6f 20 61 6c 6c 6f 77 65 64 20 74 6f 20 6d 61  so allowed to ma
1a8f0 74 63 68 20 61 67 61 69 6e 73 74 20 74 68 65 20  tch against the 
1a900 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20 63 6c  ORDER BY.  ** cl
1a910 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d  ause..  */.  j =
1a920 20 6e 50 72 69 6f 72 53 61 74 3b 0a 20 20 66 6f   nPriorSat;.  fo
1a930 72 28 69 3d 30 2c 70 4f 42 49 74 65 6d 3d 26 70  r(i=0,pOBItem=&p
1a940 4f 72 64 65 72 42 79 2d 3e 61 5b 6a 5d 3b 20 6a  OrderBy->a[j]; j
1a950 3c 6e 54 65 72 6d 20 26 26 20 69 3c 3d 70 49 64  <nTerm && i<=pId
1a960 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
1a970 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 42 45  {.    Expr *pOBE
1a980 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  xpr;          /*
1a990 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
1a9a0 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
1a9b0 70 4f 42 49 74 65 6d 20 2a 2f 0a 20 20 20 20 43  pOBItem */.    C
1a9c0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
1a9d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
1a9e0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1a9f0 20 6f 66 20 70 4f 42 45 78 70 72 20 2a 2f 0a 20   of pOBExpr */. 
1aa00 20 20 20 69 6e 74 20 74 65 72 6d 53 6f 72 74 4f     int termSortO
1aa10 72 64 65 72 3b 20 20 20 20 20 20 2f 2a 20 53 6f  rder;      /* So
1aa20 72 74 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69  rt order for thi
1aa30 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 69 6e  s term */.    in
1aa40 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  t iColumn;      
1aa50 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74        /* The i-t
1aa60 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  h column of the 
1aa70 69 6e 64 65 78 2e 20 20 2d 31 20 66 6f 72 20 72  index.  -1 for r
1aa80 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  owid */.    int 
1aa90 69 53 6f 72 74 4f 72 64 65 72 3b 20 20 20 20 20  iSortOrder;     
1aaa0 20 20 20 20 2f 2a 20 31 20 66 6f 72 20 44 45 53      /* 1 for DES
1aab0 43 2c 20 30 20 66 6f 72 20 41 53 43 20 6f 6e 20  C, 0 for ASC on 
1aac0 74 68 65 20 69 2d 74 68 20 69 6e 64 65 78 20 74  the i-th index t
1aad0 65 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  erm */.    int i
1aae0 73 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  sEq;            
1aaf0 20 20 20 2f 2a 20 53 75 62 6a 65 63 74 20 74 6f     /* Subject to
1ab00 20 61 6e 20 3d 3d 20 6f 72 20 49 53 20 4e 55 4c   an == or IS NUL
1ab10 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  L constraint */.
1ab20 20 20 20 20 69 6e 74 20 69 73 4d 61 74 63 68 3b      int isMatch;
1ab30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1ab40 52 44 45 52 20 42 59 20 74 65 72 6d 20 6d 61 74  RDER BY term mat
1ab50 63 68 65 73 20 74 68 65 20 69 6e 64 65 78 20 74  ches the index t
1ab60 65 72 6d 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  erm */.    const
1ab70 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20   char *zColl;   
1ab80 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f     /* Name of co
1ab90 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1aba0 20 66 6f 72 20 69 2d 74 68 20 69 6e 64 65 78 20   for i-th index 
1abb0 74 65 72 6d 20 2a 2f 0a 20 20 20 20 57 68 65 72  term */.    Wher
1abc0 65 54 65 72 6d 20 2a 70 43 6f 6e 73 74 72 61 69  eTerm *pConstrai
1abd0 6e 74 3b 20 2f 2a 20 41 20 63 6f 6e 73 74 72 61  nt; /* A constra
1abe0 69 6e 74 20 69 6e 20 74 68 65 20 57 48 45 52 45  int in the WHERE
1abf0 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20 20 20   clause */..    
1ac00 2f 2a 20 49 66 20 74 68 65 20 6e 65 78 74 20 74  /* If the next t
1ac10 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52  erm of the ORDER
1ac20 20 42 59 20 63 6c 61 75 73 65 20 72 65 66 65 72   BY clause refer
1ac30 73 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 6f 74  s to anything ot
1ac40 68 65 72 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20  her than.    ** 
1ac50 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  a column in the 
1ac60 22 62 61 73 65 22 20 74 61 62 6c 65 2c 20 74 68  "base" table, th
1ac70 65 6e 20 74 68 69 73 20 69 6e 64 65 78 20 77 69  en this index wi
1ac80 6c 6c 20 6e 6f 74 20 62 65 20 6f 66 20 61 6e 79  ll not be of any
1ac90 0a 20 20 20 20 2a 2a 20 66 75 72 74 68 65 72 20  .    ** further 
1aca0 75 73 65 20 69 6e 20 68 61 6e 64 6c 69 6e 67 20  use in handling 
1acb0 74 68 65 20 4f 52 44 45 52 20 42 59 2e 20 2a 2f  the ORDER BY. */
1acc0 0a 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73  .    pOBExpr = s
1acd0 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
1ace0 6c 6c 61 74 65 28 70 4f 42 49 74 65 6d 2d 3e 70  llate(pOBItem->p
1acf0 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Expr);.    if( p
1ad00 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43  OBExpr->op!=TK_C
1ad10 4f 4c 55 4d 4e 20 7c 7c 20 70 4f 42 45 78 70 72  OLUMN || pOBExpr
1ad20 2d 3e 69 54 61 62 6c 65 21 3d 62 61 73 65 20 29  ->iTable!=base )
1ad30 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
1ad40 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e     }..    /* Fin
1ad50 64 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  d column number 
1ad60 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  and collating se
1ad70 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 6e  quence for the n
1ad80 65 78 74 20 65 6e 74 72 79 0a 20 20 20 20 2a 2a  ext entry.    **
1ad90 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   in the index */
1ada0 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 7a  .    if( pIdx->z
1adb0 4e 61 6d 65 20 26 26 20 69 3c 70 49 64 78 2d 3e  Name && i<pIdx->
1adc0 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  nColumn ){.     
1add0 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d   iColumn = pIdx-
1ade0 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
1adf0 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d      if( iColumn=
1ae00 3d 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 69  =pIdx->pTable->i
1ae10 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  PKey ){.        
1ae20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  iColumn = -1;.  
1ae30 20 20 20 20 7d 0a 20 20 20 20 20 20 69 53 6f 72      }.      iSor
1ae40 74 4f 72 64 65 72 20 3d 20 70 49 64 78 2d 3e 61  tOrder = pIdx->a
1ae50 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20  SortOrder[i];.  
1ae60 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 49 64 78      zColl = pIdx
1ae70 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20  ->azColl[i];.   
1ae80 20 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c     assert( zColl
1ae90 21 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65  !=0 );.    }else
1aea0 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20  {.      iColumn 
1aeb0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69 53 6f 72  = -1;.      iSor
1aec0 74 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  tOrder = 0;.    
1aed0 20 20 7a 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20    zColl = 0;.   
1aee0 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
1aef0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 63   to see if the c
1af00 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 61 6e 64  olumn number and
1af10 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1af20 6e 63 65 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  nce of the.    *
1af30 2a 20 69 6e 64 65 78 20 6d 61 74 63 68 20 74 68  * index match th
1af40 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  e column number 
1af50 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  and collating se
1af60 71 75 65 6e 63 65 20 6f 66 20 74 68 65 20 4f 52  quence of the OR
1af70 44 45 52 20 42 59 0a 20 20 20 20 2a 2a 20 63 6c  DER BY.    ** cl
1af80 61 75 73 65 20 65 6e 74 72 79 2e 20 20 53 65 74  ause entry.  Set
1af90 20 69 73 4d 61 74 63 68 20 74 6f 20 31 20 69 66   isMatch to 1 if
1afa0 20 74 68 65 79 20 62 6f 74 68 20 6d 61 74 63 68   they both match
1afb0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f 42  . */.    if( pOB
1afc0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69  Expr->iColumn==i
1afd0 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
1afe0 69 66 28 20 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( zColl ){.   
1aff0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
1b000 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
1b010 70 50 61 72 73 65 2c 20 70 4f 42 49 74 65 6d 2d  pParse, pOBItem-
1b020 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  >pExpr);.       
1b030 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
1b040 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
1b050 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 69 73 4d  oll;.        isM
1b060 61 74 63 68 20 3d 20 73 71 6c 69 74 65 33 53 74  atch = sqlite3St
1b070 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
1b080 6d 65 2c 20 7a 43 6f 6c 6c 29 3d 3d 30 3b 0a 20  me, zColl)==0;. 
1b090 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1b0a0 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20 31 3b      isMatch = 1;
1b0b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
1b0c0 73 65 7b 0a 20 20 20 20 20 20 69 73 4d 61 74 63  se{.      isMatc
1b0d0 68 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  h = 0;.    }..  
1b0e0 20 20 2f 2a 20 74 65 72 6d 53 6f 72 74 4f 72 64    /* termSortOrd
1b0f0 65 72 20 69 73 20 30 20 6f 72 20 31 20 66 6f 72  er is 0 or 1 for
1b100 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
1b110 74 68 65 20 61 63 63 65 73 73 20 6c 6f 6f 70 20  the access loop 
1b120 73 68 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 72 75  should.    ** ru
1b130 6e 20 66 6f 72 77 61 72 64 20 6f 72 20 62 61 63  n forward or bac
1b140 6b 77 61 72 64 73 20 28 72 65 73 70 65 63 74 69  kwards (respecti
1b150 76 65 6c 79 29 20 69 6e 20 6f 72 64 65 72 20 74  vely) in order t
1b160 6f 20 73 61 74 69 73 66 79 20 74 68 69 73 20 0a  o satisfy this .
1b170 20 20 20 20 2a 2a 20 74 65 72 6d 20 6f 66 20 74      ** term of t
1b180 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1b190 73 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  se. */.    asser
1b1a0 74 28 20 70 4f 42 49 74 65 6d 2d 3e 73 6f 72 74  t( pOBItem->sort
1b1b0 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 70 4f 42 49  Order==0 || pOBI
1b1c0 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d  tem->sortOrder==
1b1d0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
1b1e0 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c   iSortOrder==0 |
1b1f0 7c 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d 31 20  | iSortOrder==1 
1b200 29 3b 0a 20 20 20 20 74 65 72 6d 53 6f 72 74 4f  );.    termSortO
1b210 72 64 65 72 20 3d 20 69 53 6f 72 74 4f 72 64 65  rder = iSortOrde
1b220 72 20 5e 20 70 4f 42 49 74 65 6d 2d 3e 73 6f 72  r ^ pOBItem->sor
1b230 74 4f 72 64 65 72 3b 0a 0a 20 20 20 20 2f 2a 20  tOrder;..    /* 
1b240 49 66 20 58 20 69 73 20 74 68 65 20 63 6f 6c 75  If X is the colu
1b250 6d 6e 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  mn in the index 
1b260 61 6e 64 20 4f 52 44 45 52 20 42 59 20 63 6c 61  and ORDER BY cla
1b270 75 73 65 2c 20 63 68 65 63 6b 20 74 6f 20 73 65  use, check to se
1b280 65 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 72  e.    ** if ther
1b290 65 20 61 72 65 20 61 6e 79 20 58 3d 20 6f 72 20  e are any X= or 
1b2a0 58 20 49 53 20 4e 55 4c 4c 20 63 6f 6e 73 74 72  X IS NULL constr
1b2b0 61 69 6e 74 73 20 69 6e 20 74 68 65 20 57 48 45  aints in the WHE
1b2c0 52 45 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20  RE clause. */.  
1b2d0 20 20 70 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20    pConstraint = 
1b2e0 66 69 6e 64 54 65 72 6d 28 70 2d 3e 70 57 43 2c  findTerm(p->pWC,
1b2f0 20 62 61 73 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20   base, iColumn, 
1b300 70 2d 3e 6e 6f 74 52 65 61 64 79 2c 0a 20 20 20  p->notReady,.   
1b310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b320 20 20 20 20 20 20 20 20 57 4f 5f 45 51 7c 57 4f          WO_EQ|WO
1b330 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 2c 20 70  _ISNULL|WO_IN, p
1b340 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20 70 43  Idx);.    if( pC
1b350 6f 6e 73 74 72 61 69 6e 74 3d 3d 30 20 29 7b 0a  onstraint==0 ){.
1b360 20 20 20 20 20 20 69 73 45 71 20 3d 20 30 3b 0a        isEq = 0;.
1b370 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
1b380 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 65 4f 70 65  Constraint->eOpe
1b390 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d  rator & WO_IN)!=
1b3a0 30 20 29 7b 0a 23 69 66 20 30 0a 20 20 20 20 20  0 ){.#if 0.     
1b3b0 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 73 20   /* Constraints 
1b3c0 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 22 58 20  of the form: "X 
1b3d0 49 4e 20 2e 2e 2e 22 20 63 61 6e 6e 6f 74 20 62  IN ..." cannot b
1b3e0 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 4f  e used with an O
1b3f0 52 44 45 52 20 42 59 0a 20 20 20 20 20 20 2a 2a  RDER BY.      **
1b400 20 62 65 63 61 75 73 65 20 77 65 20 64 6f 20 6e   because we do n
1b410 6f 74 20 6b 6e 6f 77 20 69 6e 20 77 68 61 74 20  ot know in what 
1b420 6f 72 64 65 72 20 74 68 65 20 76 61 6c 75 65 73  order the values
1b430 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74   on the RHS of t
1b440 68 65 20 49 4e 0a 20 20 20 20 20 20 2a 2a 20 6f  he IN.      ** o
1b450 70 65 72 61 74 6f 72 20 77 69 6c 6c 20 6f 63 63  perator will occ
1b460 75 72 2e 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  ur. */.      bre
1b470 61 6b 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  ak;.#else.      
1b480 69 66 28 20 74 65 72 6d 53 6f 72 74 4f 72 64 65  if( termSortOrde
1b490 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  r ) break;.     
1b4a0 20 69 73 45 71 20 3d 20 30 3b 0a 23 65 6e 64 69   isEq = 0;.#endi
1b4b0 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  f.    }else if( 
1b4c0 28 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 65 4f  (pConstraint->eO
1b4d0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e  perator & WO_ISN
1b4e0 55 4c 4c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ULL)!=0 ){.     
1b4f0 20 75 6e 69 71 75 65 4e 6f 74 4e 75 6c 6c 20 3d   uniqueNotNull =
1b500 20 30 3b 0a 20 20 20 20 20 20 69 73 45 71 20 3d   0;.      isEq =
1b510 20 31 3b 20 20 2f 2a 20 22 58 20 49 53 20 4e 55   1;  /* "X IS NU
1b520 4c 4c 22 20 6d 65 61 6e 73 20 58 20 68 61 73 20  LL" means X has 
1b530 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 76 61  only a single va
1b540 6c 75 65 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  lue */.    }else
1b550 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74   if( pConstraint
1b560 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3d 3d 30  ->prereqRight==0
1b570 20 29 7b 0a 20 20 20 20 20 20 69 73 45 71 20 3d   ){.      isEq =
1b580 20 31 3b 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69   1;  /* Constrai
1b590 6e 74 20 22 58 3d 63 6f 6e 73 74 61 6e 74 22 20  nt "X=constant" 
1b5a0 6d 65 61 6e 73 20 58 20 68 61 73 20 6f 6e 6c 79  means X has only
1b5b0 20 61 20 73 69 6e 67 6c 65 20 76 61 6c 75 65 20   a single value 
1b5c0 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
1b5d0 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
1b5e0 20 3d 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e   = pConstraint->
1b5f0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
1b600 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
1b610 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
1b620 7b 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54  {.        WHERET
1b630 52 41 43 45 28 28 22 20 20 20 20 20 20 20 2e 2e  RACE(("       ..
1b640 20 69 73 4f 72 64 65 72 65 64 43 6f 6c 75 6d 6e   isOrderedColumn
1b650 28 74 61 62 3d 25 64 2c 63 6f 6c 3d 25 64 29 22  (tab=%d,col=%d)"
1b660 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b670 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 69 54        pRight->iT
1b680 61 62 6c 65 2c 20 70 52 69 67 68 74 2d 3e 69 43  able, pRight->iC
1b690 6f 6c 75 6d 6e 29 29 3b 0a 20 20 20 20 20 20 20  olumn));.       
1b6a0 20 69 73 45 71 20 3d 20 69 73 4f 72 64 65 72 65   isEq = isOrdere
1b6b0 64 43 6f 6c 75 6d 6e 28 70 2c 20 70 52 69 67 68  dColumn(p, pRigh
1b6c0 74 2d 3e 69 54 61 62 6c 65 2c 20 70 52 69 67 68  t->iTable, pRigh
1b6d0 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  t->iColumn);.   
1b6e0 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
1b6f0 28 22 20 2d 3e 20 69 73 45 71 3d 25 64 5c 6e 22  (" -> isEq=%d\n"
1b700 2c 20 69 73 45 71 29 29 3b 0a 0a 20 20 20 20 20  , isEq));..     
1b710 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e     /* If the con
1b720 73 74 72 61 69 6e 74 20 69 73 20 6f 66 20 74 68  straint is of th
1b730 65 20 66 6f 72 6d 20 58 3d 59 20 77 68 65 72 65  e form X=Y where
1b740 20 59 20 69 73 20 61 6e 20 6f 72 64 65 72 65 64   Y is an ordered
1b750 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a   value.        *
1b760 2a 20 69 6e 20 61 6e 20 6f 75 74 65 72 20 6c 6f  * in an outer lo
1b770 6f 70 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75  op, then make su
1b780 72 65 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65  re the sort orde
1b790 72 20 6f 66 20 59 20 6d 61 74 63 68 65 73 20 74  r of Y matches t
1b7a0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  he.        ** so
1b7b0 72 74 20 6f 72 64 65 72 20 72 65 71 75 69 72 65  rt order require
1b7c0 64 20 66 6f 72 20 58 2e 20 2a 2f 0a 20 20 20 20  d for X. */.    
1b7d0 20 20 20 20 69 66 28 20 69 73 4d 61 74 63 68 20      if( isMatch 
1b7e0 26 26 20 69 73 45 71 3e 3d 32 20 26 26 20 69 73  && isEq>=2 && is
1b7f0 45 71 21 3d 70 4f 42 49 74 65 6d 2d 3e 73 6f 72  Eq!=pOBItem->sor
1b800 74 4f 72 64 65 72 2b 32 20 29 7b 0a 20 20 20 20  tOrder+2 ){.    
1b810 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1b820 69 73 45 71 3d 3d 32 20 29 3b 0a 20 20 20 20 20  isEq==2 );.     
1b830 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
1b840 73 45 71 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20  sEq==3 );.      
1b850 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1b860 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
1b870 7b 0a 20 20 20 20 20 20 20 20 69 73 45 71 20 3d  {.        isEq =
1b880 20 30 3b 20 20 2f 2a 20 22 58 3d 65 78 70 72 22   0;  /* "X=expr"
1b890 20 70 6c 61 63 65 73 20 6e 6f 20 6f 72 64 65 72   places no order
1b8a0 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ing constraints 
1b8b0 6f 6e 20 58 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  on X */.      }.
1b8c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69      }.    if( !i
1b8d0 73 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20  sMatch ){.      
1b8e0 69 66 28 20 69 73 45 71 3d 3d 30 20 29 7b 0a 20  if( isEq==0 ){. 
1b8f0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1b900 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b910 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1b920 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
1b930 66 28 20 69 73 45 71 21 3d 31 20 29 7b 0a 20 20  f( isEq!=1 ){.  
1b940 20 20 20 20 69 66 28 20 73 6f 72 74 4f 72 64 65      if( sortOrde
1b950 72 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20  r==2 ){.        
1b960 73 6f 72 74 4f 72 64 65 72 20 3d 20 74 65 72 6d  sortOrder = term
1b970 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20  SortOrder;.     
1b980 20 7d 65 6c 73 65 20 69 66 28 20 74 65 72 6d 53   }else if( termS
1b990 6f 72 74 4f 72 64 65 72 21 3d 73 6f 72 74 4f 72  ortOrder!=sortOr
1b9a0 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 62  der ){.        b
1b9b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1b9c0 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 20    }.    j++;.   
1b9d0 20 70 4f 42 49 74 65 6d 2b 2b 3b 0a 20 20 20 20   pOBItem++;.    
1b9e0 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  if( iColumn<0 ){
1b9f0 0a 20 20 20 20 20 20 73 65 65 6e 52 6f 77 69 64  .      seenRowid
1ba00 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61   = 1;.      brea
1ba10 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  k;.    }else if(
1ba20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
1ba30 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20  umn].notNull==0 
1ba40 26 26 20 69 73 45 71 21 3d 31 20 29 7b 0a 20 20  && isEq!=1 ){.  
1ba50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73      testcase( is
1ba60 45 71 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  Eq==0 );.      t
1ba70 65 73 74 63 61 73 65 28 20 69 73 45 71 3d 3d 32  estcase( isEq==2
1ba80 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1ba90 73 65 28 20 69 73 45 71 3d 3d 33 20 29 3b 0a 20  se( isEq==3 );. 
1baa0 20 20 20 20 20 75 6e 69 71 75 65 4e 6f 74 4e 75       uniqueNotNu
1bab0 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ll = 0;.    }.  
1bac0 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68 61  }..  /* If we ha
1bad0 76 65 20 6e 6f 74 20 66 6f 75 6e 64 20 61 74 20  ve not found at 
1bae0 6c 65 61 73 74 20 6f 6e 65 20 4f 52 44 45 52 20  least one ORDER 
1baf0 42 59 20 74 65 72 6d 20 74 68 61 74 20 6d 61 74  BY term that mat
1bb00 63 68 65 73 20 74 68 65 0a 20 20 2a 2a 20 69 6e  ches the.  ** in
1bb10 64 65 78 2c 20 74 68 65 6e 20 73 68 6f 77 20 6e  dex, then show n
1bb20 6f 20 70 72 6f 67 72 65 73 73 2e 20 2a 2f 0a 20  o progress. */. 
1bb30 20 69 66 28 20 70 4f 42 49 74 65 6d 3d 3d 26 70   if( pOBItem==&p
1bb40 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 50 72 69 6f  OrderBy->a[nPrio
1bb50 72 53 61 74 5d 20 29 20 72 65 74 75 72 6e 20 6e  rSat] ) return n
1bb60 50 72 69 6f 72 53 61 74 3b 0a 0a 20 20 2f 2a 20  PriorSat;..  /* 
1bb70 52 65 74 75 72 6e 20 74 68 65 20 6e 65 63 65 73  Return the neces
1bb80 73 61 72 79 20 73 63 61 6e 20 6f 72 64 65 72 20  sary scan order 
1bb90 62 61 63 6b 20 74 6f 20 74 68 65 20 63 61 6c 6c  back to the call
1bba0 65 72 20 2a 2f 0a 20 20 2a 70 62 52 65 76 20 3d  er */.  *pbRev =
1bbb0 20 73 6f 72 74 4f 72 64 65 72 20 26 20 31 3b 0a   sortOrder & 1;.
1bbc0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77  .  /* If there w
1bbd0 61 73 20 61 6e 20 22 4f 52 44 45 52 20 42 59 20  as an "ORDER BY 
1bbe0 72 6f 77 69 64 22 20 74 65 72 6d 20 74 68 61 74  rowid" term that
1bbf0 20 6d 61 74 63 68 65 64 2c 20 6f 72 20 69 74 20   matched, or it 
1bc00 69 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20 70 6f 73  is only.  ** pos
1bc10 73 69 62 6c 65 20 66 6f 72 20 61 20 73 69 6e 67  sible for a sing
1bc20 6c 65 20 72 6f 77 20 66 72 6f 6d 20 74 68 69 73  le row from this
1bc30 20 74 61 62 6c 65 20 74 6f 20 6d 61 74 63 68 2c   table to match,
1bc40 20 74 68 65 6e 20 73 6b 69 70 20 6f 76 65 72 0a   then skip over.
1bc50 20 20 2a 2a 20 61 6e 79 20 61 64 64 69 74 69 6f    ** any additio
1bc60 6e 61 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72  nal ORDER BY ter
1bc70 6d 73 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  ms dealing with 
1bc80 74 68 69 73 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  this table..  */
1bc90 0a 20 20 69 66 28 20 73 65 65 6e 52 6f 77 69 64  .  if( seenRowid
1bca0 20 7c 7c 20 28 75 6e 69 71 75 65 4e 6f 74 4e 75   || (uniqueNotNu
1bcb0 6c 6c 20 26 26 20 69 3e 3d 70 49 64 78 2d 3e 6e  ll && i>=pIdx->n
1bcc0 43 6f 6c 75 6d 6e 29 20 29 7b 0a 20 20 20 20 2f  Column) ){.    /
1bcd0 2a 20 41 64 76 61 6e 63 65 20 6a 20 6f 76 65 72  * Advance j over
1bce0 20 61 64 64 69 74 69 6f 6e 61 6c 20 4f 52 44 45   additional ORDE
1bcf0 52 20 42 59 20 74 65 72 6d 73 20 61 73 73 6f 63  R BY terms assoc
1bd00 69 61 74 65 64 20 77 69 74 68 20 62 61 73 65 20  iated with base 
1bd10 2a 2f 0a 20 20 20 20 57 68 65 72 65 4d 61 73 6b  */.    WhereMask
1bd20 53 65 74 20 2a 70 4d 53 20 3d 20 70 2d 3e 70 57  Set *pMS = p->pW
1bd30 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a 20 20 20  C->pMaskSet;.   
1bd40 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 7e 67 65   Bitmask m = ~ge
1bd50 74 4d 61 73 6b 28 70 4d 53 2c 20 62 61 73 65 29  tMask(pMS, base)
1bd60 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6a 3c 6e  ;.    while( j<n
1bd70 54 65 72 6d 20 26 26 20 28 65 78 70 72 54 61 62  Term && (exprTab
1bd80 6c 65 55 73 61 67 65 28 70 4d 53 2c 20 70 4f 72  leUsage(pMS, pOr
1bd90 64 65 72 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70  derBy->a[j].pExp
1bda0 72 29 26 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20  r)&m)==0 ){.    
1bdb0 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    j++;.    }.  }
1bdc0 0a 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a  .  return j;.}..
1bdd0 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 62  /*.** Find the b
1bde0 65 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20 66  est query plan f
1bdf0 6f 72 20 61 63 63 65 73 73 69 6e 67 20 61 20 70  or accessing a p
1be00 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 2e  articular table.
1be10 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 62    Write the.** b
1be20 65 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20 61  est query plan a
1be30 6e 64 20 69 74 73 20 63 6f 73 74 20 69 6e 74 6f  nd its cost into
1be40 20 74 68 65 20 70 2d 3e 63 6f 73 74 2e 0a 2a 2a   the p->cost..**
1be50 0a 2a 2a 20 54 68 65 20 6c 6f 77 65 73 74 20 63  .** The lowest c
1be60 6f 73 74 20 70 6c 61 6e 20 77 69 6e 73 2e 20 20  ost plan wins.  
1be70 54 68 65 20 63 6f 73 74 20 69 73 20 61 6e 20 65  The cost is an e
1be80 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 61  stimate of the a
1be90 6d 6f 75 6e 74 20 6f 66 0a 2a 2a 20 43 50 55 20  mount of.** CPU 
1bea0 61 6e 64 20 64 69 73 6b 20 49 2f 4f 20 6e 65 65  and disk I/O nee
1beb0 64 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74  ded to process t
1bec0 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65 73  he requested res
1bed0 75 6c 74 2e 0a 2a 2a 20 46 61 63 74 6f 72 73 20  ult..** Factors 
1bee0 74 68 61 74 20 69 6e 66 6c 75 65 6e 63 65 20 63  that influence c
1bef0 6f 73 74 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a  ost include:.**.
1bf00 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 65 73 74  **    *  The est
1bf10 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  imated number of
1bf20 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20   rows that will 
1bf30 62 65 20 72 65 74 72 69 65 76 65 64 2e 20 20 28  be retrieved.  (
1bf40 54 68 65 0a 2a 2a 20 20 20 20 20 20 20 66 65 77  The.**       few
1bf50 65 72 20 74 68 65 20 62 65 74 74 65 72 2e 29 0a  er the better.).
1bf60 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74  **.**    *  Whet
1bf70 68 65 72 20 6f 72 20 6e 6f 74 20 73 6f 72 74 69  her or not sorti
1bf80 6e 67 20 6d 75 73 74 20 6f 63 63 75 72 2e 0a 2a  ng must occur..*
1bf90 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68  *.**    *  Wheth
1bfa0 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 72 65 20  er or not there 
1bfb0 6d 75 73 74 20 62 65 20 73 65 70 61 72 61 74 65  must be separate
1bfc0 20 6c 6f 6f 6b 75 70 73 20 69 6e 20 74 68 65 0a   lookups in the.
1bfd0 2a 2a 20 20 20 20 20 20 20 69 6e 64 65 78 20 61  **       index a
1bfe0 6e 64 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74  nd in the main t
1bff0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  able..**.** If t
1c000 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45  here was an INDE
1c010 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 28 70  XED BY clause (p
1c020 53 72 63 2d 3e 70 49 6e 64 65 78 29 20 61 74 74  Src->pIndex) att
1c030 61 63 68 65 64 20 74 6f 20 74 68 65 20 74 61 62  ached to the tab
1c040 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 53 51 4c  le in.** the SQL
1c050 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
1c060 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f   this function o
1c070 6e 6c 79 20 63 6f 6e 73 69 64 65 72 73 20 70 6c  nly considers pl
1c080 61 6e 73 20 75 73 69 6e 67 20 74 68 65 20 0a 2a  ans using the .*
1c090 2a 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 49  * named index. I
1c0a0 66 20 6e 6f 20 73 75 63 68 20 70 6c 61 6e 20 69  f no such plan i
1c0b0 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68  s found, then th
1c0c0 65 20 72 65 74 75 72 6e 65 64 20 63 6f 73 74 20  e returned cost 
1c0d0 69 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 49 47  is.** SQLITE_BIG
1c0e0 5f 44 42 4c 2e 20 49 66 20 61 20 70 6c 61 6e 20  _DBL. If a plan 
1c0f0 69 73 20 66 6f 75 6e 64 20 74 68 61 74 20 75 73  is found that us
1c100 65 73 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64  es the named ind
1c110 65 78 2c 20 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ex, .** then the
1c120 20 63 6f 73 74 20 69 73 20 63 61 6c 63 75 6c 61   cost is calcula
1c130 74 65 64 20 69 6e 20 74 68 65 20 75 73 75 61 6c  ted in the usual
1c140 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61   way..**.** If a
1c150 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61   NOT INDEXED cla
1c160 75 73 65 20 77 61 73 20 61 74 74 61 63 68 65 64  use was attached
1c170 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 0a 2a   to the table .*
1c180 2a 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20  * in the SELECT 
1c190 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
1c1a0 6e 6f 20 69 6e 64 65 78 65 73 20 61 72 65 20 63  no indexes are c
1c1b0 6f 6e 73 69 64 65 72 65 64 2e 20 48 6f 77 65 76  onsidered. Howev
1c1c0 65 72 2c 20 74 68 65 20 0a 2a 2a 20 73 65 6c 65  er, the .** sele
1c1d0 63 74 65 64 20 70 6c 61 6e 20 6d 61 79 20 73 74  cted plan may st
1c1e0 69 6c 6c 20 74 61 6b 65 20 61 64 76 61 6e 74 61  ill take advanta
1c1f0 67 65 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d  ge of the built-
1c200 69 6e 20 72 6f 77 69 64 20 70 72 69 6d 61 72 79  in rowid primary
1c210 20 6b 65 79 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a   key.** index..*
1c220 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65  /.static void be
1c230 73 74 42 74 72 65 65 49 6e 64 65 78 28 57 68 65  stBtreeIndex(Whe
1c240 72 65 42 65 73 74 49 64 78 20 2a 70 29 7b 0a 20  reBestIdx *p){. 
1c250 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
1c260 20 70 2d 3e 70 50 61 72 73 65 3b 20 20 2f 2a 20   p->pParse;  /* 
1c270 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
1c280 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ext */.  WhereCl
1c290 61 75 73 65 20 2a 70 57 43 20 3d 20 70 2d 3e 70  ause *pWC = p->p
1c2a0 57 43 3b 20 20 2f 2a 20 54 68 65 20 57 48 45 52  WC;  /* The WHER
1c2b0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
1c2c0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1c2d0 6d 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  m *pSrc = p->pSr
1c2e0 63 3b 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63  c; /* The FROM c
1c2f0 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65  lause term to se
1c300 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69 43  arch */.  int iC
1c310 75 72 20 3d 20 70 53 72 63 2d 3e 69 43 75 72 73  ur = pSrc->iCurs
1c320 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20 63 75 72  or;   /* The cur
1c330 73 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65  sor of the table
1c340 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 20   to be accessed 
1c350 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f  */.  Index *pPro
1c360 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  be;             
1c370 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20   /* An index we 
1c380 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a  are evaluating *
1c390 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  /.  Index *pIdx;
1c3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3b0 2f 2a 20 43 6f 70 79 20 6f 66 20 70 50 72 6f 62  /* Copy of pProb
1c3c0 65 2c 20 6f 72 20 7a 65 72 6f 20 66 6f 72 20 49  e, or zero for I
1c3d0 50 4b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  PK index */.  in
1c3e0 74 20 65 71 54 65 72 6d 4d 61 73 6b 3b 20 20 20  t eqTermMask;   
1c3f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1c400 72 65 6e 74 20 6d 61 73 6b 20 6f 66 20 76 61 6c  rent mask of val
1c410 69 64 20 65 71 75 61 6c 69 74 79 20 6f 70 65 72  id equality oper
1c420 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ators */.  int i
1c430 64 78 45 71 54 65 72 6d 4d 61 73 6b 3b 20 20 20  dxEqTermMask;   
1c440 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1c450 6d 61 73 6b 20 6f 66 20 76 61 6c 69 64 20 65 71  mask of valid eq
1c460 75 61 6c 69 74 79 20 6f 70 65 72 61 74 6f 72 73  uality operators
1c470 20 2a 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b   */.  Index sPk;
1c480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c490 20 20 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64 65    /* A fake inde
1c4a0 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65  x object for the
1c4b0 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a   primary key */.
1c4c0 20 20 74 52 6f 77 63 6e 74 20 61 69 52 6f 77 45    tRowcnt aiRowE
1c4d0 73 74 50 6b 5b 32 5d 3b 20 20 20 20 20 20 2f 2a  stPk[2];      /*
1c4e0 20 54 68 65 20 61 69 52 6f 77 45 73 74 5b 5d 20   The aiRowEst[] 
1c4f0 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50  value for the sP
1c500 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  k index */.  int
1c510 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31   aiColumnPk = -1
1c520 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
1c530 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20  aColumn[] value 
1c540 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65  for the sPk inde
1c550 78 20 2a 2f 0a 20 20 69 6e 74 20 77 73 46 6c 61  x */.  int wsFla
1c560 67 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  gMask;          
1c570 20 20 20 2f 2a 20 41 6c 6c 6f 77 65 64 20 66 6c     /* Allowed fl
1c580 61 67 73 20 69 6e 20 70 2d 3e 63 6f 73 74 2e 70  ags in p->cost.p
1c590 6c 61 6e 2e 77 73 46 6c 61 67 20 2a 2f 0a 20 20  lan.wsFlag */.  
1c5a0 69 6e 74 20 6e 50 72 69 6f 72 53 61 74 3b 20 20  int nPriorSat;  
1c5b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1c5c0 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 73 61  RDER BY terms sa
1c5d0 74 69 73 66 69 65 64 20 62 79 20 6f 75 74 65 72  tisfied by outer
1c5e0 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 69 6e 74 20   loops */.  int 
1c5f0 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20  nOrderBy;       
1c600 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1c610 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65  r of ORDER BY te
1c620 72 6d 73 20 2a 2f 0a 20 20 63 68 61 72 20 62 53  rms */.  char bS
1c630 6f 72 74 49 6e 69 74 3b 20 20 20 20 20 20 20 20  ortInit;        
1c640 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69       /* Initiali
1c650 7a 65 72 20 66 6f 72 20 62 53 6f 72 74 20 69 6e  zer for bSort in
1c660 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20   inner loop */. 
1c670 20 63 68 61 72 20 62 44 69 73 74 49 6e 69 74 3b   char bDistInit;
1c680 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c690 49 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20  Initializer for 
1c6a0 62 44 69 73 74 20 69 6e 20 69 6e 6e 65 72 20 6c  bDist in inner l
1c6b0 6f 6f 70 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 49 6e  oop */...  /* In
1c6c0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 73  itialize the cos
1c6d0 74 20 74 6f 20 61 20 77 6f 72 73 74 2d 63 61 73  t to a worst-cas
1c6e0 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 6d 65 6d  e value */.  mem
1c6f0 73 65 74 28 26 70 2d 3e 63 6f 73 74 2c 20 30 2c  set(&p->cost, 0,
1c700 20 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 73 74 29   sizeof(p->cost)
1c710 29 3b 0a 20 20 70 2d 3e 63 6f 73 74 2e 72 43 6f  );.  p->cost.rCo
1c720 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f  st = SQLITE_BIG_
1c730 44 42 4c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  DBL;..  /* If th
1c740 65 20 70 53 72 63 20 74 61 62 6c 65 20 69 73 20  e pSrc table is 
1c750 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
1c760 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 74  of a LEFT JOIN t
1c770 68 65 6e 20 77 65 20 6d 61 79 20 6e 6f 74 0a 20  hen we may not. 
1c780 20 2a 2a 20 75 73 65 20 61 6e 20 69 6e 64 65 78   ** use an index
1c790 20 74 6f 20 73 61 74 69 73 66 79 20 49 53 20 4e   to satisfy IS N
1c7a0 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ULL constraints 
1c7b0 6f 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 20 20  on that table.  
1c7c0 54 68 69 73 20 69 73 0a 20 20 2a 2a 20 62 65 63  This is.  ** bec
1c7d0 61 75 73 65 20 63 6f 6c 75 6d 6e 73 20 6d 69 67  ause columns mig
1c7e0 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20  ht end up being 
1c7f0 4e 55 4c 4c 20 69 66 20 74 68 65 20 74 61 62 6c  NULL if the tabl
1c800 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  e does not match
1c810 20 2d 0a 20 20 2a 2a 20 61 20 63 69 72 63 75 6d   -.  ** a circum
1c820 73 74 61 6e 63 65 20 77 68 69 63 68 20 74 68 65  stance which the
1c830 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 68 65   index cannot he
1c840 6c 70 20 75 73 20 64 69 73 63 6f 76 65 72 2e 20  lp us discover. 
1c850 20 54 69 63 6b 65 74 20 23 32 31 37 37 2e 0a 20   Ticket #2177.. 
1c860 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e   */.  if( pSrc->
1c870 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
1c880 46 54 20 29 7b 0a 20 20 20 20 69 64 78 45 71 54  FT ){.    idxEqT
1c890 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c  ermMask = WO_EQ|
1c8a0 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 7b 0a  WO_IN;.  }else{.
1c8b0 20 20 20 20 69 64 78 45 71 54 65 72 6d 4d 61 73      idxEqTermMas
1c8c0 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c  k = WO_EQ|WO_IN|
1c8d0 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a  WO_ISNULL;.  }..
1c8e0 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64    if( pSrc->pInd
1c8f0 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20  ex ){.    /* An 
1c900 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
1c910 65 20 73 70 65 63 69 66 69 65 73 20 61 20 70 61  e specifies a pa
1c920 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 74  rticular index t
1c930 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 49 64  o use */.    pId
1c940 78 20 3d 20 70 50 72 6f 62 65 20 3d 20 70 53 72  x = pProbe = pSr
1c950 63 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 77  c->pIndex;.    w
1c960 73 46 6c 61 67 4d 61 73 6b 20 3d 20 7e 28 57 48  sFlagMask = ~(WH
1c970 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45  ERE_ROWID_EQ|WHE
1c980 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 3b  RE_ROWID_RANGE);
1c990 0a 20 20 20 20 65 71 54 65 72 6d 4d 61 73 6b 20  .    eqTermMask 
1c9a0 3d 20 69 64 78 45 71 54 65 72 6d 4d 61 73 6b 3b  = idxEqTermMask;
1c9b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1c9c0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49 4e 44   There is no IND
1c9d0 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20  EXED BY clause. 
1c9e0 20 43 72 65 61 74 65 20 61 20 66 61 6b 65 20 49   Create a fake I
1c9f0 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c  ndex object in l
1ca00 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69  ocal.    ** vari
1ca10 61 62 6c 65 20 73 50 6b 20 74 6f 20 72 65 70 72  able sPk to repr
1ca20 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64 20  esent the rowid 
1ca30 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65  primary key inde
1ca40 78 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a 20 20  x.  Make this.  
1ca50 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78 20    ** fake index 
1ca60 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 63  the first in a c
1ca70 68 61 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62  hain of Index ob
1ca80 6a 65 63 74 73 20 77 69 74 68 20 61 6c 6c 20 6f  jects with all o
1ca90 66 20 74 68 65 20 72 65 61 6c 0a 20 20 20 20 2a  f the real.    *
1caa0 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c  * indices to fol
1cab0 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78  low */.    Index
1cac0 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
1cad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1cae0 72 73 74 20 6f 66 20 72 65 61 6c 20 69 6e 64 69  rst of real indi
1caf0 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ces on the table
1cb00 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
1cb10 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49  sPk, 0, sizeof(I
1cb20 6e 64 65 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e  ndex));.    sPk.
1cb30 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20  nColumn = 1;.   
1cb40 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d 20   sPk.aiColumn = 
1cb50 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20 20  &aiColumnPk;.   
1cb60 20 73 50 6b 2e 61 69 52 6f 77 45 73 74 20 3d 20   sPk.aiRowEst = 
1cb70 61 69 52 6f 77 45 73 74 50 6b 3b 0a 20 20 20 20  aiRowEstPk;.    
1cb80 73 50 6b 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45  sPk.onError = OE
1cb90 5f 52 65 70 6c 61 63 65 3b 0a 20 20 20 20 73 50  _Replace;.    sP
1cba0 6b 2e 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d  k.pTable = pSrc-
1cbb0 3e 70 54 61 62 3b 0a 20 20 20 20 61 69 52 6f 77  >pTab;.    aiRow
1cbc0 45 73 74 50 6b 5b 30 5d 20 3d 20 70 53 72 63 2d  EstPk[0] = pSrc-
1cbd0 3e 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 3b 0a  >pTab->nRowEst;.
1cbe0 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 31      aiRowEstPk[1
1cbf0 5d 20 3d 20 31 3b 0a 20 20 20 20 70 46 69 72 73  ] = 1;.    pFirs
1cc00 74 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e  t = pSrc->pTab->
1cc10 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  pIndex;.    if( 
1cc20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64  pSrc->notIndexed
1cc30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
1cc40 54 68 65 20 72 65 61 6c 20 69 6e 64 69 63 65 73  The real indices
1cc50 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 72   of the table ar
1cc60 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 65  e only considere
1cc70 64 20 69 66 20 74 68 65 0a 20 20 20 20 20 20 2a  d if the.      *
1cc80 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 71 75  * NOT INDEXED qu
1cc90 61 6c 69 66 69 65 72 20 69 73 20 6f 6d 69 74 74  alifier is omitt
1cca0 65 64 20 66 72 6f 6d 20 74 68 65 20 46 52 4f 4d  ed from the FROM
1ccb0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
1ccc0 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46 69   sPk.pNext = pFi
1ccd0 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  rst;.    }.    p
1cce0 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20 20  Probe = &sPk;.  
1ccf0 20 20 77 73 46 6c 61 67 4d 61 73 6b 20 3d 20 7e    wsFlagMask = ~
1cd00 28 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 5f  (.        WHERE_
1cd10 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f  COLUMN_IN|WHERE_
1cd20 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f  COLUMN_EQ|WHERE_
1cd30 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 7c 57 48 45 52  COLUMN_NULL|WHER
1cd40 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 0a 20  E_COLUMN_RANGE. 
1cd50 20 20 20 29 3b 0a 20 20 20 20 65 71 54 65 72 6d     );.    eqTerm
1cd60 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f  Mask = WO_EQ|WO_
1cd70 49 4e 3b 0a 20 20 20 20 70 49 64 78 20 3d 20 30  IN;.    pIdx = 0
1cd80 3b 0a 20 20 7d 0a 0a 20 20 6e 4f 72 64 65 72 42  ;.  }..  nOrderB
1cd90 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  y = p->pOrderBy 
1cda0 3f 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  ? p->pOrderBy->n
1cdb0 45 78 70 72 20 3a 20 30 3b 0a 20 20 69 66 28 20  Expr : 0;.  if( 
1cdc0 70 2d 3e 69 20 29 7b 0a 20 20 20 20 6e 50 72 69  p->i ){.    nPri
1cdd0 6f 72 53 61 74 20 3d 20 70 2d 3e 61 4c 65 76 65  orSat = p->aLeve
1cde0 6c 5b 70 2d 3e 69 2d 31 5d 2e 70 6c 61 6e 2e 6e  l[p->i-1].plan.n
1cdf0 4f 42 53 61 74 3b 0a 20 20 20 20 62 53 6f 72 74  OBSat;.    bSort
1ce00 49 6e 69 74 20 3d 20 6e 50 72 69 6f 72 53 61 74  Init = nPriorSat
1ce10 3c 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 62  <nOrderBy;.    b
1ce20 44 69 73 74 49 6e 69 74 20 3d 20 30 3b 0a 20 20  DistInit = 0;.  
1ce30 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 72 69 6f  }else{.    nPrio
1ce40 72 53 61 74 20 3d 20 30 3b 0a 20 20 20 20 62 53  rSat = 0;.    bS
1ce50 6f 72 74 49 6e 69 74 20 3d 20 6e 4f 72 64 65 72  ortInit = nOrder
1ce60 42 79 3e 30 3b 0a 20 20 20 20 62 44 69 73 74 49  By>0;.    bDistI
1ce70 6e 69 74 20 3d 20 70 2d 3e 70 44 69 73 74 69 6e  nit = p->pDistin
1ce80 63 74 21 3d 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ct!=0;.  }..  /*
1ce90 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69   Loop over all i
1cea0 6e 64 69 63 65 73 20 6c 6f 6f 6b 69 6e 67 20 66  ndices looking f
1ceb0 6f 72 20 74 68 65 20 62 65 73 74 20 6f 6e 65 20  or the best one 
1cec0 74 6f 20 75 73 65 0a 20 20 2a 2f 0a 20 20 66 6f  to use.  */.  fo
1ced0 72 28 3b 20 70 50 72 6f 62 65 3b 20 70 49 64 78  r(; pProbe; pIdx
1cee0 3d 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e  =pProbe=pProbe->
1cef0 70 4e 65 78 74 29 7b 0a 20 20 20 20 63 6f 6e 73  pNext){.    cons
1cf00 74 20 74 52 6f 77 63 6e 74 20 2a 20 63 6f 6e 73  t tRowcnt * cons
1cf10 74 20 61 69 52 6f 77 45 73 74 20 3d 20 70 50 72  t aiRowEst = pPr
1cf20 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 3b 0a 20  obe->aiRowEst;. 
1cf30 20 20 20 57 68 65 72 65 43 6f 73 74 20 70 63 3b     WhereCost pc;
1cf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cf50 2a 20 43 6f 73 74 20 6f 66 20 75 73 69 6e 67 20  * Cost of using 
1cf60 70 50 72 6f 62 65 20 2a 2f 0a 20 20 20 20 64 6f  pProbe */.    do
1cf70 75 62 6c 65 20 6c 6f 67 31 30 4e 20 3d 20 28 64  uble log10N = (d
1cf80 6f 75 62 6c 65 29 31 3b 20 20 2f 2a 20 62 61 73  ouble)1;  /* bas
1cf90 65 2d 31 30 20 6c 6f 67 61 72 69 74 68 6d 20 6f  e-10 logarithm o
1cfa0 66 20 6e 52 6f 77 20 28 69 6e 65 78 61 63 74 29  f nRow (inexact)
1cfb0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20   */..    /* The 
1cfc0 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
1cfd0 6c 65 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65  les are populate
1cfe0 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 70  d based on the p
1cff0 72 6f 70 65 72 74 69 65 73 20 6f 66 0a 20 20 20  roperties of.   
1d000 20 2a 2a 20 69 6e 64 65 78 20 62 65 69 6e 67 20   ** index being 
1d010 65 76 61 6c 75 61 74 65 64 2e 20 54 68 65 79 20  evaluated. They 
1d020 61 72 65 20 74 68 65 6e 20 75 73 65 64 20 74 6f  are then used to
1d030 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 65   determine the e
1d040 78 70 65 63 74 65 64 0a 20 20 20 20 2a 2a 20 63  xpected.    ** c
1d050 6f 73 74 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f  ost and number o
1d060 66 20 72 6f 77 73 20 72 65 74 75 72 6e 65 64 2e  f rows returned.
1d070 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1d080 70 63 2e 70 6c 61 6e 2e 6e 45 71 3a 20 0a 20 20  pc.plan.nEq: .  
1d090 20 20 2a 2a 20 20 20 20 4e 75 6d 62 65 72 20 6f    **    Number o
1d0a0 66 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 73  f equality terms
1d0b0 20 74 68 61 74 20 63 61 6e 20 62 65 20 69 6d 70   that can be imp
1d0c0 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 74  lemented using t
1d0d0 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a  he index..    **
1d0e0 20 20 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72      In other wor
1d0f0 64 73 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ds, the number o
1d100 66 20 69 6e 69 74 69 61 6c 20 66 69 65 6c 64 73  f initial fields
1d110 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 74 68   in the index th
1d120 61 74 0a 20 20 20 20 2a 2a 20 20 20 20 61 72 65  at.    **    are
1d130 20 75 73 65 64 20 69 6e 20 3d 3d 20 6f 72 20 49   used in == or I
1d140 4e 20 6f 72 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f  N or NOT NULL co
1d150 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74 68 65  nstraints of the
1d160 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20   WHERE clause.. 
1d170 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 6e 49     **.    **  nI
1d180 6e 4d 75 6c 3a 20 20 0a 20 20 20 20 2a 2a 20 20  nMul:  .    **  
1d190 20 20 54 68 65 20 22 69 6e 2d 6d 75 6c 74 69 70    The "in-multip
1d1a0 6c 69 65 72 22 2e 20 54 68 69 73 20 69 73 20 61  lier". This is a
1d1b0 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 68 6f  n estimate of ho
1d1c0 77 20 6d 61 6e 79 20 73 65 65 6b 20 6f 70 65 72  w many seek oper
1d1d0 61 74 69 6f 6e 73 20 0a 20 20 20 20 2a 2a 20 20  ations .    **  
1d1e0 20 20 53 51 4c 69 74 65 20 6d 75 73 74 20 70 65    SQLite must pe
1d1f0 72 66 6f 72 6d 20 6f 6e 20 74 68 65 20 69 6e 64  rform on the ind
1d200 65 78 20 69 6e 20 71 75 65 73 74 69 6f 6e 2e 20  ex in question. 
1d210 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
1d220 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 57  the .    **    W
1d230 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 3a 0a  HERE clause is:.
1d240 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1d250 20 20 20 57 48 45 52 45 20 61 20 49 4e 20 28 31     WHERE a IN (1
1d260 2c 20 32 2c 20 33 29 20 41 4e 44 20 62 20 49 4e  , 2, 3) AND b IN
1d270 20 28 34 2c 20 35 2c 20 36 29 0a 20 20 20 20 2a   (4, 5, 6).    *
1d280 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53 51 4c 69  *.    **    SQLi
1d290 74 65 20 6d 75 73 74 20 70 65 72 66 6f 72 6d 20  te must perform 
1d2a0 39 20 6c 6f 6f 6b 75 70 73 20 6f 6e 20 61 6e 20  9 lookups on an 
1d2b0 69 6e 64 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c  index on (a, b),
1d2c0 20 73 6f 20 6e 49 6e 4d 75 6c 20 69 73 20 0a 20   so nInMul is . 
1d2d0 20 20 20 2a 2a 20 20 20 20 73 65 74 20 74 6f 20     **    set to 
1d2e0 39 2e 20 47 69 76 65 6e 20 74 68 65 20 73 61 6d  9. Given the sam
1d2f0 65 20 73 63 68 65 6d 61 20 61 6e 64 20 65 69 74  e schema and eit
1d300 68 65 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  her of the follo
1d310 77 69 6e 67 20 57 48 45 52 45 20 0a 20 20 20 20  wing WHERE .    
1d320 2a 2a 20 20 20 20 63 6c 61 75 73 65 73 3a 0a 20  **    clauses:. 
1d330 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1d340 20 20 57 48 45 52 45 20 61 20 3d 20 20 31 0a 20    WHERE a =  1. 
1d350 20 20 20 2a 2a 20 20 20 20 20 20 57 48 45 52 45     **      WHERE
1d360 20 61 20 3e 3d 20 32 0a 20 20 20 20 2a 2a 0a 20   a >= 2.    **. 
1d370 20 20 20 2a 2a 20 20 20 20 6e 49 6e 4d 75 6c 20     **    nInMul 
1d380 69 73 20 73 65 74 20 74 6f 20 31 2e 0a 20 20 20  is set to 1..   
1d390 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 49 66   **.    **    If
1d3a0 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20   there exists a 
1d3b0 57 48 45 52 45 20 74 65 72 6d 20 6f 66 20 74 68  WHERE term of th
1d3c0 65 20 66 6f 72 6d 20 22 78 20 49 4e 20 28 53 45  e form "x IN (SE
1d3d0 4c 45 43 54 20 2e 2e 2e 29 22 2c 20 74 68 65 6e  LECT ...)", then
1d3e0 20 0a 20 20 20 20 2a 2a 20 20 20 20 74 68 65 20   .    **    the 
1d3f0 73 75 62 2d 73 65 6c 65 63 74 20 69 73 20 61 73  sub-select is as
1d400 73 75 6d 65 64 20 74 6f 20 72 65 74 75 72 6e 20  sumed to return 
1d410 32 35 20 72 6f 77 73 20 66 6f 72 20 74 68 65 20  25 rows for the 
1d420 70 75 72 70 6f 73 65 73 20 6f 66 20 0a 20 20 20  purposes of .   
1d430 20 2a 2a 20 20 20 20 64 65 74 65 72 6d 69 6e 69   **    determini
1d440 6e 67 20 6e 49 6e 4d 75 6c 2e 0a 20 20 20 20 2a  ng nInMul..    *
1d450 2a 0a 20 20 20 20 2a 2a 20 20 62 49 6e 45 73 74  *.    **  bInEst
1d460 3a 20 20 0a 20 20 20 20 2a 2a 20 20 20 20 53 65  :  .    **    Se
1d470 74 20 74 6f 20 74 72 75 65 20 69 66 20 74 68 65  t to true if the
1d480 72 65 20 77 61 73 20 61 74 20 6c 65 61 73 74 20  re was at least 
1d490 6f 6e 65 20 22 78 20 49 4e 20 28 53 45 4c 45 43  one "x IN (SELEC
1d4a0 54 20 2e 2e 2e 29 22 20 74 65 72 6d 20 75 73 65  T ...)" term use
1d4b0 64 20 0a 20 20 20 20 2a 2a 20 20 20 20 69 6e 20  d .    **    in 
1d4c0 64 65 74 65 72 6d 69 6e 69 6e 67 20 74 68 65 20  determining the 
1d4d0 76 61 6c 75 65 20 6f 66 20 6e 49 6e 4d 75 6c 2e  value of nInMul.
1d4e0 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20    Note that the 
1d4f0 52 48 53 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  RHS of the.    *
1d500 2a 20 20 20 20 49 4e 20 6f 70 65 72 61 74 6f 72  *    IN operator
1d510 20 6d 75 73 74 20 62 65 20 61 20 53 45 4c 45 43   must be a SELEC
1d520 54 2c 20 6e 6f 74 20 61 20 76 61 6c 75 65 20 6c  T, not a value l
1d530 69 73 74 2c 20 66 6f 72 20 74 68 69 73 20 76 61  ist, for this va
1d540 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 20 20  riable.    **   
1d550 20 74 6f 20 62 65 20 74 72 75 65 2e 0a 20 20 20   to be true..   
1d560 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 72 61 6e 67   **.    **  rang
1d570 65 44 69 76 3a 0a 20 20 20 20 2a 2a 20 20 20 20  eDiv:.    **    
1d580 41 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 61  An estimate of a
1d590 20 64 69 76 69 73 6f 72 20 62 79 20 77 68 69 63   divisor by whic
1d5a0 68 20 74 6f 20 72 65 64 75 63 65 20 74 68 65 20  h to reduce the 
1d5b0 73 65 61 72 63 68 20 73 70 61 63 65 20 64 75 65  search space due
1d5c0 0a 20 20 20 20 2a 2a 20 20 20 20 74 6f 20 69 6e  .    **    to in
1d5d0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1d5e0 69 6e 74 73 2e 20 20 49 6e 20 74 68 65 20 61 62  ints.  In the ab
1d5f0 73 65 6e 63 65 20 6f 66 20 73 71 6c 69 74 65 5f  sence of sqlite_
1d600 73 74 61 74 33 20 41 4e 41 4c 59 5a 45 0a 20 20  stat3 ANALYZE.  
1d610 20 20 2a 2a 20 20 20 20 64 61 74 61 2c 20 61 20    **    data, a 
1d620 73 69 6e 67 6c 65 20 69 6e 65 71 75 61 6c 69 74  single inequalit
1d630 79 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65  y reduces the se
1d640 61 72 63 68 20 73 70 61 63 65 20 74 6f 20 31 2f  arch space to 1/
1d650 34 72 64 20 69 74 73 0a 20 20 20 20 2a 2a 20 20  4rd its.    **  
1d660 20 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 20    original size 
1d670 28 72 61 6e 67 65 44 69 76 3d 3d 34 29 2e 20 20  (rangeDiv==4).  
1d680 54 77 6f 20 69 6e 65 71 75 61 6c 69 74 69 65 73  Two inequalities
1d690 20 72 65 64 75 63 65 20 74 68 65 20 73 65 61 72   reduce the sear
1d6a0 63 68 0a 20 20 20 20 2a 2a 20 20 20 20 73 70 61  ch.    **    spa
1d6b0 63 65 20 74 6f 20 31 2f 31 36 74 68 20 6f 66 20  ce to 1/16th of 
1d6c0 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
1d6d0 65 20 28 72 61 6e 67 65 44 69 76 3d 3d 31 36 29  e (rangeDiv==16)
1d6e0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1d6f0 20 62 53 6f 72 74 3a 20 20 20 0a 20 20 20 20 2a   bSort:   .    *
1d700 2a 20 20 20 20 42 6f 6f 6c 65 61 6e 2e 20 54 72  *    Boolean. Tr
1d710 75 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ue if there is a
1d720 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
1d730 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 71 75  e that will requ
1d740 69 72 65 20 61 6e 20 0a 20 20 20 20 2a 2a 20 20  ire an .    **  
1d750 20 20 65 78 74 65 72 6e 61 6c 20 73 6f 72 74 20    external sort 
1d760 28 69 2e 65 2e 20 73 63 61 6e 6e 69 6e 67 20 74  (i.e. scanning t
1d770 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 65  he index being e
1d780 76 61 6c 75 61 74 65 64 20 77 69 6c 6c 20 6e 6f  valuated will no
1d790 74 20 0a 20 20 20 20 2a 2a 20 20 20 20 63 6f 72  t .    **    cor
1d7a0 72 65 63 74 6c 79 20 6f 72 64 65 72 20 72 65 63  rectly order rec
1d7b0 6f 72 64 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ords)..    **.  
1d7c0 20 20 2a 2a 20 20 62 44 69 73 74 3a 0a 20 20 20    **  bDist:.   
1d7d0 20 2a 2a 20 20 20 20 42 6f 6f 6c 65 61 6e 2e 20   **    Boolean. 
1d7e0 54 72 75 65 20 69 66 20 74 68 65 72 65 20 69 73  True if there is
1d7f0 20 61 20 44 49 53 54 49 4e 43 54 20 63 6c 61 75   a DISTINCT clau
1d800 73 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 71  se that will req
1d810 75 69 72 65 20 61 6e 20 0a 20 20 20 20 2a 2a 20  uire an .    ** 
1d820 20 20 20 65 78 74 65 72 6e 61 6c 20 62 74 72 65     external btre
1d830 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
1d840 20 20 62 4c 6f 6f 6b 75 70 3a 20 0a 20 20 20 20    bLookup: .    
1d850 2a 2a 20 20 20 20 42 6f 6f 6c 65 61 6e 2e 20 54  **    Boolean. T
1d860 72 75 65 20 69 66 20 61 20 74 61 62 6c 65 20 6c  rue if a table l
1d870 6f 6f 6b 75 70 20 69 73 20 72 65 71 75 69 72 65  ookup is require
1d880 64 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78  d for each index
1d890 20 65 6e 74 72 79 0a 20 20 20 20 2a 2a 20 20 20   entry.    **   
1d8a0 20 76 69 73 69 74 65 64 2e 20 20 49 6e 20 6f 74   visited.  In ot
1d8b0 68 65 72 20 77 6f 72 64 73 2c 20 74 72 75 65 20  her words, true 
1d8c0 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  if this is not a
1d8d0 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e   covering index.
1d8e0 0a 20 20 20 20 2a 2a 20 20 20 20 54 68 69 73 20  .    **    This 
1d8f0 69 73 20 61 6c 77 61 79 73 20 66 61 6c 73 65 20  is always false 
1d900 66 6f 72 20 74 68 65 20 72 6f 77 69 64 20 70 72  for the rowid pr
1d910 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20  imary key index 
1d920 6f 66 20 61 20 74 61 62 6c 65 2e 0a 20 20 20 20  of a table..    
1d930 2a 2a 20 20 20 20 46 6f 72 20 6f 74 68 65 72 20  **    For other 
1d940 69 6e 64 65 78 65 73 2c 20 69 74 20 69 73 20 74  indexes, it is t
1d950 72 75 65 20 75 6e 6c 65 73 73 20 61 6c 6c 20 74  rue unless all t
1d960 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
1d970 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 20  e table.    **  
1d980 20 20 75 73 65 64 20 62 79 20 74 68 65 20 53 45    used by the SE
1d990 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61  LECT statement a
1d9a0 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  re present in th
1d9b0 65 20 69 6e 64 65 78 20 28 73 75 63 68 20 61 6e  e index (such an
1d9c0 0a 20 20 20 20 2a 2a 20 20 20 20 69 6e 64 65 78  .    **    index
1d9d0 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 64 65   is sometimes de
1d9e0 73 63 72 69 62 65 64 20 61 73 20 61 20 63 6f 76  scribed as a cov
1d9f0 65 72 69 6e 67 20 69 6e 64 65 78 29 2e 0a 20 20  ering index)..  
1da00 20 20 2a 2a 20 20 20 20 46 6f 72 20 65 78 61 6d    **    For exam
1da10 70 6c 65 2c 20 67 69 76 65 6e 20 74 68 65 20 69  ple, given the i
1da20 6e 64 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20  ndex on (a, b), 
1da30 74 68 65 20 73 65 63 6f 6e 64 20 6f 66 20 74 68  the second of th
1da40 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 20 20 20  e following .   
1da50 20 2a 2a 20 20 20 20 74 77 6f 20 71 75 65 72 69   **    two queri
1da60 65 73 20 72 65 71 75 69 72 65 73 20 74 61 62 6c  es requires tabl
1da70 65 20 62 2d 74 72 65 65 20 6c 6f 6f 6b 75 70 73  e b-tree lookups
1da80 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 69 6e   in order to fin
1da90 64 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20  d the value.    
1daa0 2a 2a 20 20 20 20 6f 66 20 63 6f 6c 75 6d 6e 20  **    of column 
1dab0 63 2c 20 62 75 74 20 74 68 65 20 66 69 72 73 74  c, but the first
1dac0 20 64 6f 65 73 20 6e 6f 74 20 62 65 63 61 75 73   does not becaus
1dad0 65 20 63 6f 6c 75 6d 6e 73 20 61 20 61 6e 64 20  e columns a and 
1dae0 62 20 61 72 65 0a 20 20 20 20 2a 2a 20 20 20 20  b are.    **    
1daf0 62 6f 74 68 20 61 76 61 69 6c 61 62 6c 65 20 69  both available i
1db00 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20  n the index..   
1db10 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1db20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c         SELECT a,
1db30 20 62 20 20 20 20 46 52 4f 4d 20 74 62 6c 20 57   b    FROM tbl W
1db40 48 45 52 45 20 61 20 3d 20 31 3b 0a 20 20 20 20  HERE a = 1;.    
1db50 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 53  **             S
1db60 45 4c 45 43 54 20 61 2c 20 62 2c 20 63 20 46 52  ELECT a, b, c FR
1db70 4f 4d 20 74 62 6c 20 57 48 45 52 45 20 61 20 3d  OM tbl WHERE a =
1db80 20 31 3b 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69   1;.    */.    i
1db90 6e 74 20 62 49 6e 45 73 74 20 3d 20 30 3b 20 20  nt bInEst = 0;  
1dba0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dbb0 54 72 75 65 20 69 66 20 22 78 20 49 4e 20 28 53  True if "x IN (S
1dbc0 45 4c 45 43 54 2e 2e 2e 29 22 20 73 65 65 6e 20  ELECT...)" seen 
1dbd0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 49 6e 4d 75  */.    int nInMu
1dbe0 6c 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  l = 1;          
1dbf0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1dc00 66 20 64 69 73 74 69 6e 63 74 20 65 71 75 61 6c  f distinct equal
1dc10 69 74 69 65 73 20 74 6f 20 6c 6f 6f 6b 75 70 20  ities to lookup 
1dc20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 61  */.    double ra
1dc30 6e 67 65 44 69 76 20 3d 20 28 64 6f 75 62 6c 65  ngeDiv = (double
1dc40 29 31 3b 20 20 2f 2a 20 45 73 74 69 6d 61 74 65  )1;  /* Estimate
1dc50 64 20 72 65 64 75 63 74 69 6f 6e 20 69 6e 20 73  d reduction in s
1dc60 65 61 72 63 68 20 73 70 61 63 65 20 2a 2f 0a 20  earch space */. 
1dc70 20 20 20 69 6e 74 20 6e 42 6f 75 6e 64 20 3d 20     int nBound = 
1dc80 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1dc90 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 61   /* Number of ra
1dca0 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  nge constraints 
1dcb0 73 65 65 6e 20 2a 2f 0a 20 20 20 20 63 68 61 72  seen */.    char
1dcc0 20 62 53 6f 72 74 20 3d 20 62 53 6f 72 74 49 6e   bSort = bSortIn
1dcd0 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75  it;       /* Tru
1dce0 65 20 69 66 20 65 78 74 65 72 6e 61 6c 20 73 6f  e if external so
1dcf0 72 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  rt required */. 
1dd00 20 20 20 63 68 61 72 20 62 44 69 73 74 20 3d 20     char bDist = 
1dd10 62 44 69 73 74 49 6e 69 74 3b 20 20 20 20 20 20  bDistInit;      
1dd20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 64 65   /* True if inde
1dd30 78 20 63 61 6e 6e 6f 74 20 68 65 6c 70 20 77 69  x cannot help wi
1dd40 74 68 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20  th DISTINCT */. 
1dd50 20 20 20 63 68 61 72 20 62 4c 6f 6f 6b 75 70 20     char bLookup 
1dd60 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1dd70 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 74 20   /* True if not 
1dd80 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
1dd90 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72   */.    WhereTer
1dda0 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
1ddb0 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
1ddc0 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
1ddd0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 23 69  ERE clause */.#i
1dde0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1ddf0 4c 45 5f 53 54 41 54 33 0a 20 20 20 20 57 68 65  LE_STAT3.    Whe
1de00 72 65 54 65 72 6d 20 2a 70 46 69 72 73 74 54 65  reTerm *pFirstTe
1de10 72 6d 20 3d 20 30 3b 20 20 20 20 2f 2a 20 46 69  rm = 0;    /* Fi
1de20 72 73 74 20 74 65 72 6d 20 6d 61 74 63 68 69 6e  rst term matchin
1de30 67 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 23  g the index */.#
1de40 65 6e 64 69 66 0a 0a 20 20 20 20 57 48 45 52 45  endif..    WHERE
1de50 54 52 41 43 45 28 28 0a 20 20 20 20 20 20 22 20  TRACE((.      " 
1de60 20 20 25 73 28 25 73 29 3a 5c 6e 22 2c 0a 20 20    %s(%s):\n",.  
1de70 20 20 20 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e      pSrc->pTab->
1de80 7a 4e 61 6d 65 2c 20 28 70 49 64 78 20 3f 20 70  zName, (pIdx ? p
1de90 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 69 70  Idx->zName : "ip
1dea0 6b 22 29 0a 20 20 20 20 29 29 3b 0a 20 20 20 20  k").    ));.    
1deb0 6d 65 6d 73 65 74 28 26 70 63 2c 20 30 2c 20 73  memset(&pc, 0, s
1dec0 69 7a 65 6f 66 28 70 63 29 29 3b 0a 20 20 20 20  izeof(pc));.    
1ded0 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 3d  pc.plan.nOBSat =
1dee0 20 6e 50 72 69 6f 72 53 61 74 3b 0a 0a 20 20 20   nPriorSat;..   
1def0 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68   /* Determine th
1df00 65 20 76 61 6c 75 65 73 20 6f 66 20 70 63 2e 70  e values of pc.p
1df10 6c 61 6e 2e 6e 45 71 20 61 6e 64 20 6e 49 6e 4d  lan.nEq and nInM
1df20 75 6c 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 63  ul */.    for(pc
1df30 2e 70 6c 61 6e 2e 6e 45 71 3d 30 3b 20 70 63 2e  .plan.nEq=0; pc.
1df40 70 6c 61 6e 2e 6e 45 71 3c 70 50 72 6f 62 65 2d  plan.nEq<pProbe-
1df50 3e 6e 43 6f 6c 75 6d 6e 3b 20 70 63 2e 70 6c 61  >nColumn; pc.pla
1df60 6e 2e 6e 45 71 2b 2b 29 7b 0a 20 20 20 20 20 20  n.nEq++){.      
1df70 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e  int j = pProbe->
1df80 61 69 43 6f 6c 75 6d 6e 5b 70 63 2e 70 6c 61 6e  aiColumn[pc.plan
1df90 2e 6e 45 71 5d 3b 0a 20 20 20 20 20 20 70 54 65  .nEq];.      pTe
1dfa0 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  rm = findTerm(pW
1dfb0 43 2c 20 69 43 75 72 2c 20 6a 2c 20 70 2d 3e 6e  C, iCur, j, p->n
1dfc0 6f 74 52 65 61 64 79 2c 20 65 71 54 65 72 6d 4d  otReady, eqTermM
1dfd0 61 73 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  ask, pIdx);.    
1dfe0 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
1dff0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 63   break;.      pc
1e000 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d  .plan.wsFlags |=
1e010 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45   (WHERE_COLUMN_E
1e020 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51  Q|WHERE_ROWID_EQ
1e030 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1e040 65 28 20 70 54 65 72 6d 2d 3e 70 57 43 21 3d 70  e( pTerm->pWC!=p
1e050 57 43 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  WC );.      if( 
1e060 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1e070 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20   & WO_IN ){.    
1e080 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
1e090 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
1e0a0 20 20 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e          pc.plan.
1e0b0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
1e0c0 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20  _COLUMN_IN;.    
1e0d0 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
1e0e0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1e0f0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
1e100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20            /* "x 
1e110 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
1e120 3a 20 20 41 73 73 75 6d 65 20 74 68 65 20 53 45  :  Assume the SE
1e130 4c 45 43 54 20 72 65 74 75 72 6e 73 20 32 35 20  LECT returns 25 
1e140 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  rows */.        
1e150 20 20 6e 49 6e 4d 75 6c 20 2a 3d 20 32 35 3b 0a    nInMul *= 25;.
1e160 20 20 20 20 20 20 20 20 20 20 62 49 6e 45 73 74            bInEst
1e170 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 1;.        }e
1e180 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70  lse if( ALWAYS(p
1e190 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26  Expr->x.pList &&
1e1a0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
1e1b0 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  >nExpr) ){.     
1e1c0 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 76       /* "x IN (v
1e1d0 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e  alue, value, ...
1e1e0 29 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  )" */.          
1e1f0 6e 49 6e 4d 75 6c 20 2a 3d 20 70 45 78 70 72 2d  nInMul *= pExpr-
1e200 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  >x.pList->nExpr;
1e210 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1e220 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d   }else if( pTerm
1e230 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1e240 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  _ISNULL ){.     
1e250 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61     pc.plan.wsFla
1e260 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
1e270 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d  MN_NULL;.      }
1e280 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1e290 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20 20 20 20  NABLE_STAT3.    
1e2a0 20 20 69 66 28 20 70 63 2e 70 6c 61 6e 2e 6e 45    if( pc.plan.nE
1e2b0 71 3d 3d 30 20 26 26 20 70 50 72 6f 62 65 2d 3e  q==0 && pProbe->
1e2c0 61 53 61 6d 70 6c 65 20 29 20 70 46 69 72 73 74  aSample ) pFirst
1e2d0 54 65 72 6d 20 3d 20 70 54 65 72 6d 3b 0a 23 65  Term = pTerm;.#e
1e2e0 6e 64 69 66 0a 20 20 20 20 20 20 70 63 2e 75 73  ndif.      pc.us
1e2f0 65 64 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65  ed |= pTerm->pre
1e300 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 7d 0a  reqRight;.    }.
1e310 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
1e320 69 6e 64 65 78 20 62 65 69 6e 67 20 63 6f 6e 73  index being cons
1e330 69 64 65 72 65 64 20 69 73 20 55 4e 49 51 55 45  idered is UNIQUE
1e340 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 61  , and there is a
1e350 6e 20 65 71 75 61 6c 69 74 79 20 0a 20 20 20 20  n equality .    
1e360 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 6f  ** constraint fo
1e370 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  r all columns in
1e380 20 74 68 65 20 69 6e 64 65 78 2c 20 74 68 65 6e   the index, then
1e390 20 74 68 69 73 20 73 65 61 72 63 68 20 77 69 6c   this search wil
1e3a0 6c 20 66 69 6e 64 0a 20 20 20 20 2a 2a 20 61 74  l find.    ** at
1e3b0 20 6d 6f 73 74 20 61 20 73 69 6e 67 6c 65 20 72   most a single r
1e3c0 6f 77 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ow. In this case
1e3d0 20 73 65 74 20 74 68 65 20 57 48 45 52 45 5f 55   set the WHERE_U
1e3e0 4e 49 51 55 45 20 66 6c 61 67 20 74 6f 20 0a 20  NIQUE flag to . 
1e3f0 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 20 74     ** indicate t
1e400 68 69 73 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  his to the calle
1e410 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  r..    **.    **
1e420 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
1e430 68 65 20 73 65 61 72 63 68 20 6d 61 79 20 66 69  he search may fi
1e440 6e 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  nd more than one
1e450 20 72 6f 77 2c 20 74 65 73 74 20 74 6f 20 73 65   row, test to se
1e460 65 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 72  e if.    ** ther
1e470 65 20 69 73 20 61 20 72 61 6e 67 65 20 63 6f 6e  e is a range con
1e480 73 74 72 61 69 6e 74 20 6f 6e 20 69 6e 64 65 78  straint on index
1e490 65 64 20 63 6f 6c 75 6d 6e 20 28 70 63 2e 70 6c  ed column (pc.pl
1e4a0 61 6e 2e 6e 45 71 2b 31 29 20 74 68 61 74 0a 20  an.nEq+1) that. 
1e4b0 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74     ** can be opt
1e4c0 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 74 68 65  imized using the
1e4d0 20 69 6e 64 65 78 2e 20 0a 20 20 20 20 2a 2f 0a   index. .    */.
1e4e0 20 20 20 20 69 66 28 20 70 63 2e 70 6c 61 6e 2e      if( pc.plan.
1e4f0 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f  nEq==pProbe->nCo
1e500 6c 75 6d 6e 20 26 26 20 70 50 72 6f 62 65 2d 3e  lumn && pProbe->
1e510 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
1e520 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
1e530 73 65 28 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c  se( pc.plan.wsFl
1e540 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
1e550 4d 4e 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 74  MN_IN );.      t
1e560 65 73 74 63 61 73 65 28 20 70 63 2e 70 6c 61 6e  estcase( pc.plan
1e570 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
1e580 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 20 29 3b 0a  _COLUMN_NULL );.
1e590 20 20 20 20 20 20 69 66 28 20 28 70 63 2e 70 6c        if( (pc.pl
1e5a0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48  an.wsFlags & (WH
1e5b0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48  ERE_COLUMN_IN|WH
1e5c0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29  ERE_COLUMN_NULL)
1e5d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1e5e0 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  pc.plan.wsFlags 
1e5f0 7c 3d 20 57 48 45 52 45 5f 55 4e 49 51 55 45 3b  |= WHERE_UNIQUE;
1e600 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
1e610 69 3d 3d 30 20 7c 7c 20 28 70 2d 3e 61 4c 65 76  i==0 || (p->aLev
1e620 65 6c 5b 70 2d 3e 69 2d 31 5d 2e 70 6c 61 6e 2e  el[p->i-1].plan.
1e630 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1e640 41 4c 4c 5f 55 4e 49 51 55 45 29 21 3d 30 20 29  ALL_UNIQUE)!=0 )
1e650 7b 0a 20 20 20 20 20 20 20 20 20 20 70 63 2e 70  {.          pc.p
1e660 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57  lan.wsFlags |= W
1e670 48 45 52 45 5f 41 4c 4c 5f 55 4e 49 51 55 45 3b  HERE_ALL_UNIQUE;
1e680 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1e690 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
1e6a0 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65   pProbe->bUnorde
1e6b0 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  red==0 ){.      
1e6c0 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 6a 20 3d  int j;.      j =
1e6d0 20 28 70 63 2e 70 6c 61 6e 2e 6e 45 71 3d 3d 70   (pc.plan.nEq==p
1e6e0 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 3f  Probe->nColumn ?
1e6f0 20 2d 31 20 3a 20 70 50 72 6f 62 65 2d 3e 61 69   -1 : pProbe->ai
1e700 43 6f 6c 75 6d 6e 5b 70 63 2e 70 6c 61 6e 2e 6e  Column[pc.plan.n
1e710 45 71 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Eq]);.      if( 
1e720 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
1e730 75 72 2c 20 6a 2c 20 70 2d 3e 6e 6f 74 52 65 61  ur, j, p->notRea
1e740 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c  dy, WO_LT|WO_LE|
1e750 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 49 64  WO_GT|WO_GE, pId
1e760 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68  x) ){.        Wh
1e770 65 72 65 54 65 72 6d 20 2a 70 54 6f 70 2c 20 2a  ereTerm *pTop, *
1e780 70 42 74 6d 3b 0a 20 20 20 20 20 20 20 20 70 54  pBtm;.        pT
1e790 6f 70 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  op = findTerm(pW
1e7a0 43 2c 20 69 43 75 72 2c 20 6a 2c 20 70 2d 3e 6e  C, iCur, j, p->n
1e7b0 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57  otReady, WO_LT|W
1e7c0 4f 5f 4c 45 2c 20 70 49 64 78 29 3b 0a 20 20 20  O_LE, pIdx);.   
1e7d0 20 20 20 20 20 70 42 74 6d 20 3d 20 66 69 6e 64       pBtm = find
1e7e0 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
1e7f0 6a 2c 20 70 2d 3e 6e 6f 74 52 65 61 64 79 2c 20  j, p->notReady, 
1e800 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 49 64  WO_GT|WO_GE, pId
1e810 78 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  x);.        wher
1e820 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 70 50  eRangeScanEst(pP
1e830 61 72 73 65 2c 20 70 50 72 6f 62 65 2c 20 70 63  arse, pProbe, pc
1e840 2e 70 6c 61 6e 2e 6e 45 71 2c 20 70 42 74 6d 2c  .plan.nEq, pBtm,
1e850 20 70 54 6f 70 2c 20 26 72 61 6e 67 65 44 69 76   pTop, &rangeDiv
1e860 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1e870 54 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Top ){.         
1e880 20 6e 42 6f 75 6e 64 20 3d 20 31 3b 0a 20 20 20   nBound = 1;.   
1e890 20 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77         pc.plan.w
1e8a0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
1e8b0 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  TOP_LIMIT;.     
1e8c0 20 20 20 20 20 70 63 2e 75 73 65 64 20 7c 3d 20       pc.used |= 
1e8d0 70 54 6f 70 2d 3e 70 72 65 72 65 71 52 69 67 68  pTop->prereqRigh
1e8e0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  t;.          tes
1e8f0 74 63 61 73 65 28 20 70 54 6f 70 2d 3e 70 57 43  tcase( pTop->pWC
1e900 21 3d 70 57 43 20 29 3b 0a 20 20 20 20 20 20 20  !=pWC );.       
1e910 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
1e920 42 74 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Btm ){.         
1e930 20 6e 42 6f 75 6e 64 2b 2b 3b 0a 20 20 20 20 20   nBound++;.     
1e940 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46       pc.plan.wsF
1e950 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 42 54  lags |= WHERE_BT
1e960 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20  M_LIMIT;.       
1e970 20 20 20 70 63 2e 75 73 65 64 20 7c 3d 20 70 42     pc.used |= pB
1e980 74 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b  tm->prereqRight;
1e990 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
1e9a0 61 73 65 28 20 70 42 74 6d 2d 3e 70 57 43 21 3d  ase( pBtm->pWC!=
1e9b0 70 57 43 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  pWC );.        }
1e9c0 0a 20 20 20 20 20 20 20 20 70 63 2e 70 6c 61 6e  .        pc.plan
1e9d0 2e 77 73 46 6c 61 67 73 20 7c 3d 20 28 57 48 45  .wsFlags |= (WHE
1e9e0 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c  RE_COLUMN_RANGE|
1e9f0 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47  WHERE_ROWID_RANG
1ea00 45 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  E);.      }.    
1ea10 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
1ea20 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
1ea30 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65  Y clause and the
1ea40 20 69 6e 64 65 78 20 62 65 69 6e 67 20 63 6f 6e   index being con
1ea50 73 69 64 65 72 65 64 20 77 69 6c 6c 0a 20 20 20  sidered will.   
1ea60 20 2a 2a 20 6e 61 74 75 72 61 6c 6c 79 20 73 63   ** naturally sc
1ea70 61 6e 20 72 6f 77 73 20 69 6e 20 74 68 65 20 72  an rows in the r
1ea80 65 71 75 69 72 65 64 20 6f 72 64 65 72 2c 20 73  equired order, s
1ea90 65 74 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  et the appropria
1eaa0 74 65 20 66 6c 61 67 73 0a 20 20 20 20 2a 2a 20  te flags.    ** 
1eab0 69 6e 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61  in pc.plan.wsFla
1eac0 67 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  gs. Otherwise, i
1ead0 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
1eae0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 62 75  DER BY clause bu
1eaf0 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64  t.    ** the ind
1eb00 65 78 20 77 69 6c 6c 20 73 63 61 6e 20 72 6f 77  ex will scan row
1eb10 73 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74  s in a different
1eb20 20 6f 72 64 65 72 2c 20 73 65 74 20 74 68 65 20   order, set the 
1eb30 62 53 6f 72 74 0a 20 20 20 20 2a 2a 20 76 61 72  bSort.    ** var
1eb40 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69  iable.  */.    i
1eb50 66 28 20 62 53 6f 72 74 20 26 26 20 28 70 53 72  f( bSort && (pSr
1eb60 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  c->jointype & JT
1eb70 5f 4c 45 46 54 29 3d 3d 30 20 29 7b 0a 20 20 20  _LEFT)==0 ){.   
1eb80 20 20 20 69 6e 74 20 62 52 65 76 20 3d 20 32 3b     int bRev = 2;
1eb90 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
1eba0 45 28 28 22 20 20 20 20 20 20 2d 2d 3e 20 62 65  E(("      --> be
1ebb0 66 6f 72 65 20 69 73 53 6f 72 74 69 6e 67 49 6e  fore isSortingIn
1ebc0 64 65 78 3a 20 6e 50 72 69 6f 72 53 61 74 3d 25  dex: nPriorSat=%
1ebd0 64 5c 6e 22 2c 6e 50 72 69 6f 72 53 61 74 29 29  d\n",nPriorSat))
1ebe0 3b 0a 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e  ;.      pc.plan.
1ebf0 6e 4f 42 53 61 74 20 3d 20 69 73 53 6f 72 74 69  nOBSat = isSorti
1ec00 6e 67 49 6e 64 65 78 28 70 2c 20 70 50 72 6f 62  ngIndex(p, pProb
1ec10 65 2c 20 69 43 75 72 2c 20 26 62 52 65 76 29 3b  e, iCur, &bRev);
1ec20 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
1ec30 45 28 28 22 20 20 20 20 20 20 2d 2d 3e 20 61 66  E(("      --> af
1ec40 74 65 72 20 20 69 73 53 6f 72 74 69 6e 67 49 6e  ter  isSortingIn
1ec50 64 65 78 3a 20 62 52 65 76 3d 25 64 20 6e 4f 42  dex: bRev=%d nOB
1ec60 53 61 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  Sat=%d\n",.     
1ec70 20 20 20 20 20 20 20 20 20 20 20 20 20 62 52 65               bRe
1ec80 76 2c 20 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61  v, pc.plan.nOBSa
1ec90 74 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  t));.      if( n
1eca0 50 72 69 6f 72 53 61 74 3c 70 63 2e 70 6c 61 6e  PriorSat<pc.plan
1ecb0 2e 6e 4f 42 53 61 74 20 7c 7c 20 28 70 63 2e 70  .nOBSat || (pc.p
1ecc0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
1ecd0 45 52 45 5f 41 4c 4c 5f 55 4e 49 51 55 45 29 21  ERE_ALL_UNIQUE)!
1ece0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 63  =0 ){.        pc
1ecf0 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d  .plan.wsFlags |=
1ed00 20 57 48 45 52 45 5f 4f 52 44 45 52 45 44 3b 0a   WHERE_ORDERED;.
1ed10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1ed20 28 20 6e 4f 72 64 65 72 42 79 3d 3d 70 63 2e 70  ( nOrderBy==pc.p
1ed30 6c 61 6e 2e 6e 4f 42 53 61 74 20 29 7b 0a 20 20  lan.nOBSat ){.  
1ed40 20 20 20 20 20 20 62 53 6f 72 74 20 3d 20 30 3b        bSort = 0;
1ed50 0a 20 20 20 20 20 20 20 20 70 63 2e 70 6c 61 6e  .        pc.plan
1ed60 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  .wsFlags |= WHER
1ed70 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 7c 57 48  E_ROWID_RANGE|WH
1ed80 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
1ed90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1eda0 69 66 28 20 62 52 65 76 20 26 20 31 20 29 20 70  if( bRev & 1 ) p
1edb0 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c  c.plan.wsFlags |
1edc0 3d 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 3b  = WHERE_REVERSE;
1edd0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1ede0 66 20 74 68 65 72 65 20 69 73 20 61 20 44 49 53  f there is a DIS
1edf0 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20  TINCT qualifier 
1ee00 61 6e 64 20 74 68 69 73 20 69 6e 64 65 78 20 77  and this index w
1ee10 69 6c 6c 20 73 63 61 6e 20 72 6f 77 73 20 69 6e  ill scan rows in
1ee20 0a 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 6f 66  .    ** order of
1ee30 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 65 78   the DISTINCT ex
1ee40 70 72 65 73 73 69 6f 6e 73 2c 20 63 6c 65 61 72  pressions, clear
1ee50 20 62 44 69 73 74 20 61 6e 64 20 73 65 74 20 74   bDist and set t
1ee60 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 20  he appropriate. 
1ee70 20 20 20 2a 2a 20 66 6c 61 67 73 20 69 6e 20 70     ** flags in p
1ee80 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 2e 20  c.plan.wsFlags. 
1ee90 2a 2f 0a 20 20 20 20 69 66 28 20 62 44 69 73 74  */.    if( bDist
1eea0 0a 20 20 20 20 20 26 26 20 69 73 44 69 73 74 69  .     && isDisti
1eeb0 6e 63 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c  nctIndex(pParse,
1eec0 20 70 57 43 2c 20 70 50 72 6f 62 65 2c 20 69 43   pWC, pProbe, iC
1eed0 75 72 2c 20 70 2d 3e 70 44 69 73 74 69 6e 63 74  ur, p->pDistinct
1eee0 2c 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 29 0a 20  , pc.plan.nEq). 
1eef0 20 20 20 20 26 26 20 28 70 63 2e 70 6c 61 6e 2e      && (pc.plan.
1ef00 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1ef10 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 0a 20 20  COLUMN_IN)==0.  
1ef20 20 20 29 7b 0a 20 20 20 20 20 20 62 44 69 73 74    ){.      bDist
1ef30 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 63 2e 70   = 0;.      pc.p
1ef40 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57  lan.wsFlags |= W
1ef50 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
1ef60 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41  |WHERE_COLUMN_RA
1ef70 4e 47 45 7c 57 48 45 52 45 5f 44 49 53 54 49 4e  NGE|WHERE_DISTIN
1ef80 43 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  CT;.    }..    /
1ef90 2a 20 49 66 20 63 75 72 72 65 6e 74 6c 79 20 63  * If currently c
1efa0 61 6c 63 75 6c 61 74 69 6e 67 20 74 68 65 20 63  alculating the c
1efb0 6f 73 74 20 6f 66 20 75 73 69 6e 67 20 61 6e 20  ost of using an 
1efc0 69 6e 64 65 78 20 28 6e 6f 74 20 74 68 65 20 49  index (not the I
1efd0 50 4b 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 29  PK.    ** index)
1efe0 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61  , determine if a
1eff0 6c 6c 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75  ll required colu
1f000 6d 6e 20 64 61 74 61 20 6d 61 79 20 62 65 20 6f  mn data may be o
1f010 62 74 61 69 6e 65 64 20 77 69 74 68 6f 75 74 20  btained without 
1f020 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  .    ** using th
1f030 65 20 6d 61 69 6e 20 74 61 62 6c 65 20 28 69 2e  e main table (i.
1f040 65 2e 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  e. if the index 
1f050 69 73 20 61 20 63 6f 76 65 72 69 6e 67 0a 20 20  is a covering.  
1f060 20 20 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74    ** index for t
1f070 68 69 73 20 71 75 65 72 79 29 2e 20 49 66 20 69  his query). If i
1f080 74 20 69 73 2c 20 73 65 74 20 74 68 65 20 57 48  t is, set the WH
1f090 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 66 6c 61  ERE_IDX_ONLY fla
1f0a0 67 20 69 6e 0a 20 20 20 20 2a 2a 20 70 63 2e 70  g in.    ** pc.p
1f0b0 6c 61 6e 2e 77 73 46 6c 61 67 73 2e 20 4f 74 68  lan.wsFlags. Oth
1f0c0 65 72 77 69 73 65 2c 20 73 65 74 20 74 68 65 20  erwise, set the 
1f0d0 62 4c 6f 6f 6b 75 70 20 76 61 72 69 61 62 6c 65  bLookup variable
1f0e0 20 74 6f 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20   to true.  */.  
1f0f0 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20    if( pIdx ){.  
1f100 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20      Bitmask m = 
1f110 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20  pSrc->colUsed;. 
1f120 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
1f130 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64    for(j=0; j<pId
1f140 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29  x->nColumn; j++)
1f150 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20  {.        int x 
1f160 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
1f170 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [j];.        if(
1f180 20 78 3c 42 4d 53 2d 31 20 29 7b 0a 20 20 20 20   x<BMS-1 ){.    
1f190 20 20 20 20 20 20 6d 20 26 3d 20 7e 28 28 28 42        m &= ~(((B
1f1a0 69 74 6d 61 73 6b 29 31 29 3c 3c 78 29 3b 0a 20  itmask)1)<<x);. 
1f1b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1f1c0 0a 20 20 20 20 20 20 69 66 28 20 6d 3d 3d 30 20  .      if( m==0 
1f1d0 29 7b 0a 20 20 20 20 20 20 20 20 70 63 2e 70 6c  ){.        pc.pl
1f1e0 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  an.wsFlags |= WH
1f1f0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20  ERE_IDX_ONLY;.  
1f200 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f210 20 20 20 62 4c 6f 6f 6b 75 70 20 3d 20 31 3b 0a     bLookup = 1;.
1f220 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1f230 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 45 73 74     /*.    ** Est
1f240 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
1f250 20 6f 66 20 72 6f 77 73 20 6f 66 20 6f 75 74 70   of rows of outp
1f260 75 74 2e 20 20 46 6f 72 20 61 6e 20 22 78 20 49  ut.  For an "x I
1f270 4e 20 28 53 45 4c 45 43 54 2e 2e 2e 29 22 0a 20  N (SELECT...)". 
1f280 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74     ** constraint
1f290 2c 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65  , do not let the
1f2a0 20 65 73 74 69 6d 61 74 65 20 65 78 63 65 65 64   estimate exceed
1f2b0 20 68 61 6c 66 20 74 68 65 20 72 6f 77 73 20 69   half the rows i
1f2c0 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20  n the table..   
1f2d0 20 2a 2f 0a 20 20 20 20 70 63 2e 70 6c 61 6e 2e   */.    pc.plan.
1f2e0 6e 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29 28  nRow = (double)(
1f2f0 61 69 52 6f 77 45 73 74 5b 70 63 2e 70 6c 61 6e  aiRowEst[pc.plan
1f300 2e 6e 45 71 5d 20 2a 20 6e 49 6e 4d 75 6c 29 3b  .nEq] * nInMul);
1f310 0a 20 20 20 20 69 66 28 20 62 49 6e 45 73 74 20  .    if( bInEst 
1f320 26 26 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 2a  && pc.plan.nRow*
1f330 32 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20 29 7b  2>aiRowEst[0] ){
1f340 0a 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 6e  .      pc.plan.n
1f350 52 6f 77 20 3d 20 61 69 52 6f 77 45 73 74 5b 30  Row = aiRowEst[0
1f360 5d 2f 32 3b 0a 20 20 20 20 20 20 6e 49 6e 4d 75  ]/2;.      nInMu
1f370 6c 20 3d 20 28 69 6e 74 29 28 70 63 2e 70 6c 61  l = (int)(pc.pla
1f380 6e 2e 6e 52 6f 77 20 2f 20 61 69 52 6f 77 45 73  n.nRow / aiRowEs
1f390 74 5b 70 63 2e 70 6c 61 6e 2e 6e 45 71 5d 29 3b  t[pc.plan.nEq]);
1f3a0 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  .    }..#ifdef S
1f3b0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
1f3c0 54 33 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  T3.    /* If the
1f3d0 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6f   constraint is o
1f3e0 66 20 74 68 65 20 66 6f 72 6d 20 78 3d 56 41 4c  f the form x=VAL
1f3f0 55 45 20 6f 72 20 78 20 49 4e 20 28 45 31 2c 45  UE or x IN (E1,E
1f400 32 2c 2e 2e 2e 29 0a 20 20 20 20 2a 2a 20 61 6e  2,...).    ** an
1f410 64 20 77 65 20 64 6f 20 6e 6f 74 20 74 68 69 6e  d we do not thin
1f420 6b 20 74 68 61 74 20 76 61 6c 75 65 73 20 6f 66  k that values of
1f430 20 78 20 61 72 65 20 75 6e 69 71 75 65 20 61 6e   x are unique an
1f440 64 20 69 66 20 68 69 73 74 6f 67 72 61 6d 0a 20  d if histogram. 
1f450 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 61 76     ** data is av
1f460 61 69 6c 61 62 6c 65 20 66 6f 72 20 63 6f 6c 75  ailable for colu
1f470 6d 6e 20 78 2c 20 74 68 65 6e 20 69 74 20 6d 69  mn x, then it mi
1f480 67 68 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a  ght be possible.
1f490 20 20 20 20 2a 2a 20 74 6f 20 67 65 74 20 61 20      ** to get a 
1f4a0 62 65 74 74 65 72 20 65 73 74 69 6d 61 74 65 20  better estimate 
1f4b0 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  on the number of
1f4c0 20 72 6f 77 73 20 62 61 73 65 64 20 6f 6e 0a 20   rows based on. 
1f4d0 20 20 20 2a 2a 20 56 41 4c 55 45 20 61 6e 64 20     ** VALUE and 
1f4e0 68 6f 77 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20  how common that 
1f4f0 76 61 6c 75 65 20 69 73 20 61 63 63 6f 72 64 69  value is accordi
1f500 6e 67 20 74 6f 20 74 68 65 20 68 69 73 74 6f 67  ng to the histog
1f510 72 61 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ram..    */.    
1f520 69 66 28 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77  if( pc.plan.nRow
1f530 3e 28 64 6f 75 62 6c 65 29 31 20 26 26 20 70 63  >(double)1 && pc
1f540 2e 70 6c 61 6e 2e 6e 45 71 3d 3d 31 0a 20 20 20  .plan.nEq==1.   
1f550 20 20 26 26 20 70 46 69 72 73 74 54 65 72 6d 21    && pFirstTerm!
1f560 3d 30 20 26 26 20 61 69 52 6f 77 45 73 74 5b 31  =0 && aiRowEst[1
1f570 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ]>1 ){.      ass
1f580 65 72 74 28 20 28 70 46 69 72 73 74 54 65 72 6d  ert( (pFirstTerm
1f590 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
1f5a0 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57  O_EQ|WO_ISNULL|W
1f5b0 4f 5f 49 4e 29 29 21 3d 30 20 29 3b 0a 20 20 20  O_IN))!=0 );.   
1f5c0 20 20 20 69 66 28 20 70 46 69 72 73 74 54 65 72     if( pFirstTer
1f5d0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
1f5e0 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29  WO_EQ|WO_ISNULL)
1f5f0 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
1f600 63 61 73 65 28 20 70 46 69 72 73 74 54 65 72 6d  case( pFirstTerm
1f610 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1f620 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 74  _EQ );.        t
1f630 65 73 74 63 61 73 65 28 20 70 46 69 72 73 74 54  estcase( pFirstT
1f640 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1f650 20 57 4f 5f 45 51 55 49 56 20 29 3b 0a 20 20 20   WO_EQUIV );.   
1f660 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1f670 46 69 72 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72  FirstTerm->eOper
1f680 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  ator & WO_ISNULL
1f690 20 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72   );.        wher
1f6a0 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50  eEqualScanEst(pP
1f6b0 61 72 73 65 2c 20 70 50 72 6f 62 65 2c 20 70 46  arse, pProbe, pF
1f6c0 69 72 73 74 54 65 72 6d 2d 3e 70 45 78 70 72 2d  irstTerm->pExpr-
1f6d0 3e 70 52 69 67 68 74 2c 0a 20 20 20 20 20 20 20  >pRight,.       
1f6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6f0 20 20 20 26 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77     &pc.plan.nRow
1f700 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
1f710 66 28 20 62 49 6e 45 73 74 3d 3d 30 20 29 7b 0a  f( bInEst==0 ){.
1f720 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1f730 70 46 69 72 73 74 54 65 72 6d 2d 3e 65 4f 70 65  pFirstTerm->eOpe
1f740 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b  rator & WO_IN );
1f750 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 49 6e  .        whereIn
1f760 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
1f770 70 50 72 6f 62 65 2c 20 70 46 69 72 73 74 54 65  pProbe, pFirstTe
1f780 72 6d 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  rm->pExpr->x.pLi
1f790 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
1f7a0 20 20 20 20 20 20 20 20 20 20 20 26 70 63 2e 70             &pc.p
1f7b0 6c 61 6e 2e 6e 52 6f 77 29 3b 0a 20 20 20 20 20  lan.nRow);.     
1f7c0 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20   }.    }.#endif 
1f7d0 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
1f7e0 5f 53 54 41 54 33 20 2a 2f 0a 0a 20 20 20 20 2f  _STAT3 */..    /
1f7f0 2a 20 41 64 6a 75 73 74 20 74 68 65 20 6e 75 6d  * Adjust the num
1f800 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
1f810 77 73 20 61 6e 64 20 64 6f 77 6e 77 61 72 64 20  ws and downward 
1f820 74 6f 20 72 65 66 6c 65 63 74 20 72 6f 77 73 0a  to reflect rows.
1f830 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20      ** that are 
1f840 65 78 63 6c 75 64 65 64 20 62 79 20 72 61 6e 67  excluded by rang
1f850 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20  e constraints.. 
1f860 20 20 20 2a 2f 0a 20 20 20 20 70 63 2e 70 6c 61     */.    pc.pla
1f870 6e 2e 6e 52 6f 77 20 3d 20 70 63 2e 70 6c 61 6e  n.nRow = pc.plan
1f880 2e 6e 52 6f 77 2f 72 61 6e 67 65 44 69 76 3b 0a  .nRow/rangeDiv;.
1f890 20 20 20 20 69 66 28 20 70 63 2e 70 6c 61 6e 2e      if( pc.plan.
1f8a0 6e 52 6f 77 3c 31 20 29 20 70 63 2e 70 6c 61 6e  nRow<1 ) pc.plan
1f8b0 2e 6e 52 6f 77 20 3d 20 31 3b 0a 0a 20 20 20 20  .nRow = 1;..    
1f8c0 2f 2a 20 45 78 70 65 72 69 6d 65 6e 74 73 20 72  /* Experiments r
1f8d0 75 6e 20 6f 6e 20 72 65 61 6c 20 53 51 4c 69 74  un on real SQLit
1f8e0 65 20 64 61 74 61 62 61 73 65 73 20 73 68 6f 77  e databases show
1f8f0 20 74 68 61 74 20 74 68 65 20 74 69 6d 65 20 6e   that the time n
1f900 65 65 64 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20  eeded.    ** to 
1f910 64 6f 20 61 20 62 69 6e 61 72 79 20 73 65 61 72  do a binary sear
1f920 63 68 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 72  ch to locate a r
1f930 6f 77 20 69 6e 20 61 20 74 61 62 6c 65 20 6f 72  ow in a table or
1f940 20 69 6e 64 65 78 20 69 73 20 72 6f 75 67 68 6c   index is roughl
1f950 79 0a 20 20 20 20 2a 2a 20 6c 6f 67 31 30 28 4e  y.    ** log10(N
1f960 29 20 74 69 6d 65 73 20 74 68 65 20 74 69 6d 65  ) times the time
1f970 20 74 6f 20 6d 6f 76 65 20 66 72 6f 6d 20 6f 6e   to move from on
1f980 65 20 72 6f 77 20 74 6f 20 74 68 65 20 6e 65 78  e row to the nex
1f990 74 20 72 6f 77 20 77 69 74 68 69 6e 0a 20 20 20  t row within.   
1f9a0 20 2a 2a 20 61 20 74 61 62 6c 65 20 6f 72 20 69   ** a table or i
1f9b0 6e 64 65 78 2e 20 20 54 68 65 20 61 63 74 75 61  ndex.  The actua
1f9c0 6c 20 74 69 6d 65 73 20 63 61 6e 20 76 61 72 79  l times can vary
1f9d0 2c 20 77 69 74 68 20 74 68 65 20 73 69 7a 65 20  , with the size 
1f9e0 6f 66 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72 64  of.    ** record
1f9f0 73 20 62 65 69 6e 67 20 61 6e 20 69 6d 70 6f 72  s being an impor
1fa00 74 61 6e 74 20 66 61 63 74 6f 72 2e 20 20 42 6f  tant factor.  Bo
1fa10 74 68 20 6d 6f 76 65 73 20 61 6e 64 20 73 65 61  th moves and sea
1fa20 72 63 68 65 73 20 61 72 65 0a 20 20 20 20 2a 2a  rches are.    **
1fa30 20 73 6c 6f 77 65 72 20 77 69 74 68 20 6c 61 72   slower with lar
1fa40 67 65 72 20 72 65 63 6f 72 64 73 2c 20 70 72 65  ger records, pre
1fa50 73 75 6d 61 62 6c 79 20 62 65 63 61 75 73 65 20  sumably because 
1fa60 66 65 77 65 72 20 72 65 63 6f 72 64 73 20 66 69  fewer records fi
1fa70 74 0a 20 20 20 20 2a 2a 20 6f 6e 20 6f 6e 65 20  t.    ** on one 
1fa80 70 61 67 65 20 61 6e 64 20 68 65 6e 63 65 20 6d  page and hence m
1fa90 6f 72 65 20 70 61 67 65 73 20 68 61 76 65 20 74  ore pages have t
1faa0 6f 20 62 65 20 66 65 74 63 68 65 64 2e 0a 20 20  o be fetched..  
1fab0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1fac0 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 20  ANALYZE command 
1fad0 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 5f 73  and the sqlite_s
1fae0 74 61 74 31 20 61 6e 64 20 73 71 6c 69 74 65 5f  tat1 and sqlite_
1faf0 73 74 61 74 33 20 74 61 62 6c 65 73 20 64 6f 0a  stat3 tables do.
1fb00 20 20 20 20 2a 2a 20 6e 6f 74 20 67 69 76 65 20      ** not give 
1fb10 75 73 20 64 61 74 61 20 6f 6e 20 74 68 65 20 72  us data on the r
1fb20 65 6c 61 74 69 76 65 20 73 69 7a 65 73 20 6f 66  elative sizes of
1fb30 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78   table and index
1fb40 20 72 65 63 6f 72 64 73 2e 0a 20 20 20 20 2a 2a   records..    **
1fb50 20 53 6f 20 74 68 69 73 20 63 6f 6d 70 75 74 61   So this computa
1fb60 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 61 62  tion assumes tab
1fb70 6c 65 20 72 65 63 6f 72 64 73 20 61 72 65 20 61  le records are a
1fb80 62 6f 75 74 20 74 77 69 63 65 20 61 73 20 62 69  bout twice as bi
1fb90 67 0a 20 20 20 20 2a 2a 20 61 73 20 69 6e 64 65  g.    ** as inde
1fba0 78 20 72 65 63 6f 72 64 73 0a 20 20 20 20 2a 2f  x records.    */
1fbb0 0a 20 20 20 20 69 66 28 20 28 70 63 2e 70 6c 61  .    if( (pc.pla
1fbc0 6e 2e 77 73 46 6c 61 67 73 26 7e 28 57 48 45 52  n.wsFlags&~(WHER
1fbd0 45 5f 52 45 56 45 52 53 45 7c 57 48 45 52 45 5f  E_REVERSE|WHERE_
1fbe0 4f 52 44 45 52 45 44 29 29 3d 3d 57 48 45 52 45  ORDERED))==WHERE
1fbf0 5f 49 44 58 5f 4f 4e 4c 59 0a 20 20 20 20 20 26  _IDX_ONLY.     &
1fc00 26 20 28 70 57 43 2d 3e 77 63 74 72 6c 46 6c 61  & (pWC->wctrlFla
1fc10 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
1fc20 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 0a 20  SS_DESIRED)==0. 
1fc30 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 47 6c      && sqlite3Gl
1fc40 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43  obalConfig.bUseC
1fc50 69 73 0a 20 20 20 20 20 26 26 20 4f 70 74 69 6d  is.     && Optim
1fc60 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70  izationEnabled(p
1fc70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54  Parse->db, SQLIT
1fc80 45 5f 43 6f 76 65 72 49 64 78 53 63 61 6e 29 0a  E_CoverIdxScan).
1fc90 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
1fca0 54 68 69 73 20 69 6e 64 65 78 20 69 73 20 6e 6f  This index is no
1fcb0 74 20 75 73 65 66 75 6c 20 66 6f 72 20 69 6e 64  t useful for ind
1fcc0 65 78 69 6e 67 2c 20 62 75 74 20 69 74 20 69 73  exing, but it is
1fcd0 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
1fce0 78 2e 0a 20 20 20 20 20 20 2a 2a 20 41 20 66 75  x..      ** A fu
1fcf0 6c 6c 2d 73 63 61 6e 20 6f 66 20 74 68 65 20 69  ll-scan of the i
1fd00 6e 64 65 78 20 6d 69 67 68 74 20 62 65 20 61 20  ndex might be a 
1fd10 6c 69 74 74 6c 65 20 66 61 73 74 65 72 20 74 68  little faster th
1fd20 61 6e 20 61 20 66 75 6c 6c 2d 73 63 61 6e 0a 20  an a full-scan. 
1fd30 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 74       ** of the t
1fd40 61 62 6c 65 2c 20 73 6f 20 67 69 76 65 20 74 68  able, so give th
1fd50 69 73 20 63 61 73 65 20 61 20 63 6f 73 74 20 73  is case a cost s
1fd60 6c 69 67 68 74 6c 79 20 6c 65 73 73 20 74 68 61  lightly less tha
1fd70 6e 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20 20  n a table.      
1fd80 2a 2a 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20  ** scan. */.    
1fd90 20 20 70 63 2e 72 43 6f 73 74 20 3d 20 61 69 52    pc.rCost = aiR
1fda0 6f 77 45 73 74 5b 30 5d 2a 33 20 2b 20 70 50 72  owEst[0]*3 + pPr
1fdb0 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  obe->nColumn;.  
1fdc0 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c      pc.plan.wsFl
1fdd0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 56  ags |= WHERE_COV
1fde0 45 52 5f 53 43 41 4e 7c 57 48 45 52 45 5f 43 4f  ER_SCAN|WHERE_CO
1fdf0 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20 20 20 20  LUMN_RANGE;.    
1fe00 7d 65 6c 73 65 20 69 66 28 20 28 70 63 2e 70 6c  }else if( (pc.pl
1fe10 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
1fe20 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29  RE_NOT_FULLSCAN)
1fe30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
1fe40 54 68 65 20 63 6f 73 74 20 6f 66 20 61 20 66 75  The cost of a fu
1fe50 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 69 73  ll table scan is
1fe60 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 6d 6f 76   a number of mov
1fe70 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 65 71 75  e operations equ
1fe80 61 6c 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  al.      ** to t
1fe90 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
1fea0 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  s in the table..
1feb0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
1fec0 2a 20 57 65 20 61 64 64 20 61 6e 20 61 64 64 69  * We add an addi
1fed0 74 69 6f 6e 61 6c 20 34 78 20 70 65 6e 61 6c 74  tional 4x penalt
1fee0 79 20 74 6f 20 66 75 6c 6c 20 74 61 62 6c 65 20  y to full table 
1fef0 73 63 61 6e 73 2e 20 20 54 68 69 73 20 63 61 75  scans.  This cau
1ff00 73 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ses.      ** the
1ff10 20 63 6f 73 74 20 66 75 6e 63 74 69 6f 6e 20 74   cost function t
1ff20 6f 20 65 72 72 20 6f 6e 20 74 68 65 20 73 69 64  o err on the sid
1ff30 65 20 6f 66 20 63 68 6f 6f 73 69 6e 67 20 61 6e  e of choosing an
1ff40 20 69 6e 64 65 78 20 6f 76 65 72 0a 20 20 20 20   index over.    
1ff50 20 20 2a 2a 20 63 68 6f 6f 73 69 6e 67 20 61 20    ** choosing a 
1ff60 66 75 6c 6c 20 73 63 61 6e 2e 20 20 54 68 69 73  full scan.  This
1ff70 20 34 78 20 66 75 6c 6c 2d 73 63 61 6e 20 70 65   4x full-scan pe
1ff80 6e 61 6c 74 79 20 69 73 20 61 6e 20 61 72 67 75  nalty is an argu
1ff90 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65  able.      ** de
1ffa0 63 69 73 69 6f 6e 20 61 6e 64 20 6f 6e 65 20 77  cision and one w
1ffb0 68 69 63 68 20 77 65 20 65 78 70 65 63 74 20 74  hich we expect t
1ffc0 6f 20 72 65 76 69 73 69 74 20 69 6e 20 74 68 65  o revisit in the
1ffd0 20 66 75 74 75 72 65 2e 20 20 42 75 74 0a 20 20   future.  But.  
1ffe0 20 20 20 20 2a 2a 20 69 74 20 73 65 65 6d 73 20      ** it seems 
1fff0 74 6f 20 62 65 20 77 6f 72 6b 69 6e 67 20 77 65  to be working we
20000 6c 6c 20 65 6e 6f 75 67 68 20 61 74 20 74 68 65  ll enough at the
20010 20 6d 6f 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a   moment..      *
20020 2f 0a 20 20 20 20 20 20 70 63 2e 72 43 6f 73 74  /.      pc.rCost
20030 20 3d 20 61 69 52 6f 77 45 73 74 5b 30 5d 2a 34   = aiRowEst[0]*4
20040 3b 0a 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e  ;.      pc.plan.
20050 77 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52  wsFlags &= ~WHER
20060 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20  E_IDX_ONLY;.    
20070 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20    if( pIdx ){.  
20080 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73        pc.plan.ws
20090 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f  Flags &= ~WHERE_
200a0 4f 52 44 45 52 45 44 3b 0a 20 20 20 20 20 20 20  ORDERED;.       
200b0 20 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 20   pc.plan.nOBSat 
200c0 3d 20 6e 50 72 69 6f 72 53 61 74 3b 0a 20 20 20  = nPriorSat;.   
200d0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
200e0 20 20 20 20 20 20 6c 6f 67 31 30 4e 20 3d 20 65        log10N = e
200f0 73 74 4c 6f 67 28 61 69 52 6f 77 45 73 74 5b 30  stLog(aiRowEst[0
20100 5d 29 3b 0a 20 20 20 20 20 20 70 63 2e 72 43 6f  ]);.      pc.rCo
20110 73 74 20 3d 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f  st = pc.plan.nRo
20120 77 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  w;.      if( pId
20130 78 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  x ){.        if(
20140 20 62 4c 6f 6f 6b 75 70 20 29 7b 0a 20 20 20 20   bLookup ){.    
20150 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20        /* For an 
20160 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 66 6f 6c  index lookup fol
20170 6c 6f 77 65 64 20 62 79 20 61 20 74 61 62 6c 65  lowed by a table
20180 20 6c 6f 6f 6b 75 70 3a 0a 20 20 20 20 20 20 20   lookup:.       
20190 20 20 20 2a 2a 20 20 20 20 6e 49 6e 4d 75 6c 20     **    nInMul 
201a0 69 6e 64 65 78 20 73 65 61 72 63 68 65 73 20 74  index searches t
201b0 6f 20 66 69 6e 64 20 74 68 65 20 73 74 61 72 74  o find the start
201c0 20 6f 66 20 65 61 63 68 20 69 6e 64 65 78 20 72   of each index r
201d0 61 6e 67 65 0a 20 20 20 20 20 20 20 20 20 20 2a  ange.          *
201e0 2a 20 20 2b 20 6e 52 6f 77 20 73 74 65 70 73 20  *  + nRow steps 
201f0 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e 64 65  through the inde
20200 78 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20  x.          **  
20210 2b 20 6e 52 6f 77 20 74 61 62 6c 65 20 73 65 61  + nRow table sea
20220 72 63 68 65 73 20 74 6f 20 6c 6f 6f 6b 75 70 20  rches to lookup 
20230 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20  the table entry 
20240 75 73 69 6e 67 20 74 68 65 20 72 6f 77 69 64 0a  using the rowid.
20250 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
20260 20 20 20 20 20 20 20 70 63 2e 72 43 6f 73 74 20         pc.rCost 
20270 2b 3d 20 28 6e 49 6e 4d 75 6c 20 2b 20 70 63 2e  += (nInMul + pc.
20280 70 6c 61 6e 2e 6e 52 6f 77 29 2a 6c 6f 67 31 30  plan.nRow)*log10
20290 4e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  N;.        }else
202a0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  {.          /* F
202b0 6f 72 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  or a covering in
202c0 64 65 78 3a 0a 20 20 20 20 20 20 20 20 20 20 2a  dex:.          *
202d0 2a 20 20 20 20 20 6e 49 6e 4d 75 6c 20 69 6e 64  *     nInMul ind
202e0 65 78 20 73 65 61 72 63 68 65 73 20 74 6f 20 66  ex searches to f
202f0 69 6e 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20  ind the initial 
20300 65 6e 74 72 79 20 0a 20 20 20 20 20 20 20 20 20  entry .         
20310 20 2a 2a 20 20 20 2b 20 6e 52 6f 77 20 73 74 65   **   + nRow ste
20320 70 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 69  ps through the i
20330 6e 64 65 78 0a 20 20 20 20 20 20 20 20 20 20 2a  ndex.          *
20340 2f 0a 20 20 20 20 20 20 20 20 20 20 70 63 2e 72  /.          pc.r
20350 43 6f 73 74 20 2b 3d 20 6e 49 6e 4d 75 6c 2a 6c  Cost += nInMul*l
20360 6f 67 31 30 4e 3b 0a 20 20 20 20 20 20 20 20 7d  og10N;.        }
20370 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
20380 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 72        /* For a r
20390 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79  owid primary key
203a0 20 6c 6f 6f 6b 75 70 3a 0a 20 20 20 20 20 20 20   lookup:.       
203b0 20 2a 2a 20 20 20 20 6e 49 6e 4d 75 6c 74 20 74   **    nInMult t
203c0 61 62 6c 65 20 73 65 61 72 63 68 65 73 20 74 6f  able searches to
203d0 20 66 69 6e 64 20 74 68 65 20 69 6e 69 74 69 61   find the initia
203e0 6c 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68  l entry for each
203f0 20 72 61 6e 67 65 0a 20 20 20 20 20 20 20 20 2a   range.        *
20400 2a 20 20 2b 20 6e 52 6f 77 20 73 74 65 70 73 20  *  + nRow steps 
20410 74 68 72 6f 75 67 68 20 74 68 65 20 74 61 62 6c  through the tabl
20420 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  e.        */.   
20430 20 20 20 20 20 70 63 2e 72 43 6f 73 74 20 2b 3d       pc.rCost +=
20440 20 6e 49 6e 4d 75 6c 2a 6c 6f 67 31 30 4e 3b 0a   nInMul*log10N;.
20450 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
20460 20 20 20 2f 2a 20 41 64 64 20 69 6e 20 74 68 65     /* Add in the
20470 20 65 73 74 69 6d 61 74 65 64 20 63 6f 73 74 20   estimated cost 
20480 6f 66 20 73 6f 72 74 69 6e 67 20 74 68 65 20 72  of sorting the r
20490 65 73 75 6c 74 2e 20 20 41 63 74 75 61 6c 20 65  esult.  Actual e
204a0 78 70 65 72 69 6d 65 6e 74 61 6c 0a 20 20 20 20  xperimental.    
204b0 2a 2a 20 6d 65 61 73 75 72 65 6d 65 6e 74 73 20  ** measurements 
204c0 6f 66 20 73 6f 72 74 69 6e 67 20 70 65 72 66 6f  of sorting perfo
204d0 72 6d 61 6e 63 65 20 69 6e 20 53 51 4c 69 74 65  rmance in SQLite
204e0 20 73 68 6f 77 20 74 68 61 74 20 73 6f 72 74 69   show that sorti
204f0 6e 67 20 74 69 6d 65 0a 20 20 20 20 2a 2a 20 61  ng time.    ** a
20500 64 64 73 20 43 2a 4e 2a 6c 6f 67 31 30 28 4e 29  dds C*N*log10(N)
20510 20 74 6f 20 74 68 65 20 63 6f 73 74 2c 20 77 68   to the cost, wh
20520 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ere N is the num
20530 62 65 72 20 6f 66 20 72 6f 77 73 20 74 6f 20 62  ber of rows to b
20540 65 20 0a 20 20 20 20 2a 2a 20 73 6f 72 74 65 64  e .    ** sorted
20550 20 61 6e 64 20 43 20 69 73 20 61 20 66 61 63 74   and C is a fact
20560 6f 72 20 62 65 74 77 65 65 6e 20 31 2e 39 35 20  or between 1.95 
20570 61 6e 64 20 34 2e 33 2e 20 20 57 65 20 77 69 6c  and 4.3.  We wil
20580 6c 20 73 70 6c 69 74 20 74 68 65 0a 20 20 20 20  l split the.    
20590 2a 2a 20 64 69 66 66 65 72 65 6e 63 65 20 61 6e  ** difference an
205a0 64 20 73 65 6c 65 63 74 20 43 20 6f 66 20 33 2e  d select C of 3.
205b0 30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  0..    */.    if
205c0 28 20 62 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  ( bSort ){.     
205d0 20 64 6f 75 62 6c 65 20 6d 20 3d 20 65 73 74 4c   double m = estL
205e0 6f 67 28 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 2a  og(pc.plan.nRow*
205f0 28 6e 4f 72 64 65 72 42 79 20 2d 20 70 63 2e 70  (nOrderBy - pc.p
20600 6c 61 6e 2e 6e 4f 42 53 61 74 29 2f 6e 4f 72 64  lan.nOBSat)/nOrd
20610 65 72 42 79 29 3b 0a 20 20 20 20 20 20 6d 20 2a  erBy);.      m *
20620 3d 20 28 64 6f 75 62 6c 65 29 28 70 63 2e 70 6c  = (double)(pc.pl
20630 61 6e 2e 6e 4f 42 53 61 74 20 3f 20 32 20 3a 20  an.nOBSat ? 2 : 
20640 33 29 3b 0a 20 20 20 20 20 20 70 63 2e 72 43 6f  3);.      pc.rCo
20650 73 74 20 2b 3d 20 70 63 2e 70 6c 61 6e 2e 6e 52  st += pc.plan.nR
20660 6f 77 2a 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ow*m;.    }.    
20670 69 66 28 20 62 44 69 73 74 20 29 7b 0a 20 20 20  if( bDist ){.   
20680 20 20 20 70 63 2e 72 43 6f 73 74 20 2b 3d 20 70     pc.rCost += p
20690 63 2e 70 6c 61 6e 2e 6e 52 6f 77 2a 65 73 74 4c  c.plan.nRow*estL
206a0 6f 67 28 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 29  og(pc.plan.nRow)
206b0 2a 33 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  *3;.    }..    /
206c0 2a 2a 2a 2a 20 43 6f 73 74 20 6f 66 20 75 73 69  **** Cost of usi
206d0 6e 67 20 74 68 69 73 20 69 6e 64 65 78 20 68 61  ng this index ha
206e0 73 20 6e 6f 77 20 62 65 65 6e 20 63 6f 6d 70 75  s now been compu
206f0 74 65 64 20 2a 2a 2a 2a 2f 0a 0a 20 20 20 20 2f  ted ****/..    /
20700 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
20710 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6e 73 74 72  dditional constr
20720 61 69 6e 74 73 20 6f 6e 20 74 68 69 73 20 74 61  aints on this ta
20730 62 6c 65 20 74 68 61 74 20 63 61 6e 6e 6f 74 0a  ble that cannot.
20740 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64 20 77      ** be used w
20750 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20  ith the current 
20760 69 6e 64 65 78 2c 20 62 75 74 20 77 68 69 63 68  index, but which
20770 20 6d 69 67 68 74 20 6c 6f 77 65 72 20 74 68 65   might lower the
20780 20 6e 75 6d 62 65 72 0a 20 20 20 20 2a 2a 20 6f   number.    ** o
20790 66 20 6f 75 74 70 75 74 20 72 6f 77 73 2c 20 61  f output rows, a
207a0 64 6a 75 73 74 20 74 68 65 20 6e 52 6f 77 20 76  djust the nRow v
207b0 61 6c 75 65 20 61 63 63 6f 72 64 69 6e 67 6c 79  alue accordingly
207c0 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 0a 20 20  .  This only .  
207d0 20 20 2a 2a 20 6d 61 74 74 65 72 73 20 69 66 20    ** matters if 
207e0 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e 64 65  the current inde
207f0 78 20 69 73 20 74 68 65 20 6c 65 61 73 74 20 63  x is the least c
20800 6f 73 74 6c 79 2c 20 73 6f 20 64 6f 20 6e 6f 74  ostly, so do not
20810 20 62 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 77   bother.    ** w
20820 69 74 68 20 74 68 69 73 20 73 74 65 70 20 69 66  ith this step if
20830 20 77 65 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77   we already know
20840 20 74 68 69 73 20 69 6e 64 65 78 20 77 69 6c 6c   this index will
20850 20 6e 6f 74 20 62 65 20 63 68 6f 73 65 6e 2e 0a   not be chosen..
20860 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 6e 65 76      ** Also, nev
20870 65 72 20 72 65 64 75 63 65 20 74 68 65 20 6f 75  er reduce the ou
20880 74 70 75 74 20 72 6f 77 20 63 6f 75 6e 74 20 62  tput row count b
20890 65 6c 6f 77 20 32 20 75 73 69 6e 67 20 74 68 69  elow 2 using thi
208a0 73 20 73 74 65 70 2e 0a 20 20 20 20 2a 2a 0a 20  s step..    **. 
208b0 20 20 20 2a 2a 20 49 74 20 69 73 20 63 72 69 74     ** It is crit
208c0 69 63 61 6c 20 74 68 61 74 20 74 68 65 20 6e 6f  ical that the no
208d0 74 56 61 6c 69 64 20 6d 61 73 6b 20 62 65 20 75  tValid mask be u
208e0 73 65 64 20 68 65 72 65 20 69 6e 73 74 65 61 64  sed here instead
208f0 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e   of.    ** the n
20900 6f 74 52 65 61 64 79 20 6d 61 73 6b 2e 20 20 57  otReady mask.  W
20910 68 65 6e 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e  hen computing an
20920 20 22 6f 70 74 69 6d 61 6c 22 20 69 6e 64 65 78   "optimal" index
20930 2c 20 74 68 65 20 6e 6f 74 52 65 61 64 79 0a 20  , the notReady. 
20940 20 20 20 2a 2a 20 6d 61 73 6b 20 77 69 6c 6c 20     ** mask will 
20950 6f 6e 6c 79 20 68 61 76 65 20 6f 6e 65 20 62 69  only have one bi
20960 74 20 73 65 74 20 2d 20 74 68 65 20 62 69 74 20  t set - the bit 
20970 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
20980 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68  table..    ** Th
20990 65 20 6e 6f 74 56 61 6c 69 64 20 6d 61 73 6b 2c  e notValid mask,
209a0 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   on the other ha
209b0 6e 64 2c 20 61 6c 77 61 79 73 20 68 61 73 20 61  nd, always has a
209c0 6c 6c 20 62 69 74 73 20 73 65 74 20 66 6f 72 0a  ll bits set for.
209d0 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 74 68      ** tables th
209e0 61 74 20 61 72 65 20 6e 6f 74 20 69 6e 20 6f 75  at are not in ou
209f0 74 65 72 20 6c 6f 6f 70 73 2e 20 20 49 66 20 6e  ter loops.  If n
20a00 6f 74 52 65 61 64 79 20 69 73 20 75 73 65 64 20  otReady is used 
20a10 68 65 72 65 20 69 6e 73 74 65 61 64 0a 20 20 20  here instead.   
20a20 20 2a 2a 20 6f 66 20 6e 6f 74 56 61 6c 69 64 2c   ** of notValid,
20a30 20 74 68 65 6e 20 61 20 6f 70 74 69 6d 61 6c 20   then a optimal 
20a40 69 6e 64 65 78 20 74 68 61 74 20 64 65 70 65 6e  index that depen
20a50 64 73 20 6f 6e 20 69 6e 6e 65 72 20 6a 6f 69 6e  ds on inner join
20a60 73 20 6c 6f 6f 70 73 0a 20 20 20 20 2a 2a 20 6d  s loops.    ** m
20a70 69 67 68 74 20 62 65 20 73 65 6c 65 63 74 65 64  ight be selected
20a80 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 72 65   even when there
20a90 20 65 78 69 73 74 73 20 61 6e 20 6f 70 74 69 6d   exists an optim
20aa0 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20 68 61  al index that ha
20ab0 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 73 75 63 68  s.    ** no such
20ac0 20 64 65 70 65 6e 64 65 6e 63 79 2e 0a 20 20 20   dependency..   
20ad0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 2e 70   */.    if( pc.p
20ae0 6c 61 6e 2e 6e 52 6f 77 3e 32 20 26 26 20 70 63  lan.nRow>2 && pc
20af0 2e 72 43 6f 73 74 3c 3d 70 2d 3e 63 6f 73 74 2e  .rCost<=p->cost.
20b00 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 69  rCost ){.      i
20b10 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20  nt k;           
20b20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
20b30 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
20b40 20 20 20 20 20 69 6e 74 20 6e 53 6b 69 70 45 71       int nSkipEq
20b50 20 3d 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 3b 20   = pc.plan.nEq; 
20b60 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d    /* Number of =
20b70 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f  = constraints to
20b80 20 73 6b 69 70 20 2a 2f 0a 20 20 20 20 20 20 69   skip */.      i
20b90 6e 74 20 6e 53 6b 69 70 52 61 6e 67 65 20 3d 20  nt nSkipRange = 
20ba0 6e 42 6f 75 6e 64 3b 20 20 20 20 20 2f 2a 20 4e  nBound;     /* N
20bb0 75 6d 62 65 72 20 6f 66 20 3c 20 63 6f 6e 73 74  umber of < const
20bc0 72 61 69 6e 74 73 20 74 6f 20 73 6b 69 70 20 2a  raints to skip *
20bd0 2f 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  /.      Bitmask 
20be0 74 68 69 73 54 61 62 3b 20 20 20 20 20 20 20 20  thisTab;        
20bf0 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 66       /* Bitmap f
20c00 6f 72 20 70 53 72 63 20 2a 2f 0a 0a 20 20 20 20  or pSrc */..    
20c10 20 20 74 68 69 73 54 61 62 20 3d 20 67 65 74 4d    thisTab = getM
20c20 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65  ask(pWC->pMaskSe
20c30 74 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 20 20  t, iCur);.      
20c40 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
20c50 2c 20 6b 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  , k=pWC->nTerm; 
20c60 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 3e 32 20 26  pc.plan.nRow>2 &
20c70 26 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b  & k; k--, pTerm+
20c80 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
20c90 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
20ca0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 20   TERM_VIRTUAL ) 
20cb0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
20cc0 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
20cd0 65 72 65 71 41 6c 6c 20 26 20 70 2d 3e 6e 6f 74  ereqAll & p->not
20ce0 56 61 6c 69 64 29 21 3d 74 68 69 73 54 61 62 20  Valid)!=thisTab 
20cf0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
20d00 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
20d10 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45  Operator & (WO_E
20d20 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c  Q|WO_IN|WO_ISNUL
20d30 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  L) ){.          
20d40 69 66 28 20 6e 53 6b 69 70 45 71 20 29 7b 0a 20  if( nSkipEq ){. 
20d50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 67             /* Ig
20d60 6e 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 70  nore the first p
20d70 63 2e 70 6c 61 6e 2e 6e 45 71 20 65 71 75 61 6c  c.plan.nEq equal
20d80 69 74 79 20 6d 61 74 63 68 65 73 20 73 69 6e 63  ity matches sinc
20d90 65 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20  e the index.    
20da0 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 61          ** has a
20db0 6c 72 65 61 64 79 20 61 63 63 6f 75 6e 74 65 64  lready accounted
20dc0 20 66 6f 72 20 74 68 65 73 65 20 2a 2f 0a 20 20   for these */.  
20dd0 20 20 20 20 20 20 20 20 20 20 6e 53 6b 69 70 45            nSkipE
20de0 71 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  q--;.          }
20df0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
20e00 20 20 2f 2a 20 41 73 73 75 6d 65 20 65 61 63 68    /* Assume each
20e10 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 71 75 61   additional equa
20e20 6c 69 74 79 20 6d 61 74 63 68 20 72 65 64 75 63  lity match reduc
20e30 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20  es the result.  
20e40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74            ** set
20e50 20 73 69 7a 65 20 62 79 20 61 20 66 61 63 74 6f   size by a facto
20e60 72 20 6f 66 20 31 30 20 2a 2f 0a 20 20 20 20 20  r of 10 */.     
20e70 20 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 6e         pc.plan.n
20e80 52 6f 77 20 2f 3d 20 31 30 3b 0a 20 20 20 20 20  Row /= 10;.     
20e90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
20ea0 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e  else if( pTerm->
20eb0 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
20ec0 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57  LT|WO_LE|WO_GT|W
20ed0 4f 5f 47 45 29 20 29 7b 0a 20 20 20 20 20 20 20  O_GE) ){.       
20ee0 20 20 20 69 66 28 20 6e 53 6b 69 70 52 61 6e 67     if( nSkipRang
20ef0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
20f00 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 66   /* Ignore the f
20f10 69 72 73 74 20 6e 53 6b 69 70 52 61 6e 67 65 20  irst nSkipRange 
20f20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
20f30 73 20 73 69 6e 63 65 20 74 68 65 20 69 6e 64 65  s since the inde
20f40 78 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  x.            **
20f50 20 68 61 73 20 61 6c 72 65 61 64 79 20 61 63 63   has already acc
20f60 6f 75 6e 74 65 64 20 66 6f 72 20 74 68 65 73 65  ounted for these
20f70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
20f80 6e 53 6b 69 70 52 61 6e 67 65 2d 2d 3b 0a 20 20  nSkipRange--;.  
20f90 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
20fa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
20fb0 73 75 6d 65 20 65 61 63 68 20 61 64 64 69 74 69  sume each additi
20fc0 6f 6e 61 6c 20 72 61 6e 67 65 20 63 6f 6e 73 74  onal range const
20fd0 72 61 69 6e 74 20 72 65 64 75 63 65 73 20 74 68  raint reduces th
20fe0 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 20  e result.       
20ff0 20 20 20 20 20 2a 2a 20 73 65 74 20 73 69 7a 65       ** set size
21000 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20   by a factor of 
21010 33 2e 20 20 49 6e 64 65 78 65 64 20 72 61 6e 67  3.  Indexed rang
21020 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65  e constraints re
21030 64 75 63 65 0a 20 20 20 20 20 20 20 20 20 20 20  duce.           
21040 20 2a 2a 20 74 68 65 20 73 65 61 72 63 68 20 73   ** the search s
21050 70 61 63 65 20 62 79 20 61 20 6c 61 72 67 65 72  pace by a larger
21060 20 66 61 63 74 6f 72 3a 20 34 2e 20 20 57 65 20   factor: 4.  We 
21070 6d 61 6b 65 20 69 6e 64 65 78 65 64 20 72 61 6e  make indexed ran
21080 67 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ge.            *
21090 2a 20 6d 6f 72 65 20 73 65 6c 65 63 74 69 76 65  * more selective
210a0 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 6c 79 20 62   intentionally b
210b0 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 73 75  ecause of the su
210c0 62 6a 65 63 74 69 76 65 20 0a 20 20 20 20 20 20  bjective .      
210d0 20 20 20 20 20 20 2a 2a 20 6f 62 73 65 72 76 61        ** observa
210e0 74 69 6f 6e 20 74 68 61 74 20 69 6e 64 65 78 65  tion that indexe
210f0 64 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  d range constrai
21100 6e 74 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d  nts really are m
21110 6f 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ore.            
21120 2a 2a 20 73 65 6c 65 63 74 69 76 65 20 69 6e 20  ** selective in 
21130 70 72 61 63 74 69 63 65 2c 20 6f 6e 20 61 76 65  practice, on ave
21140 72 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rage. */.       
21150 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f       pc.plan.nRo
21160 77 20 2f 3d 20 33 3b 0a 20 20 20 20 20 20 20 20  w /= 3;.        
21170 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
21180 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f  e if( (pTerm->eO
21190 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4e 4f 4f  perator & WO_NOO
211a0 50 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  P)==0 ){.       
211b0 20 20 20 2f 2a 20 41 6e 79 20 6f 74 68 65 72 20     /* Any other 
211c0 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 77 65 72  expression lower
211d0 73 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f 77  s the output row
211e0 20 63 6f 75 6e 74 20 62 79 20 68 61 6c 66 20 2a   count by half *
211f0 2f 0a 20 20 20 20 20 20 20 20 20 20 70 63 2e 70  /.          pc.p
21200 6c 61 6e 2e 6e 52 6f 77 20 2f 3d 20 32 3b 0a 20  lan.nRow /= 2;. 
21210 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
21220 0a 20 20 20 20 20 20 69 66 28 20 70 63 2e 70 6c  .      if( pc.pl
21230 61 6e 2e 6e 52 6f 77 3c 32 20 29 20 70 63 2e 70  an.nRow<2 ) pc.p
21240 6c 61 6e 2e 6e 52 6f 77 20 3d 20 32 3b 0a 20 20  lan.nRow = 2;.  
21250 20 20 7d 0a 0a 0a 20 20 20 20 57 48 45 52 45 54    }...    WHERET
21260 52 41 43 45 28 28 0a 20 20 20 20 20 20 22 20 20  RACE((.      "  
21270 20 20 20 20 6e 45 71 3d 25 64 20 6e 49 6e 4d 75      nEq=%d nInMu
21280 6c 3d 25 64 20 72 61 6e 67 65 44 69 76 3d 25 64  l=%d rangeDiv=%d
21290 20 62 53 6f 72 74 3d 25 64 20 62 4c 6f 6f 6b 75   bSort=%d bLooku
212a0 70 3d 25 64 20 77 73 46 6c 61 67 73 3d 30 78 25  p=%d wsFlags=0x%
212b0 30 38 78 5c 6e 22 0a 20 20 20 20 20 20 22 20 20  08x\n".      "  
212c0 20 20 20 20 6e 6f 74 52 65 61 64 79 3d 30 78 25      notReady=0x%
212d0 6c 6c 78 20 6c 6f 67 31 30 4e 3d 25 2e 31 66 20  llx log10N=%.1f 
212e0 6e 52 6f 77 3d 25 2e 31 66 20 63 6f 73 74 3d 25  nRow=%.1f cost=%
212f0 2e 31 66 5c 6e 22 0a 20 20 20 20 20 20 22 20 20  .1f\n".      "  
21300 20 20 20 20 75 73 65 64 3d 30 78 25 6c 6c 78 20      used=0x%llx 
21310 6e 4f 42 53 61 74 3d 25 64 5c 6e 22 2c 0a 20 20  nOBSat=%d\n",.  
21320 20 20 20 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 2c      pc.plan.nEq,
21330 20 6e 49 6e 4d 75 6c 2c 20 28 69 6e 74 29 72 61   nInMul, (int)ra
21340 6e 67 65 44 69 76 2c 20 62 53 6f 72 74 2c 20 62  ngeDiv, bSort, b
21350 4c 6f 6f 6b 75 70 2c 20 70 63 2e 70 6c 61 6e 2e  Lookup, pc.plan.
21360 77 73 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 70  wsFlags,.      p
21370 2d 3e 6e 6f 74 52 65 61 64 79 2c 20 6c 6f 67 31  ->notReady, log1
21380 30 4e 2c 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77  0N, pc.plan.nRow
21390 2c 20 70 63 2e 72 43 6f 73 74 2c 20 70 63 2e 75  , pc.rCost, pc.u
213a0 73 65 64 2c 0a 20 20 20 20 20 20 70 63 2e 70 6c  sed,.      pc.pl
213b0 61 6e 2e 6e 4f 42 53 61 74 0a 20 20 20 20 29 29  an.nOBSat.    ))
213c0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
213d0 73 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 62  s index is the b
213e0 65 73 74 20 77 65 20 68 61 76 65 20 73 65 65 6e  est we have seen
213f0 20 73 6f 20 66 61 72 2c 20 74 68 65 6e 20 72 65   so far, then re
21400 63 6f 72 64 20 74 68 69 73 0a 20 20 20 20 2a 2a  cord this.    **
21410 20 69 6e 64 65 78 20 61 6e 64 20 69 74 73 20 63   index and its c
21420 6f 73 74 20 69 6e 20 74 68 65 20 70 2d 3e 63 6f  ost in the p->co
21430 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20  st structure..  
21440 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70    */.    if( (!p
21450 49 64 78 20 7c 7c 20 70 63 2e 70 6c 61 6e 2e 77  Idx || pc.plan.w
21460 73 46 6c 61 67 73 29 20 26 26 20 63 6f 6d 70 61  sFlags) && compa
21470 72 65 43 6f 73 74 28 26 70 63 2c 20 26 70 2d 3e  reCost(&pc, &p->
21480 63 6f 73 74 29 20 29 7b 0a 20 20 20 20 20 20 70  cost) ){.      p
21490 2d 3e 63 6f 73 74 20 3d 20 70 63 3b 0a 20 20 20  ->cost = pc;.   
214a0 20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e     p->cost.plan.
214b0 77 73 46 6c 61 67 73 20 26 3d 20 77 73 46 6c 61  wsFlags &= wsFla
214c0 67 4d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e  gMask;.      p->
214d0 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 49 64 78  cost.plan.u.pIdx
214e0 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 7d 0a 0a   = pIdx;.    }..
214f0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
21500 77 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42  was an INDEXED B
21510 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f  Y clause, then o
21520 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20 69 6e 64  nly that one ind
21530 65 78 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ex is.    ** con
21540 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20 20 20  sidered. */.    
21550 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78  if( pSrc->pIndex
21560 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f   ) break;..    /
21570 2a 20 52 65 73 65 74 20 6d 61 73 6b 73 20 66 6f  * Reset masks fo
21580 72 20 74 68 65 20 6e 65 78 74 20 69 6e 64 65 78  r the next index
21590 20 69 6e 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a   in the loop */.
215a0 20 20 20 20 77 73 46 6c 61 67 4d 61 73 6b 20 3d      wsFlagMask =
215b0 20 7e 28 57 48 45 52 45 5f 52 4f 57 49 44 5f 45   ~(WHERE_ROWID_E
215c0 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  Q|WHERE_ROWID_RA
215d0 4e 47 45 29 3b 0a 20 20 20 20 65 71 54 65 72 6d  NGE);.    eqTerm
215e0 4d 61 73 6b 20 3d 20 69 64 78 45 71 54 65 72 6d  Mask = idxEqTerm
215f0 4d 61 73 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Mask;.  }..  /* 
21600 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f  If there is no O
21610 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
21620 6e 64 20 74 68 65 20 53 51 4c 49 54 45 5f 52 65  nd the SQLITE_Re
21630 76 65 72 73 65 4f 72 64 65 72 20 66 6c 61 67 0a  verseOrder flag.
21640 20 20 2a 2a 20 69 73 20 73 65 74 2c 20 74 68 65    ** is set, the
21650 6e 20 72 65 76 65 72 73 65 20 74 68 65 20 6f 72  n reverse the or
21660 64 65 72 20 74 68 61 74 20 74 68 65 20 69 6e 64  der that the ind
21670 65 78 20 77 69 6c 6c 20 62 65 20 73 63 61 6e 6e  ex will be scann
21680 65 64 0a 20 20 2a 2a 20 69 6e 2e 20 54 68 69 73  ed.  ** in. This
21690 20 69 73 20 75 73 65 64 20 66 6f 72 20 61 70 70   is used for app
216a0 6c 69 63 61 74 69 6f 6e 20 74 65 73 74 69 6e 67  lication testing
216b0 2c 20 74 6f 20 68 65 6c 70 20 66 69 6e 64 20 63  , to help find c
216c0 61 73 65 73 0a 20 20 2a 2a 20 77 68 65 72 65 20  ases.  ** where 
216d0 61 70 70 6c 69 63 61 74 69 6f 6e 20 62 65 68 61  application beha
216e0 76 69 6f 75 72 20 64 65 70 65 6e 64 73 20 6f 6e  viour depends on
216f0 20 74 68 65 20 28 75 6e 64 65 66 69 6e 65 64 29   the (undefined)
21700 20 6f 72 64 65 72 20 74 68 61 74 0a 20 20 2a 2a   order that.  **
21710 20 53 51 4c 69 74 65 20 6f 75 74 70 75 74 73 20   SQLite outputs 
21720 72 6f 77 73 20 69 6e 20 69 6e 20 74 68 65 20 61  rows in in the a
21730 62 73 65 6e 63 65 20 6f 66 20 61 6e 20 4f 52 44  bsence of an ORD
21740 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 2a  ER BY clause.  *
21750 2f 0a 20 20 69 66 28 20 21 70 2d 3e 70 4f 72 64  /.  if( !p->pOrd
21760 65 72 42 79 20 26 26 20 70 50 61 72 73 65 2d 3e  erBy && pParse->
21770 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
21780 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72 20  TE_ReverseOrder 
21790 29 7b 0a 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70  ){.    p->cost.p
217a0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57  lan.wsFlags |= W
217b0 48 45 52 45 5f 52 45 56 45 52 53 45 3b 0a 20 20  HERE_REVERSE;.  
217c0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  }..  assert( p->
217d0 70 4f 72 64 65 72 42 79 20 7c 7c 20 28 70 2d 3e  pOrderBy || (p->
217e0 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  cost.plan.wsFlag
217f0 73 26 57 48 45 52 45 5f 4f 52 44 45 52 45 44 29  s&WHERE_ORDERED)
21800 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
21810 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e   p->cost.plan.u.
21820 70 49 64 78 3d 3d 30 20 7c 7c 20 28 70 2d 3e 63  pIdx==0 || (p->c
21830 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  ost.plan.wsFlags
21840 26 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 29  &WHERE_ROWID_EQ)
21850 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
21860 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3d 3d 30   pSrc->pIndex==0
21870 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 63   .       || p->c
21880 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d  ost.plan.u.pIdx=
21890 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  =0 .       || p-
218a0 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 49 64  >cost.plan.u.pId
218b0 78 3d 3d 70 53 72 63 2d 3e 70 49 6e 64 65 78 20  x==pSrc->pIndex 
218c0 0a 20 20 29 3b 0a 0a 20 20 57 48 45 52 45 54 52  .  );..  WHERETR
218d0 41 43 45 28 28 22 20 20 20 62 65 73 74 20 69 6e  ACE(("   best in
218e0 64 65 78 20 69 73 20 25 73 20 63 6f 73 74 3d 25  dex is %s cost=%
218f0 2e 31 66 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  .1f\n",.        
21900 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e   p->cost.plan.u.
21910 70 49 64 78 20 3f 20 70 2d 3e 63 6f 73 74 2e 70  pIdx ? p->cost.p
21920 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d  lan.u.pIdx->zNam
21930 65 20 3a 20 22 69 70 6b 22 2c 0a 20 20 20 20 20  e : "ipk",.     
21940 20 20 20 20 70 2d 3e 63 6f 73 74 2e 72 43 6f 73      p->cost.rCos
21950 74 29 29 3b 0a 20 20 0a 20 20 62 65 73 74 4f 72  t));.  .  bestOr
21960 43 6c 61 75 73 65 49 6e 64 65 78 28 70 29 3b 0a  ClauseIndex(p);.
21970 20 20 62 65 73 74 41 75 74 6f 6d 61 74 69 63 49    bestAutomaticI
21980 6e 64 65 78 28 70 29 3b 0a 20 20 70 2d 3e 63 6f  ndex(p);.  p->co
21990 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  st.plan.wsFlags 
219a0 7c 3d 20 65 71 54 65 72 6d 4d 61 73 6b 3b 0a 7d  |= eqTermMask;.}
219b0 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
219c0 20 71 75 65 72 79 20 70 6c 61 6e 20 66 6f 72 20   query plan for 
219d0 61 63 63 65 73 73 69 6e 67 20 74 61 62 6c 65 20  accessing table 
219e0 70 53 72 63 2d 3e 70 54 61 62 2e 20 57 72 69 74  pSrc->pTab. Writ
219f0 65 20 74 68 65 0a 2a 2a 20 62 65 73 74 20 71 75  e the.** best qu
21a00 65 72 79 20 70 6c 61 6e 20 61 6e 64 20 69 74 73  ery plan and its
21a10 20 63 6f 73 74 20 69 6e 74 6f 20 74 68 65 20 57   cost into the W
21a20 68 65 72 65 43 6f 73 74 20 6f 62 6a 65 63 74 20  hereCost object 
21a30 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 61 73 20  supplied .** as 
21a40 74 68 65 20 6c 61 73 74 20 70 61 72 61 6d 65 74  the last paramet
21a50 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
21a60 6e 20 6d 61 79 20 63 61 6c 63 75 6c 61 74 65 20  n may calculate 
21a70 74 68 65 20 63 6f 73 74 20 6f 66 0a 2a 2a 20 62  the cost of.** b
21a80 6f 74 68 20 72 65 61 6c 20 61 6e 64 20 76 69 72  oth real and vir
21a90 74 75 61 6c 20 74 61 62 6c 65 20 73 63 61 6e 73  tual table scans
21aa0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
21ab0 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 74  ction does not t
21ac0 61 6b 65 20 4f 52 44 45 52 20 42 59 20 6f 72 20  ake ORDER BY or 
21ad0 44 49 53 54 49 4e 43 54 20 69 6e 74 6f 20 61 63  DISTINCT into ac
21ae0 63 6f 75 6e 74 2e 20 20 4e 6f 72 0a 2a 2a 20 64  count.  Nor.** d
21af0 6f 65 73 20 69 74 20 72 65 6d 65 6d 62 65 72 20  oes it remember 
21b00 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
21b10 65 20 71 75 65 72 79 20 70 6c 61 6e 2e 20 20 41  e query plan.  A
21b20 6c 6c 20 69 74 20 64 6f 65 73 20 69 73 20 63 6f  ll it does is co
21b30 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 63 6f 73  mpute.** the cos
21b40 74 20 77 68 69 6c 65 20 64 65 74 65 72 6d 69 6e  t while determin
21b50 69 6e 67 20 69 66 20 61 6e 20 4f 52 20 6f 70 74  ing if an OR opt
21b60 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61 70 70  imization is app
21b70 6c 69 63 61 62 6c 65 2e 20 20 54 68 65 0a 2a 2a  licable.  The.**
21b80 20 64 65 74 61 69 6c 73 20 77 69 6c 6c 20 62 65   details will be
21b90 20 72 65 63 6f 6e 73 69 64 65 72 65 64 20 6c 61   reconsidered la
21ba0 74 65 72 20 69 66 20 74 68 65 20 6f 70 74 69 6d  ter if the optim
21bb0 69 7a 61 74 69 6f 6e 20 69 73 20 66 6f 75 6e 64  ization is found
21bc0 20 74 6f 20 62 65 0a 2a 2a 20 61 70 70 6c 69 63   to be.** applic
21bd0 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
21be0 76 6f 69 64 20 62 65 73 74 49 6e 64 65 78 28 57  void bestIndex(W
21bf0 68 65 72 65 42 65 73 74 49 64 78 20 2a 70 29 7b  hereBestIdx *p){
21c00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21c10 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
21c20 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  E.  if( IsVirtua
21c30 6c 28 70 2d 3e 70 53 72 63 2d 3e 70 54 61 62 29  l(p->pSrc->pTab)
21c40 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
21c50 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78  index_info *pIdx
21c60 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d  Info = 0;.    p-
21c70 3e 70 70 49 64 78 49 6e 66 6f 20 3d 20 26 70 49  >ppIdxInfo = &pI
21c80 64 78 49 6e 66 6f 3b 0a 20 20 20 20 62 65 73 74  dxInfo;.    best
21c90 56 69 72 74 75 61 6c 49 6e 64 65 78 28 70 29 3b  VirtualIndex(p);
21ca0 0a 20 20 20 20 69 66 28 20 70 49 64 78 49 6e 66  .    if( pIdxInf
21cb0 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
21cc0 53 74 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Str ){.      sql
21cd0 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e  ite3_free(pIdxIn
21ce0 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20  fo->idxStr);.   
21cf0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
21d00 46 72 65 65 28 70 2d 3e 70 50 61 72 73 65 2d 3e  Free(p->pParse->
21d10 64 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20  db, pIdxInfo);. 
21d20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
21d30 7b 0a 20 20 20 20 62 65 73 74 42 74 72 65 65 49  {.    bestBtreeI
21d40 6e 64 65 78 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  ndex(p);.  }.}..
21d50 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61 20  /*.** Disable a 
21d60 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52  term in the WHER
21d70 45 20 63 6c 61 75 73 65 2e 20 20 45 78 63 65 70  E clause.  Excep
21d80 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61 62 6c  t, do not disabl
21d90 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 69 66  e the term.** if
21da0 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61 20 4c   it controls a L
21db0 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 61  EFT OUTER JOIN a
21dc0 6e 64 20 69 74 20 64 69 64 20 6e 6f 74 20 6f 72  nd it did not or
21dd0 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65 20 4f  iginate in the O
21de0 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20 63 6c  N.** or USING cl
21df0 61 75 73 65 20 6f 66 20 74 68 61 74 20 6a 6f 69  ause of that joi
21e00 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65  n..**.** Conside
21e10 72 20 74 68 65 20 74 65 72 6d 20 74 32 2e 7a 3d  r the term t2.z=
21e20 27 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f 6c 6c  'ok' in the foll
21e30 6f 77 69 6e 67 20 71 75 65 72 69 65 73 3a 0a 2a  owing queries:.*
21e40 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53 45 4c 45  *.**   (1)  SELE
21e50 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46  CT * FROM t1 LEF
21e60 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e  T JOIN t2 ON t1.
21e70 61 3d 74 32 2e 78 20 57 48 45 52 45 20 74 32 2e  a=t2.x WHERE t2.
21e80 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32 29 20  z='ok'.**   (2) 
21e90 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
21ea0 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f  1 LEFT JOIN t2 O
21eb0 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20  N t1.a=t2.x AND 
21ec0 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28  t2.z='ok'.**   (
21ed0 33 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  3)  SELECT * FRO
21ee0 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45 20 74  M t1, t2 WHERE t
21ef0 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e  1.a=t2.x AND t2.
21f00 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65  z='ok'.**.** The
21f10 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20 64 69   t2.z='ok' is di
21f20 73 61 62 6c 65 64 20 69 6e 20 74 68 65 20 69 6e  sabled in the in
21f30 20 28 32 29 20 62 65 63 61 75 73 65 20 69 74 20   (2) because it 
21f40 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20 69 6e  originates.** in
21f50 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20   the ON clause. 
21f60 20 54 68 65 20 74 65 72 6d 20 69 73 20 64 69 73   The term is dis
21f70 61 62 6c 65 64 20 69 6e 20 28 33 29 20 62 65 63  abled in (3) bec
21f80 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70  ause it is not p
21f90 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54  art.** of a LEFT
21fa0 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20 49 6e   OUTER JOIN.  In
21fb0 20 28 31 29 2c 20 74 68 65 20 74 65 72 6d 20 69   (1), the term i
21fc0 73 20 6e 6f 74 20 64 69 73 61 62 6c 65 64 2e 0a  s not disabled..
21fd0 2a 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  **.** IMPLEMENTA
21fe0 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 34 35 39 37  TION-OF: R-24597
21ff0 2d 35 38 36 35 35 20 4e 6f 20 74 65 73 74 73 20  -58655 No tests 
22000 61 72 65 20 64 6f 6e 65 20 66 6f 72 20 74 65 72  are done for ter
22010 6d 73 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63  ms that are.** c
22020 6f 6d 70 6c 65 74 65 6c 79 20 73 61 74 69 73 66  ompletely satisf
22030 69 65 64 20 62 79 20 69 6e 64 69 63 65 73 2e 0a  ied by indices..
22040 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e 67 20  **.** Disabling 
22050 61 20 74 65 72 6d 20 63 61 75 73 65 73 20 74 68  a term causes th
22060 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74 20 62  at term to not b
22070 65 20 74 65 73 74 65 64 20 69 6e 20 74 68 65 20  e tested in the 
22080 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66  inner loop.** of
22090 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69 73 61   the join.  Disa
220a0 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70 74 69  bling is an opti
220b0 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65 6e 20  mization.  When 
220c0 74 65 72 6d 73 20 61 72 65 20 73 61 74 69 73 66  terms are satisf
220d0 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69 63 65  ied.** by indice
220e0 73 2c 20 77 65 20 64 69 73 61 62 6c 65 20 74 68  s, we disable th
220f0 65 6d 20 74 6f 20 70 72 65 76 65 6e 74 20 72 65  em to prevent re
22100 64 75 6e 64 61 6e 74 20 74 65 73 74 73 20 69 6e  dundant tests in
22110 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f   the inner.** lo
22120 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64 20 67 65  op.  We would ge
22130 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 65  t the correct re
22140 73 75 6c 74 73 20 69 66 20 6e 6f 74 68 69 6e 67  sults if nothing
22150 20 77 65 72 65 20 65 76 65 72 20 64 69 73 61 62   were ever disab
22160 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e  led,.** but join
22170 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69  s might run a li
22180 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 54 68  ttle slower.  Th
22190 65 20 74 72 69 63 6b 20 69 73 20 74 6f 20 64 69  e trick is to di
221a0 73 61 62 6c 65 20 61 73 20 6d 75 63 68 0a 2a 2a  sable as much.**
221b0 20 61 73 20 77 65 20 63 61 6e 20 77 69 74 68 6f   as we can witho
221c0 75 74 20 64 69 73 61 62 6c 69 6e 67 20 74 6f 6f  ut disabling too
221d0 20 6d 75 63 68 2e 20 20 49 66 20 77 65 20 64 69   much.  If we di
221e0 73 61 62 6c 65 64 20 69 6e 20 28 31 29 2c 20 77  sabled in (1), w
221f0 65 27 64 20 67 65 74 0a 2a 2a 20 74 68 65 20 77  e'd get.** the w
22200 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20 53 65  rong answer.  Se
22210 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e 0a 2a  e ticket #813..*
22220 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69  /.static void di
22230 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72 65 4c  sableTerm(WhereL
22240 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 57 68  evel *pLevel, Wh
22250 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b  ereTerm *pTerm){
22260 0a 20 20 69 66 28 20 70 54 65 72 6d 0a 20 20 20  .  if( pTerm.   
22270 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 77 74     && (pTerm->wt
22280 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  Flags & TERM_COD
22290 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20  ED)==0.      && 
222a0 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f  (pLevel->iLeftJo
222b0 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61 73  in==0 || ExprHas
222c0 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e  Property(pTerm->
222d0 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
222e0 69 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 70 54  in)).  ){.    pT
222f0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
22300 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20  TERM_CODED;.    
22310 69 66 28 20 70 54 65 72 6d 2d 3e 69 50 61 72 65  if( pTerm->iPare
22320 6e 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 57  nt>=0 ){.      W
22330 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72  hereTerm *pOther
22340 20 3d 20 26 70 54 65 72 6d 2d 3e 70 57 43 2d 3e   = &pTerm->pWC->
22350 61 5b 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  a[pTerm->iParent
22360 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28 2d 2d  ];.      if( (--
22370 70 4f 74 68 65 72 2d 3e 6e 43 68 69 6c 64 29 3d  pOther->nChild)=
22380 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69  =0 ){.        di
22390 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
223a0 2c 20 70 4f 74 68 65 72 29 3b 0a 20 20 20 20 20  , pOther);.     
223b0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
223c0 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50  /*.** Code an OP
223d0 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65  _Affinity opcode
223e0 20 74 6f 20 61 70 70 6c 79 20 74 68 65 20 63 6f   to apply the co
223f0 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74  lumn affinity st
22400 72 69 6e 67 20 7a 41 66 66 0a 2a 2a 20 74 6f 20  ring zAff.** to 
22410 74 68 65 20 6e 20 72 65 67 69 73 74 65 72 73 20  the n registers 
22420 73 74 61 72 74 69 6e 67 20 61 74 20 62 61 73 65  starting at base
22430 2e 20 0a 2a 2a 0a 2a 2a 20 41 73 20 61 6e 20 6f  . .**.** As an o
22440 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 53 51 4c  ptimization, SQL
22450 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74  ITE_AFF_NONE ent
22460 72 69 65 73 20 28 77 68 69 63 68 20 61 72 65 20  ries (which are 
22470 6e 6f 2d 6f 70 73 29 20 61 74 20 74 68 65 0a 2a  no-ops) at the.*
22480 2a 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  * beginning and 
22490 65 6e 64 20 6f 66 20 7a 41 66 66 20 61 72 65 20  end of zAff are 
224a0 69 67 6e 6f 72 65 64 2e 20 20 49 66 20 61 6c 6c  ignored.  If all
224b0 20 65 6e 74 72 69 65 73 20 69 6e 20 7a 41 66 66   entries in zAff
224c0 20 61 72 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 41   are.** SQLITE_A
224d0 46 46 5f 4e 4f 4e 45 2c 20 74 68 65 6e 20 6e 6f  FF_NONE, then no
224e0 20 63 6f 64 65 20 67 65 74 73 20 67 65 6e 65 72   code gets gener
224f0 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ated..**.** This
22500 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 69   routine makes i
22510 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 7a  ts own copy of z
22520 41 66 66 20 73 6f 20 74 68 61 74 20 74 68 65 20  Aff so that the 
22530 63 61 6c 6c 65 72 20 69 73 20 66 72 65 65 0a 2a  caller is free.*
22540 2a 20 74 6f 20 6d 6f 64 69 66 79 20 7a 41 66 66  * to modify zAff
22550 20 61 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   after this rout
22560 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2f 0a  ine returns..*/.
22570 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
22580 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 50 61  ApplyAffinity(Pa
22590 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
225a0 20 62 61 73 65 2c 20 69 6e 74 20 6e 2c 20 63 68   base, int n, ch
225b0 61 72 20 2a 7a 41 66 66 29 7b 0a 20 20 56 64 62  ar *zAff){.  Vdb
225c0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
225d0 56 64 62 65 3b 0a 20 20 69 66 28 20 7a 41 66 66  Vdbe;.  if( zAff
225e0 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
225f0 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  t( pParse->db->m
22600 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
22610 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
22620 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
22630 0a 0a 20 20 2f 2a 20 41 64 6a 75 73 74 20 62 61  ..  /* Adjust ba
22640 73 65 20 61 6e 64 20 6e 20 74 6f 20 73 6b 69 70  se and n to skip
22650 20 6f 76 65 72 20 53 51 4c 49 54 45 5f 41 46 46   over SQLITE_AFF
22660 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 61 74  _NONE entries at
22670 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20   the beginning. 
22680 20 2a 2a 20 61 6e 64 20 65 6e 64 20 6f 66 20 74   ** and end of t
22690 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  he affinity stri
226a0 6e 67 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  ng..  */.  while
226b0 28 20 6e 3e 30 20 26 26 20 7a 41 66 66 5b 30 5d  ( n>0 && zAff[0]
226c0 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
226d0 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20  E ){.    n--;.  
226e0 20 20 62 61 73 65 2b 2b 3b 0a 20 20 20 20 7a 41    base++;.    zA
226f0 66 66 2b 2b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  ff++;.  }.  whil
22700 65 28 20 6e 3e 31 20 26 26 20 7a 41 66 66 5b 6e  e( n>1 && zAff[n
22710 2d 31 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  -1]==SQLITE_AFF_
22720 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b  NONE ){.    n--;
22730 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 64 65 20  .  }..  /* Code 
22740 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20  the OP_Affinity 
22750 6f 70 63 6f 64 65 20 69 66 20 74 68 65 72 65 20  opcode if there 
22760 69 73 20 61 6e 79 74 68 69 6e 67 20 6c 65 66 74  is anything left
22770 20 74 6f 20 64 6f 2e 20 2a 2f 0a 20 20 69 66 28   to do. */.  if(
22780 20 6e 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69   n>0 ){.    sqli
22790 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
227a0 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 62 61   OP_Affinity, ba
227b0 73 65 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69  se, n);.    sqli
227c0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
227d0 76 2c 20 2d 31 2c 20 7a 41 66 66 2c 20 6e 29 3b  v, -1, zAff, n);
227e0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
227f0 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
22800 6e 67 65 28 70 50 61 72 73 65 2c 20 62 61 73 65  nge(pParse, base
22810 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  , n);.  }.}.../*
22820 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
22830 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 65  e for a single e
22840 71 75 61 6c 69 74 79 20 74 65 72 6d 20 6f 66 20  quality term of 
22850 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
22860 2e 20 20 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a  .  An equality.*
22870 2a 20 74 65 72 6d 20 63 61 6e 20 62 65 20 65 69  * term can be ei
22880 74 68 65 72 20 58 3d 65 78 70 72 20 6f 72 20 58  ther X=expr or X
22890 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65   IN (...).   pTe
228a0 72 6d 20 69 73 20 74 68 65 20 74 65 72 6d 20 74  rm is the term t
228b0 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a  o be .** coded..
228c0 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72 65 6e  **.** The curren
228d0 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
228e0 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6c 65  constraint is le
228f0 66 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ft in register i
22900 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  Reg..**.** For a
22910 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 74   constraint of t
22920 68 65 20 66 6f 72 6d 20 58 3d 65 78 70 72 2c 20  he form X=expr, 
22930 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
22940 73 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  s evaluated and 
22950 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73  its.** result is
22960 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73 74 61   left on the sta
22970 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73 74 72 61  ck.  For constra
22980 69 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ints of the form
22990 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74   X IN (...).** t
229a0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
229b0 20 75 70 20 61 20 6c 6f 6f 70 20 74 68 61 74 20   up a loop that 
229c0 77 69 6c 6c 20 69 74 65 72 61 74 65 20 6f 76 65  will iterate ove
229d0 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20  r all values of 
229e0 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  X..*/.static int
229f0 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
22a00 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  m(.  Parse *pPar
22a10 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  se,      /* The 
22a20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
22a30 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
22a40 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20  pTerm,   /* The 
22a50 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
22a60 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 63  E clause to be c
22a70 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c  oded */.  WhereL
22a80 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f 2a  evel *pLevel, /*
22a90 20 57 68 65 6e 20 6c 65 76 65 6c 20 6f 66 20 74   When level of t
22aa0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77  he FROM clause w
22ab0 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e  e are working on
22ac0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72 67 65   */.  int iTarge
22ad0 74 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74  t         /* Att
22ae0 65 6d 70 74 20 74 6f 20 6c 65 61 76 65 20 72 65  empt to leave re
22af0 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20 72 65  sults in this re
22b00 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45  gister */.){.  E
22b10 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
22b20 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65 20 2a  >pExpr;.  Vdbe *
22b30 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
22b40 65 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 20 20  e;.  int iReg;  
22b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b60 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
22b70 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a  ing results */..
22b80 20 20 61 73 73 65 72 74 28 20 69 54 61 72 67 65    assert( iTarge
22b90 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 58 2d  t>0 );.  if( pX-
22ba0 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20  >op==TK_EQ ){.  
22bb0 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33    iReg = sqlite3
22bc0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
22bd0 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
22be0 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 7d  t, iTarget);.  }
22bf0 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d  else if( pX->op=
22c00 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =TK_ISNULL ){.  
22c10 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74    iReg = iTarget
22c20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
22c30 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
22c40 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23 69  ll, 0, iReg);.#i
22c50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22c60 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c  T_SUBQUERY.  }el
22c70 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54 79 70  se{.    int eTyp
22c80 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b  e;.    int iTab;
22c90 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f  .    struct InLo
22ca0 6f 70 20 2a 70 49 6e 3b 0a 0a 20 20 20 20 61 73  op *pIn;..    as
22cb0 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  sert( pX->op==TK
22cc0 5f 49 4e 20 29 3b 0a 20 20 20 20 69 52 65 67 20  _IN );.    iReg 
22cd0 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20 65  = iTarget;.    e
22ce0 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69  Type = sqlite3Fi
22cf0 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65  ndInIndex(pParse
22d00 2c 20 70 58 2c 20 30 29 3b 0a 20 20 20 20 69 54  , pX, 0);.    iT
22d10 61 62 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b  ab = pX->iTable;
22d20 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
22d30 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
22d40 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20  ind, iTab, 0);. 
22d50 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65     assert( pLeve
22d60 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
22d70 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20  & WHERE_IN_ABLE 
22d80 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  );.    if( pLeve
22d90 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20 29  l->u.in.nIn==0 )
22da0 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
22db0 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65  addrNxt = sqlite
22dc0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
22dd0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65  );.    }.    pLe
22de0 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b  vel->u.in.nIn++;
22df0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  .    pLevel->u.i
22e00 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20 20  n.aInLoop =.    
22e10 20 20 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c     sqlite3DbReal
22e20 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 72 73 65  locOrFree(pParse
22e30 2d 3e 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e  ->db, pLevel->u.
22e40 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20  in.aInLoop,.    
22e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e60 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
22e70 28 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49  (pLevel->u.in.aI
22e80 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76 65 6c  nLoop[0])*pLevel
22e90 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20 20  ->u.in.nIn);.   
22ea0 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 75   pIn = pLevel->u
22eb0 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20  .in.aInLoop;.   
22ec0 20 69 66 28 20 70 49 6e 20 29 7b 0a 20 20 20 20   if( pIn ){.    
22ed0 20 20 70 49 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d    pIn += pLevel-
22ee0 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b 0a 20  >u.in.nIn - 1;. 
22ef0 20 20 20 20 20 70 49 6e 2d 3e 69 43 75 72 20 3d       pIn->iCur =
22f00 20 69 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28   iTab;.      if(
22f10 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
22f20 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20  _ROWID ){.      
22f30 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70    pIn->addrInTop
22f40 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
22f50 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
22f60 2c 20 69 54 61 62 2c 20 69 52 65 67 29 3b 0a 20  , iTab, iReg);. 
22f70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22f80 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54      pIn->addrInT
22f90 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
22fa0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
22fb0 75 6d 6e 2c 20 69 54 61 62 2c 20 30 2c 20 69 52  umn, iTab, 0, iR
22fc0 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eg);.      }.   
22fd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
22fe0 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp1(v, OP_IsNul
22ff0 6c 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 65  l, iReg);.    }e
23000 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  lse{.      pLeve
23010 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b  l->u.in.nIn = 0;
23020 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
23030 7d 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28  }.  disableTerm(
23040 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a  pLevel, pTerm);.
23050 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d    return iReg;.}
23060 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
23070 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
23080 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20  evaluate all == 
23090 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e  and IN constrain
230a0 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64  ts for an.** ind
230b0 65 78 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  ex..**.** For ex
230c0 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20  ample, consider 
230d0 74 61 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64  table t1(a,b,c,d
230e0 2c 65 2c 66 29 20 77 69 74 68 20 69 6e 64 65 78  ,e,f) with index
230f0 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53   i1(a,b,c)..** S
23100 75 70 70 6f 73 65 20 74 68 65 20 57 48 45 52 45  uppose the WHERE
23110 20 63 6c 61 75 73 65 20 69 73 20 74 68 69 73 3a   clause is this:
23120 20 20 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20    a==5 AND b IN 
23130 28 31 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35 20  (1,2,3) AND c>5 
23140 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20  AND c<10.** The 
23150 69 6e 64 65 78 20 68 61 73 20 61 73 20 6d 61 6e  index has as man
23160 79 20 61 73 20 74 68 72 65 65 20 65 71 75 61 6c  y as three equal
23170 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  ity constraints,
23180 20 62 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20   but in this.** 
23190 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 74 68 69  example, the thi
231a0 72 64 20 22 63 22 20 76 61 6c 75 65 20 69 73 20  rd "c" value is 
231b0 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20  an inequality.  
231c0 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20  So only two .** 
231d0 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20  constraints are 
231e0 63 6f 64 65 64 2e 20 20 54 68 69 73 20 72 6f 75  coded.  This rou
231f0 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72 61  tine will genera
23200 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
23210 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20  ate.** a==5 and 
23220 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54  b IN (1,2,3).  T
23230 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
23240 73 20 66 6f 72 20 61 20 61 6e 64 20 62 20 77 69  s for a and b wi
23250 6c 6c 20 62 65 20 73 74 6f 72 65 64 0a 2a 2a 20  ll be stored.** 
23260 69 6e 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72  in consecutive r
23270 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65  egisters and the
23280 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69   index of the fi
23290 72 73 74 20 72 65 67 69 73 74 65 72 20 69 73 20  rst register is 
232a0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
232b0 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61  In the example a
232c0 62 6f 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75  bove nEq==2.  Bu
232d0 74 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e  t this subroutin
232e0 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20  e works for any 
232f0 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20  value.** of nEq 
23300 69 6e 63 6c 75 64 69 6e 67 20 30 2e 20 20 49 66  including 0.  If
23310 20 6e 45 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f   nEq==0, this ro
23320 75 74 69 6e 65 20 69 73 20 6e 65 61 72 6c 79 20  utine is nearly 
23330 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20  a no-op..** The 
23340 6f 6e 6c 79 20 74 68 69 6e 67 20 69 74 20 64 6f  only thing it do
23350 65 73 20 69 73 20 61 6c 6c 6f 63 61 74 65 20 74  es is allocate t
23360 68 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20  he pLevel->iMem 
23370 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 0a  memory cell and.
23380 2a 2a 20 63 6f 6d 70 75 74 65 20 74 68 65 20 61  ** compute the a
23390 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a  ffinity string..
233a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
233b0 6e 65 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61  ne always alloca
233c0 74 65 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  tes at least one
233d0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
233e0 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20   returns.** the 
233f0 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 6d 65  index of that me
23400 6d 6f 72 79 20 63 65 6c 6c 2e 20 54 68 65 20 63  mory cell. The c
23410 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c  ode that.** call
23420 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
23430 69 6c 6c 20 75 73 65 20 74 68 61 74 20 6d 65 6d  ill use that mem
23440 6f 72 79 20 63 65 6c 6c 20 74 6f 20 73 74 6f 72  ory cell to stor
23450 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f  e the terminatio
23460 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f  n.** key value o
23470 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20  f the loop.  If 
23480 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f  one or more IN o
23490 70 65 72 61 74 6f 72 73 20 61 70 70 65 61 72 2c  perators appear,
234a0 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f   then.** this ro
234b0 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20  utine allocates 
234c0 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45  an additional nE
234d0 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66  q memory cells f
234e0 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75  or internal.** u
234f0 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  se..**.** Before
23500 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 41   returning, *pzA
23510 66 66 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  ff is set to poi
23520 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  nt to a buffer c
23530 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 63  ontaining a.** c
23540 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  opy of the colum
23550 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  n affinity strin
23560 67 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61  g of the index a
23570 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 0a 2a  llocated using.*
23580 2a 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  * sqlite3DbMallo
23590 63 28 29 2e 20 45 78 63 65 70 74 2c 20 65 6e 74  c(). Except, ent
235a0 72 69 65 73 20 69 6e 20 74 68 65 20 63 6f 70 79  ries in the copy
235b0 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 61   of the string a
235c0 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
235d0 68 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  h equality const
235e0 72 61 69 6e 74 73 20 74 68 61 74 20 75 73 65 20  raints that use 
235f0 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 20 61 72  NONE affinity ar
23600 65 20 73 65 74 20 74 6f 0a 2a 2a 20 53 51 4c 49  e set to.** SQLI
23610 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54 68 69  TE_AFF_NONE. Thi
23620 73 20 69 73 20 74 6f 20 64 65 61 6c 20 77 69 74  s is to deal wit
23630 68 20 53 51 4c 20 73 75 63 68 20 61 73 20 74 68  h SQL such as th
23640 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
23650 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
23660 45 20 74 31 28 61 20 54 45 58 54 20 50 52 49 4d  E t1(a TEXT PRIM
23670 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20  ARY KEY, b);.** 
23680 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f    SELECT ... FRO
23690 4d 20 74 31 20 41 53 20 74 32 2c 20 74 31 20 57  M t1 AS t2, t1 W
236a0 48 45 52 45 20 74 31 2e 61 20 3d 20 74 32 2e 62  HERE t1.a = t2.b
236b0 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65  ;.**.** In the e
236c0 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68  xample above, th
236d0 65 20 69 6e 64 65 78 20 6f 6e 20 74 31 28 61 29  e index on t1(a)
236e0 20 68 61 73 20 54 45 58 54 20 61 66 66 69 6e 69   has TEXT affini
236f0 74 79 2e 20 42 75 74 20 73 69 6e 63 65 0a 2a 2a  ty. But since.**
23700 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20   the right hand 
23710 73 69 64 65 20 6f 66 20 74 68 65 20 65 71 75 61  side of the equa
23720 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
23730 28 74 32 2e 62 29 20 68 61 73 20 4e 4f 4e 45 20  (t2.b) has NONE 
23740 61 66 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20  affinity,.** no 
23750 63 6f 6e 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c  conversion shoul
23760 64 20 62 65 20 61 74 74 65 6d 70 74 65 64 20 62  d be attempted b
23770 65 66 6f 72 65 20 75 73 69 6e 67 20 61 20 74 32  efore using a t2
23780 2e 62 20 76 61 6c 75 65 20 61 73 20 70 61 72 74  .b value as part
23790 20 6f 66 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20   of.** a key to 
237a0 73 65 61 72 63 68 20 74 68 65 20 69 6e 64 65 78  search the index
237b0 2e 20 48 65 6e 63 65 20 74 68 65 20 66 69 72 73  . Hence the firs
237c0 74 20 62 79 74 65 20 69 6e 20 74 68 65 20 72 65  t byte in the re
237d0 74 75 72 6e 65 64 20 61 66 66 69 6e 69 74 79 0a  turned affinity.
237e0 2a 2a 20 73 74 72 69 6e 67 20 69 6e 20 74 68 69  ** string in thi
237f0 73 20 65 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20  s example would 
23800 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  be set to SQLITE
23810 5f 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74  _AFF_NONE..*/.st
23820 61 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c  atic int codeAll
23830 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20  EqualityTerms(. 
23840 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
23850 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
23860 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
23870 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
23880 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65  l,   /* Which ne
23890 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65  sted loop of the
238a0 20 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64   FROM we are cod
238b0 69 6e 67 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ing */.  WhereCl
238c0 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f  ause *pWC,     /
238d0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
238e0 73 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  se */.  Bitmask 
238f0 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f 2a  notReady,     /*
23900 20 57 68 69 63 68 20 70 61 72 74 73 20 6f 66 20   Which parts of 
23910 46 52 4f 4d 20 68 61 76 65 20 6e 6f 74 20 79 65  FROM have not ye
23920 74 20 62 65 65 6e 20 63 6f 64 65 64 20 2a 2f 0a  t been coded */.
23930 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67 2c    int nExtraReg,
23940 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
23950 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73  r of extra regis
23960 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ters to allocate
23970 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 41   */.  char **pzA
23980 66 66 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ff          /* O
23990 55 54 3a 20 53 65 74 20 74 6f 20 70 6f 69 6e 74  UT: Set to point
239a0 20 74 6f 20 61 66 66 69 6e 69 74 79 20 73 74 72   to affinity str
239b0 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ing */.){.  int 
239c0 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c  nEq = pLevel->pl
239d0 61 6e 2e 6e 45 71 3b 20 20 20 2f 2a 20 54 68 65  an.nEq;   /* The
239e0 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72   number of == or
239f0 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IN constraints 
23a00 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 56 64 62  to code */.  Vdb
23a10 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
23a20 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68  Vdbe;      /* Th
23a30 65 20 76 6d 20 75 6e 64 65 72 20 63 6f 6e 73 74  e vm under const
23a40 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64  ruction */.  Ind
23a50 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
23a60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
23a70 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 75 73  e index being us
23a80 65 64 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70  ed for this loop
23a90 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 20 3d   */.  int iCur =
23aa0 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
23ab0 3b 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f  ;   /* The curso
23ac0 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a  r of the table *
23ad0 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
23ae0 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
23af0 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f    /* A single co
23b00 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f  nstraint term */
23b10 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20  .  int j;       
23b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b30 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
23b40 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73   */.  int regBas
23b50 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
23b60 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69      /* Base regi
23b70 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ster */.  int nR
23b80 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
23b90 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
23ba0 72 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74  r of registers t
23bb0 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
23bc0 63 68 61 72 20 2a 7a 41 66 66 3b 20 20 20 20 20  char *zAff;     
23bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23be0 20 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   Affinity string
23bf0 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20   to return */.. 
23c00 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20   /* This module 
23c10 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f  is only called o
23c20 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20 74 68  n query plans th
23c30 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2e  at use an index.
23c40 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4c   */.  assert( pL
23c50 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
23c60 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
23c70 45 44 20 29 3b 0a 20 20 70 49 64 78 20 3d 20 70  ED );.  pIdx = p
23c80 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49  Level->plan.u.pI
23c90 64 78 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65  dx;..  /* Figure
23ca0 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65   out how many me
23cb0 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20 77 69  mory cells we wi
23cc0 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c  ll need then all
23cd0 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2f  ocate them..  */
23ce0 0a 20 20 72 65 67 42 61 73 65 20 3d 20 70 50 61  .  regBase = pPa
23cf0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
23d00 20 6e 52 65 67 20 3d 20 70 4c 65 76 65 6c 2d 3e   nReg = pLevel->
23d10 70 6c 61 6e 2e 6e 45 71 20 2b 20 6e 45 78 74 72  plan.nEq + nExtr
23d20 61 52 65 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  aReg;.  pParse->
23d30 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20  nMem += nReg;.. 
23d40 20 7a 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44   zAff = sqlite3D
23d50 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e  bStrDup(pParse->
23d60 64 62 2c 20 73 71 6c 69 74 65 33 49 6e 64 65 78  db, sqlite3Index
23d70 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70  AffinityStr(v, p
23d80 49 64 78 29 29 3b 0a 20 20 69 66 28 20 21 7a 41  Idx));.  if( !zA
23d90 66 66 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  ff ){.    pParse
23da0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
23db0 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  ed = 1;.  }..  /
23dc0 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65  * Evaluate the e
23dd0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
23de0 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  nts.  */.  asser
23df0 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  t( pIdx->nColumn
23e00 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a  >=nEq );.  for(j
23e10 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b  =0; j<nEq; j++){
23e20 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20  .    int r1;.   
23e30 20 69 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61   int k = pIdx->a
23e40 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
23e50 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
23e60 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e  (pWC, iCur, k, n
23e70 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 2d  otReady, pLevel-
23e80 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 2c 20 70  >plan.wsFlags, p
23e90 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20 70 54  Idx);.    if( pT
23ea0 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  erm==0 ) break;.
23eb0 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
23ec0 77 69 6e 67 20 74 72 75 65 20 66 6f 72 20 69 6e  wing true for in
23ed0 64 69 63 65 73 20 77 69 74 68 20 72 65 64 75 6e  dices with redun
23ee0 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a 20  dant columns. . 
23ef0 20 20 20 2a 2a 20 45 78 3a 20 43 52 45 41 54 45     ** Ex: CREATE
23f00 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
23f10 61 2c 62 2c 61 29 3b 20 53 45 4c 45 43 54 20 2a  a,b,a); SELECT *
23f20 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
23f30 3d 30 20 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a 20  =0 AND b=0; */. 
23f40 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 54     testcase( (pT
23f50 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
23f60 45 52 4d 5f 43 4f 44 45 44 29 21 3d 30 20 29 3b  ERM_CODED)!=0 );
23f70 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
23f80 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
23f90 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20  TERM_VIRTUAL ); 
23fa0 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31  /* EV: R-30575-1
23fb0 31 36 36 32 20 2a 2f 0a 20 20 20 20 72 31 20 3d  1662 */.    r1 =
23fc0 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
23fd0 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  m(pParse, pTerm,
23fe0 20 70 4c 65 76 65 6c 2c 20 72 65 67 42 61 73 65   pLevel, regBase
23ff0 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20 72 31 21  +j);.    if( r1!
24000 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a 20 20  =regBase+j ){.  
24010 20 20 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20      if( nReg==1 
24020 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
24030 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
24040 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
24050 29 3b 0a 20 20 20 20 20 20 20 20 72 65 67 42 61  );.        regBa
24060 73 65 20 3d 20 72 31 3b 0a 20 20 20 20 20 20 7d  se = r1;.      }
24070 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
24080 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
24090 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c  v, OP_SCopy, r1,
240a0 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20   regBase+j);.   
240b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74     }.    }.    t
240c0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
240d0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
240e0 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73  SNULL );.    tes
240f0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
24100 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
24110 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  );.    if( (pTer
24120 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
24130 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29  WO_ISNULL|WO_IN)
24140 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  )==0 ){.      Ex
24150 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65  pr *pRight = pTe
24160 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
24170 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
24180 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75  ExprCodeIsNullJu
24190 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65  mp(v, pRight, re
241a0 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d  gBase+j, pLevel-
241b0 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 20  >addrBrk);.     
241c0 20 69 66 28 20 7a 41 66 66 20 29 7b 0a 20 20 20   if( zAff ){.   
241d0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
241e0 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
241f0 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29  pRight, zAff[j])
24200 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
24210 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  E ){.          z
24220 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f  Aff[j] = SQLITE_
24230 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
24240 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
24250 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73  sqlite3ExprNeeds
24260 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  NoAffinityChange
24270 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d  (pRight, zAff[j]
24280 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ) ){.          z
24290 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f  Aff[j] = SQLITE_
242a0 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
242b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
242c0 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41 66 66 20 3d  }.  }.  *pzAff =
242d0 20 7a 41 66 66 3b 0a 20 20 72 65 74 75 72 6e 20   zAff;.  return 
242e0 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 23 69 66 6e  regBase;.}..#ifn
242f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
24300 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 54 68  EXPLAIN./*.** Th
24310 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
24320 68 65 6c 70 65 72 20 66 6f 72 20 65 78 70 6c 61  helper for expla
24330 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 29 20 62  inIndexRange() b
24340 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20 70 53 74 72 20  elow.**.** pStr 
24350 68 6f 6c 64 73 20 74 68 65 20 74 65 78 74 20 6f  holds the text o
24360 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
24370 74 68 61 74 20 77 65 20 61 72 65 20 62 75 69 6c  that we are buil
24380 64 69 6e 67 20 75 70 20 6f 6e 65 20 74 65 72 6d  ding up one term
24390 0a 2a 2a 20 61 74 20 61 20 74 69 6d 65 2e 20 20  .** at a time.  
243a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64  This routine add
243b0 73 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20  s a new term to 
243c0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 65  the end of the e
243d0 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54 65  xpression..** Te
243e0 72 6d 73 20 61 72 65 20 73 65 70 61 72 61 74 65  rms are separate
243f0 64 20 62 79 20 41 4e 44 20 73 6f 20 61 64 64 20  d by AND so add 
24400 74 68 65 20 22 41 4e 44 22 20 74 65 78 74 20 66  the "AND" text f
24410 6f 72 20 73 65 63 6f 6e 64 20 61 6e 64 20 73 75  or second and su
24420 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 65 72 6d  bsequent.** term
24430 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  s only..*/.stati
24440 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 41 70  c void explainAp
24450 70 65 6e 64 54 65 72 6d 28 0a 20 20 53 74 72 41  pendTerm(.  StrA
24460 63 63 75 6d 20 2a 70 53 74 72 2c 20 20 20 20 20  ccum *pStr,     
24470 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
24480 65 78 74 20 65 78 70 72 65 73 73 69 6f 6e 20 62  ext expression b
24490 65 69 6e 67 20 62 75 69 6c 74 20 2a 2f 0a 20 20  eing built */.  
244a0 69 6e 74 20 69 54 65 72 6d 2c 20 20 20 20 20 20  int iTerm,      
244b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
244c0 6e 64 65 78 20 6f 66 20 74 68 69 73 20 74 65 72  ndex of this ter
244d0 6d 2e 20 20 46 69 72 73 74 20 69 73 20 7a 65 72  m.  First is zer
244e0 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  o */.  const cha
244f0 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  r *zColumn,     
24500 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
24510 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f  e column */.  co
24520 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 20 20  nst char *zOp   
24530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
24540 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f  e of the operato
24550 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 54  r */.){.  if( iT
24560 65 72 6d 20 29 20 73 71 6c 69 74 65 33 53 74 72  erm ) sqlite3Str
24570 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72  AccumAppend(pStr
24580 2c 20 22 20 41 4e 44 20 22 2c 20 35 29 3b 0a 20  , " AND ", 5);. 
24590 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
245a0 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a 43 6f  Append(pStr, zCo
245b0 6c 75 6d 6e 2c 20 2d 31 29 3b 0a 20 20 73 71 6c  lumn, -1);.  sql
245c0 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
245d0 6e 64 28 70 53 74 72 2c 20 7a 4f 70 2c 20 31 29  nd(pStr, zOp, 1)
245e0 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ;.  sqlite3StrAc
245f0 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20  cumAppend(pStr, 
24600 22 3f 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  "?", 1);.}../*.*
24610 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c 65 76 65  * Argument pLeve
24620 6c 20 64 65 73 63 72 69 62 65 73 20 61 20 73 74  l describes a st
24630 72 61 74 65 67 79 20 66 6f 72 20 73 63 61 6e 6e  rategy for scann
24640 69 6e 67 20 74 61 62 6c 65 20 70 54 61 62 2e 20  ing table pTab. 
24650 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
24660 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  n returns a poin
24670 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20  ter to a string 
24680 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
24690 67 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 0a  g a description.
246a0 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 73 65 74  ** of the subset
246b0 20 6f 66 20 74 61 62 6c 65 20 72 6f 77 73 20 73   of table rows s
246c0 63 61 6e 6e 65 64 20 62 79 20 74 68 65 20 73 74  canned by the st
246d0 72 61 74 65 67 79 20 69 6e 20 74 68 65 20 66 6f  rategy in the fo
246e0 72 6d 20 6f 66 20 61 6e 0a 2a 2a 20 53 51 4c 20  rm of an.** SQL 
246f0 65 78 70 72 65 73 73 69 6f 6e 2e 20 4f 72 2c 20  expression. Or, 
24700 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20  if all rows are 
24710 73 63 61 6e 6e 65 64 2c 20 4e 55 4c 4c 20 69 73  scanned, NULL is
24720 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
24730 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
24740 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a   the query:.**.*
24750 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
24760 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31 20 41  M t1 WHERE a=1 A
24770 4e 44 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20 69 73  ND b>2;.**.** is
24780 20 72 75 6e 20 61 6e 64 20 74 68 65 72 65 20 69   run and there i
24790 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28 61  s an index on (a
247a0 2c 20 62 29 2c 20 74 68 65 6e 20 74 68 69 73 20  , b), then this 
247b0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
247c0 20 61 0a 2a 2a 20 73 74 72 69 6e 67 20 73 69 6d   a.** string sim
247d0 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20  ilar to:.**.**  
247e0 20 22 61 3d 3f 20 41 4e 44 20 62 3e 3f 22 0a 2a   "a=? AND b>?".*
247f0 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
24800 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  d pointer points
24810 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   to memory obtai
24820 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
24830 44 62 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49  DbMalloc()..** I
24840 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
24850 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
24860 61 6c 6c 65 72 20 74 6f 20 66 72 65 65 20 74 68  aller to free th
24870 65 20 62 75 66 66 65 72 20 77 68 65 6e 20 69 74  e buffer when it
24880 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72   is.** no longer
24890 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74   required..*/.st
248a0 61 74 69 63 20 63 68 61 72 20 2a 65 78 70 6c 61  atic char *expla
248b0 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 73 71 6c  inIndexRange(sql
248c0 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
248d0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 54 61  evel *pLevel, Ta
248e0 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 57 68  ble *pTab){.  Wh
248f0 65 72 65 50 6c 61 6e 20 2a 70 50 6c 61 6e 20 3d  erePlan *pPlan =
24900 20 26 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 3b 0a   &pLevel->plan;.
24910 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20    Index *pIndex 
24920 3d 20 70 50 6c 61 6e 2d 3e 75 2e 70 49 64 78 3b  = pPlan->u.pIdx;
24930 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 50 6c  .  int nEq = pPl
24940 61 6e 2d 3e 6e 45 71 3b 0a 20 20 69 6e 74 20 69  an->nEq;.  int i
24950 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61  , j;.  Column *a
24960 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
24970 3b 0a 20 20 69 6e 74 20 2a 61 69 43 6f 6c 75 6d  ;.  int *aiColum
24980 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  n = pIndex->aiCo
24990 6c 75 6d 6e 3b 0a 20 20 53 74 72 41 63 63 75 6d  lumn;.  StrAccum
249a0 20 74 78 74 3b 0a 0a 20 20 69 66 28 20 6e 45 71   txt;..  if( nEq
249b0 3d 3d 30 20 26 26 20 28 70 50 6c 61 6e 2d 3e 77  ==0 && (pPlan->w
249c0 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
249d0 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f  BTM_LIMIT|WHERE_
249e0 54 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d 30 20 29  TOP_LIMIT))==0 )
249f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
24a00 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72    }.  sqlite3Str
24a10 41 63 63 75 6d 49 6e 69 74 28 26 74 78 74 2c 20  AccumInit(&txt, 
24a20 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 4d 41 58  0, 0, SQLITE_MAX
24a30 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 74 78 74 2e  _LENGTH);.  txt.
24a40 64 62 20 3d 20 64 62 3b 0a 20 20 73 71 6c 69 74  db = db;.  sqlit
24a50 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
24a60 28 26 74 78 74 2c 20 22 20 28 22 2c 20 32 29 3b  (&txt, " (", 2);
24a70 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45  .  for(i=0; i<nE
24a80 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 65 78 70  q; i++){.    exp
24a90 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26  lainAppendTerm(&
24aa0 74 78 74 2c 20 69 2c 20 61 43 6f 6c 5b 61 69 43  txt, i, aCol[aiC
24ab0 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65 2c  olumn[i]].zName,
24ac0 20 22 3d 22 29 3b 0a 20 20 7d 0a 0a 20 20 6a 20   "=");.  }..  j 
24ad0 3d 20 69 3b 0a 20 20 69 66 28 20 70 50 6c 61 6e  = i;.  if( pPlan
24ae0 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  ->wsFlags&WHERE_
24af0 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  BTM_LIMIT ){.   
24b00 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70   char *z = (j==p
24b10 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Index->nColumn )
24b20 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f   ? "rowid" : aCo
24b30 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a  l[aiColumn[j]].z
24b40 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69  Name;.    explai
24b50 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74  nAppendTerm(&txt
24b60 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e 22 29 3b 0a  , i++, z, ">");.
24b70 20 20 7d 0a 20 20 69 66 28 20 70 50 6c 61 6e 2d    }.  if( pPlan-
24b80 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 54  >wsFlags&WHERE_T
24b90 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  OP_LIMIT ){.    
24ba0 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70 49  char *z = (j==pI
24bb0 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20  ndex->nColumn ) 
24bc0 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c  ? "rowid" : aCol
24bd0 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e  [aiColumn[j]].zN
24be0 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e  ame;.    explain
24bf0 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c  AppendTerm(&txt,
24c00 20 69 2c 20 7a 2c 20 22 3c 22 29 3b 0a 20 20 7d   i, z, "<");.  }
24c10 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
24c20 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22  umAppend(&txt, "
24c30 29 22 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e  )", 1);.  return
24c40 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
24c50 46 69 6e 69 73 68 28 26 74 78 74 29 3b 0a 7d 0a  Finish(&txt);.}.
24c60 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
24c70 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
24c80 75 6e 6c 65 73 73 20 63 75 72 72 65 6e 74 6c 79  unless currently
24c90 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 20 45   processing an E
24ca0 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
24cb0 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 49 66  N.** command. If
24cc0 20 74 68 65 20 71 75 65 72 79 20 62 65 69 6e 67   the query being
24cd0 20 63 6f 6d 70 69 6c 65 64 20 69 73 20 61 6e 20   compiled is an 
24ce0 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
24cf0 41 4e 2c 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20  AN, a single.** 
24d00 72 65 63 6f 72 64 20 69 73 20 61 64 64 65 64 20  record is added 
24d10 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 74 6f  to the output to
24d20 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74 61   describe the ta
24d30 62 6c 65 20 73 63 61 6e 20 73 74 72 61 74 65 67  ble scan strateg
24d40 79 20 69 6e 20 0a 2a 2a 20 70 4c 65 76 65 6c 2e  y in .** pLevel.
24d50 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
24d60 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a  explainOneScan(.
24d70 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
24d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d90 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
24da0 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
24db0 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20  *pTabList,      
24dc0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
24dd0 20 6c 69 73 74 20 74 68 69 73 20 6c 6f 6f 70 20   list this loop 
24de0 72 65 66 65 72 73 20 74 6f 20 2a 2f 0a 20 20 57  refers to */.  W
24df0 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
24e00 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l,             /
24e10 2a 20 53 63 61 6e 20 74 6f 20 77 72 69 74 65 20  * Scan to write 
24e20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64  OP_Explain opcod
24e30 65 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  e for */.  int i
24e40 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
24e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
24e60 6c 75 65 20 66 6f 72 20 22 6c 65 76 65 6c 22 20  lue for "level" 
24e70 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74  column of output
24e80 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c   */.  int iFrom,
24e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ea0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66        /* Value f
24eb0 6f 72 20 22 66 72 6f 6d 22 20 63 6f 6c 75 6d 6e  or "from" column
24ec0 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20   of output */.  
24ed0 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 20  u16 wctrlFlags  
24ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ef0 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
24f00 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
24f10 65 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 69  egin() */.){.  i
24f20 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
24f30 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 75 33 32  in==2 ){.    u32
24f40 20 66 6c 61 67 73 20 3d 20 70 4c 65 76 65 6c 2d   flags = pLevel-
24f50 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20  >plan.wsFlags;. 
24f60 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
24f70 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
24f80 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
24f90 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
24fa0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
24fb0 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f  e->pVdbe;      /
24fc0 2a 20 56 4d 20 62 65 69 6e 67 20 63 6f 6e 73 74  * VM being const
24fd0 72 75 63 74 65 64 20 2a 2f 0a 20 20 20 20 73 71  ructed */.    sq
24fe0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
24ff0 73 65 2d 3e 64 62 3b 20 20 20 20 20 2f 2a 20 44  se->db;     /* D
25000 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
25010 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67  /.    char *zMsg
25020 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25030 20 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20 61      /* Text to a
25040 64 64 20 74 6f 20 45 51 50 20 6f 75 74 70 75 74  dd to EQP output
25050 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
25060 69 6e 74 36 34 20 6e 52 6f 77 3b 20 20 20 20 20  int64 nRow;     
25070 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65        /* Expecte
25080 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  d number of rows
25090 20 76 69 73 69 74 65 64 20 62 79 20 73 63 61 6e   visited by scan
250a0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 20   */.    int iId 
250b0 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  = pParse->iSelec
250c0 74 49 64 3b 20 20 2f 2a 20 53 65 6c 65 63 74 20  tId;  /* Select 
250d0 69 64 20 28 6c 65 66 74 2d 6d 6f 73 74 20 6f 75  id (left-most ou
250e0 74 70 75 74 20 63 6f 6c 75 6d 6e 29 20 2a 2f 0a  tput column) */.
250f0 20 20 20 20 69 6e 74 20 69 73 53 65 61 72 63 68      int isSearch
25100 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25110 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
25120 53 45 41 52 43 48 2e 20 46 61 6c 73 65 20 66 6f  SEARCH. False fo
25130 72 20 53 43 41 4e 2e 20 2a 2f 0a 0a 20 20 20 20  r SCAN. */..    
25140 69 66 28 20 28 66 6c 61 67 73 26 57 48 45 52 45  if( (flags&WHERE
25150 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c 20 28 77  _MULTI_OR) || (w
25160 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f  ctrlFlags&WHERE_
25170 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 29  ONETABLE_ONLY) )
25180 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 73   return;..    is
25190 53 65 61 72 63 68 20 3d 20 28 70 4c 65 76 65 6c  Search = (pLevel
251a0 2d 3e 70 6c 61 6e 2e 6e 45 71 3e 30 29 0a 20 20  ->plan.nEq>0).  
251b0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 66             || (f
251c0 6c 61 67 73 26 28 57 48 45 52 45 5f 42 54 4d 5f  lags&(WHERE_BTM_
251d0 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f  LIMIT|WHERE_TOP_
251e0 4c 49 4d 49 54 29 29 21 3d 30 0a 20 20 20 20 20  LIMIT))!=0.     
251f0 20 20 20 20 20 20 20 20 7c 7c 20 28 77 63 74 72          || (wctr
25200 6c 46 6c 61 67 73 26 28 57 48 45 52 45 5f 4f 52  lFlags&(WHERE_OR
25210 44 45 52 42 59 5f 4d 49 4e 7c 57 48 45 52 45 5f  DERBY_MIN|WHERE_
25220 4f 52 44 45 52 42 59 5f 4d 41 58 29 29 3b 0a 0a  ORDERBY_MAX));..
25230 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
25240 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
25250 73 22 2c 20 69 73 53 65 61 72 63 68 3f 22 53 45  s", isSearch?"SE
25260 41 52 43 48 22 3a 22 53 43 41 4e 22 29 3b 0a 20  ARCH":"SCAN");. 
25270 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
25280 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a  elect ){.      z
25290 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
252a0 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
252b0 22 25 73 20 53 55 42 51 55 45 52 59 20 25 64 22  "%s SUBQUERY %d"
252c0 2c 20 7a 4d 73 67 2c 70 49 74 65 6d 2d 3e 69 53  , zMsg,pItem->iS
252d0 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 7d 65  electId);.    }e
252e0 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20  lse{.      zMsg 
252f0 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
25300 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
25310 54 41 42 4c 45 20 25 73 22 2c 20 7a 4d 73 67 2c  TABLE %s", zMsg,
25320 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pItem->zName);.
25330 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
25340 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a  Item->zAlias ){.
25350 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
25360 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
25370 20 7a 4d 73 67 2c 20 22 25 73 20 41 53 20 25 73   zMsg, "%s AS %s
25380 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e  ", zMsg, pItem->
25390 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 7d 0a 20  zAlias);.    }. 
253a0 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20     if( (flags & 
253b0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
253c0 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  0 ){.      char 
253d0 2a 7a 57 68 65 72 65 20 3d 20 65 78 70 6c 61 69  *zWhere = explai
253e0 6e 49 6e 64 65 78 52 61 6e 67 65 28 64 62 2c 20  nIndexRange(db, 
253f0 70 4c 65 76 65 6c 2c 20 70 49 74 65 6d 2d 3e 70  pLevel, pItem->p
25400 54 61 62 29 3b 0a 20 20 20 20 20 20 7a 4d 73 67  Tab);.      zMsg
25410 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
25420 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
25430 20 55 53 49 4e 47 20 25 73 25 73 49 4e 44 45 58   USING %s%sINDEX
25440 25 73 25 73 25 73 22 2c 20 7a 4d 73 67 2c 20 0a  %s%s%s", zMsg, .
25450 20 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67            ((flag
25460 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49  s & WHERE_TEMP_I
25470 4e 44 45 58 29 3f 22 41 55 54 4f 4d 41 54 49 43  NDEX)?"AUTOMATIC
25480 20 22 3a 22 22 29 2c 0a 20 20 20 20 20 20 20 20   ":""),.        
25490 20 20 28 28 66 6c 61 67 73 20 26 20 57 48 45 52    ((flags & WHER
254a0 45 5f 49 44 58 5f 4f 4e 4c 59 29 3f 22 43 4f 56  E_IDX_ONLY)?"COV
254b0 45 52 49 4e 47 20 22 3a 22 22 29 2c 0a 20 20 20  ERING ":""),.   
254c0 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 20 26         ((flags &
254d0 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45   WHERE_TEMP_INDE
254e0 58 29 3f 22 22 3a 22 20 22 29 2c 0a 20 20 20 20  X)?"":" "),.    
254f0 20 20 20 20 20 20 28 28 66 6c 61 67 73 20 26 20        ((flags & 
25500 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58  WHERE_TEMP_INDEX
25510 29 3f 22 22 3a 20 70 4c 65 76 65 6c 2d 3e 70 6c  )?"": pLevel->pl
25520 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65  an.u.pIdx->zName
25530 29 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 57 68  ),.          zWh
25540 65 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ere.      );.   
25550 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
25560 28 64 62 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20  (db, zWhere);.  
25570 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
25580 73 20 26 20 28 57 48 45 52 45 5f 52 4f 57 49 44  s & (WHERE_ROWID
25590 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f  _EQ|WHERE_ROWID_
255a0 52 41 4e 47 45 29 20 29 7b 0a 20 20 20 20 20 20  RANGE) ){.      
255b0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
255c0 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
255d0 20 22 25 73 20 55 53 49 4e 47 20 49 4e 54 45 47   "%s USING INTEG
255e0 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 2c  ER PRIMARY KEY",
255f0 20 7a 4d 73 67 29 3b 0a 0a 20 20 20 20 20 20 69   zMsg);..      i
25600 66 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f 52  f( flags&WHERE_R
25610 4f 57 49 44 5f 45 51 20 29 7b 0a 20 20 20 20 20  OWID_EQ ){.     
25620 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
25630 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
25640 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3d 3f  sg, "%s (rowid=?
25650 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20  )", zMsg);.     
25660 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67   }else if( (flag
25670 73 26 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d  s&WHERE_BOTH_LIM
25680 49 54 29 3d 3d 57 48 45 52 45 5f 42 4f 54 48 5f  IT)==WHERE_BOTH_
25690 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20  LIMIT ){.       
256a0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
256b0 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
256c0 2c 20 22 25 73 20 28 72 6f 77 69 64 3e 3f 20 41  , "%s (rowid>? A
256d0 4e 44 20 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d  ND rowid<?)", zM
256e0 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  sg);.      }else
256f0 20 69 66 28 20 66 6c 61 67 73 26 57 48 45 52 45   if( flags&WHERE
25700 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
25710 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
25720 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
25730 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69   zMsg, "%s (rowi
25740 64 3e 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20  d>?)", zMsg);.  
25750 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c      }else if( fl
25760 61 67 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49  ags&WHERE_TOP_LI
25770 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  MIT ){.        z
25780 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
25790 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
257a0 22 25 73 20 28 72 6f 77 69 64 3c 3f 29 22 2c 20  "%s (rowid<?)", 
257b0 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  zMsg);.      }. 
257c0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
257d0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
257e0 54 41 42 4c 45 0a 20 20 20 20 65 6c 73 65 20 69  TABLE.    else i
257f0 66 28 20 28 66 6c 61 67 73 20 26 20 57 48 45 52  f( (flags & WHER
25800 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
25810 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
25820 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
25830 70 56 74 61 62 49 64 78 20 3d 20 70 4c 65 76 65  pVtabIdx = pLeve
25840 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62 49  l->plan.u.pVtabI
25850 64 78 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d  dx;.      zMsg =
25860 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
25870 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 56  (db, zMsg, "%s V
25880 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44  IRTUAL TABLE IND
25890 45 58 20 25 64 3a 25 73 22 2c 20 7a 4d 73 67 2c  EX %d:%s", zMsg,
258a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
258b0 20 20 20 70 56 74 61 62 49 64 78 2d 3e 69 64 78     pVtabIdx->idx
258c0 4e 75 6d 2c 20 70 56 74 61 62 49 64 78 2d 3e 69  Num, pVtabIdx->i
258d0 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 23 65  dxStr);.    }.#e
258e0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 77 63 74  ndif.    if( wct
258f0 72 6c 46 6c 61 67 73 26 28 57 48 45 52 45 5f 4f  rlFlags&(WHERE_O
25900 52 44 45 52 42 59 5f 4d 49 4e 7c 57 48 45 52 45  RDERBY_MIN|WHERE
25910 5f 4f 52 44 45 52 42 59 5f 4d 41 58 29 20 29 7b  _ORDERBY_MAX) ){
25920 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
25930 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
25940 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20  ERE_ORDERBY_MIN 
25950 29 3b 0a 20 20 20 20 20 20 6e 52 6f 77 20 3d 20  );.      nRow = 
25960 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
25970 20 20 20 20 6e 52 6f 77 20 3d 20 28 73 71 6c 69      nRow = (sqli
25980 74 65 33 5f 69 6e 74 36 34 29 70 4c 65 76 65 6c  te3_int64)pLevel
25990 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20  ->plan.nRow;.   
259a0 20 7d 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71   }.    zMsg = sq
259b0 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
259c0 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 7e 25 6c  , zMsg, "%s (~%l
259d0 6c 64 20 72 6f 77 73 29 22 2c 20 7a 4d 73 67 2c  ld rows)", zMsg,
259e0 20 6e 52 6f 77 29 3b 0a 20 20 20 20 73 71 6c 69   nRow);.    sqli
259f0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
25a00 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69 49 64   OP_Explain, iId
25a10 2c 20 69 4c 65 76 65 6c 2c 20 69 46 72 6f 6d 2c  , iLevel, iFrom,
25a20 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
25a30 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  C);.  }.}.#else.
25a40 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
25a50 4f 6e 65 53 63 61 6e 28 75 2c 76 2c 77 2c 78 2c  OneScan(u,v,w,x,
25a60 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  y,z).#endif /* S
25a70 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
25a80 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  IN */.../*.** Ge
25a90 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
25aa0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
25ab0 20 69 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20   iLevel-th loop 
25ac0 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
25ad0 75 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  use.** implement
25ae0 61 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ation described 
25af0 62 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74  by pWInfo..*/.st
25b00 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 64  atic Bitmask cod
25b10 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20  eOneLoopStart(. 
25b20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
25b30 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74  fo,   /* Complet
25b40 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  e information ab
25b50 6f 75 74 20 74 68 65 20 57 48 45 52 45 20 63 6c  out the WHERE cl
25b60 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ause */.  int iL
25b70 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  evel,          /
25b80 2a 20 57 68 69 63 68 20 6c 65 76 65 6c 20 6f 66  * Which level of
25b90 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f   pWInfo->a[] sho
25ba0 75 6c 64 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a  uld be coded */.
25bb0 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
25bc0 2c 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66  ,      /* One of
25bd0 20 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61   the WHERE_* fla
25be0 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71  gs defined in sq
25bf0 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 42  liteInt.h */.  B
25c00 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20  itmask notReady 
25c10 20 20 20 20 2f 2a 20 57 68 69 63 68 20 74 61 62      /* Which tab
25c20 6c 65 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c  les are currentl
25c30 79 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 29  y available */.)
25c40 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20  {.  int j, k;   
25c50 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
25c60 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
25c70 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
25c80 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
25c90 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74  cursor for the t
25ca0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  able */.  int ad
25cb0 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20 20 2f  drNxt;         /
25cc0 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20  * Where to jump 
25cd0 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
25ce0 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61 73   the next IN cas
25cf0 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 54  e */.  int omitT
25d00 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 54  able;       /* T
25d10 72 75 65 20 69 66 20 77 65 20 75 73 65 20 74 68  rue if we use th
25d20 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a  e index only */.
25d30 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20    int bRev;     
25d40 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
25d50 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63 61  f we need to sca
25d60 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  n in reverse ord
25d70 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  er */.  WhereLev
25d80 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a 20  el *pLevel;  /* 
25d90 54 68 65 20 77 68 65 72 65 20 6c 65 76 65 6c 20  The where level 
25da0 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
25db0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
25dc0 43 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f  C;    /* Decompo
25dd0 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e  sition of the en
25de0 74 69 72 65 20 57 48 45 52 45 20 63 6c 61 75 73  tire WHERE claus
25df0 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
25e00 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
25e10 20 20 20 20 20 20 20 2f 2a 20 41 20 57 48 45 52         /* A WHER
25e20 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f  E clause term */
25e30 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
25e40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25e50 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
25e60 6e 74 65 78 74 20 2a 2f 0a 20 20 56 64 62 65 20  ntext */.  Vdbe 
25e70 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
25e80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
25e90 65 20 70 72 65 70 61 72 65 64 20 73 74 6d 74 20  e prepared stmt 
25ea0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
25eb0 6f 6e 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ons */.  struct 
25ec0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
25ed0 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d  abItem;  /* FROM
25ee0 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69   clause term bei
25ef0 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  ng coded */.  in
25f00 74 20 61 64 64 72 42 72 6b 3b 20 20 20 20 20 20  t addrBrk;      
25f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25f20 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72   Jump here to br
25f30 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  eak out of the l
25f40 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  oop */.  int add
25f50 72 43 6f 6e 74 3b 20 20 20 20 20 20 20 20 20 20  rCont;          
25f60 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
25f70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75   here to continu
25f80 65 20 77 69 74 68 20 6e 65 78 74 20 63 79 63 6c  e with next cycl
25f90 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69  e */.  int iRowi
25fa0 64 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20  dReg = 0;       
25fb0 20 2f 2a 20 52 6f 77 69 64 20 69 73 20 73 74 6f   /* Rowid is sto
25fc0 72 65 64 20 69 6e 20 74 68 69 73 20 72 65 67 69  red in this regi
25fd0 73 74 65 72 2c 20 69 66 20 6e 6f 74 20 7a 65 72  ster, if not zer
25fe0 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 6c 65  o */.  int iRele
25ff0 61 73 65 52 65 67 20 3d 20 30 3b 20 20 20 20 20  aseReg = 0;     
26000 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65   /* Temp registe
26010 72 20 74 6f 20 66 72 65 65 20 62 65 66 6f 72 65  r to free before
26020 20 72 65 74 75 72 6e 69 6e 67 20 2a 2f 0a 0a 20   returning */.. 
26030 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f   pParse = pWInfo
26040 2d 3e 70 50 61 72 73 65 3b 0a 20 20 76 20 3d 20  ->pParse;.  v = 
26050 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
26060 20 70 57 43 20 3d 20 70 57 49 6e 66 6f 2d 3e 70   pWC = pWInfo->p
26070 57 43 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26  WC;.  pLevel = &
26080 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c  pWInfo->a[iLevel
26090 5d 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20  ];.  pTabItem = 
260a0 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  &pWInfo->pTabLis
260b0 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
260c0 6f 6d 5d 3b 0a 20 20 69 43 75 72 20 3d 20 70 54  om];.  iCur = pT
260d0 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  abItem->iCursor;
260e0 0a 20 20 62 52 65 76 20 3d 20 28 70 4c 65 76 65  .  bRev = (pLeve
260f0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
26100 26 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 29  & WHERE_REVERSE)
26110 21 3d 30 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65  !=0;.  omitTable
26120 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e   = (pLevel->plan
26130 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
26140 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20  _IDX_ONLY)!=0 . 
26150 20 20 20 20 20 20 20 20 20 20 26 26 20 28 77 63            && (wc
26160 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
26170 5f 46 4f 52 43 45 5f 54 41 42 4c 45 29 3d 3d 30  _FORCE_TABLE)==0
26180 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 6c  ;..  /* Create l
26190 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20 22 62  abels for the "b
261a0 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69  reak" and "conti
261b0 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69 6f 6e  nue" instruction
261c0 73 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63  s.  ** for the c
261d0 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75  urrent loop.  Ju
261e0 6d 70 20 74 6f 20 61 64 64 72 42 72 6b 20 74 6f  mp to addrBrk to
261f0 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 61 20   break out of a 
26200 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20  loop..  ** Jump 
26210 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d  to cont to go im
26220 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74 68 65  mediately to the
26230 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
26240 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70  of the.  ** loop
26250 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
26260 20 74 68 65 72 65 20 69 73 20 61 6e 20 49 4e 20   there is an IN 
26270 6f 70 65 72 61 74 6f 72 2c 20 77 65 20 61 6c 73  operator, we als
26280 6f 20 68 61 76 65 20 61 20 22 61 64 64 72 4e 78  o have a "addrNx
26290 74 22 20 6c 61 62 65 6c 20 74 68 61 74 0a 20 20  t" label that.  
262a0 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74  ** means to cont
262b0 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65  inue with the ne
262c0 78 74 20 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62  xt IN value comb
262d0 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20  ination.  When. 
262e0 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f   ** there are no
262f0 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 69 6e   IN operators in
26300 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73   the constraints
26310 2c 20 74 68 65 20 22 61 64 64 72 4e 78 74 22 20  , the "addrNxt" 
26320 6c 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20 74 68  label.  ** is th
26330 65 20 73 61 6d 65 20 61 73 20 22 61 64 64 72 42  e same as "addrB
26340 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72  rk"..  */.  addr
26350 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  Brk = pLevel->ad
26360 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e  drBrk = pLevel->
26370 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65  addrNxt = sqlite
26380 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
26390 29 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20  );.  addrCont = 
263a0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74  pLevel->addrCont
263b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
263c0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f  keLabel(v);..  /
263d0 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
263e0 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20   right table of 
263f0 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
26400 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a  N, allocate and.
26410 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20    ** initialize 
26420 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68  a memory cell th
26430 61 74 20 72 65 63 6f 72 64 73 20 69 66 20 74 68  at records if th
26440 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68 65 73  is table matches
26450 20 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66   any.  ** row of
26460 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20   the left table 
26470 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a  of the join..  *
26480 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  /.  if( pLevel->
26490 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 54 61 62  iFrom>0 && (pTab
264a0 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65  Item[0].jointype
264b0 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29   & JT_LEFT)!=0 )
264c0 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c  {.    pLevel->iL
264d0 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72  eftJoin = ++pPar
264e0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71  se->nMem;.    sq
264f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
26500 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
26510 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  , pLevel->iLeftJ
26520 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  oin);.    VdbeCo
26530 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69 74 20  mment((v, "init 
26540 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74  LEFT JOIN no-mat
26550 63 68 20 66 6c 61 67 22 29 29 3b 0a 20 20 7d 0a  ch flag"));.  }.
26560 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
26570 73 65 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61  se of a FROM cla
26580 75 73 65 20 73 75 62 71 75 65 72 79 20 69 6d 70  use subquery imp
26590 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f  lemented as a co
265a0 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 66  -routine */.  if
265b0 28 20 70 54 61 62 49 74 65 6d 2d 3e 76 69 61 43  ( pTabItem->viaC
265c0 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
265d0 69 6e 74 20 72 65 67 59 69 65 6c 64 20 3d 20 70  int regYield = p
265e0 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  TabItem->regRetu
265f0 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  rn;.    sqlite3V
26600 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
26610 49 6e 74 65 67 65 72 2c 20 70 54 61 62 49 74 65  Integer, pTabIte
26620 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 2d 31  m->addrFillSub-1
26630 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20  , regYield);.   
26640 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 20 73   pLevel->p2 =  s
26650 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
26660 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
26670 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 56 64 62  gYield);.    Vdb
26680 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65  eComment((v, "ne
26690 78 74 20 72 6f 77 20 6f 66 20 63 6f 2d 72 6f 75  xt row of co-rou
266a0 74 69 6e 65 20 25 73 22 2c 20 70 54 61 62 49 74  tine %s", pTabIt
266b0 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
266c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
266d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
266e0 66 2c 20 72 65 67 59 69 65 6c 64 2b 31 2c 20 61  f, regYield+1, a
266f0 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 70 4c 65  ddrBrk);.    pLe
26700 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 47 6f 74  vel->op = OP_Got
26710 6f 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e  o;.  }else..#ifn
26720 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
26730 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
26740 66 28 20 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  f(  (pLevel->pla
26750 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
26760 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
26770 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  =0 ){.    /* Cas
26780 65 20 30 3a 20 20 54 68 65 20 74 61 62 6c 65 20  e 0:  The table 
26790 69 73 20 61 20 76 69 72 74 75 61 6c 2d 74 61 62  is a virtual-tab
267a0 6c 65 2e 20 20 55 73 65 20 74 68 65 20 56 46 69  le.  Use the VFi
267b0 6c 74 65 72 20 61 6e 64 20 56 4e 65 78 74 0a 20  lter and VNext. 
267c0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 74     **          t
267d0 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
267e0 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  a..    */.    in
267f0 74 20 69 52 65 67 3b 20 20 20 2f 2a 20 50 33 20  t iReg;   /* P3 
26800 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46 69  Value for OP_VFi
26810 6c 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  lter */.    int 
26820 61 64 64 72 4e 6f 74 46 6f 75 6e 64 3b 0a 20 20  addrNotFound;.  
26830 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
26840 69 6e 66 6f 20 2a 70 56 74 61 62 49 64 78 20 3d  info *pVtabIdx =
26850 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e   pLevel->plan.u.
26860 70 56 74 61 62 49 64 78 3b 0a 20 20 20 20 69 6e  pVtabIdx;.    in
26870 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  t nConstraint = 
26880 70 56 74 61 62 49 64 78 2d 3e 6e 43 6f 6e 73 74  pVtabIdx->nConst
26890 72 61 69 6e 74 3b 0a 20 20 20 20 73 74 72 75 63  raint;.    struc
268a0 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
268b0 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
268c0 20 2a 61 55 73 61 67 65 20 3d 0a 20 20 20 20 20   *aUsage =.     
268d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268f0 20 20 20 20 20 20 20 20 20 20 20 70 56 74 61 62             pVtab
26900 49 64 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  Idx->aConstraint
26910 55 73 61 67 65 3b 0a 20 20 20 20 63 6f 6e 73 74  Usage;.    const
26920 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
26930 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
26940 20 2a 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 0a   *aConstraint =.
26950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26980 70 56 74 61 62 49 64 78 2d 3e 61 43 6f 6e 73 74  pVtabIdx->aConst
26990 72 61 69 6e 74 3b 0a 0a 20 20 20 20 73 71 6c 69  raint;..    sqli
269a0 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
269b0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 52  (pParse);.    iR
269c0 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  eg = sqlite3GetT
269d0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
269e0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b   nConstraint+2);
269f0 0a 20 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e  .    addrNotFoun
26a00 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  d = pLevel->addr
26a10 42 72 6b 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31  Brk;.    for(j=1
26a20 3b 20 6a 3c 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  ; j<=nConstraint
26a30 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f  ; j++){.      fo
26a40 72 28 6b 3d 30 3b 20 6b 3c 6e 43 6f 6e 73 74 72  r(k=0; k<nConstr
26a50 61 69 6e 74 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  aint; k++){.    
26a60 20 20 20 20 69 66 28 20 61 55 73 61 67 65 5b 6b      if( aUsage[k
26a70 5d 2e 61 72 67 76 49 6e 64 65 78 3d 3d 6a 20 29  ].argvIndex==j )
26a80 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
26a90 69 54 61 72 67 65 74 20 3d 20 69 52 65 67 2b 6a  iTarget = iReg+j
26aa0 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54  +1;.          pT
26ab0 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 61 43  erm = &pWC->a[aC
26ac0 6f 6e 73 74 72 61 69 6e 74 5b 6b 5d 2e 69 54 65  onstraint[k].iTe
26ad0 72 6d 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 20  rmOffset];.     
26ae0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
26af0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
26b00 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N ){.           
26b10 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
26b20 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  m(pParse, pTerm,
26b30 20 70 4c 65 76 65 6c 2c 20 69 54 61 72 67 65 74   pLevel, iTarget
26b40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  );.            a
26b50 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c  ddrNotFound = pL
26b60 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20  evel->addrNxt;. 
26b70 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
26b80 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
26b90 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
26ba0 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se, pTerm->pExpr
26bb0 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 72 67 65  ->pRight, iTarge
26bc0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  t);.          }.
26bd0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
26be0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
26bf0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d   }.      if( k==
26c00 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 20 62 72  nConstraint ) br
26c10 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  eak;.    }.    s
26c20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
26c30 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
26c40 70 56 74 61 62 49 64 78 2d 3e 69 64 78 4e 75 6d  pVtabIdx->idxNum
26c50 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 73 71 6c  , iReg);.    sql
26c60 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
26c70 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6a 2d  , OP_Integer, j-
26c80 31 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20  1, iReg+1);.    
26c90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
26ca0 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c  4(v, OP_VFilter,
26cb0 20 69 43 75 72 2c 20 61 64 64 72 4e 6f 74 46 6f   iCur, addrNotFo
26cc0 75 6e 64 2c 20 69 52 65 67 2c 20 70 56 74 61 62  und, iReg, pVtab
26cd0 49 64 78 2d 3e 69 64 78 53 74 72 2c 0a 20 20 20  Idx->idxStr,.   
26ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cf0 20 20 20 70 56 74 61 62 49 64 78 2d 3e 6e 65 65     pVtabIdx->nee
26d00 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3f 20  dToFreeIdxStr ? 
26d10 50 34 5f 4d 50 52 49 4e 54 46 20 3a 20 50 34 5f  P4_MPRINTF : P4_
26d20 53 54 41 54 49 43 29 3b 0a 20 20 20 20 70 56 74  STATIC);.    pVt
26d30 61 62 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65  abIdx->needToFre
26d40 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20  eIdxStr = 0;.   
26d50 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e   for(j=0; j<nCon
26d60 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20  straint; j++){. 
26d70 20 20 20 20 20 69 66 28 20 61 55 73 61 67 65 5b       if( aUsage[
26d80 6a 5d 2e 6f 6d 69 74 20 29 7b 0a 20 20 20 20 20  j].omit ){.     
26d90 20 20 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 61     int iTerm = a
26da0 43 6f 6e 73 74 72 61 69 6e 74 5b 6a 5d 2e 69 54  Constraint[j].iT
26db0 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ermOffset;.     
26dc0 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
26dd0 4c 65 76 65 6c 2c 20 26 70 57 43 2d 3e 61 5b 69  Level, &pWC->a[i
26de0 54 65 72 6d 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  Term]);.      }.
26df0 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c      }.    pLevel
26e00 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b  ->op = OP_VNext;
26e10 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20  .    pLevel->p1 
26e20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76  = iCur;.    pLev
26e30 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33  el->p2 = sqlite3
26e40 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
26e50 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  v);.    sqlite3R
26e60 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
26e70 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 43  pParse, iReg, nC
26e80 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20  onstraint+2);.  
26e90 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
26ea0 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
26eb0 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
26ec0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
26ed0 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
26ee0 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70  .  if( pLevel->p
26ef0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
26f00 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 7b 0a  ERE_ROWID_EQ ){.
26f10 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20      /* Case 1:  
26f20 57 65 20 63 61 6e 20 64 69 72 65 63 74 6c 79 20  We can directly 
26f30 72 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e 67  reference a sing
26f40 6c 65 20 72 6f 77 20 75 73 69 6e 67 20 61 6e 0a  le row using an.
26f50 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
26f60 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69  equality compari
26f70 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20  son against the 
26f80 52 4f 57 49 44 20 66 69 65 6c 64 2e 20 20 4f 72  ROWID field.  Or
26f90 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
26fa0 20 77 65 20 72 65 66 65 72 65 6e 63 65 20 6d 75   we reference mu
26fb0 6c 74 69 70 6c 65 20 72 6f 77 73 20 75 73 69 6e  ltiple rows usin
26fc0 67 20 61 20 22 72 6f 77 69 64 20 49 4e 20 28 2e  g a "rowid IN (.
26fd0 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 20 20 20 20  ..)".    **     
26fe0 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a       construct..
26ff0 20 20 20 20 2a 2f 0a 20 20 20 20 69 52 65 6c 65      */.    iRele
27000 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33  aseReg = sqlite3
27010 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
27020 65 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  e);.    pTerm = 
27030 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
27040 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79  ur, -1, notReady
27050 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30  , WO_EQ|WO_IN, 0
27060 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
27070 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61  Term!=0 );.    a
27080 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45  ssert( pTerm->pE
27090 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  xpr!=0 );.    as
270a0 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d  sert( omitTable=
270b0 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =0 );.    testca
270c0 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  se( pTerm->wtFla
270d0 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
270e0 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30  L ); /* EV: R-30
270f0 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20  575-11662 */.   
27100 20 69 52 6f 77 69 64 52 65 67 20 3d 20 63 6f 64   iRowidReg = cod
27110 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50  eEqualityTerm(pP
27120 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65  arse, pTerm, pLe
27130 76 65 6c 2c 20 69 52 65 6c 65 61 73 65 52 65 67  vel, iReleaseReg
27140 29 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d  );.    addrNxt =
27150 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
27160 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
27170 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75  eAddOp2(v, OP_Mu
27180 73 74 42 65 49 6e 74 2c 20 69 52 6f 77 69 64 52  stBeInt, iRowidR
27190 65 67 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20  eg, addrNxt);.  
271a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
271b0 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69  Op3(v, OP_NotExi
271c0 73 74 73 2c 20 69 43 75 72 2c 20 61 64 64 72 4e  sts, iCur, addrN
271d0 78 74 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  xt, iRowidReg);.
271e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
271f0 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65  acheStore(pParse
27200 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77  , iCur, -1, iRow
27210 69 64 52 65 67 29 3b 0a 20 20 20 20 56 64 62 65  idReg);.    Vdbe
27220 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22  Comment((v, "pk"
27230 29 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ));.    pLevel->
27240 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  op = OP_Noop;.  
27250 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c  }else if( pLevel
27260 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
27270 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e   WHERE_ROWID_RAN
27280 47 45 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  GE ){.    /* Cas
27290 65 20 32 3a 20 20 57 65 20 68 61 76 65 20 61 6e  e 2:  We have an
272a0 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d 70   inequality comp
272b0 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74  arison against t
272c0 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a  he ROWID field..
272d0 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74      */.    int t
272e0 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  estOp = OP_Noop;
272f0 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a  .    int start;.
27300 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e 64 56 61      int memEndVa
27310 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 57 68 65  lue = 0;.    Whe
27320 72 65 54 65 72 6d 20 2a 70 53 74 61 72 74 2c 20  reTerm *pStart, 
27330 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 61 73 73 65  *pEnd;..    asse
27340 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30  rt( omitTable==0
27350 20 29 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d   );.    pStart =
27360 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
27370 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64  Cur, -1, notRead
27380 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20  y, WO_GT|WO_GE, 
27390 30 29 3b 0a 20 20 20 20 70 45 6e 64 20 3d 20 66  0);.    pEnd = f
273a0 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
273b0 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c  r, -1, notReady,
273c0 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29   WO_LT|WO_LE, 0)
273d0 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 20 29  ;.    if( bRev )
273e0 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  {.      pTerm = 
273f0 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20 70 53  pStart;.      pS
27400 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20  tart = pEnd;.   
27410 20 20 20 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b     pEnd = pTerm;
27420 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
27430 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45  Start ){.      E
27440 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20  xpr *pX;        
27450 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
27460 65 73 73 69 6f 6e 20 74 68 61 74 20 64 65 66 69  ession that defi
27470 6e 65 73 20 74 68 65 20 73 74 61 72 74 20 62 6f  nes the start bo
27480 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  und */.      int
27490 20 72 31 2c 20 72 54 65 6d 70 3b 20 20 20 20 20   r1, rTemp;     
274a0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20     /* Registers 
274b0 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  for holding the 
274c0 73 74 61 72 74 20 62 6f 75 6e 64 61 72 79 20 2a  start boundary *
274d0 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  /..      /* The 
274e0 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61  following consta
274f0 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78 20 63 6f  nt maps TK_xx co
27500 64 65 73 20 69 6e 74 6f 20 63 6f 72 72 65 73 70  des into corresp
27510 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a  onding .      **
27520 20 73 65 65 6b 20 6f 70 63 6f 64 65 73 2e 20 20   seek opcodes.  
27530 49 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 61 20  It depends on a 
27540 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72  particular order
27550 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a 20 20 20  ing of TK_xx.   
27560 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73     */.      cons
27570 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d  t u8 aMoveOp[] =
27580 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a   {.           /*
27590 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f 53 65   TK_GT */  OP_Se
275a0 65 6b 47 74 2c 0a 20 20 20 20 20 20 20 20 20 20  ekGt,.          
275b0 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50   /* TK_LE */  OP
275c0 5f 53 65 65 6b 4c 65 2c 0a 20 20 20 20 20 20 20  _SeekLe,.       
275d0 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20      /* TK_LT */ 
275e0 20 4f 50 5f 53 65 65 6b 4c 74 2c 0a 20 20 20 20   OP_SeekLt,.    
275f0 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 45 20         /* TK_GE 
27600 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 65 0a 20 20  */  OP_SeekGe.  
27610 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 61 73 73      };.      ass
27620 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47  ert( TK_LE==TK_G
27630 54 2b 31 20 29 3b 20 20 20 20 20 20 2f 2a 20 4d  T+1 );      /* M
27640 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72 64  ake sure the ord
27650 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20 20  ering.. */.     
27660 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d   assert( TK_LT==
27670 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20 20 20 20  TK_GT+2 );      
27680 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68 65 20 54  /*  ... of the T
27690 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e 2e 20 2a  K_xx values... *
276a0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
276b0 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33 20 29  TK_GE==TK_GT+3 )
276c0 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 69  ;      /*  ... i
276d0 73 20 63 6f 72 72 65 63 63 74 2e 20 2a 2f 0a 0a  s correcct. */..
276e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
276f0 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  pStart->wtFlags 
27700 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
27710 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35  ; /* EV: R-30575
27720 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 20 20  -11662 */.      
27730 70 58 20 3d 20 70 53 74 61 72 74 2d 3e 70 45 78  pX = pStart->pEx
27740 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
27750 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( pX!=0 );.     
27760 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74 2d   assert( pStart-
27770 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
27780 72 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  r );.      r1 = 
27790 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
277a0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  emp(pParse, pX->
277b0 70 52 69 67 68 74 2c 20 26 72 54 65 6d 70 29 3b  pRight, &rTemp);
277c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
277d0 62 65 41 64 64 4f 70 33 28 76 2c 20 61 4d 6f 76  beAddOp3(v, aMov
277e0 65 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54  eOp[pX->op-TK_GT
277f0 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b  ], iCur, addrBrk
27800 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
27810 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b  eComment((v, "pk
27820 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
27830 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
27840 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
27850 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  , r1, 1);.      
27860 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
27870 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 54  mpReg(pParse, rT
27880 65 6d 70 29 3b 0a 20 20 20 20 20 20 64 69 73 61  emp);.      disa
27890 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
278a0 70 53 74 61 72 74 29 3b 0a 20 20 20 20 7d 65 6c  pStart);.    }el
278b0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
278c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62  3VdbeAddOp2(v, b
278d0 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20  Rev ? OP_Last : 
278e0 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c  OP_Rewind, iCur,
278f0 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 7d   addrBrk);.    }
27900 0a 20 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b  .    if( pEnd ){
27910 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b  .      Expr *pX;
27920 0a 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64  .      pX = pEnd
27930 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ->pExpr;.      a
27940 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a  ssert( pX!=0 );.
27950 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
27960 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  nd->leftCursor==
27970 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20 74 65  iCur );.      te
27980 73 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 77 74  stcase( pEnd->wt
27990 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
279a0 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52  TUAL ); /* EV: R
279b0 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a  -30575-11662 */.
279c0 20 20 20 20 20 20 6d 65 6d 45 6e 64 56 61 6c 75        memEndValu
279d0 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  e = ++pParse->nM
279e0 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
279f0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
27a00 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 6d 65  , pX->pRight, me
27a10 6d 45 6e 64 56 61 6c 75 65 29 3b 0a 20 20 20 20  mEndValue);.    
27a20 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b    if( pX->op==TK
27a30 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54  _LT || pX->op==T
27a40 4b 5f 47 54 20 29 7b 0a 20 20 20 20 20 20 20 20  K_GT ){.        
27a50 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20  testOp = bRev ? 
27a60 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20  OP_Le : OP_Ge;. 
27a70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27a80 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65      testOp = bRe
27a90 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47  v ? OP_Lt : OP_G
27aa0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
27ab0 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
27ac0 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20  vel, pEnd);.    
27ad0 7d 0a 20 20 20 20 73 74 61 72 74 20 3d 20 73 71  }.    start = sq
27ae0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
27af0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 70 4c 65  Addr(v);.    pLe
27b00 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f  vel->op = bRev ?
27b10 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65   OP_Prev : OP_Ne
27b20 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  xt;.    pLevel->
27b30 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70  p1 = iCur;.    p
27b40 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72  Level->p2 = star
27b50 74 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61 72  t;.    if( pStar
27b60 74 3d 3d 30 20 26 26 20 70 45 6e 64 3d 3d 30 20  t==0 && pEnd==0 
27b70 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  ){.      pLevel-
27b80 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d  >p5 = SQLITE_STM
27b90 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e  TSTATUS_FULLSCAN
27ba0 5f 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73 65  _STEP;.    }else
27bb0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
27bc0 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b  pLevel->p5==0 );
27bd0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74  .    }.    if( t
27be0 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  estOp!=OP_Noop )
27bf0 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65  {.      iRowidRe
27c00 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20  g = iReleaseReg 
27c10 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
27c20 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
27c30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
27c40 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
27c50 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65  , iCur, iRowidRe
27c60 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
27c70 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28  3ExprCacheStore(
27c80 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31  pParse, iCur, -1
27c90 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
27ca0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
27cb0 64 64 4f 70 33 28 76 2c 20 74 65 73 74 4f 70 2c  ddOp3(v, testOp,
27cc0 20 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20 61 64   memEndValue, ad
27cd0 64 72 42 72 6b 2c 20 69 52 6f 77 69 64 52 65 67  drBrk, iRowidReg
27ce0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27cf0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
27d00 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
27d10 49 43 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  IC | SQLITE_JUMP
27d20 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20  IFNULL);.    }. 
27d30 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65   }else if( pLeve
27d40 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
27d50 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  & (WHERE_COLUMN_
27d60 52 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55  RANGE|WHERE_COLU
27d70 4d 4e 5f 45 51 29 20 29 7b 0a 20 20 20 20 2f 2a  MN_EQ) ){.    /*
27d80 20 43 61 73 65 20 33 3a 20 41 20 73 63 61 6e 20   Case 3: A scan 
27d90 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2e 0a  using an index..
27da0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
27db0 20 20 20 20 20 20 54 68 65 20 57 48 45 52 45 20        The WHERE 
27dc0 63 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e 74 61  clause may conta
27dd0 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  in zero or more 
27de0 65 71 75 61 6c 69 74 79 20 0a 20 20 20 20 2a 2a  equality .    **
27df0 20 20 20 20 20 20 20 20 20 74 65 72 6d 73 20 28           terms (
27e00 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70 65  "==" or "IN" ope
27e10 72 61 74 6f 72 73 29 20 74 68 61 74 20 72 65 66  rators) that ref
27e20 65 72 20 74 6f 20 74 68 65 20 4e 0a 20 20 20 20  er to the N.    
27e30 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 66 74 2d  **         left-
27e40 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  most columns of 
27e50 74 68 65 20 69 6e 64 65 78 2e 20 49 74 20 6d 61  the index. It ma
27e60 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a 20  y also contain. 
27e70 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e     **         in
27e80 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
27e90 69 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f  ints (>, <, >= o
27ea0 72 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69 6e 64  r <=) on the ind
27eb0 65 78 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20  exed.    **     
27ec0 20 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20      column that 
27ed0 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
27ee0 6f 77 73 20 74 68 65 20 4e 20 65 71 75 61 6c 69  ows the N equali
27ef0 74 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20 20 20  ties. Only .    
27f00 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 72  **         the r
27f10 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  ight-most column
27f20 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65 71 75   can be an inequ
27f30 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65 73 74  ality - the rest
27f40 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20 20 20   must.    **    
27f50 20 20 20 20 20 75 73 65 20 74 68 65 20 22 3d 3d       use the "==
27f60 22 20 61 6e 64 20 22 49 4e 22 20 6f 70 65 72 61  " and "IN" opera
27f70 74 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c  tors. For exampl
27f80 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20 2a  e, if the .    *
27f90 2a 20 20 20 20 20 20 20 20 20 69 6e 64 65 78 20  *         index 
27fa0 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20 74  is on (x,y,z), t
27fb0 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  hen the followin
27fc0 67 20 63 6c 61 75 73 65 73 20 61 72 65 20 61 6c  g clauses are al
27fd0 6c 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  l .    **       
27fe0 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20 20 20    optimized:.   
27ff0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
28000 20 20 20 20 20 20 78 3d 35 0a 20 20 20 20 2a 2a        x=5.    **
28010 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
28020 41 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a 2a 20  AND y=10.    ** 
28030 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
28040 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20  ND y<10.    **  
28050 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
28060 44 20 79 3e 35 20 41 4e 44 20 79 3c 31 30 0a 20  D y>5 AND y<10. 
28070 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
28080 20 78 3d 35 20 41 4e 44 20 79 3d 35 20 41 4e 44   x=5 AND y=5 AND
28090 20 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a 20 20   z<=10.    **.  
280a0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65    **         The
280b0 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20 74 68   z<10 term of th
280c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e 6e  e following cann
280d0 6f 74 20 62 65 20 75 73 65 64 2c 20 6f 6e 6c 79  ot be used, only
280e0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
280f0 74 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a 20 20  the x=5 term:.  
28100 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
28110 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 7a         x=5 AND z
28120 3c 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  <10.    **.    *
28130 2a 20 20 20 20 20 20 20 20 20 4e 20 6d 61 79 20  *         N may 
28140 62 65 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65  be zero if there
28150 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20   are inequality 
28160 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20  constraints..   
28170 20 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 74   **         If t
28180 68 65 72 65 20 61 72 65 20 6e 6f 20 69 6e 65 71  here are no ineq
28190 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
281a0 74 73 2c 20 74 68 65 6e 20 4e 20 69 73 20 61 74  ts, then N is at
281b0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
281c0 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20 20 2a  least one..    *
281d0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
281e0 20 54 68 69 73 20 63 61 73 65 20 69 73 20 61 6c   This case is al
281f0 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  so used when the
28200 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20  re are no WHERE 
28210 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 20 20  clause.    **   
28220 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74        constraint
28230 73 20 62 75 74 20 61 6e 20 69 6e 64 65 78 20 69  s but an index i
28240 73 20 73 65 6c 65 63 74 65 64 20 61 6e 79 77 61  s selected anywa
28250 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20 20 20  y, in order.    
28260 2a 2a 20 20 20 20 20 20 20 20 20 74 6f 20 66 6f  **         to fo
28270 72 63 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f  rce the output o
28280 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20  rder to conform 
28290 74 6f 20 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a  to an ORDER BY..
282a0 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 73 74 61      */  .    sta
282b0 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74  tic const u8 aSt
282c0 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20  artOp[] = {.    
282d0 20 20 30 2c 0a 20 20 20 20 20 20 30 2c 0a 20 20    0,.      0,.  
282e0 20 20 20 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20      OP_Rewind,  
282f0 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28           /* 2: (
28300 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  !start_constrain
28310 74 73 20 26 26 20 73 74 61 72 74 45 71 20 26 26  ts && startEq &&
28320 20 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20    !bRev) */.    
28330 20 20 4f 50 5f 4c 61 73 74 2c 20 20 20 20 20 20    OP_Last,      
28340 20 20 20 20 20 20 20 2f 2a 20 33 3a 20 28 21 73         /* 3: (!s
28350 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
28360 20 26 26 20 73 74 61 72 74 45 71 20 26 26 20 20   && startEq &&  
28370 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20   bRev) */.      
28380 4f 50 5f 53 65 65 6b 47 74 2c 20 20 20 20 20 20  OP_SeekGt,      
28390 20 20 20 20 20 2f 2a 20 34 3a 20 28 73 74 61 72       /* 4: (star
283a0 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
283b0 26 20 21 73 74 61 72 74 45 71 20 26 26 20 21 62  & !startEq && !b
283c0 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
283d0 5f 53 65 65 6b 4c 74 2c 20 20 20 20 20 20 20 20  _SeekLt,        
283e0 20 20 20 2f 2a 20 35 3a 20 28 73 74 61 72 74 5f     /* 5: (start_
283f0 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20  constraints  && 
28400 21 73 74 61 72 74 45 71 20 26 26 20 20 62 52 65  !startEq &&  bRe
28410 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53  v) */.      OP_S
28420 65 65 6b 47 65 2c 20 20 20 20 20 20 20 20 20 20  eekGe,          
28430 20 2f 2a 20 36 3a 20 28 73 74 61 72 74 5f 63 6f   /* 6: (start_co
28440 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73  nstraints  &&  s
28450 74 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29  tartEq && !bRev)
28460 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65   */.      OP_See
28470 6b 4c 65 20 20 20 20 20 20 20 20 20 20 20 20 2f  kLe            /
28480 2a 20 37 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73  * 7: (start_cons
28490 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74 61  traints  &&  sta
284a0 72 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a  rtEq &&  bRev) *
284b0 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 73 74 61  /.    };.    sta
284c0 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 45 6e  tic const u8 aEn
284d0 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  dOp[] = {.      
284e0 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20 20 20  OP_Noop,        
284f0 20 20 20 20 20 2f 2a 20 30 3a 20 28 21 65 6e 64       /* 0: (!end
28500 5f 63 6f 6e 73 74 72 61 69 6e 74 73 29 20 2a 2f  _constraints) */
28510 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 47 45 2c  .      OP_IdxGE,
28520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
28530 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e  : (end_constrain
28540 74 73 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a  ts && !bRev) */.
28550 20 20 20 20 20 20 4f 50 5f 49 64 78 4c 54 20 20        OP_IdxLT  
28560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a             /* 2:
28570 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74   (end_constraint
28580 73 20 26 26 20 62 52 65 76 29 20 2a 2f 0a 20 20  s && bRev) */.  
28590 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6e 45 71    };.    int nEq
285a0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
285b0 6e 45 71 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  nEq;  /* Number 
285c0 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72 6d  of == or IN term
285d0 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 4d  s */.    int isM
285e0 69 6e 51 75 65 72 79 20 3d 20 30 3b 20 20 20 20  inQuery = 0;    
285f0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
28600 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64   is an optimized
28610 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 2e 2e   SELECT min(x)..
28620 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 42   */.    int regB
28630 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
28640 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67       /* Base reg
28650 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f  ister holding co
28660 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65 73 20  nstraint values 
28670 2a 2f 0a 20 20 20 20 69 6e 74 20 72 31 3b 20 20  */.    int r1;  
28680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28690 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69      /* Temp regi
286a0 73 74 65 72 20 2a 2f 0a 20 20 20 20 57 68 65 72  ster */.    Wher
286b0 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 53 74 61  eTerm *pRangeSta
286c0 72 74 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 65 71  rt = 0;  /* Ineq
286d0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
286e0 74 20 61 74 20 72 61 6e 67 65 20 73 74 61 72 74  t at range start
286f0 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72   */.    WhereTer
28700 6d 20 2a 70 52 61 6e 67 65 45 6e 64 20 3d 20 30  m *pRangeEnd = 0
28710 3b 20 20 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69  ;    /* Inequali
28720 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74  ty constraint at
28730 20 72 61 6e 67 65 20 65 6e 64 20 2a 2f 0a 20 20   range end */.  
28740 20 20 69 6e 74 20 73 74 61 72 74 45 71 3b 20 20    int startEq;  
28750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28760 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67 65 20  * True if range 
28770 73 74 61 72 74 20 75 73 65 73 20 3d 3d 2c 20 3e  start uses ==, >
28780 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69  = or <= */.    i
28790 6e 74 20 65 6e 64 45 71 3b 20 20 20 20 20 20 20  nt endEq;       
287a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
287b0 72 75 65 20 69 66 20 72 61 6e 67 65 20 65 6e 64  rue if range end
287c0 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20   uses ==, >= or 
287d0 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74  <= */.    int st
287e0 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3b  art_constraints;
287f0 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20         /* Start 
28800 6f 66 20 72 61 6e 67 65 20 69 73 20 63 6f 6e 73  of range is cons
28810 74 72 61 69 6e 65 64 20 2a 2f 0a 20 20 20 20 69  trained */.    i
28820 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  nt nConstraint; 
28830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
28840 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74 72 61  umber of constra
28850 69 6e 74 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  int terms */.   
28860 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
28870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28880 20 54 68 65 20 69 6e 64 65 78 20 77 65 20 77 69   The index we wi
28890 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20  ll be using */. 
288a0 20 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20     int iIdxCur; 
288b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288c0 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73  /* The VDBE curs
288d0 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  or for the index
288e0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 78 74   */.    int nExt
288f0 72 61 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20  raReg = 0;      
28900 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
28910 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  f extra register
28920 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 20 20  s needed */.    
28930 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
28940 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28950 49 6e 73 74 72 75 63 74 69 6f 6e 20 6f 70 63 6f  Instruction opco
28960 64 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  de */.    char *
28970 7a 53 74 61 72 74 41 66 66 3b 20 20 20 20 20 20  zStartAff;      
28980 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69         /* Affini
28990 74 79 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20  ty for start of 
289a0 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
289b0 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 45   */.    char *zE
289c0 6e 64 41 66 66 3b 20 20 20 20 20 20 20 20 20 20  ndAff;          
289d0 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
289e0 20 66 6f 72 20 65 6e 64 20 6f 66 20 72 61 6e 67   for end of rang
289f0 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  e constraint */.
28a00 0a 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76  .    pIdx = pLev
28a10 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b  el->plan.u.pIdx;
28a20 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d 20 70  .    iIdxCur = p
28a30 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
28a40 20 20 20 20 6b 20 3d 20 28 6e 45 71 3d 3d 70 49      k = (nEq==pI
28a50 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3f 20 2d 31  dx->nColumn ? -1
28a60 20 3a 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   : pIdx->aiColum
28a70 6e 5b 6e 45 71 5d 29 3b 0a 0a 20 20 20 20 2f 2a  n[nEq]);..    /*
28a80 20 49 66 20 74 68 69 73 20 6c 6f 6f 70 20 73 61   If this loop sa
28a90 74 69 73 66 69 65 73 20 61 20 73 6f 72 74 20 6f  tisfies a sort o
28aa0 72 64 65 72 20 28 70 4f 72 64 65 72 42 79 29 20  rder (pOrderBy) 
28ab0 72 65 71 75 65 73 74 20 74 68 61 74 20 0a 20 20  request that .  
28ac0 20 20 2a 2a 20 77 61 73 20 70 61 73 73 65 64 20    ** was passed 
28ad0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
28ae0 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20   to implement a 
28af0 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 2e  "SELECT min(x) .
28b00 2e 2e 22 20 0a 20 20 20 20 2a 2a 20 71 75 65 72  .." .    ** quer
28b10 79 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  y, then the call
28b20 65 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c  er will only all
28b30 6f 77 20 74 68 65 20 6c 6f 6f 70 20 74 6f 20 72  ow the loop to r
28b40 75 6e 20 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20  un for.    ** a 
28b50 73 69 6e 67 6c 65 20 69 74 65 72 61 74 69 6f 6e  single iteration
28b60 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
28b70 74 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20  t the first row 
28b80 72 65 74 75 72 6e 65 64 0a 20 20 20 20 2a 2a 20  returned.    ** 
28b90 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20  should not have 
28ba0 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 73 74 6f  a NULL value sto
28bb0 72 65 64 20 69 6e 20 27 78 27 2e 20 49 66 20 63  red in 'x'. If c
28bc0 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a 20 20 20  olumn 'x' is.   
28bd0 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 6e   ** the first on
28be0 65 20 61 66 74 65 72 20 74 68 65 20 6e 45 71 20  e after the nEq 
28bf0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
28c00 69 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65  ints in the inde
28c10 78 2c 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 72  x,.    ** this r
28c20 65 71 75 69 72 65 73 20 73 6f 6d 65 20 73 70 65  equires some spe
28c30 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20  cial handling.. 
28c40 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77     */.    if( (w
28c50 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f  ctrlFlags&WHERE_
28c60 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a  ORDERBY_MIN)!=0.
28c70 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d       && (pLevel-
28c80 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 26 57 48  >plan.wsFlags&WH
28c90 45 52 45 5f 4f 52 44 45 52 45 44 29 0a 20 20 20  ERE_ORDERED).   
28ca0 20 20 26 26 20 28 70 49 64 78 2d 3e 6e 43 6f 6c    && (pIdx->nCol
28cb0 75 6d 6e 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a  umn>nEq).    ){.
28cc0 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
28cd0 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
28ce0 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20  ==1 ); */.      
28cf0 2f 2a 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  /* assert( pOrde
28d00 72 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  rBy->a[0].pExpr-
28d10 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e  >iColumn==pIdx->
28d20 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 20 29 3b  aiColumn[nEq] );
28d30 20 2a 2f 0a 20 20 20 20 20 20 69 73 4d 69 6e 51   */.      isMinQ
28d40 75 65 72 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  uery = 1;.      
28d50 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20  nExtraReg = 1;. 
28d60 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e     }..    /* Fin
28d70 64 20 61 6e 79 20 69 6e 65 71 75 61 6c 69 74 79  d any inequality
28d80 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d   constraint term
28d90 73 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20  s for the start 
28da0 61 6e 64 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20  and end .    ** 
28db0 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 0a 20  of the range. . 
28dc0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
28dd0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
28de0 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
28df0 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52  IMIT ){.      pR
28e00 61 6e 67 65 45 6e 64 20 3d 20 66 69 6e 64 54 65  angeEnd = findTe
28e10 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c  rm(pWC, iCur, k,
28e20 20 6e 6f 74 52 65 61 64 79 2c 20 28 57 4f 5f 4c   notReady, (WO_L
28e30 54 7c 57 4f 5f 4c 45 29 2c 20 70 49 64 78 29 3b  T|WO_LE), pIdx);
28e40 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67  .      nExtraReg
28e50 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
28e60 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
28e70 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
28e80 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
28e90 20 20 20 20 70 52 61 6e 67 65 53 74 61 72 74 20      pRangeStart 
28ea0 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
28eb0 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64  iCur, k, notRead
28ec0 79 2c 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29  y, (WO_GT|WO_GE)
28ed0 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 6e  , pIdx);.      n
28ee0 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20  ExtraReg = 1;.  
28ef0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65    }..    /* Gene
28f00 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61  rate code to eva
28f10 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72  luate all constr
28f20 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67  aint terms using
28f30 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 2a 2a   == or IN.    **
28f40 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 76   and store the v
28f50 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20 74  alues of those t
28f60 65 72 6d 73 20 69 6e 20 61 6e 20 61 72 72 61 79  erms in an array
28f70 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20   of registers.  
28f80 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74    ** starting at
28f90 20 72 65 67 42 61 73 65 2e 0a 20 20 20 20 2a 2f   regBase..    */
28fa0 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 63  .    regBase = c
28fb0 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65  odeAllEqualityTe
28fc0 72 6d 73 28 0a 20 20 20 20 20 20 20 20 70 50 61  rms(.        pPa
28fd0 72 73 65 2c 20 70 4c 65 76 65 6c 2c 20 70 57 43  rse, pLevel, pWC
28fe0 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e 45 78 74  , notReady, nExt
28ff0 72 61 52 65 67 2c 20 26 7a 53 74 61 72 74 41 66  raReg, &zStartAf
29000 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 7a 45 6e  f.    );.    zEn
29010 64 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62  dAff = sqlite3Db
29020 53 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  StrDup(pParse->d
29030 62 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20  b, zStartAff);. 
29040 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65     addrNxt = pLe
29050 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20  vel->addrNxt;.. 
29060 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
29070 64 6f 69 6e 67 20 61 20 72 65 76 65 72 73 65 20  doing a reverse 
29080 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e  order scan on an
29090 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78   ascending index
290a0 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f  , or.    ** a fo
290b0 72 77 61 72 64 20 6f 72 64 65 72 20 73 63 61 6e  rward order scan
290c0 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67   on a descending
290d0 20 69 6e 64 65 78 2c 20 69 6e 74 65 72 63 68 61   index, intercha
290e0 6e 67 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  nge the .    ** 
290f0 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 74 65  start and end te
29100 72 6d 73 20 28 70 52 61 6e 67 65 53 74 61 72 74  rms (pRangeStart
29110 20 61 6e 64 20 70 52 61 6e 67 65 45 6e 64 29 2e   and pRangeEnd).
29120 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
29130 28 6e 45 71 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  (nEq<pIdx->nColu
29140 6d 6e 20 26 26 20 62 52 65 76 3d 3d 28 70 49 64  mn && bRev==(pId
29150 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45  x->aSortOrder[nE
29160 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53  q]==SQLITE_SO_AS
29170 43 29 29 0a 20 20 20 20 20 7c 7c 20 28 62 52 65  C)).     || (bRe
29180 76 20 26 26 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  v && pIdx->nColu
29190 6d 6e 3d 3d 6e 45 71 29 0a 20 20 20 20 29 7b 0a  mn==nEq).    ){.
291a0 20 20 20 20 20 20 53 57 41 50 28 57 68 65 72 65        SWAP(Where
291b0 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e  Term *, pRangeEn
291c0 64 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b  d, pRangeStart);
291d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74  .    }..    test
291e0 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72  case( pRangeStar
291f0 74 20 26 26 20 70 52 61 6e 67 65 53 74 61 72 74  t && pRangeStart
29200 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
29210 5f 4c 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _LE );.    testc
29220 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74  ase( pRangeStart
29230 20 26 26 20 70 52 61 6e 67 65 53 74 61 72 74 2d   && pRangeStart-
29240 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
29250 47 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  GE );.    testca
29260 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26  se( pRangeEnd &&
29270 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65   pRangeEnd->eOpe
29280 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b  rator & WO_LE );
29290 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
292a0 52 61 6e 67 65 45 6e 64 20 26 26 20 70 52 61 6e  RangeEnd && pRan
292b0 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72  geEnd->eOperator
292c0 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20   & WO_GE );.    
292d0 73 74 61 72 74 45 71 20 3d 20 21 70 52 61 6e 67  startEq = !pRang
292e0 65 53 74 61 72 74 20 7c 7c 20 70 52 61 6e 67 65  eStart || pRange
292f0 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72  Start->eOperator
29300 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29   & (WO_LE|WO_GE)
29310 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d 20 20 20  ;.    endEq =   
29320 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52  !pRangeEnd || pR
29330 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74  angeEnd->eOperat
29340 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47  or & (WO_LE|WO_G
29350 45 29 3b 0a 20 20 20 20 73 74 61 72 74 5f 63 6f  E);.    start_co
29360 6e 73 74 72 61 69 6e 74 73 20 3d 20 70 52 61 6e  nstraints = pRan
29370 67 65 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30  geStart || nEq>0
29380 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74  ;..    /* Seek t
29390 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  he index cursor 
293a0 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
293b0 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20  the range. */.  
293c0 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20    nConstraint = 
293d0 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61  nEq;.    if( pRa
293e0 6e 67 65 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ngeStart ){.    
293f0 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
29400 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 70 45   pRangeStart->pE
29410 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
29420 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
29430 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  de(pParse, pRigh
29440 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b  t, regBase+nEq);
29450 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 61 6e  .      if( (pRan
29460 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73  geStart->wtFlags
29470 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d   & TERM_VNULL)==
29480 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
29490 69 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75  ite3ExprCodeIsNu
294a0 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68 74  llJump(v, pRight
294b0 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61  , regBase+nEq, a
294c0 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 7d  ddrNxt);.      }
294d0 0a 20 20 20 20 20 20 69 66 28 20 7a 53 74 61 72  .      if( zStar
294e0 74 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  tAff ){.        
294f0 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  if( sqlite3Compa
29500 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68  reAffinity(pRigh
29510 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71  t, zStartAff[nEq
29520 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ])==SQLITE_AFF_N
29530 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ONE){.          
29540 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d  /* Since the com
29550 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65  parison is to be
29560 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20   performed with 
29570 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20  no conversions. 
29580 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c           ** appl
29590 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72 61  ied to the opera
295a0 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61 66 66  nds, set the aff
295b0 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74  inity to apply t
295c0 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20  o pRight to .   
295d0 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45         ** SQLITE
295e0 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20  _AFF_NONE.  */. 
295f0 20 20 20 20 20 20 20 20 20 7a 53 74 61 72 74 41           zStartA
29600 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45  ff[nEq] = SQLITE
29610 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
29620 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
29630 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64   sqlite3ExprNeed
29640 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67  sNoAffinityChang
29650 65 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74  e(pRight, zStart
29660 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20  Aff[nEq]) ){.   
29670 20 20 20 20 20 20 20 7a 53 74 61 72 74 41 66 66         zStartAff
29680 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41  [nEq] = SQLITE_A
29690 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20  FF_NONE;.       
296a0 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20   }.      }  .   
296b0 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b     nConstraint++
296c0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
296d0 28 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77  ( pRangeStart->w
296e0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
296f0 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20  RTUAL ); /* EV: 
29700 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f  R-30575-11662 */
29710 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69  .    }else if( i
29720 73 4d 69 6e 51 75 65 72 79 20 29 7b 0a 20 20 20  sMinQuery ){.   
29730 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
29740 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
29750 20 30 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29   0, regBase+nEq)
29760 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61  ;.      nConstra
29770 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 74 61  int++;.      sta
29780 72 74 45 71 20 3d 20 30 3b 0a 20 20 20 20 20 20  rtEq = 0;.      
29790 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
297a0 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  s = 1;.    }.   
297b0 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69   codeApplyAffini
297c0 74 79 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  ty(pParse, regBa
297d0 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c  se, nConstraint,
297e0 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20   zStartAff);.   
297f0 20 6f 70 20 3d 20 61 53 74 61 72 74 4f 70 5b 28   op = aStartOp[(
29800 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
29810 73 3c 3c 32 29 20 2b 20 28 73 74 61 72 74 45 71  s<<2) + (startEq
29820 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20 20  <<1) + bRev];.  
29830 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 30 20    assert( op!=0 
29840 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
29850 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29   op==OP_Rewind )
29860 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
29870 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20  op==OP_Last );. 
29880 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
29890 3d 4f 50 5f 53 65 65 6b 47 74 20 29 3b 0a 20 20  =OP_SeekGt );.  
298a0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
298b0 4f 50 5f 53 65 65 6b 47 65 20 29 3b 0a 20 20 20  OP_SeekGe );.   
298c0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
298d0 50 5f 53 65 65 6b 4c 65 20 29 3b 0a 20 20 20 20  P_SeekLe );.    
298e0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
298f0 5f 53 65 65 6b 4c 74 20 29 3b 0a 20 20 20 20 73  _SeekLt );.    s
29900 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
29910 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43  Int(v, op, iIdxC
29920 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67  ur, addrNxt, reg
29930 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  Base, nConstrain
29940 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64  t);..    /* Load
29950 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74   the value for t
29960 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  he inequality co
29970 6e 73 74 72 61 69 6e 74 20 61 74 20 74 68 65 20  nstraint at the 
29980 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  end of the.    *
29990 2a 20 72 61 6e 67 65 20 28 69 66 20 61 6e 79 29  * range (if any)
299a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43 6f  ..    */.    nCo
299b0 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a  nstraint = nEq;.
299c0 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 45 6e      if( pRangeEn
299d0 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  d ){.      Expr 
299e0 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65  *pRight = pRange
299f0 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  End->pExpr->pRig
29a00 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ht;.      sqlite
29a10 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
29a20 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
29a30 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20 20 20 20  +nEq, 1);.      
29a40 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
29a50 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
29a60 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20  regBase+nEq);.  
29a70 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65 45      if( (pRangeE
29a80 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  nd->wtFlags & TE
29a90 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a  RM_VNULL)==0 ){.
29aa0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
29ab0 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d  xprCodeIsNullJum
29ac0 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67  p(v, pRight, reg
29ad0 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78  Base+nEq, addrNx
29ae0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
29af0 20 20 69 66 28 20 7a 45 6e 64 41 66 66 20 29 7b    if( zEndAff ){
29b00 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
29b10 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
29b20 69 74 79 28 70 52 69 67 68 74 2c 20 7a 45 6e 64  ity(pRight, zEnd
29b30 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54  Aff[nEq])==SQLIT
29b40 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20  E_AFF_NONE){.   
29b50 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20         /* Since 
29b60 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
29b70 73 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65  s to be performe
29b80 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72  d with no conver
29b90 73 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20  sions.          
29ba0 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68  ** applied to th
29bb0 65 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74 20  e operands, set 
29bc0 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20  the affinity to 
29bd0 61 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74 20  apply to pRight 
29be0 74 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  to .          **
29bf0 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
29c00 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
29c10 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 20 3d 20 53  zEndAff[nEq] = S
29c20 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
29c30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29c40 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
29c50 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79  rNeedsNoAffinity
29c60 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a  Change(pRight, z
29c70 45 6e 64 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a  EndAff[nEq]) ){.
29c80 20 20 20 20 20 20 20 20 20 20 7a 45 6e 64 41 66            zEndAf
29c90 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f  f[nEq] = SQLITE_
29ca0 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
29cb0 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20    }.      }  .  
29cc0 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66      codeApplyAff
29cd0 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72 65  inity(pParse, re
29ce0 67 42 61 73 65 2c 20 6e 45 71 2b 31 2c 20 7a 45  gBase, nEq+1, zE
29cf0 6e 64 41 66 66 29 3b 0a 20 20 20 20 20 20 6e 43  ndAff);.      nC
29d00 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20  onstraint++;.   
29d10 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
29d20 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20  ngeEnd->wtFlags 
29d30 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
29d40 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35  ; /* EV: R-30575
29d50 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 7d 0a  -11662 */.    }.
29d60 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
29d70 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 53  e(pParse->db, zS
29d80 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 73 71  tartAff);.    sq
29d90 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
29da0 73 65 2d 3e 64 62 2c 20 7a 45 6e 64 41 66 66 29  se->db, zEndAff)
29db0 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66  ;..    /* Top of
29dc0 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20 2a   the loop body *
29dd0 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32  /.    pLevel->p2
29de0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
29df0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20  rrentAddr(v);.. 
29e00 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
29e10 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  he index cursor 
29e20 69 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  is past the end 
29e30 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f  of the range. */
29e40 0a 20 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f 70  .    op = aEndOp
29e50 5b 28 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 6e  [(pRangeEnd || n
29e60 45 71 29 20 2a 20 28 31 20 2b 20 62 52 65 76 29  Eq) * (1 + bRev)
29e70 5d 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  ];.    testcase(
29e80 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 3b 0a   op==OP_Noop );.
29e90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
29ea0 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20 20  ==OP_IdxGE );.  
29eb0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
29ec0 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20 20  OP_IdxLT );.    
29ed0 69 66 28 20 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  if( op!=OP_Noop 
29ee0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
29ef0 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
29f00 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64   op, iIdxCur, ad
29f10 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20  drNxt, regBase, 
29f20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20  nConstraint);.  
29f30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
29f40 68 61 6e 67 65 50 35 28 76 2c 20 65 6e 64 45 71  hangeP5(v, endEq
29f50 21 3d 62 52 65 76 20 3f 31 3a 30 29 3b 0a 20 20  !=bRev ?1:0);.  
29f60 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
29f70 68 65 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c  here are inequal
29f80 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  ity constraints,
29f90 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
29fa0 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20  value.    ** of 
29fb0 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  the table column
29fc0 20 74 68 61 74 20 74 68 65 20 69 6e 65 71 75 61   that the inequa
29fd0 6c 69 74 79 20 63 6f 6e 74 72 61 69 6e 73 20 69  lity contrains i
29fe0 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20  s not NULL..    
29ff0 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 6a 75 6d  ** If it is, jum
2a000 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74  p to the next it
2a010 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  eration of the l
2a020 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
2a030 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
2a040 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
2a050 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c      testcase( pL
2a060 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
2a070 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c  gs & WHERE_BTM_L
2a080 49 4d 49 54 20 29 3b 0a 20 20 20 20 74 65 73 74  IMIT );.    test
2a090 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c  case( pLevel->pl
2a0a0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
2a0b0 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 3b 0a  RE_TOP_LIMIT );.
2a0c0 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d      if( (pLevel-
2a0d0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
2a0e0 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  (WHERE_BTM_LIMIT
2a0f0 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  |WHERE_TOP_LIMIT
2a100 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ))!=0 ){.      s
2a110 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2a120 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
2a130 49 64 78 43 75 72 2c 20 6e 45 71 2c 20 72 31 29  IdxCur, nEq, r1)
2a140 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2a150 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2a160 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 61 64 64 72  IsNull, r1, addr
2a170 43 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Cont);.    }.   
2a180 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
2a190 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
2a1a0 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b  1);..    /* Seek
2a1b0 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f   the table curso
2a1c0 72 2c 20 69 66 20 72 65 71 75 69 72 65 64 20 2a  r, if required *
2a1d0 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65 72  /.    disableTer
2a1e0 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65  m(pLevel, pRange
2a1f0 53 74 61 72 74 29 3b 0a 20 20 20 20 64 69 73 61  Start);.    disa
2a200 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
2a210 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20  pRangeEnd);.    
2a220 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65 20 29  if( !omitTable )
2a230 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65  {.      iRowidRe
2a240 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20  g = iReleaseReg 
2a250 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
2a260 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
2a270 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2a280 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f  dOp2(v, OP_IdxRo
2a290 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20 69 52  wid, iIdxCur, iR
2a2a0 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
2a2b0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
2a2c0 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43  Store(pParse, iC
2a2d0 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65  ur, -1, iRowidRe
2a2e0 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
2a2f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2a300 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20 69 52  P_Seek, iCur, iR
2a310 6f 77 69 64 52 65 67 29 3b 20 20 2f 2a 20 44 65  owidReg);  /* De
2a320 66 65 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a 20  ferred seek */. 
2a330 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 63     }..    /* Rec
2a340 6f 72 64 20 74 68 65 20 69 6e 73 74 72 75 63 74  ord the instruct
2a350 69 6f 6e 20 75 73 65 64 20 74 6f 20 74 65 72 6d  ion used to term
2a360 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20  inate the loop. 
2a370 44 69 73 61 62 6c 65 20 0a 20 20 20 20 2a 2a 20  Disable .    ** 
2a380 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
2a390 6d 73 20 6d 61 64 65 20 72 65 64 75 6e 64 61 6e  ms made redundan
2a3a0 74 20 62 79 20 74 68 65 20 69 6e 64 65 78 20 72  t by the index r
2a3b0 61 6e 67 65 20 73 63 61 6e 2e 0a 20 20 20 20 2a  ange scan..    *
2a3c0 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  /.    if( pLevel
2a3d0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
2a3e0 20 57 48 45 52 45 5f 55 4e 49 51 55 45 20 29 7b   WHERE_UNIQUE ){
2a3f0 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
2a400 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  p = OP_Noop;.   
2a410 20 7d 65 6c 73 65 20 69 66 28 20 62 52 65 76 20   }else if( bRev 
2a420 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  ){.      pLevel-
2a430 3e 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20  >op = OP_Prev;. 
2a440 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a450 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
2a460 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
2a470 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64  pLevel->p1 = iId
2a480 78 43 75 72 3b 0a 20 20 20 20 69 66 28 20 70 4c  xCur;.    if( pL
2a490 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
2a4a0 67 73 20 26 20 57 48 45 52 45 5f 43 4f 56 45 52  gs & WHERE_COVER
2a4b0 5f 53 43 41 4e 20 29 7b 0a 20 20 20 20 20 20 70  _SCAN ){.      p
2a4c0 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49  Level->p5 = SQLI
2a4d0 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55  TE_STMTSTATUS_FU
2a4e0 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20  LLSCAN_STEP;.   
2a4f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
2a500 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35  sert( pLevel->p5
2a510 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ==0 );.    }.  }
2a520 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51  else..#ifndef SQ
2a530 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
2a540 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20  IMIZATION.  if( 
2a550 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
2a560 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c  lags & WHERE_MUL
2a570 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a 20  TI_OR ){.    /* 
2a580 43 61 73 65 20 34 3a 20 20 54 77 6f 20 6f 72 20  Case 4:  Two or 
2a590 6d 6f 72 65 20 73 65 70 61 72 61 74 65 6c 79 20  more separately 
2a5a0 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f  indexed terms co
2a5b0 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 0a 20 20  nnected by OR.  
2a5c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d    **.    ** Exam
2a5d0 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
2a5e0 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
2a5f0 45 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20  E t1(a,b,c,d);. 
2a600 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49     **   CREATE I
2a610 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29  NDEX i1 ON t1(a)
2a620 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  ;.    **   CREAT
2a630 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 31  E INDEX i2 ON t1
2a640 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52  (b);.    **   CR
2a650 45 41 54 45 20 49 4e 44 45 58 20 69 33 20 4f 4e  EATE INDEX i3 ON
2a660 20 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a 20   t1(c);.    **. 
2a670 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a     **   SELECT *
2a680 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
2a690 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20 28 63 3d  =5 OR b=7 OR (c=
2a6a0 31 31 20 41 4e 44 20 64 3d 31 33 29 0a 20 20 20  11 AND d=13).   
2a6b0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68   **.    ** In th
2a6c0 65 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 72 65  e example, there
2a6d0 20 61 72 65 20 74 68 72 65 65 20 69 6e 64 65 78   are three index
2a6e0 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74  ed terms connect
2a6f0 65 64 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a 2a  ed by OR..    **
2a700 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   The top of the 
2a710 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  loop looks like 
2a720 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  this:.    **.   
2a730 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c   **          Nul
2a740 6c 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20  l       1       
2a750 20 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20           # Zero 
2a760 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65  the rowset in re
2a770 67 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  g 1.    **.    *
2a780 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65 61 63 68  * Then, for each
2a790 20 69 6e 64 65 78 65 64 20 74 65 72 6d 2c 20 74   indexed term, t
2a7a0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68  he following. Th
2a7b0 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20  e arguments to. 
2a7c0 20 20 20 2a 2a 20 52 6f 77 53 65 74 54 65 73 74     ** RowSetTest
2a7d0 20 61 72 65 20 73 75 63 68 20 74 68 61 74 20 74   are such that t
2a7e0 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  he rowid of the 
2a7f0 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 69  current row is i
2a800 6e 73 65 72 74 65 64 0a 20 20 20 20 2a 2a 20 69  nserted.    ** i
2a810 6e 74 6f 20 74 68 65 20 52 6f 77 53 65 74 2e 20  nto the RowSet. 
2a820 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  If it is already
2a830 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74 72 6f   present, contro
2a840 6c 20 73 6b 69 70 73 20 74 68 65 0a 20 20 20 20  l skips the.    
2a850 2a 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64 65 20  ** Gosub opcode 
2a860 61 6e 64 20 6a 75 6d 70 73 20 73 74 72 61 69 67  and jumps straig
2a870 68 74 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67  ht to the code g
2a880 65 6e 65 72 61 74 65 64 20 62 79 20 57 68 65 72  enerated by Wher
2a890 65 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  eEnd()..    **. 
2a8a0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c     **        sql
2a8b0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 3c  ite3WhereBegin(<
2a8c0 74 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20 20 20  term>).    **   
2a8d0 20 20 20 20 20 20 20 52 6f 77 53 65 74 54 65 73         RowSetTes
2a8e0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2a8f0 20 20 20 23 20 49 6e 73 65 72 74 20 72 6f 77 69     # Insert rowi
2a900 64 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a 20 20  d into rowset.  
2a910 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f    **          Go
2a920 73 75 62 20 20 20 20 20 20 32 20 41 0a 20 20 20  sub      2 A.   
2a930 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74   **        sqlit
2a940 65 33 57 68 65 72 65 45 6e 64 28 29 0a 20 20 20  e3WhereEnd().   
2a950 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f   **.    ** Follo
2a960 77 69 6e 67 20 74 68 65 20 61 62 6f 76 65 2c 20  wing the above, 
2a970 63 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e 61 74  code to terminat
2a980 65 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61 62 65  e the loop. Labe
2a990 6c 20 41 2c 20 74 68 65 20 74 61 72 67 65 74 0a  l A, the target.
2a9a0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 47 6f      ** of the Go
2a9b0 73 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d 70 73  sub above, jumps
2a9c0 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63 74   to the instruct
2a9d0 69 6f 6e 20 72 69 67 68 74 20 61 66 74 65 72 20  ion right after 
2a9e0 74 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a  the Goto..    **
2a9f0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
2aa00 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20   Null       1   
2aa10 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 5a               # Z
2aa20 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69  ero the rowset i
2aa30 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 20 20  n reg 1.    **  
2aa40 20 20 20 20 20 20 20 20 47 6f 74 6f 20 20 20 20          Goto    
2aa50 20 20 20 42 20 20 20 20 20 20 20 20 20 20 20 20     B            
2aa60 20 20 20 20 23 20 54 68 65 20 6c 6f 6f 70 20 69      # The loop i
2aa70 73 20 66 69 6e 69 73 68 65 64 2e 0a 20 20 20 20  s finished..    
2aa80 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
2aa90 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20 20  A: <loop body>  
2aaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
2aab0 20 52 65 74 75 72 6e 20 64 61 74 61 2c 20 77 68   Return data, wh
2aac0 61 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a 0a 20  atever..    **. 
2aad0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52     **          R
2aae0 65 74 75 72 6e 20 20 20 20 20 32 20 20 20 20 20  eturn     2     
2aaf0 20 20 20 20 20 20 20 20 20 20 20 23 20 4a 75 6d             # Jum
2ab00 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20 47 6f  p back to the Go
2ab10 73 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  sub.    **.    *
2ab20 2a 20 20 20 20 20 20 20 42 3a 20 3c 61 66 74 65  *       B: <afte
2ab30 72 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20 20 20  r the loop>.    
2ab40 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20 57 68  **.    */.    Wh
2ab50 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63  ereClause *pOrWc
2ab60 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63  ;    /* The OR-c
2ab70 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f 75 74  lause broken out
2ab80 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
2ab90 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  /.    SrcList *p
2aba0 4f 72 54 61 62 3b 20 20 20 20 20 20 20 2f 2a 20  OrTab;       /* 
2abb0 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c 65 20  Shortened table 
2abc0 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61 75 73  list or OR-claus
2abd0 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a  e generation */.
2abe0 20 20 20 20 49 6e 64 65 78 20 2a 70 43 6f 76 20      Index *pCov 
2abf0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2ac00 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c 20 63 6f   /* Potential co
2ac10 76 65 72 69 6e 67 20 69 6e 64 65 78 20 28 6f 72  vering index (or
2ac20 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20 69 6e   NULL) */.    in
2ac30 74 20 69 43 6f 76 43 75 72 20 3d 20 70 50 61 72  t iCovCur = pPar
2ac40 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 2f 2a 20  se->nTab++;  /* 
2ac50 43 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20  Cursor used for 
2ac60 69 6e 64 65 78 20 73 63 61 6e 73 20 28 69 66 20  index scans (if 
2ac70 61 6e 79 29 20 2a 2f 0a 0a 20 20 20 20 69 6e 74  any) */..    int
2ac80 20 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70   regReturn = ++p
2ac90 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20  Parse->nMem;    
2aca0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
2acb0 65 72 20 75 73 65 64 20 77 69 74 68 20 4f 50 5f  er used with OP_
2acc0 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69 6e 74  Gosub */.    int
2acd0 20 72 65 67 52 6f 77 73 65 74 20 3d 20 30 3b 20   regRowset = 0; 
2ace0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2acf0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
2ad00 65 72 20 66 6f 72 20 52 6f 77 53 65 74 20 6f 62  er for RowSet ob
2ad10 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ject */.    int 
2ad20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 20 20 20  regRowid = 0;   
2ad30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad40 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
2ad50 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64 20  r holding rowid 
2ad60 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f 6f 70  */.    int iLoop
2ad70 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64  Body = sqlite3Vd
2ad80 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20  beMakeLabel(v); 
2ad90 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c 6f 6f   /* Start of loo
2ada0 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 69 6e  p body */.    in
2adb0 74 20 69 52 65 74 49 6e 69 74 3b 20 20 20 20 20  t iRetInit;     
2adc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2add0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
2ade0 73 73 20 6f 66 20 72 65 67 52 65 74 75 72 6e 20  ss of regReturn 
2adf0 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  init */.    int 
2ae00 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20  untestedTerms = 
2ae10 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
2ae20 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e 6f 74  * Some terms not
2ae30 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65 73 74   completely test
2ae40 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  ed */.    int ii
2ae50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ae60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ae70 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
2ae80 20 20 20 20 45 78 70 72 20 2a 70 41 6e 64 45 78      Expr *pAndEx
2ae90 70 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  pr = 0;         
2aea0 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 22 2e 2e         /* An "..
2aeb0 20 41 4e 44 20 28 2e 2e 2e 29 22 20 65 78 70 72   AND (...)" expr
2aec0 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 0a 20 20  ession */.   .  
2aed0 20 20 70 54 65 72 6d 20 3d 20 70 4c 65 76 65 6c    pTerm = pLevel
2aee0 2d 3e 70 6c 61 6e 2e 75 2e 70 54 65 72 6d 3b 0a  ->plan.u.pTerm;.
2aef0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
2af00 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  m!=0 );.    asse
2af10 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  rt( pTerm->eOper
2af20 61 74 6f 72 20 26 20 57 4f 5f 4f 52 20 29 3b 0a  ator & WO_OR );.
2af30 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65      assert( (pTe
2af40 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
2af50 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20 29 3b  RM_ORINFO)!=0 );
2af60 0a 20 20 20 20 70 4f 72 57 63 20 3d 20 26 70 54  .    pOrWc = &pT
2af70 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e  erm->u.pOrInfo->
2af80 77 63 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  wc;.    pLevel->
2af90 6f 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e 3b 0a  op = OP_Return;.
2afa0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
2afb0 20 72 65 67 52 65 74 75 72 6e 3b 0a 0a 20 20 20   regReturn;..   
2afc0 20 2f 2a 20 53 65 74 20 75 70 20 61 20 6e 65 77   /* Set up a new
2afd0 20 53 72 63 4c 69 73 74 20 69 6e 20 70 4f 72 54   SrcList in pOrT
2afe0 61 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ab containing th
2aff0 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 73 63  e table being sc
2b000 61 6e 6e 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  anned.    ** by 
2b010 74 68 69 73 20 6c 6f 6f 70 20 69 6e 20 74 68 65  this loop in the
2b020 20 61 5b 30 5d 20 73 6c 6f 74 20 61 6e 64 20 61   a[0] slot and a
2b030 6c 6c 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c  ll notReady tabl
2b040 65 73 20 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f  es in a[1..] slo
2b050 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20  ts..    ** This 
2b060 62 65 63 6f 6d 65 73 20 74 68 65 20 53 72 63 4c  becomes the SrcL
2b070 69 73 74 20 69 6e 20 74 68 65 20 72 65 63 75 72  ist in the recur
2b080 73 69 76 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c  sive call to sql
2b090 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
2b0a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2b0b0 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e   pWInfo->nLevel>
2b0c0 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  1 ){.      int n
2b0d0 4e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20  NotReady;       
2b0e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2b0f0 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74 52 65   number of notRe
2b100 61 64 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ady tables */.  
2b110 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
2b120 73 74 5f 69 74 65 6d 20 2a 6f 72 69 67 53 72 63  st_item *origSrc
2b130 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
2b140 6c 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  l list of tables
2b150 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 52 65   */.      nNotRe
2b160 61 64 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c  ady = pWInfo->nL
2b170 65 76 65 6c 20 2d 20 69 4c 65 76 65 6c 20 2d 20  evel - iLevel - 
2b180 31 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20  1;.      pOrTab 
2b190 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c  = sqlite3StackAl
2b1a0 6c 6f 63 52 61 77 28 70 50 61 72 73 65 2d 3e 64  locRaw(pParse->d
2b1b0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
2b1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2b1d0 69 7a 65 6f 66 28 2a 70 4f 72 54 61 62 29 2b 20  izeof(*pOrTab)+ 
2b1e0 6e 4e 6f 74 52 65 61 64 79 2a 73 69 7a 65 6f 66  nNotReady*sizeof
2b1f0 28 70 4f 72 54 61 62 2d 3e 61 5b 30 5d 29 29 3b  (pOrTab->a[0]));
2b200 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 61  .      if( pOrTa
2b210 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 6e 6f  b==0 ) return no
2b220 74 52 65 61 64 79 3b 0a 20 20 20 20 20 20 70 4f  tReady;.      pO
2b230 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28  rTab->nAlloc = (
2b240 69 31 36 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b  i16)(nNotReady +
2b250 20 31 29 3b 0a 20 20 20 20 20 20 70 4f 72 54 61   1);.      pOrTa
2b260 62 2d 3e 6e 53 72 63 20 3d 20 70 4f 72 54 61 62  b->nSrc = pOrTab
2b270 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20  ->nAlloc;.      
2b280 6d 65 6d 63 70 79 28 70 4f 72 54 61 62 2d 3e 61  memcpy(pOrTab->a
2b290 2c 20 70 54 61 62 49 74 65 6d 2c 20 73 69 7a 65  , pTabItem, size
2b2a0 6f 66 28 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a  of(*pTabItem));.
2b2b0 20 20 20 20 20 20 6f 72 69 67 53 72 63 20 3d 20        origSrc = 
2b2c0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
2b2d0 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  ->a;.      for(k
2b2e0 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79  =1; k<=nNotReady
2b2f0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
2b300 6d 65 6d 63 70 79 28 26 70 4f 72 54 61 62 2d 3e  memcpy(&pOrTab->
2b310 61 5b 6b 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70  a[k], &origSrc[p
2b320 4c 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c  Level[k].iFrom],
2b330 20 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e   sizeof(pOrTab->
2b340 61 5b 6b 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a  a[k]));.      }.
2b350 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b360 20 70 4f 72 54 61 62 20 3d 20 70 57 49 6e 66 6f   pOrTab = pWInfo
2b370 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20  ->pTabList;.    
2b380 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  }..    /* Initia
2b390 6c 69 7a 65 20 74 68 65 20 72 6f 77 73 65 74 20  lize the rowset 
2b3a0 72 65 67 69 73 74 65 72 20 74 6f 20 63 6f 6e 74  register to cont
2b3b0 61 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c  ain NULL. An SQL
2b3c0 20 4e 55 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a   NULL is .    **
2b3d0 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 61   equivalent to a
2b3e0 6e 20 65 6d 70 74 79 20 72 6f 77 73 65 74 2e 0a  n empty rowset..
2b3f0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c      **.    ** Al
2b400 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 72 65  so initialize re
2b410 67 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e 74 61  gReturn to conta
2b420 69 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  in the address o
2b430 66 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  f the instructio
2b440 6e 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69  n .    ** immedi
2b450 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
2b460 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 20 61 74  the OP_Return at
2b470 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74   the bottom of t
2b480 68 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a 20 20  he loop. This.  
2b490 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
2b4a0 20 69 6e 20 61 20 66 65 77 20 6f 62 73 63 75 72   in a few obscur
2b4b0 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 73 65  e LEFT JOIN case
2b4c0 73 20 77 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20  s where control 
2b4d0 6a 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f 76 65  jumps.    ** ove
2b4e0 72 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  r the top of the
2b4f0 20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 62   loop into the b
2b500 6f 64 79 20 6f 66 20 69 74 2e 20 49 6e 20 74 68  ody of it. In th
2b510 69 73 20 63 61 73 65 20 74 68 65 20 0a 20 20 20  is case the .   
2b520 20 2a 2a 20 63 6f 72 72 65 63 74 20 72 65 73 70   ** correct resp
2b530 6f 6e 73 65 20 66 6f 72 20 74 68 65 20 65 6e 64  onse for the end
2b540 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20 28 74  -of-loop code (t
2b550 68 65 20 4f 50 5f 52 65 74 75 72 6e 29 20 69 73  he OP_Return) is
2b560 20 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61 6c 6c   to .    ** fall
2b570 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
2b580 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
2b590 2c 20 6a 75 73 74 20 61 73 20 61 6e 20 4f 50 5f  , just as an OP_
2b5a0 4e 65 78 74 20 64 6f 65 73 20 69 66 0a 20 20 20  Next does if.   
2b5b0 20 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e   ** called on an
2b5c0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 63   uninitialized c
2b5d0 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  ursor..    */.  
2b5e0 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
2b5f0 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43  s & WHERE_DUPLIC
2b600 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20  ATES_OK)==0 ){. 
2b610 20 20 20 20 20 72 65 67 52 6f 77 73 65 74 20 3d       regRowset =
2b620 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2b630 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69 64 20  .      regRowid 
2b640 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2b650 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2b660 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2b670 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77 73  Null, 0, regRows
2b680 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  et);.    }.    i
2b690 52 65 74 49 6e 69 74 20 3d 20 73 71 6c 69 74 65  RetInit = sqlite
2b6a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2b6b0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
2b6c0 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20 2f  gReturn);..    /
2b6d0 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61  * If the origina
2b6e0 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  l WHERE clause i
2b6f0 73 20 7a 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  s z of the form:
2b700 20 20 28 78 31 20 4f 52 20 78 32 20 4f 52 20 2e    (x1 OR x2 OR .
2b710 2e 2e 29 20 41 4e 44 20 79 0a 20 20 20 20 2a 2a  ..) AND y.    **
2b720 20 54 68 65 6e 20 66 6f 72 20 65 76 65 72 79 20   Then for every 
2b730 74 65 72 6d 20 78 4e 2c 20 65 76 61 6c 75 61 74  term xN, evaluat
2b740 65 20 61 73 20 74 68 65 20 73 75 62 65 78 70 72  e as the subexpr
2b750 65 73 73 69 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a  ession: xN AND z
2b760 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61 79  .    ** That way
2b770 2c 20 74 65 72 6d 73 20 69 6e 20 79 20 74 68 61  , terms in y tha
2b780 74 20 61 72 65 20 66 61 63 74 6f 72 65 64 20 69  t are factored i
2b790 6e 74 6f 20 74 68 65 20 64 69 73 6a 75 6e 63 74  nto the disjunct
2b7a0 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ion will.    ** 
2b7b0 62 65 20 70 69 63 6b 65 64 20 75 70 20 62 79 20  be picked up by 
2b7c0 74 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61  the recursive ca
2b7d0 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 57 68  lls to sqlite3Wh
2b7e0 65 72 65 42 65 67 69 6e 28 29 20 62 65 6c 6f 77  ereBegin() below
2b7f0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2b800 41 63 74 75 61 6c 6c 79 2c 20 65 61 63 68 20 73  Actually, each s
2b810 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ubexpression is 
2b820 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 22 78 4e  converted to "xN
2b830 20 41 4e 44 20 77 22 20 77 68 65 72 65 20 77 20   AND w" where w 
2b840 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 22 69  is.    ** the "i
2b850 6e 74 65 72 65 73 74 69 6e 67 22 20 74 65 72 6d  nteresting" term
2b860 73 20 6f 66 20 7a 20 2d 20 74 65 72 6d 73 20 74  s of z - terms t
2b870 68 61 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67  hat did not orig
2b880 69 6e 61 74 65 20 69 6e 20 74 68 65 0a 20 20 20  inate in the.   
2b890 20 2a 2a 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20   ** ON or USING 
2b8a0 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54  clause of a LEFT
2b8b0 20 4a 4f 49 4e 2c 20 61 6e 64 20 74 65 72 6d 73   JOIN, and terms
2b8c0 20 74 68 61 74 20 61 72 65 20 75 73 61 62 6c 65   that are usable
2b8d0 20 61 73 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69   as .    ** indi
2b8e0 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ces..    */.    
2b8f0 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 31  if( pWC->nTerm>1
2b900 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54   ){.      int iT
2b910 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  erm;.      for(i
2b920 54 65 72 6d 3d 30 3b 20 69 54 65 72 6d 3c 70 57  Term=0; iTerm<pW
2b930 43 2d 3e 6e 54 65 72 6d 3b 20 69 54 65 72 6d 2b  C->nTerm; iTerm+
2b940 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72  +){.        Expr
2b950 20 2a 70 45 78 70 72 20 3d 20 70 57 43 2d 3e 61   *pExpr = pWC->a
2b960 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 3b 0a 20  [iTerm].pExpr;. 
2b970 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48         if( ExprH
2b980 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
2b990 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
2b9a0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2b9b0 20 20 20 69 66 28 20 70 57 43 2d 3e 61 5b 69 54     if( pWC->a[iT
2b9c0 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20 28  erm].wtFlags & (
2b9d0 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
2b9e0 4d 5f 4f 52 49 4e 46 4f 29 20 29 20 63 6f 6e 74  M_ORINFO) ) cont
2b9f0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
2ba00 28 20 28 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  ( (pWC->a[iTerm]
2ba10 2e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  .eOperator & WO_
2ba20 41 4c 4c 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  ALL)==0 ) contin
2ba30 75 65 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  ue;.        pExp
2ba40 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
2ba50 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
2ba60 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
2ba70 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c    pAndExpr = sql
2ba80 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72  ite3ExprAnd(pPar
2ba90 73 65 2d 3e 64 62 2c 20 70 41 6e 64 45 78 70 72  se->db, pAndExpr
2baa0 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
2bab0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e 64  }.      if( pAnd
2bac0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
2bad0 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74  pAndExpr = sqlit
2bae0 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
2baf0 54 4b 5f 41 4e 44 2c 20 30 2c 20 70 41 6e 64 45  TK_AND, 0, pAndE
2bb00 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  xpr, 0);.      }
2bb10 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
2bb20 69 69 3d 30 3b 20 69 69 3c 70 4f 72 57 63 2d 3e  ii=0; ii<pOrWc->
2bb30 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20  nTerm; ii++){.  
2bb40 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
2bb50 4f 72 54 65 72 6d 20 3d 20 26 70 4f 72 57 63 2d  OrTerm = &pOrWc-
2bb60 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20 69 66  >a[ii];.      if
2bb70 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
2bb80 75 72 73 6f 72 3d 3d 69 43 75 72 20 7c 7c 20 28  ursor==iCur || (
2bb90 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
2bba0 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20  or & WO_AND)!=0 
2bbb0 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  ){.        Where
2bbc0 49 6e 66 6f 20 2a 70 53 75 62 57 49 6e 66 6f 3b  Info *pSubWInfo;
2bbd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66            /* Inf
2bbe0 6f 20 66 6f 72 20 73 69 6e 67 6c 65 20 4f 52 2d  o for single OR-
2bbf0 74 65 72 6d 20 73 63 61 6e 20 2a 2f 0a 20 20 20  term scan */.   
2bc00 20 20 20 20 20 45 78 70 72 20 2a 70 4f 72 45 78       Expr *pOrEx
2bc10 70 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45  pr = pOrTerm->pE
2bc20 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  xpr;.        if(
2bc30 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20   pAndExpr ){.   
2bc40 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 2d         pAndExpr-
2bc50 3e 70 4c 65 66 74 20 3d 20 70 4f 72 45 78 70 72  >pLeft = pOrExpr
2bc60 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72 45  ;.          pOrE
2bc70 78 70 72 20 3d 20 70 41 6e 64 45 78 70 72 3b 0a  xpr = pAndExpr;.
2bc80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bc90 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
2bca0 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20  h table entries 
2bcb0 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20  that match term 
2bcc0 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  pOrTerm. */.    
2bcd0 20 20 20 20 70 53 75 62 57 49 6e 66 6f 20 3d 20      pSubWInfo = 
2bce0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2bcf0 6e 28 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62  n(pParse, pOrTab
2bd00 2c 20 70 4f 72 45 78 70 72 2c 20 30 2c 20 30 2c  , pOrExpr, 0, 0,
2bd10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bd20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 4f           WHERE_O
2bd30 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 20 7c  MIT_OPEN_CLOSE |
2bd40 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20   WHERE_AND_ONLY 
2bd50 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
2bd60 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f            WHERE_
2bd70 46 4f 52 43 45 5f 54 41 42 4c 45 20 7c 20 57 48  FORCE_TABLE | WH
2bd80 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
2bd90 59 2c 20 69 43 6f 76 43 75 72 29 3b 0a 20 20 20  Y, iCovCur);.   
2bda0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
2bdb0 62 57 49 6e 66 6f 20 7c 7c 20 70 50 61 72 73 65  bWInfo || pParse
2bdc0 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65  ->nErr || pParse
2bdd0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
2bde0 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ed );.        if
2bdf0 28 20 70 53 75 62 57 49 6e 66 6f 20 29 7b 0a 20  ( pSubWInfo ){. 
2be00 20 20 20 20 20 20 20 20 20 57 68 65 72 65 4c 65           WhereLe
2be10 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 20 20 20  vel *pLvl;.     
2be20 20 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53       explainOneS
2be30 63 61 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20  can(.           
2be40 20 20 20 70 50 61 72 73 65 2c 20 70 4f 72 54 61     pParse, pOrTa
2be50 62 2c 20 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61  b, &pSubWInfo->a
2be60 5b 30 5d 2c 20 69 4c 65 76 65 6c 2c 20 70 4c 65  [0], iLevel, pLe
2be70 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 30 0a 20 20  vel->iFrom, 0.  
2be80 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
2be90 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46       if( (wctrlF
2bea0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 55 50  lags & WHERE_DUP
2beb0 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29  LICATES_OK)==0 )
2bec0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
2bed0 74 20 69 53 65 74 20 3d 20 28 28 69 69 3d 3d 70  t iSet = ((ii==p
2bee0 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d  OrWc->nTerm-1)?-
2bef0 31 3a 69 69 29 3b 0a 20 20 20 20 20 20 20 20 20  1:ii);.         
2bf00 20 20 20 69 6e 74 20 72 3b 0a 20 20 20 20 20 20     int r;.      
2bf10 20 20 20 20 20 20 72 20 3d 20 73 71 6c 69 74 65        r = sqlite
2bf20 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
2bf30 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 49  mn(pParse, pTabI
2bf40 74 65 6d 2d 3e 70 54 61 62 2c 20 2d 31 2c 20 69  tem->pTab, -1, i
2bf50 43 75 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Cur, .          
2bf60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
2bf80 65 67 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20  egRowid, 0);.   
2bf90 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2bfa0 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
2bfb0 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 2c 20   OP_RowSetTest, 
2bfc0 72 65 67 52 6f 77 73 65 74 2c 0a 20 20 20 20 20  regRowset,.     
2bfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bfe0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2bff0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2c000 64 72 28 76 29 2b 32 2c 20 72 2c 20 69 53 65 74  dr(v)+2, r, iSet
2c010 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2c020 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2c030 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2c040 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 74 75 72  _Gosub, regRetur
2c050 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a  n, iLoopBody);..
2c060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2c070 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65   pSubWInfo->unte
2c080 73 74 65 64 54 65 72 6d 73 20 66 6c 61 67 20 6d  stedTerms flag m
2c090 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 4f  eans that this O
2c0a0 52 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20  R term.         
2c0b0 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 6f 6e   ** contained on
2c0c0 65 20 6f 72 20 6d 6f 72 65 20 41 4e 44 20 74 65  e or more AND te
2c0d0 72 6d 20 66 72 6f 6d 20 61 20 6e 6f 74 52 65 61  rm from a notRea
2c0e0 64 79 20 74 61 62 6c 65 2e 20 20 54 68 65 0a 20  dy table.  The. 
2c0f0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d           ** term
2c100 73 20 66 72 6f 6d 20 74 68 65 20 6e 6f 74 52 65  s from the notRe
2c110 61 64 79 20 74 61 62 6c 65 20 63 6f 75 6c 64 20  ady table could 
2c120 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20 61 6e  not be tested an
2c130 64 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 20  d will.         
2c140 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 74   ** need to be t
2c150 65 73 74 65 64 20 6c 61 74 65 72 2e 0a 20 20 20  ested later..   
2c160 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2c170 20 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66      if( pSubWInf
2c180 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73  o->untestedTerms
2c190 20 29 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73   ) untestedTerms
2c1a0 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20   = 1;..         
2c1b0 20 2f 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68   /* If all of th
2c1c0 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74  e OR-connected t
2c1d0 65 72 6d 73 20 61 72 65 20 6f 70 74 69 6d 69 7a  erms are optimiz
2c1e0 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  ed using the sam
2c1f0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  e.          ** i
2c200 6e 64 65 78 2c 20 61 6e 64 20 74 68 65 20 69 6e  ndex, and the in
2c210 64 65 78 20 69 73 20 6f 70 65 6e 65 64 20 75 73  dex is opened us
2c220 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 75 72  ing the same cur
2c230 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20 20 20  sor number.     
2c240 20 20 20 20 20 2a 2a 20 62 79 20 65 61 63 68 20       ** by each 
2c250 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57  call to sqlite3W
2c260 68 65 72 65 42 65 67 69 6e 28 29 20 6d 61 64 65  hereBegin() made
2c270 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 2c 20 69   by this loop, i
2c280 74 20 6d 61 79 0a 20 20 20 20 20 20 20 20 20 20  t may.          
2c290 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ** be possible t
2c2a0 6f 20 75 73 65 20 74 68 61 74 20 69 6e 64 65 78  o use that index
2c2b0 20 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69   as a covering i
2c2c0 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20  ndex..          
2c2d0 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  **.          ** 
2c2e0 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  If the call to s
2c2f0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2c300 28 29 20 61 62 6f 76 65 20 72 65 73 75 6c 74 65  () above resulte
2c310 64 20 69 6e 20 61 20 73 63 61 6e 20 74 68 61 74  d in a scan that
2c320 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73  .          ** us
2c330 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 61 6e 64  es an index, and
2c340 20 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20   this is either 
2c350 74 68 65 20 66 69 72 73 74 20 4f 52 2d 63 6f 6e  the first OR-con
2c360 6e 65 63 74 65 64 20 74 65 72 6d 0a 20 20 20 20  nected term.    
2c370 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
2c380 65 64 20 6f 72 20 74 68 65 20 69 6e 64 65 78 20  ed or the index 
2c390 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
2c3a0 68 61 74 20 75 73 65 64 20 62 79 20 61 6c 6c 20  hat used by all 
2c3b0 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20  previous.       
2c3c0 20 20 20 2a 2a 20 74 65 72 6d 73 2c 20 73 65 74     ** terms, set
2c3d0 20 70 43 6f 76 20 74 6f 20 74 68 65 20 63 61 6e   pCov to the can
2c3e0 64 69 64 61 74 65 20 63 6f 76 65 72 69 6e 67 20  didate covering 
2c3f0 69 6e 64 65 78 2e 20 4f 74 68 65 72 77 69 73 65  index. Otherwise
2c400 2c 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 20  , set .         
2c410 20 2a 2a 20 70 43 6f 76 20 74 6f 20 4e 55 4c 4c   ** pCov to NULL
2c420 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
2c430 74 20 6e 6f 20 63 61 6e 64 69 64 61 74 65 20 63  t no candidate c
2c440 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 77 69  overing index wi
2c450 6c 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ll .          **
2c460 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 20   be available.. 
2c470 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2c480 20 20 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 53        pLvl = &pS
2c490 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 3b 0a 20  ubWInfo->a[0];. 
2c4a0 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4c           if( (pL
2c4b0 76 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  vl->plan.wsFlags
2c4c0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
2c4d0 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
2c4e0 26 26 20 28 70 4c 76 6c 2d 3e 70 6c 61 6e 2e 77  && (pLvl->plan.w
2c4f0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
2c500 45 4d 50 5f 49 4e 44 45 58 29 3d 3d 30 0a 20 20  EMP_INDEX)==0.  
2c510 20 20 20 20 20 20 20 20 20 26 26 20 28 69 69 3d           && (ii=
2c520 3d 30 20 7c 7c 20 70 4c 76 6c 2d 3e 70 6c 61 6e  =0 || pLvl->plan
2c530 2e 75 2e 70 49 64 78 3d 3d 70 43 6f 76 29 0a 20  .u.pIdx==pCov). 
2c540 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
2c550 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2c560 70 4c 76 6c 2d 3e 69 49 64 78 43 75 72 3d 3d 69  pLvl->iIdxCur==i
2c570 43 6f 76 43 75 72 20 29 3b 0a 20 20 20 20 20 20  CovCur );.      
2c580 20 20 20 20 20 20 70 43 6f 76 20 3d 20 70 4c 76        pCov = pLv
2c590 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a  l->plan.u.pIdx;.
2c5a0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2c5b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
2c5c0 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  v = 0;.         
2c5d0 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   }..          /*
2c5e0 20 46 69 6e 69 73 68 20 74 68 65 20 6c 6f 6f 70   Finish the loop
2c5f0 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65   through table e
2c600 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61 74 63  ntries that matc
2c610 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20  h term pOrTerm. 
2c620 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  */.          sql
2c630 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 53 75  ite3WhereEnd(pSu
2c640 62 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  bWInfo);.       
2c650 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2c660 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 70  .    pLevel->u.p
2c670 43 6f 76 69 64 78 20 3d 20 70 43 6f 76 3b 0a 20  Covidx = pCov;. 
2c680 20 20 20 69 66 28 20 70 43 6f 76 20 29 20 70 4c     if( pCov ) pL
2c690 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20  evel->iIdxCur = 
2c6a0 69 43 6f 76 43 75 72 3b 0a 20 20 20 20 69 66 28  iCovCur;.    if(
2c6b0 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20   pAndExpr ){.   
2c6c0 20 20 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65     pAndExpr->pLe
2c6d0 66 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  ft = 0;.      sq
2c6e0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
2c6f0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 6e 64  pParse->db, pAnd
2c700 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Expr);.    }.   
2c710 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2c720 67 65 50 31 28 76 2c 20 69 52 65 74 49 6e 69 74  geP1(v, iRetInit
2c730 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
2c740 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20  rentAddr(v));.  
2c750 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2c760 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
2c770 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42  0, pLevel->addrB
2c780 72 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rk);.    sqlite3
2c790 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
2c7a0 28 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a  (v, iLoopBody);.
2c7b0 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
2c7c0 3e 6e 4c 65 76 65 6c 3e 31 20 29 20 73 71 6c 69  >nLevel>1 ) sqli
2c7d0 74 65 33 53 74 61 63 6b 46 72 65 65 28 70 50 61  te3StackFree(pPa
2c7e0 72 73 65 2d 3e 64 62 2c 20 70 4f 72 54 61 62 29  rse->db, pOrTab)
2c7f0 3b 0a 20 20 20 20 69 66 28 20 21 75 6e 74 65 73  ;.    if( !untes
2c800 74 65 64 54 65 72 6d 73 20 29 20 64 69 73 61 62  tedTerms ) disab
2c810 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
2c820 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  Term);.  }else.#
2c830 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2c840 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
2c850 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20  TION */..  {.   
2c860 20 2f 2a 20 43 61 73 65 20 35 3a 20 20 54 68 65   /* Case 5:  The
2c870 72 65 20 69 73 20 6e 6f 20 75 73 61 62 6c 65 20  re is no usable 
2c880 69 6e 64 65 78 2e 20 20 57 65 20 6d 75 73 74 20  index.  We must 
2c890 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20  do a complete.  
2c8a0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63    **          sc
2c8b0 61 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  an of the entire
2c8c0 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20   table..    */. 
2c8d0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
2c8e0 75 38 20 61 53 74 65 70 5b 5d 20 3d 20 7b 20 4f  u8 aStep[] = { O
2c8f0 50 5f 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76 20  P_Next, OP_Prev 
2c900 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  };.    static co
2c910 6e 73 74 20 75 38 20 61 53 74 61 72 74 5b 5d 20  nst u8 aStart[] 
2c920 3d 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 4f  = { OP_Rewind, O
2c930 50 5f 4c 61 73 74 20 7d 3b 0a 20 20 20 20 61 73  P_Last };.    as
2c940 73 65 72 74 28 20 62 52 65 76 3d 3d 30 20 7c 7c  sert( bRev==0 ||
2c950 20 62 52 65 76 3d 3d 31 20 29 3b 0a 20 20 20 20   bRev==1 );.    
2c960 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c  assert( omitTabl
2c970 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 65 76  e==0 );.    pLev
2c980 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65 70 5b 62  el->op = aStep[b
2c990 52 65 76 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Rev];.    pLevel
2c9a0 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20  ->p1 = iCur;.   
2c9b0 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20   pLevel->p2 = 1 
2c9c0 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
2c9d0 4f 70 32 28 76 2c 20 61 53 74 61 72 74 5b 62 52  Op2(v, aStart[bR
2c9e0 65 76 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42  ev], iCur, addrB
2c9f0 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  rk);.    pLevel-
2ca00 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d  >p5 = SQLITE_STM
2ca10 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e  TSTATUS_FULLSCAN
2ca20 5f 53 54 45 50 3b 0a 20 20 7d 0a 20 20 6e 6f 74  _STEP;.  }.  not
2ca30 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73  Ready &= ~getMas
2ca40 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c  k(pWC->pMaskSet,
2ca50 20 69 43 75 72 29 3b 0a 0a 20 20 2f 2a 20 49 6e   iCur);..  /* In
2ca60 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73  sert code to tes
2ca70 74 20 65 76 65 72 79 20 73 75 62 65 78 70 72 65  t every subexpre
2ca80 73 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62  ssion that can b
2ca90 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a  e completely.  *
2caa0 2a 20 63 6f 6d 70 75 74 65 64 20 75 73 69 6e 67  * computed using
2cab0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74   the current set
2cac0 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a   of tables..  **
2cad0 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  .  ** IMPLEMENTA
2cae0 54 49 4f 4e 2d 4f 46 3a 20 52 2d 34 39 35 32 35  TION-OF: R-49525
2caf0 2d 35 30 39 33 35 20 54 65 72 6d 73 20 74 68 61  -50935 Terms tha
2cb00 74 20 63 61 6e 6e 6f 74 20 62 65 20 73 61 74 69  t cannot be sati
2cb10 73 66 69 65 64 20 74 68 72 6f 75 67 68 0a 20 20  sfied through.  
2cb20 2a 2a 20 74 68 65 20 75 73 65 20 6f 66 20 69 6e  ** the use of in
2cb30 64 69 63 65 73 20 62 65 63 6f 6d 65 20 74 65 73  dices become tes
2cb40 74 73 20 74 68 61 74 20 61 72 65 20 65 76 61 6c  ts that are eval
2cb50 75 61 74 65 64 20 61 67 61 69 6e 73 74 20 65 61  uated against ea
2cb60 63 68 20 72 6f 77 20 6f 66 0a 20 20 2a 2a 20 74  ch row of.  ** t
2cb70 68 65 20 72 65 6c 65 76 61 6e 74 20 69 6e 70 75  he relevant inpu
2cb80 74 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  t tables..  */. 
2cb90 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
2cba0 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b  a, j=pWC->nTerm;
2cbb0 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d   j>0; j--, pTerm
2cbc0 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
2cbd0 45 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  E;.    testcase(
2cbe0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
2cbf0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
2cc00 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 30 35 37  ; /* IMP: R-3057
2cc10 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 74  5-11662 */.    t
2cc20 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
2cc30 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
2cc40 4f 44 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20  ODED );.    if( 
2cc50 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
2cc60 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54   (TERM_VIRTUAL|T
2cc70 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e  ERM_CODED) ) con
2cc80 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
2cc90 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
2cca0 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20   & notReady)!=0 
2ccb0 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
2ccc0 65 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  e( pWInfo->untes
2ccd0 74 65 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20  tedTerms==0.    
2cce0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
2ccf0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
2cd00 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42  s & WHERE_ONETAB
2cd10 4c 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20  LE_ONLY)!=0 );. 
2cd20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74       pWInfo->unt
2cd30 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a  estedTerms = 1;.
2cd40 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
2cd50 20 20 20 20 7d 0a 20 20 20 20 70 45 20 3d 20 70      }.    pE = p
2cd60 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
2cd70 20 61 73 73 65 72 74 28 20 70 45 21 3d 30 20 29   assert( pE!=0 )
2cd80 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
2cd90 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21  ->iLeftJoin && !
2cda0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2cdb0 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pE, EP_FromJoin)
2cdc0 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   ){.      contin
2cdd0 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ue;.    }.    sq
2cde0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
2cdf0 28 70 50 61 72 73 65 2c 20 70 45 2c 20 61 64 64  (pParse, pE, add
2ce00 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55  rCont, SQLITE_JU
2ce10 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70  MPIFNULL);.    p
2ce20 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
2ce30 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d   TERM_CODED;.  }
2ce40 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46  ..  /* For a LEF
2ce50 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65  T OUTER JOIN, ge
2ce60 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
2ce70 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65   will record the
2ce80 20 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20   fact that.  ** 
2ce90 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77  at least one row
2cea0 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61   of the right ta
2ceb0 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64 20  ble has matched 
2cec0 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20  the left table. 
2ced0 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65   .  */.  if( pLe
2cee0 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29  vel->iLeftJoin )
2cef0 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64  {.    pLevel->ad
2cf00 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65  drFirst = sqlite
2cf10 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
2cf20 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
2cf30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2cf40 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65  _Integer, 1, pLe
2cf50 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b  vel->iLeftJoin);
2cf60 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
2cf70 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46  ((v, "record LEF
2cf80 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20  T JOIN hit"));. 
2cf90 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
2cfa0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
2cfb0 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d  ;.    for(pTerm=
2cfc0 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70  pWC->a, j=0; j<p
2cfd0 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20  WC->nTerm; j++, 
2cfe0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
2cff0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
2d000 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
2d010 56 49 52 54 55 41 4c 20 29 3b 20 20 2f 2a 20 49  VIRTUAL );  /* I
2d020 4d 50 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36  MP: R-30575-1166
2d030 32 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  2 */.      testc
2d040 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
2d050 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
2d060 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   );.      if( pT
2d070 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
2d080 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
2d090 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69  M_CODED) ) conti
2d0a0 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28  nue;.      if( (
2d0b0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
2d0c0 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20   & notReady)!=0 
2d0d0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
2d0e0 74 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  t( pWInfo->untes
2d0f0 74 65 64 54 65 72 6d 73 20 29 3b 0a 20 20 20 20  tedTerms );.    
2d100 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2d110 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
2d120 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  rt( pTerm->pExpr
2d130 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
2d140 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
2d150 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70  rse, pTerm->pExp
2d160 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c  r, addrCont, SQL
2d170 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
2d180 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  .      pTerm->wt
2d190 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
2d1a0 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  DED;.    }.  }. 
2d1b0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
2d1c0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 69  empReg(pParse, i
2d1d0 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 0a 20 20  ReleaseReg);..  
2d1e0 72 65 74 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b  return notReady;
2d1f0 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
2d200 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a  SQLITE_TEST)./*.
2d210 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
2d220 20 76 61 72 69 61 62 6c 65 20 68 6f 6c 64 73 20   variable holds 
2d230 61 20 74 65 78 74 20 64 65 73 63 72 69 70 74 69  a text descripti
2d240 6f 6e 20 6f 66 20 71 75 65 72 79 20 70 6c 61 6e  on of query plan
2d250 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 62 79   generated.** by
2d260 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
2d270 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
2d280 57 68 65 72 65 42 65 67 69 6e 28 29 2e 20 20 45  WhereBegin().  E
2d290 61 63 68 20 63 61 6c 6c 20 74 6f 20 57 68 65 72  ach call to Wher
2d2a0 65 42 65 67 69 6e 0a 2a 2a 20 6f 76 65 72 77 72  eBegin.** overwr
2d2b0 69 74 65 73 20 74 68 65 20 70 72 65 76 69 6f 75  ites the previou
2d2c0 73 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  s.  This informa
2d2d0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
2d2e0 20 74 65 73 74 69 6e 67 20 61 6e 64 0a 2a 2a 20   testing and.** 
2d2f0 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a  analysis only..*
2d300 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 5f 71  /.char sqlite3_q
2d310 75 65 72 79 5f 70 6c 61 6e 5b 42 4d 53 2a 32 2a  uery_plan[BMS*2*
2d320 34 30 5d 3b 20 20 2f 2a 20 54 65 78 74 20 6f 66  40];  /* Text of
2d330 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 73 74 61   the join */.sta
2d340 74 69 63 20 69 6e 74 20 6e 51 50 6c 61 6e 20 3d  tic int nQPlan =
2d350 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2d360 20 2f 2a 20 4e 65 78 74 20 66 72 65 65 20 73 6c   /* Next free sl
2d370 6f 77 20 69 6e 20 5f 71 75 65 72 79 5f 70 6c 61  ow in _query_pla
2d380 6e 5b 5d 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f  n[] */..#endif /
2d390 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f  * SQLITE_TEST */
2d3a0 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20  .../*.** Free a 
2d3b0 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74  WhereInfo struct
2d3c0 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ure.*/.static vo
2d3d0 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65  id whereInfoFree
2d3e0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
2d3f0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
2d400 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  {.  if( ALWAYS(p
2d410 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 69 6e  WInfo) ){.    in
2d420 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
2d430 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  ; i<pWInfo->nLev
2d440 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  el; i++){.      
2d450 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
2d460 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 57 49 6e  fo *pInfo = pWIn
2d470 66 6f 2d 3e 61 5b 69 5d 2e 70 49 64 78 49 6e 66  fo->a[i].pIdxInf
2d480 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  o;.      if( pIn
2d490 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  fo ){.        /*
2d4a0 20 61 73 73 65 72 74 28 20 70 49 6e 66 6f 2d 3e   assert( pInfo->
2d4b0 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
2d4c0 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  ==0 || db->mallo
2d4d0 63 46 61 69 6c 65 64 20 29 3b 20 2a 2f 0a 20 20  cFailed ); */.  
2d4e0 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d        if( pInfo-
2d4f0 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
2d500 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  r ){.          s
2d510 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e 66  qlite3_free(pInf
2d520 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  o->idxStr);.    
2d530 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
2d540 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2d550 70 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  pInfo);.      }.
2d560 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
2d570 2d 3e 61 5b 69 5d 2e 70 6c 61 6e 2e 77 73 46 6c  ->a[i].plan.wsFl
2d580 61 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50  ags & WHERE_TEMP
2d590 5f 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 20 20  _INDEX ){.      
2d5a0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20    Index *pIdx = 
2d5b0 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 6c 61  pWInfo->a[i].pla
2d5c0 6e 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20 20 20  n.u.pIdx;.      
2d5d0 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20    if( pIdx ){.  
2d5e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
2d5f0 62 46 72 65 65 28 64 62 2c 20 70 49 64 78 2d 3e  bFree(db, pIdx->
2d600 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20 20  zColAff);.      
2d610 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2d620 65 28 64 62 2c 20 70 49 64 78 29 3b 0a 20 20 20  e(db, pIdx);.   
2d630 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2d640 20 20 20 7d 0a 20 20 20 20 77 68 65 72 65 43 6c     }.    whereCl
2d650 61 75 73 65 43 6c 65 61 72 28 70 57 49 6e 66 6f  auseClear(pWInfo
2d660 2d 3e 70 57 43 29 3b 0a 20 20 20 20 73 71 6c 69  ->pWC);.    sqli
2d670 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57  te3DbFree(db, pW
2d680 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  Info);.  }.}.../
2d690 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68  *.** Generate th
2d6a0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
2d6b0 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72  he loop used for
2d6c0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
2d6d0 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65  ocessing..** The
2d6e0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
2d6f0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
2d700 20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75 72   opaque structur
2d710 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a  e that contains.
2d720 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e  ** information n
2d730 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61  eeded to termina
2d740 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61  te the loop.  La
2d750 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  ter, the calling
2d760 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75   routine.** shou
2d770 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ld invoke sqlite
2d780 33 57 68 65 72 65 45 6e 64 28 29 20 77 69 74 68  3WhereEnd() with
2d790 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
2d7a0 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
2d7b0 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  on.** in order t
2d7c0 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57  o complete the W
2d7d0 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
2d7e0 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  essing..**.** If
2d7f0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2d800 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
2d810 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  eturns NULL..**.
2d820 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69 64 65  ** The basic ide
2d830 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73  a is to do a nes
2d840 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f  ted loop, one lo
2d850 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c  op for each tabl
2d860 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d  e in.** the FROM
2d870 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c   clause of a sel
2d880 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e  ect.  (INSERT an
2d890 64 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  d UPDATE stateme
2d8a0 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73  nts are the.** s
2d8b0 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54 20  ame as a SELECT 
2d8c0 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67  with only a sing
2d8d0 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  le table in the 
2d8e0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46  FROM clause.)  F
2d8f0 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69  or.** example, i
2d900 66 20 74 68 65 20 53 51 4c 20 69 73 20 74 68 69  f the SQL is thi
2d910 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53  s:.**.**       S
2d920 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c  ELECT * FROM t1,
2d930 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e   t2, t3 WHERE ..
2d940 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68  .;.**.** Then th
2d950 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
2d960 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79   is conceptually
2d970 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77   like the follow
2d980 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ing:.**.**      
2d990 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20  foreach row1 in 
2d9a0 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20  t1 do       \   
2d9b0 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a   Code generated.
2d9c0 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  **        foreac
2d9d0 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20  h row2 in t2 do 
2d9e0 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69       |-- by sqli
2d9f0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a  te3WhereBegin().
2da00 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  **          fore
2da10 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64  ach row3 in t3 d
2da20 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20  o   /.**        
2da30 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20      ....**      
2da40 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
2da50 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 20 20              \   
2da60 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a   Code generated.
2da70 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20 20  **        end   
2da80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da90 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69       |-- by sqli
2daa0 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a  te3WhereEnd().**
2dab0 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20        end       
2dac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dad0 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74    /.**.** Note t
2dae0 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69  hat the loops mi
2daf0 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65  ght not be neste
2db00 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69  d in the order i
2db10 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20  n which they.** 
2db20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52  appear in the FR
2db30 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20 64  OM clause if a d
2db40 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69  ifferent order i
2db50 73 20 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f  s better able to
2db60 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20   make.** use of 
2db70 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61  indices.  Note a
2db80 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68  lso that when th
2db90 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70  e IN operator ap
2dba0 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20  pears in.** the 
2dbb0 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74  WHERE clause, it
2dbc0 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e   might result in
2dbd0 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74   additional nest
2dbe0 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20  ed loops for.** 
2dbf0 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
2dc00 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74   all values on t
2dc10 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
2dc20 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a  de of the IN..**
2dc30 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42 74  .** There are Bt
2dc40 72 65 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f  ree cursors asso
2dc50 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68  ciated with each
2dc60 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73   table.  t1 uses
2dc70 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65   cursor.** numbe
2dc80 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  r pTabList->a[0]
2dc90 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73  .iCursor.  t2 us
2dca0 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 70 54  es the cursor pT
2dcb0 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75  abList->a[1].iCu
2dcc0 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20  rsor..** And so 
2dcd0 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75  forth.  This rou
2dce0 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
2dcf0 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73  ode to open thos
2dd00 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a  e VDBE cursors.*
2dd10 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65  * and sqlite3Whe
2dd20 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65  reEnd() generate
2dd30 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c  s the code to cl
2dd40 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20  ose them..**.** 
2dd50 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71  The code that sq
2dd60 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2dd70 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76  ) generates leav
2dd80 65 73 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e  es the cursors n
2dd90 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c  amed.** in pTabL
2dda0 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  ist pointing at 
2ddb0 74 68 65 69 72 20 61 70 70 72 6f 70 72 69 61 74  their appropriat
2ddc0 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20  e entries.  The 
2ddd0 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61  [...] code.** ca
2dde0 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20  n use OP_Column 
2ddf0 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63  and OP_Rowid opc
2de00 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75  odes on these cu
2de10 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74  rsors to extract
2de20 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68  .** data from th
2de30 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73  e various tables
2de40 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a   of the loop..**
2de50 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45  .** If the WHERE
2de60 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79   clause is empty
2de70 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f  , the foreach lo
2de80 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20 73 63  ops must each sc
2de90 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69  an their.** enti
2dea0 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73  re tables.  Thus
2deb0 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69   a three-way joi
2dec0 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f  n is an O(N^3) o
2ded0 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69  peration.  But i
2dee0 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20  f.** the tables 
2def0 68 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64  have indices and
2df00 20 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73   there are terms
2df10 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
2df20 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66  ause that.** ref
2df30 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69  er to those indi
2df40 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20  ces, a complete 
2df50 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62  table scan can b
2df60 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68  e avoided and th
2df70 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72  e.** code will r
2df80 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20  un much faster. 
2df90 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72   Most of the wor
2dfa0 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  k of this routin
2dfb0 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  e is checking.**
2dfc0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
2dfd0 20 61 72 65 20 69 6e 64 69 63 65 73 20 74 68 61   are indices tha
2dfe0 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
2dff0 20 73 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f   speed up the lo
2e000 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20  op..**.** Terms 
2e010 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
2e020 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65  use are also use
2e030 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68  d to limit which
2e040 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a   rows actually.*
2e050 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65  * make it to the
2e060 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69   "..." in the mi
2e070 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ddle of the loop
2e080 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 22 66  .  After each "f
2e090 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d  oreach",.** term
2e0a0 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
2e0b0 6c 61 75 73 65 20 74 68 61 74 20 75 73 65 20 6f  lause that use o
2e0c0 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61  nly terms in tha
2e0d0 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72  t loop and outer
2e0e0 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76  .** loops are ev
2e0f0 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20 66  aluated and if f
2e100 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d  alse a jump is m
2e110 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73  ade around all s
2e120 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e  ubsequent.** inn
2e130 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f  er loops (or aro
2e140 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66  und the "..." if
2e150 20 74 68 65 20 74 65 73 74 20 6f 63 63 75 72 73   the test occurs
2e160 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65   within the inne
2e170 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29  r-.** most loop)
2e180 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49  .**.** OUTER JOI
2e190 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65  NS.**.** An oute
2e1a0 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73  r join of tables
2e1b0 20 74 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f   t1 and t2 is co
2e1c0 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20  nceptally coded 
2e1d0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
2e1e0 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77  *    foreach row
2e1f0 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20  1 in t1 do.**   
2e200 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20     flag = 0.**  
2e210 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32      foreach row2
2e220 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20   in t2 do.**    
2e230 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20      start:.**   
2e240 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20         ....**   
2e250 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a         flag = 1.
2e260 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20  **      end.**  
2e270 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74      if flag==0 t
2e280 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f  hen.**        mo
2e290 76 65 20 74 68 65 20 72 6f 77 32 20 63 75 72 73  ve the row2 curs
2e2a0 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77  or to a null row
2e2b0 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .**        goto 
2e2c0 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69  start.**      fi
2e2d0 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a  .**    end.**.**
2e2e0 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53 45   ORDER BY CLAUSE
2e2f0 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a   PROCESSING.**.*
2e300 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20 61 20  * pOrderBy is a 
2e310 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f  pointer to the O
2e320 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
2e330 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  f a SELECT state
2e340 6d 65 6e 74 2c 0a 2a 2a 20 69 66 20 74 68 65 72  ment,.** if ther
2e350 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68  e is one.  If th
2e360 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
2e370 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20  BY clause or if 
2e380 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
2e390 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61  is called from a
2e3a0 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
2e3b0 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  TE statement, th
2e3c0 65 6e 20 70 4f 72 64 65 72 42 79 20 69 73 20 4e  en pOrderBy is N
2e3d0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ULL..**.** If an
2e3e0 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73   index can be us
2e3f0 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  ed so that the n
2e400 61 74 75 72 61 6c 20 6f 75 74 70 75 74 20 6f 72  atural output or
2e410 64 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65  der of the table
2e420 0a 2a 2a 20 73 63 61 6e 20 69 73 20 63 6f 72 72  .** scan is corr
2e430 65 63 74 20 66 6f 72 20 74 68 65 20 4f 52 44 45  ect for the ORDE
2e440 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
2e450 6e 20 74 68 61 74 20 69 6e 64 65 78 20 69 73 20  n that index is 
2e460 75 73 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20  used and.** the 
2e470 72 65 74 75 72 6e 65 64 20 57 68 65 72 65 49 6e  returned WhereIn
2e480 66 6f 2e 6e 4f 42 53 61 74 20 66 69 65 6c 64 20  fo.nOBSat field 
2e490 69 73 20 73 65 74 20 74 6f 20 70 4f 72 64 65 72  is set to pOrder
2e4a0 42 79 2d 3e 6e 45 78 70 72 2e 20 20 54 68 69 73  By->nExpr.  This
2e4b0 0a 2a 2a 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  .** is an optimi
2e4c0 7a 61 74 69 6f 6e 20 74 68 61 74 20 70 72 65 76  zation that prev
2e4d0 65 6e 74 73 20 61 6e 20 75 6e 6e 65 63 65 73 73  ents an unnecess
2e4e0 61 72 79 20 73 6f 72 74 20 6f 66 20 74 68 65 20  ary sort of the 
2e4f0 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 69 66  result set.** if
2e500 20 61 6e 20 69 6e 64 65 78 20 61 70 70 72 6f 70   an index approp
2e510 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 4f 52  riate for the OR
2e520 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6c  DER BY clause al
2e530 72 65 61 64 79 20 65 78 69 73 74 73 2e 0a 2a 2a  ready exists..**
2e540 0a 2a 2a 20 49 66 20 74 68 65 20 77 68 65 72 65  .** If the where
2e550 20 63 6c 61 75 73 65 20 6c 6f 6f 70 73 20 63 61   clause loops ca
2e560 6e 6e 6f 74 20 62 65 20 61 72 72 61 6e 67 65 64  nnot be arranged
2e570 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20   to provide the 
2e580 63 6f 72 72 65 63 74 0a 2a 2a 20 6f 75 74 70 75  correct.** outpu
2e590 74 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 57 68  t order, then Wh
2e5a0 65 72 65 49 6e 66 6f 2e 6e 4f 42 53 61 74 20 69  ereInfo.nOBSat i
2e5b0 73 20 30 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66  s 0..*/.WhereInf
2e5c0 6f 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42  o *sqlite3WhereB
2e5d0 65 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  egin(.  Parse *p
2e5e0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
2e5f0 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
2e600 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
2e610 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f   *pTabList,    /
2e620 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  * A list of all 
2e630 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61  tables to be sca
2e640 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nned */.  Expr *
2e650 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20  pWhere,         
2e660 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
2e670 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
2e680 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f  t *pOrderBy,   /
2e690 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  * An ORDER BY cl
2e6a0 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  ause, or NULL */
2e6b0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69  .  ExprList *pDi
2e6c0 73 74 69 6e 63 74 2c 20 20 2f 2a 20 54 68 65 20  stinct,  /* The 
2e6d0 73 65 6c 65 63 74 2d 6c 69 73 74 20 66 6f 72 20  select-list for 
2e6e0 44 49 53 54 49 4e 43 54 20 71 75 65 72 69 65 73  DISTINCT queries
2e6f0 20 2d 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20   - or NULL */.  
2e700 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20  u16 wctrlFlags, 
2e710 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
2e720 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67  the WHERE_* flag
2e730 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c  s defined in sql
2e740 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e  iteInt.h */.  in
2e750 74 20 69 49 64 78 43 75 72 20 20 20 20 20 20 20  t iIdxCur       
2e760 20 20 20 20 2f 2a 20 49 66 20 57 48 45 52 45 5f      /* If WHERE_
2e770 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73  ONETABLE_ONLY is
2e780 20 73 65 74 2c 20 69 6e 64 65 78 20 63 75 72 73   set, index curs
2e790 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a  or number */.){.
2e7a0 20 20 69 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f    int nByteWInfo
2e7b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2e7c0 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63  Num. bytes alloc
2e7d0 61 74 65 64 20 66 6f 72 20 57 68 65 72 65 49 6e  ated for WhereIn
2e7e0 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 69  fo struct */.  i
2e7f0 6e 74 20 6e 54 61 62 4c 69 73 74 3b 20 20 20 20  nt nTabList;    
2e800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2e810 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
2e820 69 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20  in pTabList */. 
2e830 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
2e840 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57  fo;         /* W
2e850 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72  ill become the r
2e860 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
2e870 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
2e880 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
2e890 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20  se->pVdbe;   /* 
2e8a0 54 68 65 20 76 69 72 74 75 61 6c 20 64 61 74 61  The virtual data
2e8b0 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20  base engine */. 
2e8c0 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
2e8d0 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  y;          /* C
2e8e0 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
2e8f0 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e  not yet position
2e900 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 42 65 73  ed */.  WhereBes
2e910 74 49 64 78 20 73 57 42 49 3b 20 20 20 20 20 20  tIdx sWBI;      
2e920 20 20 20 2f 2a 20 42 65 73 74 20 69 6e 64 65 78     /* Best index
2e930 20 73 65 61 72 63 68 20 63 6f 6e 74 65 78 74 20   search context 
2e940 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
2e950 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20  t *pMaskSet;    
2e960 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
2e970 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20  n mask set */.  
2e980 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
2e990 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20  el;        /* A 
2e9a0 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20  single level in 
2e9b0 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20  pWInfo->a[] */. 
2e9c0 20 69 6e 74 20 69 46 72 6f 6d 3b 20 20 20 20 20   int iFrom;     
2e9d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2e9e0 69 72 73 74 20 75 6e 75 73 65 64 20 46 52 4f 4d  irst unused FROM
2e9f0 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20   clause element 
2ea00 2a 2f 0a 20 20 69 6e 74 20 61 6e 64 46 6c 61 67  */.  int andFlag
2ea10 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
2ea20 2f 2a 20 41 4e 44 2d 65 64 20 63 6f 6d 62 69 6e  /* AND-ed combin
2ea30 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 70 57 43  ation of all pWC
2ea40 2d 3e 61 5b 5d 2e 77 74 46 6c 61 67 73 20 2a 2f  ->a[].wtFlags */
2ea50 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
2ea60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ea70 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
2ea80 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
2ea90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2eaa0 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
2eab0 74 69 6f 6e 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 56  tion */...  /* V
2eac0 61 72 69 61 62 6c 65 20 69 6e 69 74 69 61 6c 69  ariable initiali
2ead0 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 6d 65 6d 73  zation */.  mems
2eae0 65 74 28 26 73 57 42 49 2c 20 30 2c 20 73 69 7a  et(&sWBI, 0, siz
2eaf0 65 6f 66 28 73 57 42 49 29 29 3b 0a 20 20 73 57  eof(sWBI));.  sW
2eb00 42 49 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  BI.pParse = pPar
2eb10 73 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75  se;..  /* The nu
2eb20 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69  mber of tables i
2eb30 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2eb40 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20  e is limited by 
2eb50 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
2eb60 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69 74  ** bits in a Bit
2eb70 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73  mask .  */.  tes
2eb80 74 63 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d  tcase( pTabList-
2eb90 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20  >nSrc==BMS );.  
2eba0 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  if( pTabList->nS
2ebb0 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71  rc>BMS ){.    sq
2ebc0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2ebd0 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25  arse, "at most %
2ebe0 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f  d tables in a jo
2ebf0 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72  in", BMS);.    r
2ec00 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
2ec10 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
2ec20 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61   normally genera
2ec30 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f  tes a nested loo
2ec40 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  p for all tables
2ec50 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69   in .  ** pTabLi
2ec60 73 74 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  st.  But if the 
2ec70 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
2ec80 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74 2c  NLY flag is set,
2ec90 20 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a   then we should.
2eca0 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61    ** only genera
2ecb0 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
2ecc0 66 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70  first table in p
2ecd0 54 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75  TabList and assu
2ece0 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79  me that.  ** any
2ecf0 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61   cursors associa
2ed00 74 65 64 20 77 69 74 68 20 73 75 62 73 65 71 75  ted with subsequ
2ed10 65 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20 75  ent tables are u
2ed20 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20  ninitialized..  
2ed30 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20  */.  nTabList = 
2ed40 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
2ed50 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
2ed60 59 29 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73  Y) ? 1 : pTabLis
2ed70 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41  t->nSrc;..  /* A
2ed80 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
2ed90 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65  ialize the Where
2eda0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
2edb0 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  hat will become 
2edc0 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  the.  ** return 
2edd0 76 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20  value. A single 
2ede0 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73  allocation is us
2edf0 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
2ee00 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73  WhereInfo.  ** s
2ee10 74 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65  truct, the conte
2ee20 6e 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f  nts of WhereInfo
2ee30 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43  .a[], the WhereC
2ee40 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a  lause structure.
2ee50 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65    ** and the Whe
2ee60 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74  reMaskSet struct
2ee70 75 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65  ure. Since Where
2ee80 43 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  Clause contains 
2ee90 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66  an 8-byte.  ** f
2eea0 69 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61  ield (type Bitma
2eeb0 73 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20 61  sk) it must be a
2eec0 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62  ligned on an 8-b
2eed0 79 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a  yte boundary on.
2eee0 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74    ** some archit
2eef0 65 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74  ectures. Hence t
2ef00 68 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f  he ROUND8() belo
2ef10 77 2e 0a 20 20 2a 2f 0a 20 20 64 62 20 3d 20 70  w..  */.  db = p
2ef20 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 42 79  Parse->db;.  nBy
2ef30 74 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38  teWInfo = ROUND8
2ef40 28 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66  (sizeof(WhereInf
2ef50 6f 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a  o)+(nTabList-1)*
2ef60 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65  sizeof(WhereLeve
2ef70 6c 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20  l));.  pWInfo = 
2ef80 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
2ef90 65 72 6f 28 64 62 2c 20 0a 20 20 20 20 20 20 6e  ero(db, .      n
2efa0 42 79 74 65 57 49 6e 66 6f 20 2b 20 0a 20 20 20  ByteWInfo + .   
2efb0 20 20 20 73 69 7a 65 6f 66 28 57 68 65 72 65 43     sizeof(WhereC
2efc0 6c 61 75 73 65 29 20 2b 0a 20 20 20 20 20 20 73  lause) +.      s
2efd0 69 7a 65 6f 66 28 57 68 65 72 65 4d 61 73 6b 53  izeof(WhereMaskS
2efe0 65 74 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 64  et).  );.  if( d
2eff0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2f000 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
2f010 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29  Free(db, pWInfo)
2f020 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 30  ;.    pWInfo = 0
2f030 3b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65  ;.    goto where
2f040 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a  BeginError;.  }.
2f050 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c    pWInfo->nLevel
2f060 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70   = nTabList;.  p
2f070 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20  WInfo->pParse = 
2f080 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f  pParse;.  pWInfo
2f090 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61  ->pTabList = pTa
2f0a0 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d  bList;.  pWInfo-
2f0b0 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65  >iBreak = sqlite
2f0c0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
2f0d0 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 57 43  );.  pWInfo->pWC
2f0e0 20 3d 20 73 57 42 49 2e 70 57 43 20 3d 20 28 57   = sWBI.pWC = (W
2f0f0 68 65 72 65 43 6c 61 75 73 65 20 2a 29 26 28 28  hereClause *)&((
2f100 75 38 20 2a 29 70 57 49 6e 66 6f 29 5b 6e 42 79  u8 *)pWInfo)[nBy
2f110 74 65 57 49 6e 66 6f 5d 3b 0a 20 20 70 57 49 6e  teWInfo];.  pWIn
2f120 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d  fo->wctrlFlags =
2f130 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70   wctrlFlags;.  p
2f140 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65  WInfo->savedNQue
2f150 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d  ryLoop = pParse-
2f160 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 70  >nQueryLoop;.  p
2f170 4d 61 73 6b 53 65 74 20 3d 20 28 57 68 65 72 65  MaskSet = (Where
2f180 4d 61 73 6b 53 65 74 2a 29 26 73 57 42 49 2e 70  MaskSet*)&sWBI.p
2f190 57 43 5b 31 5d 3b 0a 20 20 73 57 42 49 2e 61 4c  WC[1];.  sWBI.aL
2f1a0 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  evel = pWInfo->a
2f1b0 3b 0a 0a 20 20 2f 2a 20 44 69 73 61 62 6c 65 20  ;..  /* Disable 
2f1c0 74 68 65 20 44 49 53 54 49 4e 43 54 20 6f 70 74  the DISTINCT opt
2f1d0 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 53 51 4c  imization if SQL
2f1e0 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 20  ITE_DistinctOpt 
2f1f0 69 73 20 73 65 74 20 76 69 61 0a 20 20 2a 2a 20  is set via.  ** 
2f200 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 74 72  sqlite3_test_ctr
2f210 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
2f220 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c  L_OPTIMIZATIONS,
2f230 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66 28 20 4f 70  ...) */.  if( Op
2f240 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c  timizationDisabl
2f250 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 69  ed(db, SQLITE_Di
2f260 73 74 69 6e 63 74 4f 70 74 29 20 29 20 70 44 69  stinctOpt) ) pDi
2f270 73 74 69 6e 63 74 20 3d 20 30 3b 0a 0a 20 20 2f  stinct = 0;..  /
2f280 2a 20 53 70 6c 69 74 20 74 68 65 20 57 48 45 52  * Split the WHER
2f290 45 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65  E clause into se
2f2a0 70 61 72 61 74 65 20 73 75 62 65 78 70 72 65 73  parate subexpres
2f2b0 73 69 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68  sions where each
2f2c0 0a 20 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73  .  ** subexpress
2f2d0 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64  ion is separated
2f2e0 20 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61   by an AND opera
2f2f0 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74  tor..  */.  init
2f300 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b 53 65 74  MaskSet(pMaskSet
2f310 29 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65  );.  whereClause
2f320 49 6e 69 74 28 73 57 42 49 2e 70 57 43 2c 20 70  Init(sWBI.pWC, p
2f330 50 61 72 73 65 2c 20 70 4d 61 73 6b 53 65 74 2c  Parse, pMaskSet,
2f340 20 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20   wctrlFlags);.  
2f350 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43  sqlite3ExprCodeC
2f360 6f 6e 73 74 61 6e 74 73 28 70 50 61 72 73 65 2c  onstants(pParse,
2f370 20 70 57 68 65 72 65 29 3b 0a 20 20 77 68 65 72   pWhere);.  wher
2f380 65 53 70 6c 69 74 28 73 57 42 49 2e 70 57 43 2c  eSplit(sWBI.pWC,
2f390 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29   pWhere, TK_AND)
2f3a0 3b 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 31 35  ;   /* IMP: R-15
2f3b0 38 34 32 2d 35 33 32 39 36 20 2a 2f 0a 20 20 20  842-53296 */.   
2f3c0 20 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63   .  /* Special c
2f3d0 61 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61  ase: a WHERE cla
2f3e0 75 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73  use that is cons
2f3f0 74 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20  tant.  Evaluate 
2f400 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73  the.  ** express
2f410 69 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a  ion and either j
2f420 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20  ump over all of 
2f430 74 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c  the code or fall
2f440 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 69 66   thru..  */.  if
2f450 28 20 70 57 68 65 72 65 20 26 26 20 28 6e 54 61  ( pWhere && (nTa
2f460 62 4c 69 73 74 3d 3d 30 20 7c 7c 20 73 71 6c 69  bList==0 || sqli
2f470 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
2f480 74 4e 6f 74 4a 6f 69 6e 28 70 57 68 65 72 65 29  tNotJoin(pWhere)
2f490 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
2f4a0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
2f4b0 73 65 2c 20 70 57 68 65 72 65 2c 20 70 57 49 6e  se, pWhere, pWIn
2f4c0 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 53 51 4c 49  fo->iBreak, SQLI
2f4d0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
2f4e0 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a      pWhere = 0;.
2f4f0 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e    }..  /* Assign
2f500 20 61 20 62 69 74 20 66 72 6f 6d 20 74 68 65 20   a bit from the 
2f510 62 69 74 6d 61 73 6b 20 74 6f 20 65 76 65 72 79  bitmask to every
2f520 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f   term in the FRO
2f530 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20  M clause..  **. 
2f540 20 2a 2a 20 57 68 65 6e 20 61 73 73 69 67 6e 69   ** When assigni
2f550 6e 67 20 62 69 74 6d 61 73 6b 20 76 61 6c 75 65  ng bitmask value
2f560 73 20 74 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65  s to FROM clause
2f570 20 63 75 72 73 6f 72 73 2c 20 69 74 20 6d 75 73   cursors, it mus
2f580 74 20 62 65 0a 20 20 2a 2a 20 74 68 65 20 63 61  t be.  ** the ca
2f590 73 65 20 74 68 61 74 20 69 66 20 58 20 69 73 20  se that if X is 
2f5a0 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20  the bitmask for 
2f5b0 74 68 65 20 4e 2d 74 68 20 46 52 4f 4d 20 63 6c  the N-th FROM cl
2f5c0 61 75 73 65 20 74 65 72 6d 20 74 68 65 6e 0a 20  ause term then. 
2f5d0 20 2a 2a 20 74 68 65 20 62 69 74 6d 61 73 6b 20   ** the bitmask 
2f5e0 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61  for all FROM cla
2f5f0 75 73 65 20 74 65 72 6d 73 20 74 6f 20 74 68 65  use terms to the
2f600 20 6c 65 66 74 20 6f 66 20 74 68 65 20 4e 2d 74   left of the N-t
2f610 68 20 74 65 72 6d 0a 20 20 2a 2a 20 69 73 20 28  h term.  ** is (
2f620 58 2d 31 29 2e 20 20 20 41 6e 20 65 78 70 72 65  X-1).   An expre
2f630 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f  ssion from the O
2f640 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45  N clause of a LE
2f650 46 54 20 4a 4f 49 4e 20 63 61 6e 20 75 73 65 0a  FT JOIN can use.
2f660 20 20 2a 2a 20 69 74 73 20 45 78 70 72 2e 69 52    ** its Expr.iR
2f670 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 76 61  ightJoinTable va
2f680 6c 75 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20  lue to find the 
2f690 62 69 74 6d 61 73 6b 20 6f 66 20 74 68 65 20 72  bitmask of the r
2f6a0 69 67 68 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20  ight table.  ** 
2f6b0 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 53 75  of the join.  Su
2f6c0 62 74 72 61 63 74 69 6e 67 20 6f 6e 65 20 66 72  btracting one fr
2f6d0 6f 6d 20 74 68 65 20 72 69 67 68 74 20 74 61 62  om the right tab
2f6e0 6c 65 20 62 69 74 6d 61 73 6b 20 67 69 76 65 73  le bitmask gives
2f6f0 20 61 0a 20 20 2a 2a 20 62 69 74 6d 61 73 6b 20   a.  ** bitmask 
2f700 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74  for all tables t
2f710 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68  o the left of th
2f720 65 20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67  e join.  Knowing
2f730 20 74 68 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a   the bitmask.  *
2f740 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  * for all tables
2f750 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
2f760 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69 73 20 69  a left join is i
2f770 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b 65  mportant.  Ticke
2f780 74 20 23 33 30 31 35 2e 0a 20 20 2a 2a 0a 20 20  t #3015..  **.  
2f790 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 69 74  ** Note that bit
2f7a0 6d 61 73 6b 73 20 61 72 65 20 63 72 65 61 74 65  masks are create
2f7b0 64 20 66 6f 72 20 61 6c 6c 20 70 54 61 62 4c 69  d for all pTabLi
2f7c0 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65 73 20  st->nSrc tables 
2f7d0 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74  in.  ** pTabList
2f7e0 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 65 20 66  , not just the f
2f7f0 69 72 73 74 20 6e 54 61 62 4c 69 73 74 20 74 61  irst nTabList ta
2f800 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69 73 74 20  bles.  nTabList 
2f810 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a  is normally.  **
2f820 20 65 71 75 61 6c 20 74 6f 20 70 54 61 62 4c 69   equal to pTabLi
2f830 73 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d 69 67  st->nSrc but mig
2f840 68 74 20 62 65 20 73 68 6f 72 74 65 6e 65 64 20  ht be shortened 
2f850 74 6f 20 31 20 69 66 20 74 68 65 0a 20 20 2a 2a  to 1 if the.  **
2f860 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
2f870 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74  ONLY flag is set
2f880 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  ..  */.  for(ii=
2f890 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e  0; ii<pTabList->
2f8a0 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  nSrc; ii++){.   
2f8b0 20 63 72 65 61 74 65 4d 61 73 6b 28 70 4d 61 73   createMask(pMas
2f8c0 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e  kSet, pTabList->
2f8d0 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  a[ii].iCursor);.
2f8e0 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42    }.#ifndef NDEB
2f8f0 55 47 0a 20 20 7b 0a 20 20 20 20 42 69 74 6d 61  UG.  {.    Bitma
2f900 73 6b 20 74 6f 54 68 65 4c 65 66 74 20 3d 20 30  sk toTheLeft = 0
2f910 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ;.    for(ii=0; 
2f920 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ii<pTabList->nSr
2f930 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
2f940 42 69 74 6d 61 73 6b 20 6d 20 3d 20 67 65 74 4d  Bitmask m = getM
2f950 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54  ask(pMaskSet, pT
2f960 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43  abList->a[ii].iC
2f970 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 61 73  ursor);.      as
2f980 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d 74 6f 54  sert( (m-1)==toT
2f990 68 65 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20  heLeft );.      
2f9a0 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a  toTheLeft |= m;.
2f9b0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
2f9c0 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61  ..  /* Analyze a
2f9d0 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65 78 70  ll of the subexp
2f9e0 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20  ressions.  Note 
2f9f0 74 68 61 74 20 65 78 70 72 41 6e 61 6c 79 7a 65  that exprAnalyze
2fa00 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64  () might.  ** ad
2fa10 64 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65  d new virtual te
2fa20 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  rms onto the end
2fa30 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2fa40 61 75 73 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74  ause.  We do not
2fa50 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e  .  ** want to an
2fa60 61 6c 79 7a 65 20 74 68 65 73 65 20 76 69 72 74  alyze these virt
2fa70 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f 20 73 74  ual terms, so st
2fa80 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74  art analyzing at
2fa90 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e   the end.  ** an
2faa0 64 20 77 6f 72 6b 20 66 6f 72 77 61 72 64 20 73  d work forward s
2fab0 6f 20 74 68 61 74 20 74 68 65 20 61 64 64 65 64  o that the added
2fac0 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 61   virtual terms a
2fad0 72 65 20 6e 65 76 65 72 20 70 72 6f 63 65 73 73  re never process
2fae0 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 78 70 72 41  ed..  */.  exprA
2faf0 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61 62 4c 69  nalyzeAll(pTabLi
2fb00 73 74 2c 20 73 57 42 49 2e 70 57 43 29 3b 0a 20  st, sWBI.pWC);. 
2fb10 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2fb20 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
2fb30 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
2fb40 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  r;.  }..  /* Che
2fb50 63 6b 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ck if the DISTIN
2fb60 43 54 20 71 75 61 6c 69 66 69 65 72 2c 20 69 66  CT qualifier, if
2fb70 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2c 20 69   there is one, i
2fb80 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 0a 20 20  s redundant. .  
2fb90 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68 65  ** If it is, the
2fba0 6e 20 73 65 74 20 70 44 69 73 74 69 6e 63 74 20  n set pDistinct 
2fbb0 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 57 68 65 72  to NULL and Wher
2fbc0 65 49 6e 66 6f 2e 65 44 69 73 74 69 6e 63 74 20  eInfo.eDistinct 
2fbd0 74 6f 0a 20 20 2a 2a 20 57 48 45 52 45 5f 44 49  to.  ** WHERE_DI
2fbe0 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 20 74 6f  STINCT_UNIQUE to
2fbf0 20 74 65 6c 6c 20 74 68 65 20 63 61 6c 6c 65 72   tell the caller
2fc00 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 44   to ignore the D
2fc10 49 53 54 49 4e 43 54 2e 0a 20 20 2a 2f 0a 20 20  ISTINCT..  */.  
2fc20 69 66 28 20 70 44 69 73 74 69 6e 63 74 20 26 26  if( pDistinct &&
2fc30 20 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e   isDistinctRedun
2fc40 64 61 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61  dant(pParse, pTa
2fc50 62 4c 69 73 74 2c 20 73 57 42 49 2e 70 57 43 2c  bList, sWBI.pWC,
2fc60 20 70 44 69 73 74 69 6e 63 74 29 20 29 7b 0a 20   pDistinct) ){. 
2fc70 20 20 20 70 44 69 73 74 69 6e 63 74 20 3d 20 30     pDistinct = 0
2fc80 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44  ;.    pWInfo->eD
2fc90 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
2fca0 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b  DISTINCT_UNIQUE;
2fcb0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 6f 73 65  .  }..  /* Chose
2fcc0 20 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20   the best index 
2fcd0 74 6f 20 75 73 65 20 66 6f 72 20 65 61 63 68 20  to use for each 
2fce0 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
2fcf0 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20  M clause..  **. 
2fd00 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 66 69   ** This loop fi
2fd10 6c 6c 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  lls in the follo
2fd20 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 20 20 2a  wing fields:.  *
2fd30 2a 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  *.  **   pWInfo-
2fd40 3e 61 5b 5d 2e 70 49 64 78 20 20 20 20 20 20 54  >a[].pIdx      T
2fd50 68 65 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  he index to use 
2fd60 66 6f 72 20 74 68 69 73 20 6c 65 76 65 6c 20 6f  for this level o
2fd70 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 2a 2a  f the loop..  **
2fd80 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 77     pWInfo->a[].w
2fd90 73 46 6c 61 67 73 20 20 20 57 48 45 52 45 5f 78  sFlags   WHERE_x
2fda0 78 78 20 66 6c 61 67 73 20 61 73 73 6f 63 69 61  xx flags associa
2fdb0 74 65 64 20 77 69 74 68 20 70 49 64 78 0a 20 20  ted with pIdx.  
2fdc0 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
2fdd0 2e 6e 45 71 20 20 20 20 20 20 20 54 68 65 20 6e  .nEq       The n
2fde0 75 6d 62 65 72 20 6f 66 20 3d 3d 20 61 6e 64 20  umber of == and 
2fdf0 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  IN constraints. 
2fe00 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b   **   pWInfo->a[
2fe10 5d 2e 69 46 72 6f 6d 20 20 20 20 20 57 68 69 63  ].iFrom     Whic
2fe20 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52  h term of the FR
2fe30 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 62 65 69  OM clause is bei
2fe40 6e 67 20 63 6f 64 65 64 0a 20 20 2a 2a 20 20 20  ng coded.  **   
2fe50 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 54 61 62  pWInfo->a[].iTab
2fe60 43 75 72 20 20 20 54 68 65 20 56 44 42 45 20 63  Cur   The VDBE c
2fe70 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 64 61  ursor for the da
2fe80 74 61 62 61 73 65 20 74 61 62 6c 65 0a 20 20 2a  tabase table.  *
2fe90 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e  *   pWInfo->a[].
2fea0 69 49 64 78 43 75 72 20 20 20 54 68 65 20 56 44  iIdxCur   The VD
2feb0 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  BE cursor for th
2fec0 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 20 20 70  e index.  **   p
2fed0 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 54 65 72 6d  WInfo->a[].pTerm
2fee0 20 20 20 20 20 57 68 65 6e 20 77 73 46 6c 61 67       When wsFlag
2fef0 73 3d 3d 57 4f 5f 4f 52 2c 20 74 68 65 20 4f 52  s==WO_OR, the OR
2ff00 2d 63 6c 61 75 73 65 20 74 65 72 6d 0a 20 20 2a  -clause term.  *
2ff10 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70  *.  ** This loop
2ff20 20 61 6c 73 6f 20 66 69 67 75 72 65 73 20 6f 75   also figures ou
2ff30 74 20 74 68 65 20 6e 65 73 74 69 6e 67 20 6f 72  t the nesting or
2ff40 64 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  der of tables in
2ff50 20 74 68 65 20 46 52 4f 4d 0a 20 20 2a 2a 20 63   the FROM.  ** c
2ff60 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 73 57  lause..  */.  sW
2ff70 42 49 2e 6e 6f 74 56 61 6c 69 64 20 3d 20 7e 28  BI.notValid = ~(
2ff80 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 73 57 42  Bitmask)0;.  sWB
2ff90 49 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  I.pOrderBy = pOr
2ffa0 64 65 72 42 79 3b 0a 20 20 73 57 42 49 2e 6e 20  derBy;.  sWBI.n 
2ffb0 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20 73 57  = nTabList;.  sW
2ffc0 42 49 2e 70 44 69 73 74 69 6e 63 74 20 3d 20 70  BI.pDistinct = p
2ffd0 44 69 73 74 69 6e 63 74 3b 0a 20 20 61 6e 64 46  Distinct;.  andF
2ffe0 6c 61 67 73 20 3d 20 7e 30 3b 0a 20 20 57 48 45  lags = ~0;.  WHE
2fff0 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70  RETRACE(("*** Op
30000 74 69 6d 69 7a 65 72 20 53 74 61 72 74 20 2a 2a  timizer Start **
30010 2a 5c 6e 22 29 29 3b 0a 20 20 66 6f 72 28 73 57  *\n"));.  for(sW
30020 42 49 2e 69 3d 69 46 72 6f 6d 3d 30 2c 20 70 4c  BI.i=iFrom=0, pL
30030 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20  evel=pWInfo->a; 
30040 73 57 42 49 2e 69 3c 6e 54 61 62 4c 69 73 74 3b  sWBI.i<nTabList;
30050 20 73 57 42 49 2e 69 2b 2b 2c 20 70 4c 65 76 65   sWBI.i++, pLeve
30060 6c 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 43  l++){.    WhereC
30070 6f 73 74 20 62 65 73 74 50 6c 61 6e 3b 20 20 20  ost bestPlan;   
30080 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 65 66        /* Most ef
30090 66 69 63 69 65 6e 74 20 70 6c 61 6e 20 73 65 65  ficient plan see
300a0 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20  n so far */.    
300b0 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
300c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
300d0 6e 64 65 78 20 66 6f 72 20 46 52 4f 4d 20 74 61  ndex for FROM ta
300e0 62 6c 65 20 61 74 20 70 54 61 62 49 74 65 6d 20  ble at pTabItem 
300f0 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 3b 20 20 20  */.    int j;   
30100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30110 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
30120 67 20 6f 76 65 72 20 46 52 4f 4d 20 74 61 62 6c  g over FROM tabl
30130 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65  es */.    int be
30140 73 74 4a 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  stJ = -1;       
30150 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c        /* The val
30160 75 65 20 6f 66 20 6a 20 2a 2f 0a 20 20 20 20 42  ue of j */.    B
30170 69 74 6d 61 73 6b 20 6d 3b 20 20 20 20 20 20 20  itmask m;       
30180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
30190 74 6d 61 73 6b 20 76 61 6c 75 65 20 66 6f 72 20  tmask value for 
301a0 6a 20 6f 72 20 62 65 73 74 4a 20 2a 2f 0a 20 20  j or bestJ */.  
301b0 20 20 69 6e 74 20 69 73 4f 70 74 69 6d 61 6c 3b    int isOptimal;
301c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
301d0 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6f 70   Iterator for op
301e0 74 69 6d 61 6c 2f 6e 6f 6e 2d 6f 70 74 69 6d 61  timal/non-optima
301f0 6c 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 20 20  l search */.    
30200 69 6e 74 20 63 6b 4f 70 74 69 6d 61 6c 3b 20 20  int ckOptimal;  
30210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
30220 6f 20 74 68 65 20 6f 70 74 69 6d 61 6c 20 73 63  o the optimal sc
30230 61 6e 20 63 68 65 63 6b 20 2a 2f 0a 20 20 20 20  an check */.    
30240 69 6e 74 20 6e 55 6e 63 6f 6e 73 74 72 61 69 6e  int nUnconstrain
30250 65 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ed;         /* N
30260 75 6d 62 65 72 20 74 61 62 6c 65 73 20 77 69 74  umber tables wit
30270 68 6f 75 74 20 49 4e 44 45 58 45 44 20 42 59 20  hout INDEXED BY 
30280 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6e  */.    Bitmask n
30290 6f 74 49 6e 64 65 78 65 64 3b 20 20 20 20 20 20  otIndexed;      
302a0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 61     /* Mask of ta
302b0 62 6c 65 73 20 74 68 61 74 20 63 61 6e 6e 6f 74  bles that cannot
302c0 20 75 73 65 20 61 6e 20 69 6e 64 65 78 20 2a 2f   use an index */
302d0 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 62 65  ..    memset(&be
302e0 73 74 50 6c 61 6e 2c 20 30 2c 20 73 69 7a 65 6f  stPlan, 0, sizeo
302f0 66 28 62 65 73 74 50 6c 61 6e 29 29 3b 0a 20 20  f(bestPlan));.  
30300 20 20 62 65 73 74 50 6c 61 6e 2e 72 43 6f 73 74    bestPlan.rCost
30310 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42   = SQLITE_BIG_DB
30320 4c 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43  L;.    WHERETRAC
30330 45 28 28 22 2a 2a 2a 20 42 65 67 69 6e 20 73 65  E(("*** Begin se
30340 61 72 63 68 20 66 6f 72 20 6c 6f 6f 70 20 25 64  arch for loop %d
30350 20 2a 2a 2a 5c 6e 22 2c 20 73 57 42 49 2e 69 29   ***\n", sWBI.i)
30360 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20  );..    /* Loop 
30370 74 68 72 6f 75 67 68 20 74 68 65 20 72 65 6d 61  through the rema
30380 69 6e 69 6e 67 20 65 6e 74 72 69 65 73 20 69 6e  ining entries in
30390 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
303a0 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 20 20 20   to find the.   
303b0 20 2a 2a 20 6e 65 78 74 20 6e 65 73 74 65 64 20   ** next nested 
303c0 6c 6f 6f 70 2e 20 54 68 65 20 6c 6f 6f 70 20 74  loop. The loop t
303d0 65 73 74 73 20 61 6c 6c 20 46 52 4f 4d 20 63 6c  ests all FROM cl
303e0 61 75 73 65 20 65 6e 74 72 69 65 73 0a 20 20 20  ause entries.   
303f0 20 2a 2a 20 65 69 74 68 65 72 20 6f 6e 63 65 20   ** either once 
30400 6f 72 20 74 77 69 63 65 2e 20 0a 20 20 20 20 2a  or twice. .    *
30410 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72  *.    ** The fir
30420 73 74 20 74 65 73 74 20 69 73 20 61 6c 77 61 79  st test is alway
30430 73 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 74  s performed if t
30440 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72 20  here are two or 
30450 6d 6f 72 65 20 65 6e 74 72 69 65 73 0a 20 20 20  more entries.   
30460 20 2a 2a 20 72 65 6d 61 69 6e 69 6e 67 20 61 6e   ** remaining an
30470 64 20 6e 65 76 65 72 20 70 65 72 66 6f 72 6d 65  d never performe
30480 64 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  d if there is on
30490 6c 79 20 6f 6e 65 20 46 52 4f 4d 20 63 6c 61 75  ly one FROM clau
304a0 73 65 20 65 6e 74 72 79 0a 20 20 20 20 2a 2a 20  se entry.    ** 
304b0 74 6f 20 63 68 6f 6f 73 65 20 66 72 6f 6d 2e 20  to choose from. 
304c0 20 54 68 65 20 66 69 72 73 74 20 74 65 73 74 20   The first test 
304d0 6c 6f 6f 6b 73 20 66 6f 72 20 61 6e 20 22 6f 70  looks for an "op
304e0 74 69 6d 61 6c 22 20 73 63 61 6e 2e 20 20 49 6e  timal" scan.  In
304f0 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e  .    ** this con
30500 74 65 78 74 20 61 6e 20 6f 70 74 69 6d 61 6c 20  text an optimal 
30510 73 63 61 6e 20 69 73 20 6f 6e 65 20 74 68 61 74  scan is one that
30520 20 75 73 65 73 20 74 68 65 20 73 61 6d 65 20 73   uses the same s
30530 74 72 61 74 65 67 79 0a 20 20 20 20 2a 2a 20 66  trategy.    ** f
30540 6f 72 20 74 68 65 20 67 69 76 65 6e 20 46 52 4f  or the given FRO
30550 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 61  M clause entry a
30560 73 20 77 6f 75 6c 64 20 62 65 20 73 65 6c 65 63  s would be selec
30570 74 65 64 20 69 66 20 74 68 65 20 65 6e 74 72 79  ted if the entry
30580 0a 20 20 20 20 2a 2a 20 77 65 72 65 20 75 73 65  .    ** were use
30590 64 20 61 73 20 74 68 65 20 69 6e 6e 65 72 6d 6f  d as the innermo
305a0 73 74 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2e 20  st nested loop. 
305b0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
305c0 20 61 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20   a table.    ** 
305d0 69 73 20 63 68 6f 73 65 6e 20 73 75 63 68 20 74  is chosen such t
305e0 68 61 74 20 74 68 65 20 63 6f 73 74 20 6f 66 20  hat the cost of 
305f0 72 75 6e 6e 69 6e 67 20 74 68 61 74 20 74 61 62  running that tab
30600 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 64  le cannot be red
30610 75 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 77  uced.    ** by w
30620 61 69 74 69 6e 67 20 66 6f 72 20 6f 74 68 65 72  aiting for other
30630 20 74 61 62 6c 65 73 20 74 6f 20 72 75 6e 20 66   tables to run f
30640 69 72 73 74 2e 20 20 54 68 69 73 20 22 6f 70 74  irst.  This "opt
30650 69 6d 61 6c 22 20 74 65 73 74 20 77 6f 72 6b 73  imal" test works
30660 0a 20 20 20 20 2a 2a 20 62 79 20 66 69 72 73 74  .    ** by first
30670 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 74   assuming that t
30680 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
30690 73 20 6f 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c  s on the inner l
306a0 6f 6f 70 20 61 6e 64 20 66 69 6e 64 69 6e 67 0a  oop and finding.
306b0 20 20 20 20 2a 2a 20 69 74 73 20 71 75 65 72 79      ** its query
306c0 20 70 6c 61 6e 2c 20 74 68 65 6e 20 63 68 65 63   plan, then chec
306d0 6b 69 6e 67 20 74 6f 20 73 65 65 20 69 66 20 74  king to see if t
306e0 68 61 74 20 71 75 65 72 79 20 70 6c 61 6e 20 75  hat query plan u
306f0 73 65 73 20 61 6e 79 0a 20 20 20 20 2a 2a 20 6f  ses any.    ** o
30700 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65  ther FROM clause
30710 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65 20   terms that are 
30720 73 57 42 49 2e 6e 6f 74 56 61 6c 69 64 2e 20 20  sWBI.notValid.  
30730 49 66 20 6e 6f 20 6e 6f 74 56 61 6c 69 64 20 74  If no notValid t
30740 65 72 6d 73 0a 20 20 20 20 2a 2a 20 61 72 65 20  erms.    ** are 
30750 75 73 65 64 20 74 68 65 6e 20 74 68 65 20 22 6f  used then the "o
30760 70 74 69 6d 61 6c 22 20 71 75 65 72 79 20 70 6c  ptimal" query pl
30770 61 6e 20 77 6f 72 6b 73 2e 0a 20 20 20 20 2a 2a  an works..    **
30780 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  .    ** Note tha
30790 74 20 74 68 65 20 57 68 65 72 65 43 6f 73 74 2e  t the WhereCost.
307a0 6e 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20 66  nRow parameter f
307b0 6f 72 20 61 6e 20 6f 70 74 69 6d 61 6c 20 73 63  or an optimal sc
307c0 61 6e 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20  an might.    ** 
307d0 6e 6f 74 20 62 65 20 61 73 20 73 6d 61 6c 6c 20  not be as small 
307e0 61 73 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69  as it would be i
307f0 66 20 74 68 65 20 74 61 62 6c 65 20 72 65 61 6c  f the table real
30800 6c 79 20 77 65 72 65 20 74 68 65 20 69 6e 6e 65  ly were the inne
30810 72 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 6a 6f 69  rmost.    ** joi
30820 6e 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c  n.  The nRow val
30830 75 65 20 63 61 6e 20 62 65 20 72 65 64 75 63 65  ue can be reduce
30840 64 20 62 79 20 57 48 45 52 45 20 63 6c 61 75 73  d by WHERE claus
30850 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  e constraints.  
30860 20 20 2a 2a 20 74 68 61 74 20 64 6f 20 6e 6f 74    ** that do not
30870 20 75 73 65 20 69 6e 64 69 63 65 73 2e 20 20 42   use indices.  B
30880 75 74 20 74 68 69 73 20 6e 52 6f 77 20 72 65 64  ut this nRow red
30890 75 63 74 69 6f 6e 20 6f 6e 6c 79 20 68 61 70 70  uction only happ
308a0 65 6e 73 20 69 66 20 74 68 65 0a 20 20 20 20 2a  ens if the.    *
308b0 2a 20 74 61 62 6c 65 20 72 65 61 6c 6c 79 20 69  * table really i
308c0 73 20 74 68 65 20 69 6e 6e 65 72 6d 6f 73 74 20  s the innermost 
308d0 6a 6f 69 6e 2e 20 20 0a 20 20 20 20 2a 2a 0a 20  join.  .    **. 
308e0 20 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64     ** The second
308f0 20 6c 6f 6f 70 20 69 74 65 72 61 74 69 6f 6e 20   loop iteration 
30900 69 73 20 6f 6e 6c 79 20 70 65 72 66 6f 72 6d 65  is only performe
30910 64 20 69 66 20 6e 6f 20 6f 70 74 69 6d 61 6c 20  d if no optimal 
30920 73 63 61 6e 0a 20 20 20 20 2a 2a 20 73 74 72 61  scan.    ** stra
30930 74 65 67 69 65 73 20 77 65 72 65 20 66 6f 75 6e  tegies were foun
30940 64 20 62 79 20 74 68 65 20 66 69 72 73 74 20 69  d by the first i
30950 74 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 73  teration. This s
30960 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 0a  econd iteration.
30970 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64 20 74      ** is used t
30980 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65  o search for the
30990 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 73 63 61   lowest cost sca
309a0 6e 20 6f 76 65 72 61 6c 6c 2e 0a 20 20 20 20 2a  n overall..    *
309b0 2a 0a 20 20 20 20 2a 2a 20 57 69 74 68 6f 75 74  *.    ** Without
309c0 20 74 68 65 20 6f 70 74 69 6d 61 6c 20 73 63 61   the optimal sca
309d0 6e 20 73 74 65 70 20 28 74 68 65 20 66 69 72 73  n step (the firs
309e0 74 20 69 74 65 72 61 74 69 6f 6e 29 20 61 20 73  t iteration) a s
309f0 75 62 6f 70 74 69 6d 61 6c 0a 20 20 20 20 2a 2a  uboptimal.    **
30a00 20 70 6c 61 6e 20 6d 69 67 68 74 20 62 65 20 63   plan might be c
30a10 68 6f 73 65 6e 20 66 6f 72 20 71 75 65 72 69 65  hosen for querie
30a20 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20  s like this:.   
30a30 20 2a 2a 20 20 20 0a 20 20 20 20 2a 2a 20 20 20   **   .    **   
30a40 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
30a50 61 2c 20 62 29 3b 20 0a 20 20 20 20 2a 2a 20 20  a, b); .    **  
30a60 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
30a70 28 63 2c 20 64 29 3b 0a 20 20 20 20 2a 2a 20 20  (c, d);.    **  
30a80 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
30a90 32 2c 20 74 31 20 57 48 45 52 45 20 74 32 2e 72  2, t1 WHERE t2.r
30aa0 6f 77 69 64 20 3d 20 74 31 2e 61 3b 0a 20 20 20  owid = t1.a;.   
30ab0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 62   **.    ** The b
30ac0 65 73 74 20 73 74 72 61 74 65 67 79 20 69 73 20  est strategy is 
30ad0 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
30ae0 67 68 20 74 61 62 6c 65 20 74 31 20 66 69 72 73  gh table t1 firs
30af0 74 2e 20 48 6f 77 65 76 65 72 20 69 74 0a 20 20  t. However it.  
30b00 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73    ** is not poss
30b10 69 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  ible to determin
30b20 65 20 74 68 69 73 20 77 69 74 68 20 61 20 73 69  e this with a si
30b30 6d 70 6c 65 20 67 72 65 65 64 79 20 61 6c 67 6f  mple greedy algo
30b40 72 69 74 68 6d 2e 0a 20 20 20 20 2a 2a 20 53 69  rithm..    ** Si
30b50 6e 63 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20  nce the cost of 
30b60 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68  a linear scan th
30b70 72 6f 75 67 68 20 74 61 62 6c 65 20 74 32 20 69  rough table t2 i
30b80 73 20 74 68 65 20 73 61 6d 65 20 0a 20 20 20 20  s the same .    
30b90 2a 2a 20 61 73 20 74 68 65 20 63 6f 73 74 20 6f  ** as the cost o
30ba0 66 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20  f a linear scan 
30bb0 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 74 31  through table t1
30bc0 2c 20 61 20 73 69 6d 70 6c 65 20 67 72 65 65 64  , a simple greed
30bd0 79 20 0a 20 20 20 20 2a 2a 20 61 6c 67 6f 72 69  y .    ** algori
30be0 74 68 6d 20 6d 61 79 20 63 68 6f 6f 73 65 20 74  thm may choose t
30bf0 6f 20 75 73 65 20 74 32 20 66 6f 72 20 74 68 65  o use t2 for the
30c00 20 6f 75 74 65 72 20 6c 6f 6f 70 2c 20 77 68 69   outer loop, whi
30c10 63 68 20 69 73 20 61 20 6d 75 63 68 0a 20 20 20  ch is a much.   
30c20 20 2a 2a 20 63 6f 73 74 6c 69 65 72 20 61 70 70   ** costlier app
30c30 72 6f 61 63 68 2e 0a 20 20 20 20 2a 2f 0a 20 20  roach..    */.  
30c40 20 20 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65 64    nUnconstrained
30c50 20 3d 20 30 3b 0a 20 20 20 20 6e 6f 74 49 6e 64   = 0;.    notInd
30c60 65 78 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  exed = 0;..    /
30c70 2a 20 54 68 65 20 6f 70 74 69 6d 61 6c 20 73 63  * The optimal sc
30c80 61 6e 20 63 68 65 63 6b 20 6f 6e 6c 79 20 6f 63  an check only oc
30c90 63 75 72 73 20 69 66 20 74 68 65 72 65 20 61 72  curs if there ar
30ca0 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74 61  e two or more ta
30cb0 62 6c 65 73 0a 20 20 20 20 2a 2a 20 61 76 61 69  bles.    ** avai
30cc0 6c 61 62 6c 65 20 74 6f 20 62 65 20 72 65 6f 72  lable to be reor
30cd0 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 69 66 28  dered */.    if(
30ce0 20 69 46 72 6f 6d 3d 3d 6e 54 61 62 4c 69 73 74   iFrom==nTabList
30cf0 2d 31 20 29 7b 0a 20 20 20 20 20 20 63 6b 4f 70  -1 ){.      ckOp
30d00 74 69 6d 61 6c 20 3d 20 30 3b 20 20 2f 2a 20 43  timal = 0;  /* C
30d10 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6a 75  ommon case of ju
30d20 73 74 20 6f 6e 65 20 74 61 62 6c 65 20 69 6e 20  st one table in 
30d30 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
30d40 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
30d50 20 20 20 20 63 6b 4f 70 74 69 6d 61 6c 20 3d 20      ckOptimal = 
30d60 2d 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  -1;.      for(j=
30d70 69 46 72 6f 6d 2c 20 73 57 42 49 2e 70 53 72 63  iFrom, sWBI.pSrc
30d80 3d 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  =&pTabList->a[j]
30d90 3b 20 6a 3c 6e 54 61 62 4c 69 73 74 3b 20 6a 2b  ; j<nTabList; j+
30da0 2b 2c 20 73 57 42 49 2e 70 53 72 63 2b 2b 29 7b  +, sWBI.pSrc++){
30db0 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 67 65 74  .        m = get
30dc0 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 73  Mask(pMaskSet, s
30dd0 57 42 49 2e 70 53 72 63 2d 3e 69 43 75 72 73 6f  WBI.pSrc->iCurso
30de0 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
30df0 28 6d 20 26 20 73 57 42 49 2e 6e 6f 74 56 61 6c  (m & sWBI.notVal
30e00 69 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  id)==0 ){.      
30e10 20 20 20 20 69 66 28 20 6a 3d 3d 69 46 72 6f 6d      if( j==iFrom
30e20 20 29 20 69 46 72 6f 6d 2b 2b 3b 0a 20 20 20 20   ) iFrom++;.    
30e30 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
30e40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30e50 20 20 69 66 28 20 6a 3e 69 46 72 6f 6d 20 26 26    if( j>iFrom &&
30e60 20 28 73 57 42 49 2e 70 53 72 63 2d 3e 6a 6f 69   (sWBI.pSrc->joi
30e70 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54  ntype & (JT_LEFT
30e80 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 20 29  |JT_CROSS))!=0 )
30e90 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
30ea0 69 66 28 20 2b 2b 63 6b 4f 70 74 69 6d 61 6c 20  if( ++ckOptimal 
30eb0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
30ec0 20 69 66 28 20 28 73 57 42 49 2e 70 53 72 63 2d   if( (sWBI.pSrc-
30ed0 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c  >jointype & JT_L
30ee0 45 46 54 29 21 3d 30 20 29 20 62 72 65 61 6b 3b  EFT)!=0 ) break;
30ef0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
30f00 20 20 20 61 73 73 65 72 74 28 20 63 6b 4f 70 74     assert( ckOpt
30f10 69 6d 61 6c 3d 3d 30 20 7c 7c 20 63 6b 4f 70 74  imal==0 || ckOpt
30f20 69 6d 61 6c 3d 3d 31 20 29 3b 0a 0a 20 20 20 20  imal==1 );..    
30f30 66 6f 72 28 69 73 4f 70 74 69 6d 61 6c 3d 63 6b  for(isOptimal=ck
30f40 4f 70 74 69 6d 61 6c 3b 20 69 73 4f 70 74 69 6d  Optimal; isOptim
30f50 61 6c 3e 3d 30 20 26 26 20 62 65 73 74 4a 3c 30  al>=0 && bestJ<0
30f60 3b 20 69 73 4f 70 74 69 6d 61 6c 2d 2d 29 7b 0a  ; isOptimal--){.
30f70 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 46 72 6f        for(j=iFro
30f80 6d 2c 20 73 57 42 49 2e 70 53 72 63 3d 26 70 54  m, sWBI.pSrc=&pT
30f90 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 3b 20 6a 3c  abList->a[j]; j<
30fa0 6e 54 61 62 4c 69 73 74 3b 20 6a 2b 2b 2c 20 73  nTabList; j++, s
30fb0 57 42 49 2e 70 53 72 63 2b 2b 29 7b 0a 20 20 20  WBI.pSrc++){.   
30fc0 20 20 20 20 20 69 66 28 20 6a 3e 69 46 72 6f 6d       if( j>iFrom
30fd0 20 26 26 20 28 73 57 42 49 2e 70 53 72 63 2d 3e   && (sWBI.pSrc->
30fe0 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c  jointype & (JT_L
30ff0 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d  EFT|JT_CROSS))!=
31000 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
31010 2a 20 54 68 69 73 20 62 72 65 61 6b 20 61 6e 64  * This break and
31020 20 6f 6e 65 20 6c 69 6b 65 20 69 74 20 69 6e 20   one like it in 
31030 74 68 65 20 63 6b 4f 70 74 69 6d 61 6c 20 63 6f  the ckOptimal co
31040 6d 70 75 74 61 74 69 6f 6e 20 6c 6f 6f 70 0a 20  mputation loop. 
31050 20 20 20 20 20 20 20 20 20 2a 2a 20 61 62 6f 76           ** abov
31060 65 20 70 72 65 76 65 6e 74 20 74 61 62 6c 65 20  e prevent table 
31070 72 65 6f 72 64 65 72 69 6e 67 20 61 63 72 6f 73  reordering acros
31080 73 20 4c 45 46 54 20 61 6e 64 20 43 52 4f 53 53  s LEFT and CROSS
31090 20 4a 4f 49 4e 73 2e 0a 20 20 20 20 20 20 20 20   JOINs..        
310a0 20 20 2a 2a 20 54 68 65 20 4c 45 46 54 20 4a 4f    ** The LEFT JO
310b0 49 4e 20 63 61 73 65 20 69 73 20 6e 65 63 65 73  IN case is neces
310c0 73 61 72 79 20 66 6f 72 20 63 6f 72 72 65 63 74  sary for correct
310d0 6e 65 73 73 2e 20 20 54 68 65 20 70 72 6f 68 69  ness.  The prohi
310e0 62 69 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20  bition.         
310f0 20 2a 2a 20 61 67 61 69 6e 73 74 20 72 65 6f 72   ** against reor
31100 64 65 72 69 6e 67 20 61 63 72 6f 73 73 20 61 20  dering across a 
31110 43 52 4f 53 53 20 4a 4f 49 4e 20 69 73 20 61 6e  CROSS JOIN is an
31120 20 53 51 4c 69 74 65 20 66 65 61 74 75 72 65 20   SQLite feature 
31130 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a  that.          *
31140 2a 20 61 6c 6c 6f 77 73 20 74 68 65 20 64 65 76  * allows the dev
31150 65 6c 6f 70 65 72 20 74 6f 20 63 6f 6e 74 72 6f  eloper to contro
31160 6c 20 74 61 62 6c 65 20 72 65 6f 72 64 65 72 69  l table reorderi
31170 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ng */.          
31180 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
31190 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 67 65 74  .        m = get
311a0 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 73  Mask(pMaskSet, s
311b0 57 42 49 2e 70 53 72 63 2d 3e 69 43 75 72 73 6f  WBI.pSrc->iCurso
311c0 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
311d0 28 6d 20 26 20 73 57 42 49 2e 6e 6f 74 56 61 6c  (m & sWBI.notVal
311e0 69 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  id)==0 ){.      
311f0 20 20 20 20 61 73 73 65 72 74 28 20 6a 3e 69 46      assert( j>iF
31200 72 6f 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 20  rom );.         
31210 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
31220 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 57 42     }.        sWB
31230 49 2e 6e 6f 74 52 65 61 64 79 20 3d 20 28 69 73  I.notReady = (is
31240 4f 70 74 69 6d 61 6c 20 3f 20 6d 20 3a 20 73 57  Optimal ? m : sW
31250 42 49 2e 6e 6f 74 56 61 6c 69 64 29 3b 0a 20 20  BI.notValid);.  
31260 20 20 20 20 20 20 69 66 28 20 73 57 42 49 2e 70        if( sWBI.p
31270 53 72 63 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 29  Src->pIndex==0 )
31280 20 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65 64 2b   nUnconstrained+
31290 2b 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 57 48  +;.  .        WH
312a0 45 52 45 54 52 41 43 45 28 28 22 20 20 20 3d 3d  ERETRACE(("   ==
312b0 3d 20 74 72 79 69 6e 67 20 74 61 62 6c 65 20 25  = trying table %
312c0 64 20 28 25 73 29 20 77 69 74 68 20 69 73 4f 70  d (%s) with isOp
312d0 74 69 6d 61 6c 3d 25 64 20 3d 3d 3d 5c 6e 22 2c  timal=%d ===\n",
312e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
312f0 20 20 20 20 20 6a 2c 20 73 57 42 49 2e 70 53 72       j, sWBI.pSr
31300 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  c->pTab->zName, 
31310 69 73 4f 70 74 69 6d 61 6c 29 29 3b 0a 20 20 20  isOptimal));.   
31320 20 20 20 20 20 61 73 73 65 72 74 28 20 73 57 42       assert( sWB
31330 49 2e 70 53 72 63 2d 3e 70 54 61 62 20 29 3b 0a  I.pSrc->pTab );.
31340 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
31350 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
31360 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73 56  .        if( IsV
31370 69 72 74 75 61 6c 28 73 57 42 49 2e 70 53 72 63  irtual(sWBI.pSrc
31380 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  ->pTab) ){.     
31390 20 20 20 20 20 73 57 42 49 2e 70 70 49 64 78 49       sWBI.ppIdxI
313a0 6e 66 6f 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  nfo = &pWInfo->a
313b0 5b 6a 5d 2e 70 49 64 78 49 6e 66 6f 3b 0a 20 20  [j].pIdxInfo;.  
313c0 20 20 20 20 20 20 20 20 62 65 73 74 56 69 72 74          bestVirt
313d0 75 61 6c 49 6e 64 65 78 28 26 73 57 42 49 29 3b  ualIndex(&sWBI);
313e0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 0a  .        }else .
313f0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b  #endif.        {
31400 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74 42  .          bestB
31410 74 72 65 65 49 6e 64 65 78 28 26 73 57 42 49 29  treeIndex(&sWBI)
31420 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31430 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
31440 74 69 6d 61 6c 20 7c 7c 20 28 73 57 42 49 2e 63  timal || (sWBI.c
31450 6f 73 74 2e 75 73 65 64 26 73 57 42 49 2e 6e 6f  ost.used&sWBI.no
31460 74 56 61 6c 69 64 29 3d 3d 30 20 29 3b 0a 0a 20  tValid)==0 );.. 
31470 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20         /* If an 
31480 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
31490 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68  e is present, th
314a0 65 6e 20 74 68 65 20 70 6c 61 6e 20 6d 75 73 74  en the plan must
314b0 20 75 73 65 20 74 68 61 74 0a 20 20 20 20 20 20   use that.      
314c0 20 20 2a 2a 20 69 6e 64 65 78 20 69 66 20 69 74    ** index if it
314d0 20 75 73 65 73 20 61 6e 79 20 69 6e 64 65 78 20   uses any index 
314e0 61 74 20 61 6c 6c 20 2a 2f 0a 20 20 20 20 20 20  at all */.      
314f0 20 20 61 73 73 65 72 74 28 20 73 57 42 49 2e 70    assert( sWBI.p
31500 53 72 63 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 0a  Src->pIndex==0 .
31510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31520 20 20 7c 7c 20 28 73 57 42 49 2e 63 6f 73 74 2e    || (sWBI.cost.
31530 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
31540 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41  HERE_NOT_FULLSCA
31550 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  N)==0.          
31560 20 20 20 20 20 20 20 20 7c 7c 20 73 57 42 49 2e          || sWBI.
31570 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 49 64 78  cost.plan.u.pIdx
31580 3d 3d 73 57 42 49 2e 70 53 72 63 2d 3e 70 49 6e  ==sWBI.pSrc->pIn
31590 64 65 78 20 29 3b 0a 0a 20 20 20 20 20 20 20 20  dex );..        
315a0 69 66 28 20 69 73 4f 70 74 69 6d 61 6c 20 26 26  if( isOptimal &&
315b0 20 28 73 57 42 49 2e 63 6f 73 74 2e 70 6c 61 6e   (sWBI.cost.plan
315c0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
315d0 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d  _NOT_FULLSCAN)==
315e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  0 ){.          n
315f0 6f 74 49 6e 64 65 78 65 64 20 7c 3d 20 6d 3b 0a  otIndexed |= m;.
31600 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31610 20 20 69 66 28 20 69 73 4f 70 74 69 6d 61 6c 20    if( isOptimal 
31620 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 57 49  ){.          pWI
31630 6e 66 6f 2d 3e 61 5b 6a 5d 2e 72 4f 70 74 43 6f  nfo->a[j].rOptCo
31640 73 74 20 3d 20 73 57 42 49 2e 63 6f 73 74 2e 72  st = sWBI.cost.r
31650 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 65  Cost;.        }e
31660 6c 73 65 20 69 66 28 20 63 6b 4f 70 74 69 6d 61  lse if( ckOptima
31670 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  l ){.          /
31680 2a 20 49 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  * If two or more
31690 20 74 61 62 6c 65 73 20 68 61 76 65 20 6e 65 61   tables have nea
316a0 72 6c 79 20 74 68 65 20 73 61 6d 65 20 6f 75 74  rly the same out
316b0 65 72 20 6c 6f 6f 70 20 63 6f 73 74 2c 20 62 75  er loop cost, bu
316c0 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76  t.          ** v
316d0 65 72 79 20 64 69 66 66 65 72 65 6e 74 20 69 6e  ery different in
316e0 6e 65 72 20 6c 6f 6f 70 20 28 6f 70 74 69 6d 61  ner loop (optima
316f0 6c 29 20 63 6f 73 74 2c 20 77 65 20 77 61 6e 74  l) cost, we want
31700 20 74 6f 20 63 68 6f 6f 73 65 0a 20 20 20 20 20   to choose.     
31710 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20       ** for the 
31720 6f 75 74 65 72 20 6c 6f 6f 70 20 74 68 61 74 20  outer loop that 
31730 74 61 62 6c 65 20 77 68 69 63 68 20 62 65 6e 65  table which bene
31740 66 69 74 73 20 74 68 65 20 6c 65 61 73 74 20 66  fits the least f
31750 72 6f 6d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  rom.          **
31760 20 62 65 69 6e 67 20 69 6e 20 74 68 65 20 69 6e   being in the in
31770 6e 65 72 20 6c 6f 6f 70 2e 20 20 54 68 65 20 66  ner loop.  The f
31780 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 73 63  ollowing code sc
31790 61 6c 65 73 20 74 68 65 20 0a 20 20 20 20 20 20  ales the .      
317a0 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 6c 6f 6f      ** outer loo
317b0 70 20 63 6f 73 74 20 65 73 74 69 6d 61 74 65 20  p cost estimate 
317c0 74 6f 20 61 63 63 6f 6d 70 6c 69 73 68 20 74 68  to accomplish th
317d0 61 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  at. */.         
317e0 20 57 48 45 52 45 54 52 41 43 45 28 28 22 20 20   WHERETRACE(("  
317f0 20 73 63 61 6c 69 6e 67 20 63 6f 73 74 20 66 72   scaling cost fr
31800 6f 6d 20 25 2e 31 66 20 74 6f 20 25 2e 31 66 5c  om %.1f to %.1f\
31810 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
31820 20 20 20 20 20 20 20 20 20 20 73 57 42 49 2e 63            sWBI.c
31830 6f 73 74 2e 72 43 6f 73 74 2c 0a 20 20 20 20 20  ost.rCost,.     
31840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31850 20 73 57 42 49 2e 63 6f 73 74 2e 72 43 6f 73 74   sWBI.cost.rCost
31860 2f 70 57 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e 72 4f  /pWInfo->a[j].rO
31870 70 74 43 6f 73 74 29 29 3b 0a 20 20 20 20 20 20  ptCost));.      
31880 20 20 20 20 73 57 42 49 2e 63 6f 73 74 2e 72 43      sWBI.cost.rC
31890 6f 73 74 20 2f 3d 20 70 57 49 6e 66 6f 2d 3e 61  ost /= pWInfo->a
318a0 5b 6a 5d 2e 72 4f 70 74 43 6f 73 74 3b 0a 20 20  [j].rOptCost;.  
318b0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
318c0 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e 73 20 75   /* Conditions u
318d0 6e 64 65 72 20 77 68 69 63 68 20 74 68 69 73 20  nder which this 
318e0 74 61 62 6c 65 20 62 65 63 6f 6d 65 73 20 74 68  table becomes th
318f0 65 20 62 65 73 74 20 73 6f 20 66 61 72 3a 0a 20  e best so far:. 
31900 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
31910 20 20 2a 2a 20 20 20 28 31 29 20 54 68 65 20 74    **   (1) The t
31920 61 62 6c 65 20 6d 75 73 74 20 6e 6f 74 20 64 65  able must not de
31930 70 65 6e 64 20 6f 6e 20 6f 74 68 65 72 20 74 61  pend on other ta
31940 62 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e  bles that have n
31950 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ot.        **   
31960 20 20 20 20 79 65 74 20 72 75 6e 2e 20 20 28 49      yet run.  (I
31970 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
31980 74 20 6d 75 73 74 20 6e 6f 74 20 64 65 70 65 6e  t must not depen
31990 64 20 6f 6e 20 74 61 62 6c 65 73 0a 20 20 20 20  d on tables.    
319a0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 69 6e 20      **       in 
319b0 69 6e 6e 65 72 20 6c 6f 6f 70 73 2e 29 0a 20 20  inner loops.).  
319c0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
319d0 20 2a 2a 20 20 20 28 32 29 20 28 54 68 69 73 20   **   (2) (This 
319e0 72 75 6c 65 20 77 61 73 20 72 65 6d 6f 76 65 64  rule was removed
319f0 20 6f 6e 20 32 30 31 32 2d 31 31 2d 30 39 2e 20   on 2012-11-09. 
31a00 20 54 68 65 20 73 63 61 6c 69 6e 67 20 6f 66 20   The scaling of 
31a10 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  the.        **  
31a20 20 20 20 20 20 63 6f 73 74 20 75 73 69 6e 67 20       cost using 
31a30 74 68 65 20 6f 70 74 69 6d 61 6c 20 73 63 61 6e  the optimal scan
31a40 20 63 6f 73 74 20 6d 61 64 65 20 74 68 69 73 20   cost made this 
31a50 72 75 6c 65 20 6f 62 73 6f 6c 65 74 65 2e 29 0a  rule obsolete.).
31a60 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
31a70 20 20 20 2a 2a 20 20 20 28 33 29 20 41 6c 6c 20     **   (3) All 
31a80 74 61 62 6c 65 73 20 68 61 76 65 20 61 6e 20 49  tables have an I
31a90 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
31aa0 20 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20 6c   or this table l
31ab0 61 63 6b 73 20 61 6e 0a 20 20 20 20 20 20 20 20  acks an.        
31ac0 2a 2a 20 20 20 20 20 20 20 49 4e 44 45 58 45 44  **       INDEXED
31ad0 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 74 68   BY clause or th
31ae0 69 73 20 74 61 62 6c 65 20 75 73 65 73 20 74 68  is table uses th
31af0 65 20 73 70 65 63 69 66 69 63 0a 20 20 20 20 20  e specific.     
31b00 20 20 20 2a 2a 20 20 20 20 20 20 20 69 6e 64 65     **       inde
31b10 78 20 73 70 65 63 69 66 69 65 64 20 62 79 20 69  x specified by i
31b20 74 73 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  ts INDEXED BY cl
31b30 61 75 73 65 2e 20 20 54 68 69 73 20 72 75 6c 65  ause.  This rule
31b40 20 65 6e 73 75 72 65 73 0a 20 20 20 20 20 20 20   ensures.       
31b50 20 2a 2a 20 20 20 20 20 20 20 74 68 61 74 20 61   **       that a
31b60 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 69 73 20   best-so-far is 
31b70 61 6c 77 61 79 73 20 73 65 6c 65 63 74 65 64 20  always selected 
31b80 65 76 65 6e 20 69 66 20 61 6e 20 69 6d 70 6f 73  even if an impos
31b90 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a  sible.        **
31ba0 20 20 20 20 20 20 20 63 6f 6d 62 69 6e 61 74 69         combinati
31bb0 6f 6e 20 6f 66 20 49 4e 44 45 58 45 44 20 42 59  on of INDEXED BY
31bc0 20 63 6c 61 75 73 65 73 20 61 72 65 20 67 69 76   clauses are giv
31bd0 65 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 0a 20  en.  The error. 
31be0 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20         **       
31bf0 77 69 6c 6c 20 62 65 20 64 65 74 65 63 74 65 64  will be detected
31c00 20 61 6e 64 20 72 65 6c 61 79 65 64 20 62 61 63   and relayed bac
31c10 6b 20 74 6f 20 74 68 65 20 61 70 70 6c 69 63 61  k to the applica
31c20 74 69 6f 6e 20 6c 61 74 65 72 2e 0a 20 20 20 20  tion later..    
31c30 20 20 20 20 2a 2a 20 20 20 20 20 20 20 54 68 65      **       The
31c40 20 4e 45 56 45 52 28 29 20 63 6f 6d 65 73 20 61   NEVER() comes a
31c50 62 6f 75 74 20 62 65 63 61 75 73 65 20 72 75 6c  bout because rul
31c60 65 20 28 32 29 20 61 62 6f 76 65 20 70 72 65 76  e (2) above prev
31c70 65 6e 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ents.        ** 
31c80 20 20 20 20 20 20 41 6e 20 69 6e 64 65 78 61 62        An indexab
31c90 6c 65 20 66 75 6c 6c 2d 74 61 62 6c 65 2d 73 63  le full-table-sc
31ca0 61 6e 20 66 72 6f 6d 20 72 65 61 63 68 69 6e 67  an from reaching
31cb0 20 72 75 6c 65 20 28 33 29 2e 0a 20 20 20 20 20   rule (3)..     
31cc0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
31cd0 20 20 20 28 34 29 20 54 68 65 20 70 6c 61 6e 20     (4) The plan 
31ce0 63 6f 73 74 20 6d 75 73 74 20 62 65 20 6c 6f 77  cost must be low
31cf0 65 72 20 74 68 61 6e 20 70 72 69 6f 72 20 70 6c  er than prior pl
31d00 61 6e 73 2c 20 77 68 65 72 65 20 22 63 6f 73 74  ans, where "cost
31d10 22 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  ".        **    
31d20 20 20 20 69 73 20 64 65 66 69 6e 65 64 20 62 79     is defined by
31d30 20 74 68 65 20 63 6f 6d 70 61 72 65 43 6f 73 74   the compareCost
31d40 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76  () function abov
31d50 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  e. .        */. 
31d60 20 20 20 20 20 20 20 69 66 28 20 28 73 57 42 49         if( (sWBI
31d70 2e 63 6f 73 74 2e 75 73 65 64 26 73 57 42 49 2e  .cost.used&sWBI.
31d80 6e 6f 74 56 61 6c 69 64 29 3d 3d 30 20 20 20 20  notValid)==0    
31d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31da0 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20  /* (1) */.      
31db0 20 20 20 20 20 20 26 26 20 28 6e 55 6e 63 6f 6e        && (nUncon
31dc0 73 74 72 61 69 6e 65 64 3d 3d 30 20 7c 7c 20 73  strained==0 || s
31dd0 57 42 49 2e 70 53 72 63 2d 3e 70 49 6e 64 65 78  WBI.pSrc->pIndex
31de0 3d 3d 30 20 20 20 20 20 20 20 20 2f 2a 20 28 33  ==0        /* (3
31df0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  ) */.           
31e00 20 20 20 20 20 7c 7c 20 4e 45 56 45 52 28 28 73       || NEVER((s
31e10 57 42 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73  WBI.cost.plan.ws
31e20 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f  Flags & WHERE_NO
31e30 54 5f 46 55 4c 4c 53 43 41 4e 29 21 3d 30 29 29  T_FULLSCAN)!=0))
31e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
31e50 28 62 65 73 74 4a 3c 30 20 7c 7c 20 63 6f 6d 70  (bestJ<0 || comp
31e60 61 72 65 43 6f 73 74 28 26 73 57 42 49 2e 63 6f  areCost(&sWBI.co
31e70 73 74 2c 20 26 62 65 73 74 50 6c 61 6e 29 29 20  st, &bestPlan)) 
31e80 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20    /* (4) */.    
31e90 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
31ea0 20 57 48 45 52 45 54 52 41 43 45 28 28 22 20 20   WHERETRACE(("  
31eb0 20 3d 3d 3d 20 74 61 62 6c 65 20 25 64 20 28 25   === table %d (%
31ec0 73 29 20 69 73 20 62 65 73 74 20 73 6f 20 66 61  s) is best so fa
31ed0 72 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  r\n".           
31ee0 20 20 20 20 20 20 20 20 20 20 20 22 20 20 20 20             "    
31ef0 20 20 20 63 6f 73 74 3d 25 2e 31 66 2c 20 6e 52     cost=%.1f, nR
31f00 6f 77 3d 25 2e 31 66 2c 20 6e 4f 42 53 61 74 3d  ow=%.1f, nOBSat=
31f10 25 64 2c 20 77 73 46 6c 61 67 73 3d 25 30 38 78  %d, wsFlags=%08x
31f20 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
31f30 20 20 20 20 20 20 20 20 20 20 20 6a 2c 20 73 57             j, sW
31f40 42 49 2e 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a  BI.pSrc->pTab->z
31f50 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
31f60 20 20 20 20 20 20 20 20 20 20 20 20 73 57 42 49              sWBI
31f70 2e 63 6f 73 74 2e 72 43 6f 73 74 2c 20 73 57 42  .cost.rCost, sWB
31f80 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77  I.cost.plan.nRow
31f90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
31fa0 20 20 20 20 20 20 20 20 73 57 42 49 2e 63 6f 73          sWBI.cos
31fb0 74 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 2c 20 73  t.plan.nOBSat, s
31fc0 57 42 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73  WBI.cost.plan.ws
31fd0 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 20 20 20  Flags));.       
31fe0 20 20 20 62 65 73 74 50 6c 61 6e 20 3d 20 73 57     bestPlan = sW
31ff0 42 49 2e 63 6f 73 74 3b 0a 20 20 20 20 20 20 20  BI.cost;.       
32000 20 20 20 62 65 73 74 4a 20 3d 20 6a 3b 0a 20 20     bestJ = j;.  
32010 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
32020 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 6c 69   /* In a join li
32030 6b 65 20 22 77 20 4a 4f 49 4e 20 78 20 4c 45 46  ke "w JOIN x LEF
32040 54 20 4a 4f 49 4e 20 79 20 4a 4f 49 4e 20 7a 22  T JOIN y JOIN z"
32050 20 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74    make sure that
32060 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  .        ** tabl
32070 65 20 79 20 28 61 6e 64 20 6e 6f 74 20 74 61 62  e y (and not tab
32080 6c 65 20 7a 29 20 69 73 20 61 6c 77 61 79 73 20  le z) is always 
32090 74 68 65 20 6e 65 78 74 20 69 6e 6e 65 72 20 6c  the next inner l
320a0 6f 6f 70 20 69 6e 73 69 64 65 0a 20 20 20 20 20  oop inside.     
320b0 20 20 20 2a 2a 20 6f 66 20 74 61 62 6c 65 20 78     ** of table x
320c0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
320d0 20 28 73 57 42 49 2e 70 53 72 63 2d 3e 6a 6f 69   (sWBI.pSrc->joi
320e0 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
320f0 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  !=0 ) break;.   
32100 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
32110 73 73 65 72 74 28 20 62 65 73 74 4a 3e 3d 30 20  ssert( bestJ>=0 
32120 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
32130 57 42 49 2e 6e 6f 74 56 61 6c 69 64 20 26 20 67  WBI.notValid & g
32140 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
32150 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73   pTabList->a[bes
32160 74 4a 5d 2e 69 43 75 72 73 6f 72 29 20 29 3b 0a  tJ].iCursor) );.
32170 20 20 20 20 61 73 73 65 72 74 28 20 62 65 73 74      assert( best
32180 4a 3d 3d 69 46 72 6f 6d 20 7c 7c 20 28 70 54 61  J==iFrom || (pTa
32190 62 4c 69 73 74 2d 3e 61 5b 69 46 72 6f 6d 5d 2e  bList->a[iFrom].
321a0 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
321b0 46 54 29 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65  FT)==0 );.    te
321c0 73 74 63 61 73 65 28 20 62 65 73 74 4a 3e 69 46  stcase( bestJ>iF
321d0 72 6f 6d 20 26 26 20 28 70 54 61 62 4c 69 73 74  rom && (pTabList
321e0 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74  ->a[iFrom].joint
321f0 79 70 65 20 26 20 4a 54 5f 43 52 4f 53 53 29 21  ype & JT_CROSS)!
32200 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =0 );.    testca
32210 73 65 28 20 62 65 73 74 4a 3e 69 46 72 6f 6d 20  se( bestJ>iFrom 
32220 26 26 20 62 65 73 74 4a 3c 6e 54 61 62 4c 69 73  && bestJ<nTabLis
32230 74 2d 31 0a 20 20 20 20 20 20 20 20 20 20 20 20  t-1.            
32240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
32250 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65   (pTabList->a[be
32260 73 74 4a 2b 31 5d 2e 6a 6f 69 6e 74 79 70 65 20  stJ+1].jointype 
32270 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 3b  & JT_LEFT)!=0 );
32280 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
32290 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20  ("*** Optimizer 
322a0 73 65 6c 65 63 74 73 20 74 61 62 6c 65 20 25 64  selects table %d
322b0 20 28 25 73 29 20 66 6f 72 20 6c 6f 6f 70 20 25   (%s) for loop %
322c0 64 20 77 69 74 68 3a 5c 6e 22 0a 20 20 20 20 20  d with:\n".     
322d0 20 20 20 20 20 20 20 20 20 20 20 22 20 20 20 20             "    
322e0 63 6f 73 74 3d 25 2e 31 66 2c 20 6e 52 6f 77 3d  cost=%.1f, nRow=
322f0 25 2e 31 66 2c 20 6e 4f 42 53 61 74 3d 25 64 2c  %.1f, nOBSat=%d,
32300 20 77 73 46 6c 61 67 73 3d 30 78 25 30 38 78 5c   wsFlags=0x%08x\
32310 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
32320 20 20 20 20 62 65 73 74 4a 2c 20 70 54 61 62 4c      bestJ, pTabL
32330 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 70 54  ist->a[bestJ].pT
32340 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ab->zName,.     
32350 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 76 65             pLeve
32360 6c 2d 70 57 49 6e 66 6f 2d 3e 61 2c 20 62 65 73  l-pWInfo->a, bes
32370 74 50 6c 61 6e 2e 72 43 6f 73 74 2c 20 62 65 73  tPlan.rCost, bes
32380 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 52 6f 77 2c  tPlan.plan.nRow,
32390 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
323a0 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e   bestPlan.plan.n
323b0 4f 42 53 61 74 2c 20 62 65 73 74 50 6c 61 6e 2e  OBSat, bestPlan.
323c0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 29 29 3b 0a  plan.wsFlags));.
323d0 20 20 20 20 69 66 28 20 28 62 65 73 74 50 6c 61      if( (bestPla
323e0 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  n.plan.wsFlags &
323f0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 29   WHERE_DISTINCT)
32400 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  !=0 ){.      ass
32410 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69  ert( pWInfo->eDi
32420 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20  stinct==0 );.   
32430 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74     pWInfo->eDist
32440 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53  inct = WHERE_DIS
32450 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20  TINCT_ORDERED;. 
32460 20 20 20 7d 0a 20 20 20 20 61 6e 64 46 6c 61 67     }.    andFlag
32470 73 20 26 3d 20 62 65 73 74 50 6c 61 6e 2e 70 6c  s &= bestPlan.pl
32480 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  an.wsFlags;.    
32490 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 20 3d 20 62  pLevel->plan = b
324a0 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 3b 0a 20 20  estPlan.plan;.  
324b0 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75    pLevel->iTabCu
324c0 72 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  r = pTabList->a[
324d0 62 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72 3b 0a  bestJ].iCursor;.
324e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 62 65      testcase( be
324f0 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c  stPlan.plan.wsFl
32500 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
32510 58 45 44 20 29 3b 0a 20 20 20 20 74 65 73 74 63  XED );.    testc
32520 61 73 65 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c  ase( bestPlan.pl
32530 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
32540 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20 29 3b  RE_TEMP_INDEX );
32550 0a 20 20 20 20 69 66 28 20 62 65 73 74 50 6c 61  .    if( bestPla
32560 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  n.plan.wsFlags &
32570 20 28 57 48 45 52 45 5f 49 4e 44 45 58 45 44 7c   (WHERE_INDEXED|
32580 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58  WHERE_TEMP_INDEX
32590 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ) ){.      if( (
325a0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
325b0 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
325c0 29 20 0a 20 20 20 20 20 20 20 26 26 20 28 62 65  ) .       && (be
325d0 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c  stPlan.plan.wsFl
325e0 61 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50  ags & WHERE_TEMP
325f0 5f 49 4e 44 45 58 29 3d 3d 30 20 0a 20 20 20 20  _INDEX)==0 .    
32600 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 65    ){.        pLe
32610 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69  vel->iIdxCur = i
32620 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 7d 65  IdxCur;.      }e
32630 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4c 65  lse{.        pLe
32640 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 70  vel->iIdxCur = p
32650 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
32660 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
32670 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
32680 69 49 64 78 43 75 72 20 3d 20 2d 31 3b 0a 20 20  iIdxCur = -1;.  
32690 20 20 7d 0a 20 20 20 20 73 57 42 49 2e 6e 6f 74    }.    sWBI.not
326a0 56 61 6c 69 64 20 26 3d 20 7e 67 65 74 4d 61 73  Valid &= ~getMas
326b0 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(pMaskSet, pTab
326c0 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69  List->a[bestJ].i
326d0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 4c 65  Cursor);.    pLe
326e0 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 28 75 38  vel->iFrom = (u8
326f0 29 62 65 73 74 4a 3b 0a 20 20 20 20 69 66 28 20  )bestJ;.    if( 
32700 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 52  bestPlan.plan.nR
32710 6f 77 3e 3d 28 64 6f 75 62 6c 65 29 31 20 29 7b  ow>=(double)1 ){
32720 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
32730 51 75 65 72 79 4c 6f 6f 70 20 2a 3d 20 62 65 73  QueryLoop *= bes
32740 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 52 6f 77 3b  tPlan.plan.nRow;
32750 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
32760 68 65 63 6b 20 74 68 61 74 20 69 66 20 74 68 65  heck that if the
32770 20 74 61 62 6c 65 20 73 63 61 6e 6e 65 64 20 62   table scanned b
32780 79 20 74 68 69 73 20 6c 6f 6f 70 20 69 74 65 72  y this loop iter
32790 61 74 69 6f 6e 20 68 61 64 20 61 6e 0a 20 20 20  ation had an.   
327a0 20 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63   ** INDEXED BY c
327b0 6c 61 75 73 65 20 61 74 74 61 63 68 65 64 20 74  lause attached t
327c0 6f 20 69 74 2c 20 74 68 61 74 20 74 68 65 20 6e  o it, that the n
327d0 61 6d 65 64 20 69 6e 64 65 78 20 69 73 20 62 65  amed index is be
327e0 69 6e 67 0a 20 20 20 20 2a 2a 20 75 73 65 64 20  ing.    ** used 
327f0 66 6f 72 20 74 68 65 20 73 63 61 6e 2e 20 49 66  for the scan. If
32800 20 6e 6f 74 2c 20 74 68 65 6e 20 71 75 65 72 79   not, then query
32810 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 68 61 73   compilation has
32820 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 2a 2a 20   failed..    ** 
32830 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e  Return an error.
32840 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 64 78  .    */.    pIdx
32850 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62   = pTabList->a[b
32860 65 73 74 4a 5d 2e 70 49 6e 64 65 78 3b 0a 20 20  estJ].pIndex;.  
32870 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20    if( pIdx ){.  
32880 20 20 20 20 69 66 28 20 28 62 65 73 74 50 6c 61      if( (bestPla
32890 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  n.plan.wsFlags &
328a0 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d   WHERE_INDEXED)=
328b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
328c0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
328d0 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 75 73  arse, "cannot us
328e0 65 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 70 49  e index: %s", pI
328f0 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  dx->zName);.    
32900 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
32910 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20  ginError;.      
32920 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
32930 2a 20 49 66 20 61 6e 20 49 4e 44 45 58 45 44 20  * If an INDEXED 
32940 42 59 20 63 6c 61 75 73 65 20 69 73 20 75 73 65  BY clause is use
32950 64 2c 20 74 68 65 20 62 65 73 74 49 6e 64 65 78  d, the bestIndex
32960 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20  () function is. 
32970 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e         ** guaran
32980 74 65 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65  teed to find the
32990 20 69 6e 64 65 78 20 73 70 65 63 69 66 69 65 64   index specified
329a0 20 69 6e 20 74 68 65 20 49 4e 44 45 58 45 44 20   in the INDEXED 
329b0 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20  BY clause.      
329c0 20 20 2a 2a 20 69 66 20 69 74 20 66 69 6e 64 20    ** if it find 
329d0 61 6e 20 69 6e 64 65 78 20 61 74 20 61 6c 6c 2e  an index at all.
329e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
329f0 72 74 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61  rt( bestPlan.pla
32a00 6e 2e 75 2e 70 49 64 78 3d 3d 70 49 64 78 20 29  n.u.pIdx==pIdx )
32a10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
32a20 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45    }.  WHERETRACE
32a30 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  (("*** Optimizer
32a40 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22   Finished ***\n"
32a50 29 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  ));.  if( pParse
32a60 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
32a70 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
32a80 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
32a90 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66  nError;.  }.  if
32aa0 28 20 6e 54 61 62 4c 69 73 74 20 29 7b 0a 20 20  ( nTabList ){.  
32ab0 20 20 70 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20    pLevel--;.    
32ac0 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d  pWInfo->nOBSat =
32ad0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 4f   pLevel->plan.nO
32ae0 42 53 61 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BSat;.  }else{. 
32af0 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61     pWInfo->nOBSa
32b00 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t = 0;.  }..  /*
32b10 20 49 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75   If the total qu
32b20 65 72 79 20 6f 6e 6c 79 20 73 65 6c 65 63 74 73  ery only selects
32b30 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2c 20 74   a single row, t
32b40 68 65 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59  hen the ORDER BY
32b50 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20  .  ** clause is 
32b60 69 72 72 65 6c 65 76 61 6e 74 2e 0a 20 20 2a 2f  irrelevant..  */
32b70 0a 20 20 69 66 28 20 28 61 6e 64 46 6c 61 67 73  .  if( (andFlags
32b80 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45 29   & WHERE_UNIQUE)
32b90 21 3d 30 20 26 26 20 70 4f 72 64 65 72 42 79 20  !=0 && pOrderBy 
32ba0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
32bb0 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20 28 70  TabList==0 || (p
32bc0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
32bd0 61 67 73 20 26 20 57 48 45 52 45 5f 41 4c 4c 5f  ags & WHERE_ALL_
32be0 55 4e 49 51 55 45 29 21 3d 30 20 29 3b 0a 20 20  UNIQUE)!=0 );.  
32bf0 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74    pWInfo->nOBSat
32c00 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
32c10 70 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  pr;.  }..  /* If
32c20 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61   the caller is a
32c30 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
32c40 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  TE statement tha
32c50 74 20 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a  t is requesting.
32c60 20 20 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e    ** to use a on
32c70 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d  e-pass algorithm
32c80 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  , determine if t
32c90 68 69 73 20 69 73 20 61 70 70 72 6f 70 72 69 61  his is appropria
32ca0 74 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65  te..  ** The one
32cb0 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 20  -pass algorithm 
32cc0 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20 74 68  only works if th
32cd0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  e WHERE clause c
32ce0 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20  onstraints.  ** 
32cf0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  the statement to
32d00 20 75 70 64 61 74 65 20 61 20 73 69 6e 67 6c 65   update a single
32d10 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   row..  */.  ass
32d20 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73  ert( (wctrlFlags
32d30 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
32d40 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20  _DESIRED)==0 || 
32d50 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d  pWInfo->nLevel==
32d60 31 20 29 3b 0a 20 20 69 66 28 20 28 77 63 74 72  1 );.  if( (wctr
32d70 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
32d80 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 21  NEPASS_DESIRED)!
32d90 3d 30 20 26 26 20 28 61 6e 64 46 6c 61 67 73 20  =0 && (andFlags 
32da0 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45 29 21  & WHERE_UNIQUE)!
32db0 3d 30 20 29 7b 0a 20 20 20 20 70 57 49 6e 66 6f  =0 ){.    pWInfo
32dc0 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d 20 31 3b  ->okOnePass = 1;
32dd0 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30  .    pWInfo->a[0
32de0 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ].plan.wsFlags &
32df0 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  = ~WHERE_IDX_ONL
32e00 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  Y;.  }..  /* Ope
32e10 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  n all tables in 
32e20 74 68 65 20 70 54 61 62 4c 69 73 74 20 61 6e 64  the pTabList and
32e30 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73 65 6c   any indices sel
32e40 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73  ected for.  ** s
32e50 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65 20 74  earching those t
32e60 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  ables..  */.  sq
32e70 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
32e80 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 2d 31  chema(pParse, -1
32e90 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  ); /* Insert the
32ea0 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 65 72   cookie verifier
32eb0 20 47 6f 74 6f 20 2a 2f 0a 20 20 6e 6f 74 52 65   Goto */.  notRe
32ec0 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29  ady = ~(Bitmask)
32ed0 30 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  0;.  pWInfo->nRo
32ee0 77 4f 75 74 20 3d 20 28 64 6f 75 62 6c 65 29 31  wOut = (double)1
32ef0 3b 0a 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 4c  ;.  for(ii=0, pL
32f00 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20  evel=pWInfo->a; 
32f10 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b  ii<nTabList; ii+
32f20 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20  +, pLevel++){.  
32f30 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
32f40 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f     /* Table to o
32f50 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  pen */.    int i
32f60 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  Db;         /* I
32f70 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61 73 65  ndex of database
32f80 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c   containing tabl
32f90 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73  e/index */.    s
32fa0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
32fb0 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 0a 0a 20  em *pTabItem;.. 
32fc0 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70     pTabItem = &p
32fd0 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
32fe0 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70  l->iFrom];.    p
32ff0 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Tab = pTabItem->
33000 70 54 61 62 3b 0a 20 20 20 20 70 57 49 6e 66 6f  pTab;.    pWInfo
33010 2d 3e 6e 52 6f 77 4f 75 74 20 2a 3d 20 70 4c 65  ->nRowOut *= pLe
33020 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 3b 0a  vel->plan.nRow;.
33030 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
33040 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
33050 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
33060 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62  );.    if( (pTab
33070 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
33080 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c  Ephemeral)!=0 ||
33090 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
330a0 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
330b0 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c  thing */.    }el
330c0 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  se.#ifndef SQLIT
330d0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
330e0 42 4c 45 0a 20 20 20 20 69 66 28 20 28 70 4c 65  BLE.    if( (pLe
330f0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
33100 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
33110 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20  LTABLE)!=0 ){.  
33120 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
33130 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63  pVTab = (const c
33140 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74  har *)sqlite3Get
33150 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  VTable(db, pTab)
33160 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 75 72  ;.      int iCur
33170 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
33180 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  rsor;.      sqli
33190 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
331a0 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c   OP_VOpen, iCur,
331b0 20 30 2c 20 30 2c 20 70 56 54 61 62 2c 20 50 34   0, 0, pVTab, P4
331c0 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73  _VTAB);.    }els
331d0 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28  e if( IsVirtual(
331e0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 2f  pTab) ){.      /
331f0 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 65  * noop */.    }e
33200 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  lse.#endif.    i
33210 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  f( (pLevel->plan
33220 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
33230 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20  _IDX_ONLY)==0.  
33240 20 20 20 20 20 20 20 26 26 20 28 77 63 74 72 6c         && (wctrl
33250 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d  Flags & WHERE_OM
33260 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d  IT_OPEN_CLOSE)==
33270 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  0 ){.      int o
33280 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  p = pWInfo->okOn
33290 65 50 61 73 73 20 3f 20 4f 50 5f 4f 70 65 6e 57  ePass ? OP_OpenW
332a0 72 69 74 65 20 3a 20 4f 50 5f 4f 70 65 6e 52 65  rite : OP_OpenRe
332b0 61 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ad;.      sqlite
332c0 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
332d0 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  e, pTabItem->iCu
332e0 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c  rsor, iDb, pTab,
332f0 20 6f 70 29 3b 0a 20 20 20 20 20 20 74 65 73 74   op);.      test
33300 63 61 73 65 28 20 70 54 61 62 2d 3e 6e 43 6f 6c  case( pTab->nCol
33310 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
33320 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 2d   testcase( pTab-
33330 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20  >nCol==BMS );.  
33340 20 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d      if( !pWInfo-
33350 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54  >okOnePass && pT
33360 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 29 7b 0a  ab->nCol<BMS ){.
33370 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
33380 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f  b = pTabItem->co
33390 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69  lUsed;.        i
333a0 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  nt n = 0;.      
333b0 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e    for(; b; b=b>>
333c0 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  1, n++){}.      
333d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
333e0 6e 67 65 50 34 28 76 2c 20 73 71 6c 69 74 65 33  ngeP4(v, sqlite3
333f0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
33400 76 29 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20  v)-1, .         
33410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33420 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f     SQLITE_INT_TO
33430 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33  _PTR(n), P4_INT3
33440 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  2);.        asse
33450 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f  rt( n<=pTab->nCo
33460 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  l );.      }.   
33470 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
33480 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
33490 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
334a0 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
334b0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23  >zName);.    }.#
334c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
334d0 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
334e0 45 58 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76  EX.    if( (pLev
334f0 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
33500 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
33510 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  DEX)!=0 ){.     
33520 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61   constructAutoma
33530 74 69 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ticIndex(pParse,
33540 20 73 57 42 49 2e 70 57 43 2c 20 70 54 61 62 49   sWBI.pWC, pTabI
33550 74 65 6d 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70  tem, notReady, p
33560 4c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  Level);.    }els
33570 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  e.#endif.    if(
33580 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
33590 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
335a0 4e 44 45 58 45 44 29 21 3d 30 20 29 7b 0a 20 20  NDEXED)!=0 ){.  
335b0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78 20 3d      Index *pIx =
335c0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e   pLevel->plan.u.
335d0 70 49 64 78 3b 0a 20 20 20 20 20 20 4b 65 79 49  pIdx;.      KeyI
335e0 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69  nfo *pKey = sqli
335f0 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28  te3IndexKeyinfo(
33600 70 50 61 72 73 65 2c 20 70 49 78 29 3b 0a 20 20  pParse, pIx);.  
33610 20 20 20 20 69 6e 74 20 69 49 6e 64 65 78 43 75      int iIndexCu
33620 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  r = pLevel->iIdx
33630 43 75 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Cur;.      asser
33640 74 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d  t( pIx->pSchema=
33650 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
33660 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
33670 69 49 6e 64 65 78 43 75 72 3e 3d 30 20 29 3b 0a  iIndexCur>=0 );.
33680 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
33690 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
336a0 65 6e 52 65 61 64 2c 20 69 49 6e 64 65 78 43 75  enRead, iIndexCu
336b0 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44  r, pIx->tnum, iD
336c0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
336d0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
336e0 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e  *)pKey, P4_KEYIN
336f0 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
33700 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
33710 76 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e  v, "%s", pIx->zN
33720 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ame));.    }.   
33730 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
33740 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
33750 20 69 44 62 29 3b 0a 20 20 20 20 6e 6f 74 52 65   iDb);.    notRe
33760 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28  ady &= ~getMask(
33770 73 57 42 49 2e 70 57 43 2d 3e 70 4d 61 73 6b 53  sWBI.pWC->pMaskS
33780 65 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  et, pTabItem->iC
33790 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 57  ursor);.  }.  pW
337a0 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c  Info->iTop = sql
337b0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
337c0 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62  ddr(v);.  if( db
337d0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
337e0 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
337f0 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e  Error;..  /* Gen
33800 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  erate the code t
33810 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e  o do the search.
33820 20 20 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e    Each iteration
33830 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a   of the for.  **
33840 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65   loop below gene
33850 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61  rates code for a
33860 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c   single nested l
33870 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20  oop of the VM.  
33880 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f  ** program..  */
33890 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28  .  notReady = ~(
338a0 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72  Bitmask)0;.  for
338b0 28 69 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69  (ii=0; ii<nTabLi
338c0 73 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 70  st; ii++){.    p
338d0 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
338e0 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 65 78 70 6c  >a[ii];.    expl
338f0 61 69 6e 4f 6e 65 53 63 61 6e 28 70 50 61 72 73  ainOneScan(pPars
33900 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65  e, pTabList, pLe
33910 76 65 6c 2c 20 69 69 2c 20 70 4c 65 76 65 6c 2d  vel, ii, pLevel-
33920 3e 69 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c 61  >iFrom, wctrlFla
33930 67 73 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64  gs);.    notRead
33940 79 20 3d 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53  y = codeOneLoopS
33950 74 61 72 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c  tart(pWInfo, ii,
33960 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 6e 6f 74   wctrlFlags, not
33970 52 65 61 64 79 29 3b 0a 20 20 20 20 70 57 49 6e  Ready);.    pWIn
33980 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20  fo->iContinue = 
33990 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74  pLevel->addrCont
339a0 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  ;.  }..#ifdef SQ
339b0 4c 49 54 45 5f 54 45 53 54 20 20 2f 2a 20 46 6f  LITE_TEST  /* Fo
339c0 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  r testing and de
339d0 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79  bugging use only
339e0 20 2a 2f 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20   */.  /* Record 
339f0 69 6e 20 74 68 65 20 71 75 65 72 79 20 70 6c 61  in the query pla
33a00 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  n information ab
33a10 6f 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  out the current 
33a20 74 61 62 6c 65 0a 20 20 2a 2a 20 61 6e 64 20 74  table.  ** and t
33a30 68 65 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f  he index used to
33a40 20 61 63 63 65 73 73 20 69 74 20 28 69 66 20 61   access it (if a
33a50 6e 79 29 2e 20 20 49 66 20 74 68 65 20 74 61 62  ny).  If the tab
33a60 6c 65 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69  le itself.  ** i
33a70 73 20 6e 6f 74 20 75 73 65 64 2c 20 69 74 73 20  s not used, its 
33a80 6e 61 6d 65 20 69 73 20 6a 75 73 74 20 27 7b 7d  name is just '{}
33a90 27 2e 20 20 49 66 20 6e 6f 20 69 6e 64 65 78 20  '.  If no index 
33aa0 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 74 68 65  is used.  ** the
33ab0 20 69 6e 64 65 78 20 69 73 20 6c 69 73 74 65 64   index is listed
33ac0 20 61 73 20 22 7b 7d 22 2e 20 20 49 66 20 74 68   as "{}".  If th
33ad0 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73  e primary key is
33ae0 20 75 73 65 64 20 74 68 65 0a 20 20 2a 2a 20 69   used the.  ** i
33af0 6e 64 65 78 20 6e 61 6d 65 20 69 73 20 27 2a 27  ndex name is '*'
33b00 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  ..  */.  for(ii=
33b10 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20  0; ii<nTabList; 
33b20 69 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20  ii++){.    char 
33b30 2a 7a 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  *z;.    int n;. 
33b40 20 20 20 69 6e 74 20 77 3b 0a 20 20 20 20 73 74     int w;.    st
33b50 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
33b60 6d 20 2a 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20  m *pTabItem;..  
33b70 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e    pLevel = &pWIn
33b80 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 77  fo->a[ii];.    w
33b90 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
33ba0 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 54 61  wsFlags;.    pTa
33bb0 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
33bc0 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
33bd0 6f 6d 5d 3b 0a 20 20 20 20 7a 20 3d 20 70 54 61  om];.    z = pTa
33be0 62 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20  bItem->zAlias;. 
33bf0 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20     if( z==0 ) z 
33c00 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
33c10 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 20 3d  ->zName;.    n =
33c20 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
33c30 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 2b 6e  (z);.    if( n+n
33c40 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73  QPlan < sizeof(s
33c50 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
33c60 6e 29 2d 31 30 20 29 7b 0a 20 20 20 20 20 20 69  n)-10 ){.      i
33c70 66 28 20 28 77 20 26 20 57 48 45 52 45 5f 49 44  f( (w & WHERE_ID
33c80 58 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 28 77  X_ONLY)!=0 && (w
33c90 20 26 20 57 48 45 52 45 5f 43 4f 56 45 52 5f 53   & WHERE_COVER_S
33ca0 43 41 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  CAN)==0 ){.     
33cb0 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74     memcpy(&sqlit
33cc0 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
33cd0 50 6c 61 6e 5d 2c 20 22 7b 7d 22 2c 20 32 29 3b  Plan], "{}", 2);
33ce0 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20  .        nQPlan 
33cf0 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73  += 2;.      }els
33d00 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  e{.        memcp
33d10 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79  y(&sqlite3_query
33d20 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 7a  _plan[nQPlan], z
33d30 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 6e 51  , n);.        nQ
33d40 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20  Plan += n;.     
33d50 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
33d60 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
33d70 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  an++] = ' ';.   
33d80 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28   }.    testcase(
33d90 20 77 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44   w & WHERE_ROWID
33da0 5f 45 51 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _EQ );.    testc
33db0 61 73 65 28 20 77 20 26 20 57 48 45 52 45 5f 52  ase( w & WHERE_R
33dc0 4f 57 49 44 5f 52 41 4e 47 45 20 29 3b 0a 20 20  OWID_RANGE );.  
33dd0 20 20 69 66 28 20 77 20 26 20 28 57 48 45 52 45    if( w & (WHERE
33de0 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f  _ROWID_EQ|WHERE_
33df0 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a  ROWID_RANGE) ){.
33e00 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71        memcpy(&sq
33e10 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
33e20 5b 6e 51 50 6c 61 6e 5d 2c 20 22 2a 20 22 2c 20  [nQPlan], "* ", 
33e30 32 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e  2);.      nQPlan
33e40 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65   += 2;.    }else
33e50 20 69 66 28 20 28 77 20 26 20 57 48 45 52 45 5f   if( (w & WHERE_
33e60 49 4e 44 45 58 45 44 29 21 3d 30 20 26 26 20 28  INDEXED)!=0 && (
33e70 77 20 26 20 57 48 45 52 45 5f 43 4f 56 45 52 5f  w & WHERE_COVER_
33e80 53 43 41 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  SCAN)==0 ){.    
33e90 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72    n = sqlite3Str
33ea0 6c 65 6e 33 30 28 70 4c 65 76 65 6c 2d 3e 70 6c  len30(pLevel->pl
33eb0 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65  an.u.pIdx->zName
33ec0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 2b 6e  );.      if( n+n
33ed0 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73  QPlan < sizeof(s
33ee0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
33ef0 6e 29 2d 32 20 29 7b 0a 20 20 20 20 20 20 20 20  n)-2 ){.        
33f00 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f  memcpy(&sqlite3_
33f10 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
33f20 6e 5d 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  n], pLevel->plan
33f30 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  .u.pIdx->zName, 
33f40 6e 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c  n);.        nQPl
33f50 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20  an += n;.       
33f60 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
33f70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20  lan[nQPlan++] = 
33f80 27 20 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ' ';.      }.   
33f90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
33fa0 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75  mcpy(&sqlite3_qu
33fb0 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d  ery_plan[nQPlan]
33fc0 2c 20 22 7b 7d 20 22 2c 20 33 29 3b 0a 20 20 20  , "{} ", 3);.   
33fd0 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 33 3b 0a     nQPlan += 3;.
33fe0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 69 6c      }.  }.  whil
33ff0 65 28 20 6e 51 50 6c 61 6e 3e 30 20 26 26 20 73  e( nQPlan>0 && s
34000 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
34010 6e 5b 6e 51 50 6c 61 6e 2d 31 5d 3d 3d 27 20 27  n[nQPlan-1]==' '
34020 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
34030 71 75 65 72 79 5f 70 6c 61 6e 5b 2d 2d 6e 51 50  query_plan[--nQP
34040 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  lan] = 0;.  }.  
34050 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
34060 61 6e 5b 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a  an[nQPlan] = 0;.
34070 20 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 0a 23 65    nQPlan = 0;.#e
34080 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54  ndif /* SQLITE_T
34090 45 53 54 20 2f 2f 20 54 65 73 74 69 6e 67 20 61  EST // Testing a
340a0 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75 73 65  nd debugging use
340b0 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a 20 52   only */..  /* R
340c0 65 63 6f 72 64 20 74 68 65 20 63 6f 6e 74 69 6e  ecord the contin
340d0 75 61 74 69 6f 6e 20 61 64 64 72 65 73 73 20 69  uation address i
340e0 6e 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20  n the WhereInfo 
340f0 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 6e  structure.  Then
34100 0a 20 20 2a 2a 20 63 6c 65 61 6e 20 75 70 20 61  .  ** clean up a
34110 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a  nd return..  */.
34120 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b    return pWInfo;
34130 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
34140 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
34150 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e 45 72   */.whereBeginEr
34160 72 6f 72 3a 0a 20 20 69 66 28 20 70 57 49 6e 66  ror:.  if( pWInf
34170 6f 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  o ){.    pParse-
34180 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57  >nQueryLoop = pW
34190 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72  Info->savedNQuer
341a0 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65  yLoop;.    where
341b0 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49  InfoFree(db, pWI
341c0 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nfo);.  }.  retu
341d0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
341e0 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64 20  enerate the end 
341f0 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f  of the WHERE loo
34200 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  p.  See comments
34210 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57   on .** sqlite3W
34220 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20  hereBegin() for 
34230 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
34240 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  mation..*/.void 
34250 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
34260 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
34270 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  o){.  Parse *pPa
34280 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
34290 61 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20  arse;.  Vdbe *v 
342a0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
342b0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72  .  int i;.  Wher
342c0 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a  eLevel *pLevel;.
342d0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
342e0 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  ist = pWInfo->pT
342f0 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65  abList;.  sqlite
34300 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
34310 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  db;..  /* Genera
34320 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  te loop terminat
34330 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ion code..  */. 
34340 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
34350 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
34360 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e    for(i=pWInfo->
34370 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20  nLevel-1; i>=0; 
34380 69 2d 2d 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c  i--){.    pLevel
34390 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d   = &pWInfo->a[i]
343a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
343b0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
343c0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e   pLevel->addrCon
343d0 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  t);.    if( pLev
343e0 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  el->op!=OP_Noop 
343f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
34400 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 4c  VdbeAddOp2(v, pL
34410 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c  evel->op, pLevel
34420 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32  ->p1, pLevel->p2
34430 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
34440 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
34450 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20  pLevel->p5);.   
34460 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65   }.    if( pLeve
34470 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
34480 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20  & WHERE_IN_ABLE 
34490 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  && pLevel->u.in.
344a0 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  nIn>0 ){.      s
344b0 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49  truct InLoop *pI
344c0 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  n;.      int j;.
344d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
344e0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
344f0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
34500 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70  );.      for(j=p
34510 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c  Level->u.in.nIn,
34520 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e   pIn=&pLevel->u.
34530 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b  in.aInLoop[j-1];
34540 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d   j>0; j--, pIn--
34550 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
34560 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
34570 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70  , pIn->addrInTop
34580 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  +1);.        sql
34590 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
345a0 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 49 6e 2d 3e  , OP_Next, pIn->
345b0 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49  iCur, pIn->addrI
345c0 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 73  nTop);.        s
345d0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
345e0 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49  re(v, pIn->addrI
345f0 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d  nTop-1);.      }
34600 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
34610 46 72 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d  Free(db, pLevel-
34620 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a  >u.in.aInLoop);.
34630 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
34640 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
34650 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
34660 72 42 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70  rBrk);.    if( p
34670 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
34680 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64   ){.      int ad
34690 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  dr;.      addr =
346a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
346b0 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p1(v, OP_IfPos, 
346c0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
346d0 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  n);.      assert
346e0 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
346f0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
34700 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20  IDX_ONLY)==0.   
34710 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4c 65 76          || (pLev
34720 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
34730 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
34740 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )!=0 );.      if
34750 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
34760 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
34770 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a  IDX_ONLY)==0 ){.
34780 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
34790 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
347a0 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73  NullRow, pTabLis
347b0 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29  t->a[i].iCursor)
347c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
347d0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  if( pLevel->iIdx
347e0 43 75 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Cur>=0 ){.      
347f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
34800 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
34810 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  w, pLevel->iIdxC
34820 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ur);.      }.   
34830 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f     if( pLevel->o
34840 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29 7b 0a  p==OP_Return ){.
34850 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
34860 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
34870 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d 3e 70  Gosub, pLevel->p
34880 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46  1, pLevel->addrF
34890 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  irst);.      }el
348a0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
348b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
348c0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65   OP_Goto, 0, pLe
348d0 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b  vel->addrFirst);
348e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
348f0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
34900 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
34910 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
34920 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69   "break" point i
34930 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73  s here, just pas
34940 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
34950 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a   outer loop..  *
34960 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20  * Set it..  */. 
34970 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
34980 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e  lveLabel(v, pWIn
34990 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20  fo->iBreak);..  
349a0 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20  /* Close all of 
349b0 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74  the cursors that
349c0 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20   were opened by 
349d0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
349e0 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  n..  */.  assert
349f0 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
34a00 3d 3d 31 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e  ==1 || pWInfo->n
34a10 4c 65 76 65 6c 3d 3d 70 54 61 62 4c 69 73 74 2d  Level==pTabList-
34a20 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72 28 69  >nSrc );.  for(i
34a30 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
34a40 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e  o->a; i<pWInfo->
34a50 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c 65  nLevel; i++, pLe
34a60 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 49 6e 64 65  vel++){.    Inde
34a70 78 20 2a 70 49 64 78 20 3d 20 30 3b 0a 20 20 20  x *pIdx = 0;.   
34a80 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
34a90 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d  item *pTabItem =
34aa0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
34ab0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
34ac0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
34ad0 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pTabItem->pTab;.
34ae0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
34af0 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28  !=0 );.    if( (
34b00 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
34b10 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d   TF_Ephemeral)==
34b20 30 0a 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e  0.     && pTab->
34b30 70 53 65 6c 65 63 74 3d 3d 30 0a 20 20 20 20 20  pSelect==0.     
34b40 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
34b50 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
34b60 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d  MIT_OPEN_CLOSE)=
34b70 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
34b80 69 6e 74 20 77 73 20 3d 20 70 4c 65 76 65 6c 2d  int ws = pLevel-
34b90 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20  >plan.wsFlags;. 
34ba0 20 20 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f       if( !pWInfo
34bb0 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 28  ->okOnePass && (
34bc0 77 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  ws & WHERE_IDX_O
34bd0 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)==0 ){.     
34be0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
34bf0 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
34c00 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
34c10 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  sor);.      }.  
34c20 20 20 20 20 69 66 28 20 28 77 73 20 26 20 57 48      if( (ws & WH
34c30 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20  ERE_INDEXED)!=0 
34c40 26 26 20 28 77 73 20 26 20 57 48 45 52 45 5f 54  && (ws & WHERE_T
34c50 45 4d 50 5f 49 4e 44 45 58 29 3d 3d 30 20 29 7b  EMP_INDEX)==0 ){
34c60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34c70 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
34c80 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e  _Close, pLevel->
34c90 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20  iIdxCur);.      
34ca0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
34cb0 49 66 20 74 68 69 73 20 73 63 61 6e 20 75 73 65  If this scan use
34cc0 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65  s an index, make
34cd0 20 63 6f 64 65 20 73 75 62 73 74 69 74 75 74 69   code substituti
34ce0 6f 6e 73 20 74 6f 20 72 65 61 64 20 64 61 74 61  ons to read data
34cf0 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65  .    ** from the
34d00 20 69 6e 64 65 78 20 69 6e 20 70 72 65 66 65 72   index in prefer
34d10 65 6e 63 65 20 74 6f 20 74 68 65 20 74 61 62 6c  ence to the tabl
34d20 65 2e 20 53 6f 6d 65 74 69 6d 65 73 2c 20 74 68  e. Sometimes, th
34d30 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  is means.    ** 
34d40 74 68 65 20 74 61 62 6c 65 20 6e 65 65 64 20 6e  the table need n
34d50 65 76 65 72 20 62 65 20 72 65 61 64 20 66 72 6f  ever be read fro
34d60 6d 2e 20 54 68 69 73 20 69 73 20 61 20 70 65 72  m. This is a per
34d70 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2c 0a  formance boost,.
34d80 20 20 20 20 2a 2a 20 61 73 20 74 68 65 20 76 64      ** as the vd
34d90 62 65 20 6c 65 76 65 6c 20 77 61 69 74 73 20 75  be level waits u
34da0 6e 74 69 6c 20 74 68 65 20 74 61 62 6c 65 20 69  ntil the table i
34db0 73 20 72 65 61 64 20 62 65 66 6f 72 65 20 61 63  s read before ac
34dc0 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 73 65  tually.    ** se
34dd0 65 6b 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20  eking the table 
34de0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 72 65  cursor to the re
34df0 63 6f 72 64 20 63 6f 72 72 65 73 70 6f 6e 64 69  cord correspondi
34e00 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ng to the curren
34e10 74 0a 20 20 20 20 2a 2a 20 70 6f 73 69 74 69 6f  t.    ** positio
34e20 6e 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a  n in the index..
34e30 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43      ** .    ** C
34e40 61 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65  alls to the code
34e50 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65   generator in be
34e60 74 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65  tween sqlite3Whe
34e70 72 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20  reBegin and.    
34e80 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  ** sqlite3WhereE
34e90 6e 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65  nd will have cre
34ea0 61 74 65 64 20 63 6f 64 65 20 74 68 61 74 20 72  ated code that r
34eb0 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 74 61  eferences the ta
34ec0 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  ble.    ** direc
34ed0 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20  tly.  This loop 
34ee0 73 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63  scans all that c
34ef0 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ode looking for 
34f00 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74  opcodes.    ** t
34f10 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68  hat reference th
34f20 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76  e table and conv
34f30 65 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f  erts them into o
34f40 70 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20  pcodes that.    
34f50 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ** reference the
34f60 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20   index..    */. 
34f70 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70     if( pLevel->p
34f80 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
34f90 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20  ERE_INDEXED ){. 
34fa0 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76       pIdx = pLev
34fb0 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b  el->plan.u.pIdx;
34fc0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
34fd0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
34fe0 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54  ags & WHERE_MULT
34ff0 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 49  I_OR ){.      pI
35000 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 70  dx = pLevel->u.p
35010 43 6f 76 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20  Covidx;.    }.  
35020 20 20 69 66 28 20 70 49 64 78 20 26 26 20 21 64    if( pIdx && !d
35030 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29  b->mallocFailed)
35040 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 2c 20 6a  {.      int k, j
35050 2c 20 6c 61 73 74 3b 0a 20 20 20 20 20 20 56 64  , last;.      Vd
35060 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 20 20  beOp *pOp;..    
35070 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
35080 64 62 65 47 65 74 4f 70 28 76 2c 20 70 57 49 6e  dbeGetOp(v, pWIn
35090 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20 20 20 20  fo->iTop);.     
350a0 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56   last = sqlite3V
350b0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
350c0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70  );.      for(k=p
350d0 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20 6b 3c 6c  WInfo->iTop; k<l
350e0 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29  ast; k++, pOp++)
350f0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  {.        if( pO
35100 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69  p->p1!=pLevel->i
35110 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  TabCur ) continu
35120 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
35130 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43  Op->opcode==OP_C
35140 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
35150 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49     for(j=0; j<pI
35160 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  dx->nColumn; j++
35170 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
35180 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70 49 64 78  f( pOp->p2==pIdx
35190 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b  ->aiColumn[j] ){
351a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
351b0 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20 20 20  Op->p2 = j;.    
351c0 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
351d0 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  1 = pLevel->iIdx
351e0 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Cur;.           
351f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
35200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35210 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73    }.          as
35220 73 65 72 74 28 20 28 70 4c 65 76 65 6c 2d 3e 70  sert( (pLevel->p
35230 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
35240 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
35250 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
35260 7c 7c 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  || j<pIdx->nColu
35270 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  mn );.        }e
35280 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  lse if( pOp->opc
35290 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b  ode==OP_Rowid ){
352a0 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
352b0 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  p1 = pLevel->iId
352c0 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20  xCur;.          
352d0 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
352e0 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20 20 20  _IdxRowid;.     
352f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
35300 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e   }.  }..  /* Fin
35310 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a  al cleanup.  */.
35320 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
35330 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73  Loop = pWInfo->s
35340 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a  avedNQueryLoop;.
35350 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28    whereInfoFree(
35360 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72  db, pWInfo);.  r
35370 65 74 75 72 6e 3b 0a 7d 0a                       eturn;.}.