/ Hex Artifact Content
Login

Artifact b5325975cbdd9b64f680fb88d7e727fc9368db68:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  .../*.** Trace o
0350: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
0360: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
0370: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
0380: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
0390: 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c 69  )./***/ int sqli
03a0: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d 20  te3WhereTrace = 
03b0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
03c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
03d0: 55 47 29 20 5c 0a 20 20 20 20 26 26 20 28 64 65  UG) \.    && (de
03e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
03f0: 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
0400: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52  LITE_ENABLE_WHER
0410: 45 54 52 41 43 45 29 29 0a 23 20 64 65 66 69 6e  ETRACE)).# defin
0420: 65 20 57 48 45 52 45 54 52 41 43 45 28 58 29 20  e WHERETRACE(X) 
0430: 20 69 66 28 73 71 6c 69 74 65 33 57 68 65 72 65   if(sqlite3Where
0440: 54 72 61 63 65 29 20 73 71 6c 69 74 65 33 44 65  Trace) sqlite3De
0450: 62 75 67 50 72 69 6e 74 66 20 58 0a 23 65 6c 73  bugPrintf X.#els
0460: 65 0a 23 20 64 65 66 69 6e 65 20 57 48 45 52 45  e.# define WHERE
0470: 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a  TRACE(X).#endif.
0480: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
0490: 72 65 6e 63 65 0a 2a 2f 0a 74 79 70 65 64 65 66  rence.*/.typedef
04a0: 20 73 74 72 75 63 74 20 57 68 65 72 65 43 6c 61   struct WhereCla
04b0: 75 73 65 20 57 68 65 72 65 43 6c 61 75 73 65 3b  use WhereClause;
04c0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
04d0: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 57 68 65  WhereMaskSet Whe
04e0: 72 65 4d 61 73 6b 53 65 74 3b 0a 74 79 70 65 64  reMaskSet;.typed
04f0: 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65 4f  ef struct WhereO
0500: 72 49 6e 66 6f 20 57 68 65 72 65 4f 72 49 6e 66  rInfo WhereOrInf
0510: 6f 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  o;.typedef struc
0520: 74 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 57  t WhereAndInfo W
0530: 68 65 72 65 41 6e 64 49 6e 66 6f 3b 0a 74 79 70  hereAndInfo;.typ
0540: 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72  edef struct Wher
0550: 65 43 6f 73 74 20 57 68 65 72 65 43 6f 73 74 3b  eCost WhereCost;
0560: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72  ../*.** The quer
0570: 79 20 67 65 6e 65 72 61 74 6f 72 20 75 73 65 73  y generator uses
0580: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 73   an array of ins
0590: 74 61 6e 63 65 73 20 6f 66 20 74 68 69 73 20 73  tances of this s
05a0: 74 72 75 63 74 75 72 65 20 74 6f 0a 2a 2a 20 68  tructure to.** h
05b0: 65 6c 70 20 69 74 20 61 6e 61 6c 79 7a 65 20 74  elp it analyze t
05c0: 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
05d0: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
05e0: 6c 61 75 73 65 2e 20 20 45 61 63 68 20 57 48 45  lause.  Each WHE
05f0: 52 45 0a 2a 2a 20 63 6c 61 75 73 65 20 73 75 62  RE.** clause sub
0600: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
0610: 70 61 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65  parated from the
0620: 20 6f 74 68 65 72 73 20 62 79 20 41 4e 44 20 6f   others by AND o
0630: 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20 75 73 75  perators,.** usu
0640: 61 6c 6c 79 2c 20 6f 72 20 73 6f 6d 65 74 69 6d  ally, or sometim
0650: 65 73 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  es subexpression
0660: 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20 4f  s separated by O
0670: 52 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 57 68 65  R..**.** All Whe
0680: 72 65 54 65 72 6d 73 20 61 72 65 20 63 6f 6c 6c  reTerms are coll
0690: 65 63 74 65 64 20 69 6e 74 6f 20 61 20 73 69 6e  ected into a sin
06a0: 67 6c 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  gle WhereClause 
06b0: 73 74 72 75 63 74 75 72 65 2e 20 20 0a 2a 2a 20  structure.  .** 
06c0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 64  The following id
06d0: 65 6e 74 69 74 79 20 68 6f 6c 64 73 3a 0a 2a 2a  entity holds:.**
06e0: 0a 2a 2a 20 20 20 20 20 20 20 20 57 68 65 72 65  .**        Where
06f0: 54 65 72 6d 2e 70 57 43 2d 3e 61 5b 57 68 65 72  Term.pWC->a[Wher
0700: 65 54 65 72 6d 2e 69 64 78 5d 20 3d 3d 20 57 68  eTerm.idx] == Wh
0710: 65 72 65 54 65 72 6d 0a 2a 2a 0a 2a 2a 20 57 68  ereTerm.**.** Wh
0720: 65 6e 20 61 20 74 65 72 6d 20 69 73 20 6f 66 20  en a term is of 
0730: 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 58 20 3c               X <
0750: 6f 70 3e 20 3c 65 78 70 72 3e 0a 2a 2a 0a 2a 2a  op> <expr>.**.**
0760: 20 77 68 65 72 65 20 58 20 69 73 20 61 20 63 6f   where X is a co
0770: 6c 75 6d 6e 20 6e 61 6d 65 20 61 6e 64 20 3c 6f  lumn name and <o
0780: 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 63 65 72  p> is one of cer
0790: 74 61 69 6e 20 6f 70 65 72 61 74 6f 72 73 2c 0a  tain operators,.
07a0: 2a 2a 20 74 68 65 6e 20 57 68 65 72 65 54 65 72  ** then WhereTer
07b0: 6d 2e 6c 65 66 74 43 75 72 73 6f 72 20 61 6e 64  m.leftCursor and
07c0: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 6c 65 66   WhereTerm.u.lef
07d0: 74 43 6f 6c 75 6d 6e 20 72 65 63 6f 72 64 20 74  tColumn record t
07e0: 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d  he.** cursor num
07f0: 62 65 72 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e  ber and column n
0800: 75 6d 62 65 72 20 66 6f 72 20 58 2e 20 20 57 68  umber for X.  Wh
0810: 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f  ereTerm.eOperato
0820: 72 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65  r records.** the
0830: 20 3c 6f 70 3e 20 75 73 69 6e 67 20 61 20 62 69   <op> using a bi
0840: 74 6d 61 73 6b 20 65 6e 63 6f 64 69 6e 67 20 64  tmask encoding d
0850: 65 66 69 6e 65 64 20 62 79 20 57 4f 5f 78 78 78  efined by WO_xxx
0860: 20 62 65 6c 6f 77 2e 20 20 54 68 65 0a 2a 2a 20   below.  The.** 
0870: 75 73 65 20 6f 66 20 61 20 62 69 74 6d 61 73 6b  use of a bitmask
0880: 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72 20 74 68   encoding for th
0890: 65 20 6f 70 65 72 61 74 6f 72 20 61 6c 6c 6f 77  e operator allow
08a0: 73 20 75 73 20 74 6f 20 73 65 61 72 63 68 0a 2a  s us to search.*
08b0: 2a 20 71 75 69 63 6b 6c 79 20 66 6f 72 20 74 65  * quickly for te
08c0: 72 6d 73 20 74 68 61 74 20 6d 61 74 63 68 20 61  rms that match a
08d0: 6e 79 20 6f 66 20 73 65 76 65 72 61 6c 20 64 69  ny of several di
08e0: 66 66 65 72 65 6e 74 20 6f 70 65 72 61 74 6f 72  fferent operator
08f0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 57 68 65 72 65  s..**.** A Where
0900: 54 65 72 6d 20 6d 69 67 68 74 20 61 6c 73 6f 20  Term might also 
0910: 62 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  be two or more s
0920: 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65  ubterms connecte
0930: 64 20 62 79 20 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20  d by OR:.**.**  
0940: 20 20 20 20 20 20 20 28 74 31 2e 58 20 3c 6f 70         (t1.X <op
0950: 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20 28 74 31  > <expr>) OR (t1
0960: 2e 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 29 20  .Y <op> <expr>) 
0970: 4f 52 20 2e 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e  OR .....**.** In
0980: 20 74 68 69 73 20 73 65 63 6f 6e 64 20 63 61 73   this second cas
0990: 65 2c 20 77 74 46 6c 61 67 20 61 73 20 74 68 65  e, wtFlag as the
09a0: 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 73 65 74   TERM_ORINFO set
09b0: 20 61 6e 64 20 65 4f 70 65 72 61 74 6f 72 3d 3d   and eOperator==
09c0: 57 4f 5f 4f 52 0a 2a 2a 20 61 6e 64 20 74 68 65  WO_OR.** and the
09d0: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72   WhereTerm.u.pOr
09e0: 49 6e 66 6f 20 66 69 65 6c 64 20 70 6f 69 6e 74  Info field point
09f0: 73 20 74 6f 20 61 75 78 69 6c 69 61 72 79 20 69  s to auxiliary i
0a00: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 0a  nformation that.
0a10: 2a 2a 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20  ** is collected 
0a20: 61 62 6f 75 74 20 74 68 65 0a 2a 2a 0a 2a 2a 20  about the.**.** 
0a30: 49 66 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65  If a term in the
0a40: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 6f   WHERE clause do
0a50: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 65 69 74  es not match eit
0a60: 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
0a70: 72 65 76 69 6f 75 73 0a 2a 2a 20 63 61 74 65 67  revious.** categ
0a80: 6f 72 69 65 73 2c 20 74 68 65 6e 20 65 4f 70 65  ories, then eOpe
0a90: 72 61 74 6f 72 3d 3d 30 2e 20 20 54 68 65 20 57  rator==0.  The W
0aa0: 68 65 72 65 54 65 72 6d 2e 70 45 78 70 72 20 66  hereTerm.pExpr f
0ab0: 69 65 6c 64 20 69 73 20 73 74 69 6c 6c 20 73 65  ield is still se
0ac0: 74 0a 2a 2a 20 74 6f 20 74 68 65 20 6f 72 69 67  t.** to the orig
0ad0: 69 6e 61 6c 20 73 75 62 65 78 70 72 65 73 73 69  inal subexpressi
0ae0: 6f 6e 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 77  on content and w
0af0: 74 46 6c 61 67 73 20 69 73 20 73 65 74 20 75 70  tFlags is set up
0b00: 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 0a 2a   appropriately.*
0b10: 2a 20 62 75 74 20 6e 6f 20 6f 74 68 65 72 20 66  * but no other f
0b20: 69 65 6c 64 73 20 69 6e 20 74 68 65 20 57 68 65  ields in the Whe
0b30: 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 20 61 72  reTerm object ar
0b40: 65 20 6d 65 61 6e 69 6e 67 66 75 6c 2e 0a 2a 2a  e meaningful..**
0b50: 0a 2a 2a 20 57 68 65 6e 20 65 4f 70 65 72 61 74  .** When eOperat
0b60: 6f 72 21 3d 30 2c 20 70 72 65 72 65 71 52 69 67  or!=0, prereqRig
0b70: 68 74 20 61 6e 64 20 70 72 65 72 65 71 41 6c 6c  ht and prereqAll
0b80: 20 72 65 63 6f 72 64 20 73 65 74 73 20 6f 66 20   record sets of 
0b90: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 2c 0a  cursor numbers,.
0ba0: 2a 2a 20 62 75 74 20 74 68 65 79 20 64 6f 20 73  ** but they do s
0bb0: 6f 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 20 41  o indirectly.  A
0bc0: 20 73 69 6e 67 6c 65 20 57 68 65 72 65 4d 61 73   single WhereMas
0bd0: 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 20 74  kSet structure t
0be0: 72 61 6e 73 6c 61 74 65 73 0a 2a 2a 20 63 75 72  ranslates.** cur
0bf0: 73 6f 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  sor number into 
0c00: 62 69 74 73 20 61 6e 64 20 74 68 65 20 74 72 61  bits and the tra
0c10: 6e 73 6c 61 74 65 64 20 62 69 74 20 69 73 20 73  nslated bit is s
0c20: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 72 65  tored in the pre
0c30: 72 65 71 0a 2a 2a 20 66 69 65 6c 64 73 2e 20 20  req.** fields.  
0c40: 54 68 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20  The translation 
0c50: 69 73 20 75 73 65 64 20 69 6e 20 6f 72 64 65 72  is used in order
0c60: 20 74 6f 20 6d 61 78 69 6d 69 7a 65 20 74 68 65   to maximize the
0c70: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 69   number of.** bi
0c80: 74 73 20 74 68 61 74 20 77 69 6c 6c 20 66 69 74  ts that will fit
0c90: 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 2e 20 20   in a Bitmask.  
0ca0: 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
0cb0: 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20 62 65  numbers might be
0cc0: 0a 2a 2a 20 73 70 72 65 61 64 20 6f 75 74 20 6f  .** spread out o
0cd0: 76 65 72 20 74 68 65 20 6e 6f 6e 2d 6e 65 67 61  ver the non-nega
0ce0: 74 69 76 65 20 69 6e 74 65 67 65 72 73 2e 20 20  tive integers.  
0cf0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  For example, the
0d00: 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65   cursor.** numbe
0d10: 72 73 20 6d 69 67 68 74 20 62 65 20 33 2c 20 38  rs might be 3, 8
0d20: 2c 20 39 2c 20 31 30 2c 20 32 30 2c 20 32 33 2c  , 9, 10, 20, 23,
0d30: 20 34 31 2c 20 61 6e 64 20 34 35 2e 20 20 54 68   41, and 45.  Th
0d40: 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74 0a 2a  e WhereMaskSet.*
0d50: 2a 20 74 72 61 6e 73 6c 61 74 65 73 20 74 68 65  * translates the
0d60: 73 65 20 73 70 61 72 73 65 20 63 75 72 73 6f 72  se sparse cursor
0d70: 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f   numbers into co
0d80: 6e 73 65 63 75 74 69 76 65 20 69 6e 74 65 67 65  nsecutive intege
0d90: 72 73 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20  rs.** beginning 
0da0: 77 69 74 68 20 30 20 69 6e 20 6f 72 64 65 72 20  with 0 in order 
0db0: 74 6f 20 6d 61 6b 65 20 74 68 65 20 62 65 73 74  to make the best
0dc0: 20 70 6f 73 73 69 62 6c 65 20 75 73 65 20 6f 66   possible use of
0dd0: 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a   the available.*
0de0: 2a 20 62 69 74 73 20 69 6e 20 74 68 65 20 42 69  * bits in the Bi
0df0: 74 6d 61 73 6b 2e 20 20 53 6f 2c 20 69 6e 20 74  tmask.  So, in t
0e00: 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65  he example above
0e10: 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  , the cursor num
0e20: 62 65 72 73 0a 2a 2a 20 77 6f 75 6c 64 20 62 65  bers.** would be
0e30: 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 69 6e 74   mapped into int
0e40: 65 67 65 72 73 20 30 20 74 68 72 6f 75 67 68 20  egers 0 through 
0e50: 37 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d  7..**.** The num
0e60: 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
0e70: 61 20 6a 6f 69 6e 20 69 73 20 6c 69 6d 69 74 65  a join is limite
0e80: 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20  d by the number 
0e90: 6f 66 20 62 69 74 73 0a 2a 2a 20 69 6e 20 70 72  of bits.** in pr
0ea0: 65 72 65 71 52 69 67 68 74 20 61 6e 64 20 70 72  ereqRight and pr
0eb0: 65 72 65 71 41 6c 6c 2e 20 20 54 68 65 20 64 65  ereqAll.  The de
0ec0: 66 61 75 6c 74 20 69 73 20 36 34 20 62 69 74 73  fault is 64 bits
0ed0: 2c 20 68 65 6e 63 65 20 53 51 4c 69 74 65 0a 2a  , hence SQLite.*
0ee0: 2a 20 69 73 20 6f 6e 6c 79 20 61 62 6c 65 20 74  * is only able t
0ef0: 6f 20 70 72 6f 63 65 73 73 20 6a 6f 69 6e 73 20  o process joins 
0f00: 77 69 74 68 20 36 34 20 6f 72 20 66 65 77 65 72  with 64 or fewer
0f10: 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 74 79 70 65   tables..*/.type
0f20: 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65  def struct Where
0f30: 54 65 72 6d 20 57 68 65 72 65 54 65 72 6d 3b 0a  Term WhereTerm;.
0f40: 73 74 72 75 63 74 20 57 68 65 72 65 54 65 72 6d  struct WhereTerm
0f50: 20 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72   {.  Expr *pExpr
0f60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0f70: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  Pointer to the s
0f80: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  ubexpression tha
0f90: 74 20 69 73 20 74 68 69 73 20 74 65 72 6d 20 2a  t is this term *
0fa0: 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b  /.  int iParent;
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
0fc0: 69 73 61 62 6c 65 20 70 57 43 2d 3e 61 5b 69 50  isable pWC->a[iP
0fd0: 61 72 65 6e 74 5d 20 77 68 65 6e 20 74 68 69 73  arent] when this
0fe0: 20 74 65 72 6d 20 64 69 73 61 62 6c 65 64 20 2a   term disabled *
0ff0: 2f 0a 20 20 69 6e 74 20 6c 65 66 74 43 75 72 73  /.  int leftCurs
1000: 6f 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  or;         /* C
1010: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
1020: 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78  X in "X <op> <ex
1030: 70 72 3e 22 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20  pr>" */.  union 
1040: 7b 0a 20 20 20 20 69 6e 74 20 6c 65 66 74 43 6f  {.    int leftCo
1050: 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  lumn;         /*
1060: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f   Column number o
1070: 66 20 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c  f X in "X <op> <
1080: 65 78 70 72 3e 22 20 2a 2f 0a 20 20 20 20 57 68  expr>" */.    Wh
1090: 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e  ereOrInfo *pOrIn
10a0: 66 6f 3b 20 20 20 2f 2a 20 45 78 74 72 61 20 69  fo;   /* Extra i
10b0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 66 20 65 4f  nformation if eO
10c0: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 2a  perator==WO_OR *
10d0: 2f 0a 20 20 20 20 57 68 65 72 65 41 6e 64 49 6e  /.    WhereAndIn
10e0: 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 20 2f 2a  fo *pAndInfo; /*
10f0: 20 45 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   Extra informati
1100: 6f 6e 20 69 66 20 65 4f 70 65 72 61 74 6f 72 3d  on if eOperator=
1110: 3d 57 4f 5f 41 4e 44 20 2a 2f 0a 20 20 7d 20 75  =WO_AND */.  } u
1120: 3b 0a 20 20 75 31 36 20 65 4f 70 65 72 61 74 6f  ;.  u16 eOperato
1130: 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  r;          /* A
1140: 20 57 4f 5f 78 78 20 76 61 6c 75 65 20 64 65 73   WO_xx value des
1150: 63 72 69 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a  cribing <op> */.
1160: 20 20 75 38 20 77 74 46 6c 61 67 73 3b 20 20 20    u8 wtFlags;   
1170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 45 52            /* TER
1180: 4d 5f 78 78 78 20 62 69 74 20 66 6c 61 67 73 2e  M_xxx bit flags.
1190: 20 20 53 65 65 20 62 65 6c 6f 77 20 2a 2f 0a 20    See below */. 
11a0: 20 75 38 20 6e 43 68 69 6c 64 3b 20 20 20 20 20   u8 nChild;     
11b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
11c0: 65 72 20 6f 66 20 63 68 69 6c 64 72 65 6e 20 74  er of children t
11d0: 68 61 74 20 6d 75 73 74 20 64 69 73 61 62 6c 65  hat must disable
11e0: 20 75 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c   us */.  WhereCl
11f0: 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20  ause *pWC;      
1200: 20 2f 2a 20 54 68 65 20 63 6c 61 75 73 65 20 74   /* The clause t
1210: 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74  his term is part
1220: 20 6f 66 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b   of */.  Bitmask
1230: 20 70 72 65 72 65 71 52 69 67 68 74 3b 20 20 20   prereqRight;   
1240: 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 74   /* Bitmask of t
1250: 61 62 6c 65 73 20 75 73 65 64 20 62 79 20 70 45  ables used by pE
1260: 78 70 72 2d 3e 70 52 69 67 68 74 20 2a 2f 0a 20  xpr->pRight */. 
1270: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41   Bitmask prereqA
1280: 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 42 69 74 6d  ll;      /* Bitm
1290: 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 72 65  ask of tables re
12a0: 66 65 72 65 6e 63 65 64 20 62 79 20 70 45 78 70  ferenced by pExp
12b0: 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  r */.};../*.** A
12c0: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66  llowed values of
12d0: 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61   WhereTerm.wtFla
12e0: 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45  gs.*/.#define TE
12f0: 52 4d 5f 44 59 4e 41 4d 49 43 20 20 20 20 30 78  RM_DYNAMIC    0x
1300: 30 31 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20  01   /* Need to 
1310: 63 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72  call sqlite3Expr
1320: 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
1330: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52  ) */.#define TER
1340: 4d 5f 56 49 52 54 55 41 4c 20 20 20 20 30 78 30  M_VIRTUAL    0x0
1350: 32 20 20 20 2f 2a 20 41 64 64 65 64 20 62 79 20  2   /* Added by 
1360: 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20  the optimizer.  
1370: 44 6f 20 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a 23  Do not code */.#
1380: 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 44 45  define TERM_CODE
1390: 44 20 20 20 20 20 20 30 78 30 34 20 20 20 2f 2a  D      0x04   /*
13a0: 20 54 68 69 73 20 74 65 72 6d 20 69 73 20 61 6c   This term is al
13b0: 72 65 61 64 79 20 63 6f 64 65 64 20 2a 2f 0a 23  ready coded */.#
13c0: 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 50 49  define TERM_COPI
13d0: 45 44 20 20 20 20 20 30 78 30 38 20 20 20 2f 2a  ED     0x08   /*
13e0: 20 48 61 73 20 61 20 63 68 69 6c 64 20 2a 2f 0a   Has a child */.
13f0: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 49  #define TERM_ORI
1400: 4e 46 4f 20 20 20 20 20 30 78 31 30 20 20 20 2f  NFO     0x10   /
1410: 2a 20 4e 65 65 64 20 74 6f 20 66 72 65 65 20 74  * Need to free t
1420: 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70  he WhereTerm.u.p
1430: 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f  OrInfo object */
1440: 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 41 4e  .#define TERM_AN
1450: 44 49 4e 46 4f 20 20 20 20 30 78 32 30 20 20 20  DINFO    0x20   
1460: 2f 2a 20 4e 65 65 64 20 74 6f 20 66 72 65 65 20  /* Need to free 
1470: 74 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e  the WhereTerm.u.
1480: 70 41 6e 64 49 6e 66 6f 20 6f 62 6a 20 2a 2f 0a  pAndInfo obj */.
1490: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 5f  #define TERM_OR_
14a0: 4f 4b 20 20 20 20 20 20 30 78 34 30 20 20 20 2f  OK      0x40   /
14b0: 2a 20 55 73 65 64 20 64 75 72 69 6e 67 20 4f 52  * Used during OR
14c0: 2d 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69  -clause processi
14d0: 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ng */.#ifdef SQL
14e0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
14f0: 0a 23 20 20 64 65 66 69 6e 65 20 54 45 52 4d 5f  .#  define TERM_
1500: 56 4e 55 4c 4c 20 20 20 20 30 78 38 30 20 20 20  VNULL    0x80   
1510: 2f 2a 20 4d 61 6e 75 66 61 63 74 75 72 65 64 20  /* Manufactured 
1520: 78 3e 4e 55 4c 4c 20 6f 72 20 78 3c 3d 4e 55 4c  x>NULL or x<=NUL
1530: 4c 20 74 65 72 6d 20 2a 2f 0a 23 65 6c 73 65 0a  L term */.#else.
1540: 23 20 20 64 65 66 69 6e 65 20 54 45 52 4d 5f 56  #  define TERM_V
1550: 4e 55 4c 4c 20 20 20 20 30 78 30 30 20 20 20 2f  NULL    0x00   /
1560: 2a 20 44 69 73 61 62 6c 65 64 20 69 66 20 6e 6f  * Disabled if no
1570: 74 20 75 73 69 6e 67 20 73 74 61 74 33 20 2a 2f  t using stat3 */
1580: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
1590: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
15a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
15b0: 63 74 75 72 65 20 68 6f 6c 64 73 20 61 6c 6c 20  cture holds all 
15c0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
15d0: 74 20 61 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  t a.** WHERE cla
15e0: 75 73 65 2e 20 20 4d 6f 73 74 6c 79 20 74 68 69  use.  Mostly thi
15f0: 73 20 69 73 20 61 20 63 6f 6e 74 61 69 6e 65 72  s is a container
1600: 20 66 6f 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   for one or more
1610: 20 57 68 65 72 65 54 65 72 6d 73 2e 0a 2a 2a 0a   WhereTerms..**.
1620: 2a 2a 20 45 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  ** Explanation o
1630: 66 20 70 4f 75 74 65 72 3a 20 20 46 6f 72 20 61  f pOuter:  For a
1640: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66   WHERE clause of
1650: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20   the form.**.** 
1660: 20 20 20 20 20 20 20 20 20 20 61 20 41 4e 44 20            a AND 
1670: 28 28 62 20 41 4e 44 20 63 29 20 4f 52 20 28 64  ((b AND c) OR (d
1680: 20 41 4e 44 20 65 29 29 20 41 4e 44 20 66 0a 2a   AND e)) AND f.*
1690: 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 73  *.** There are s
16a0: 65 70 61 72 61 74 65 20 57 68 65 72 65 43 6c 61  eparate WhereCla
16b0: 75 73 65 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  use objects for 
16c0: 74 68 65 20 77 68 6f 6c 65 20 63 6c 61 75 73 65  the whole clause
16d0: 20 61 6e 64 20 66 6f 72 0a 2a 2a 20 74 68 65 20   and for.** the 
16e0: 73 75 62 63 6c 61 75 73 65 73 20 22 28 62 20 41  subclauses "(b A
16f0: 4e 44 20 63 29 22 20 61 6e 64 20 22 28 64 20 41  ND c)" and "(d A
1700: 4e 44 20 65 29 22 2e 20 20 54 68 65 20 70 4f 75  ND e)".  The pOu
1710: 74 65 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ter field of the
1720: 0a 2a 2a 20 73 75 62 63 6c 61 75 73 65 73 20 70  .** subclauses p
1730: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 57 68 65  oints to the Whe
1740: 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20  reClause object 
1750: 66 6f 72 20 74 68 65 20 77 68 6f 6c 65 20 63 6c  for the whole cl
1760: 61 75 73 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ause..*/.struct 
1770: 57 68 65 72 65 43 6c 61 75 73 65 20 7b 0a 20 20  WhereClause {.  
1780: 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
1790: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17a0: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
17b0: 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74  /.  WhereMaskSet
17c0: 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 2f 2a 20   *pMaskSet;  /* 
17d0: 4d 61 70 70 69 6e 67 20 6f 66 20 74 61 62 6c 65  Mapping of table
17e0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
17f0: 74 6f 20 62 69 74 6d 61 73 6b 73 20 2a 2f 0a 20  to bitmasks */. 
1800: 20 42 69 74 6d 61 73 6b 20 76 6d 61 73 6b 3b 20   Bitmask vmask; 
1810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
1820: 6d 61 73 6b 20 69 64 65 6e 74 69 66 79 69 6e 67  mask identifying
1830: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63   virtual table c
1840: 75 72 73 6f 72 73 20 2a 2f 0a 20 20 57 68 65 72  ursors */.  Wher
1850: 65 43 6c 61 75 73 65 20 2a 70 4f 75 74 65 72 3b  eClause *pOuter;
1860: 20 20 20 20 20 2f 2a 20 4f 75 74 65 72 20 63 6f       /* Outer co
1870: 6e 6a 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75  njunction */.  u
1880: 38 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  8 op;           
1890: 20 20 20 20 20 20 20 20 2f 2a 20 53 70 6c 69 74          /* Split
18a0: 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 4b 5f 41   operator.  TK_A
18b0: 4e 44 20 6f 72 20 54 4b 5f 4f 52 20 2a 2f 0a 20  ND or TK_OR */. 
18c0: 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 3b   u16 wctrlFlags;
18d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 67            /* Mig
18e0: 68 74 20 69 6e 63 6c 75 64 65 20 57 48 45 52 45  ht include WHERE
18f0: 5f 41 4e 44 5f 4f 4e 4c 59 20 2a 2f 0a 20 20 69  _AND_ONLY */.  i
1900: 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
1910: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1920: 72 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20  r of terms */.  
1930: 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20  int nSlot;      
1940: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1950: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
1960: 20 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54   a[] */.  WhereT
1970: 65 72 6d 20 2a 61 3b 20 20 20 20 20 20 20 20 20  erm *a;         
1980: 20 20 20 2f 2a 20 45 61 63 68 20 61 5b 5d 20 64     /* Each a[] d
1990: 65 73 63 72 69 62 65 73 20 61 20 74 65 72 6d 20  escribes a term 
19a0: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 75  of the WHERE clu
19b0: 61 73 65 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ase */.#if defin
19c0: 65 64 28 53 51 4c 49 54 45 5f 53 4d 41 4c 4c 5f  ed(SQLITE_SMALL_
19d0: 53 54 41 43 4b 29 0a 20 20 57 68 65 72 65 54 65  STACK).  WhereTe
19e0: 72 6d 20 61 53 74 61 74 69 63 5b 31 5d 3b 20 20  rm aStatic[1];  
19f0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74 61    /* Initial sta
1a00: 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 5b  tic space for a[
1a10: 5d 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 57 68 65  ] */.#else.  Whe
1a20: 72 65 54 65 72 6d 20 61 53 74 61 74 69 63 5b 38  reTerm aStatic[8
1a30: 5d 3b 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  ];    /* Initial
1a40: 20 73 74 61 74 69 63 20 73 70 61 63 65 20 66 6f   static space fo
1a50: 72 20 61 5b 5d 20 2a 2f 0a 23 65 6e 64 69 66 0a  r a[] */.#endif.
1a60: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72  };../*.** A Wher
1a70: 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65 72  eTerm with eOper
1a80: 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 68 61 73 20  ator==WO_OR has 
1a90: 69 74 73 20 75 2e 70 4f 72 49 6e 66 6f 20 70 6f  its u.pOrInfo po
1aa0: 69 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20  inter set to.** 
1ab0: 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  a dynamically al
1ac0: 6c 6f 63 61 74 65 64 20 69 6e 73 74 61 6e 63 65  located instance
1ad0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1ae0: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  g structure..*/.
1af0: 73 74 72 75 63 74 20 57 68 65 72 65 4f 72 49 6e  struct WhereOrIn
1b00: 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61 75  fo {.  WhereClau
1b10: 73 65 20 77 63 3b 20 20 20 20 20 20 20 20 20 20  se wc;          
1b20: 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e  /* Decomposition
1b30: 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
1b40: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65  /.  Bitmask inde
1b50: 78 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  xable;       /* 
1b60: 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 69  Bitmask of all i
1b70: 6e 64 65 78 61 62 6c 65 20 74 61 62 6c 65 73 20  ndexable tables 
1b80: 69 6e 20 74 68 65 20 63 6c 61 75 73 65 20 2a 2f  in the clause */
1b90: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65  .};../*.** A Whe
1ba0: 72 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65  reTerm with eOpe
1bb0: 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 68 61  rator==WO_AND ha
1bc0: 73 20 69 74 73 20 75 2e 70 41 6e 64 49 6e 66 6f  s its u.pAndInfo
1bd0: 20 70 6f 69 6e 74 65 72 20 73 65 74 20 74 6f 0a   pointer set to.
1be0: 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  ** a dynamically
1bf0: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 73 74 61   allocated insta
1c00: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
1c10: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
1c20: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 41  */.struct WhereA
1c30: 6e 64 49 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65  ndInfo {.  Where
1c40: 43 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20 20  Clause wc;      
1c50: 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 65 78      /* The subex
1c60: 70 72 65 73 73 69 6f 6e 20 62 72 6f 6b 65 6e 20  pression broken 
1c70: 6f 75 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  out */.};../*.**
1c80: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
1c90: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
1ca0: 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 74 72  ructure keeps tr
1cb0: 61 63 6b 20 6f 66 20 61 20 6d 61 70 70 69 6e 67  ack of a mapping
1cc0: 0a 2a 2a 20 62 65 74 77 65 65 6e 20 56 44 42 45  .** between VDBE
1cd0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
1ce0: 61 6e 64 20 62 69 74 73 20 6f 66 20 74 68 65 20  and bits of the 
1cf0: 62 69 74 6d 61 73 6b 73 20 69 6e 20 57 68 65 72  bitmasks in Wher
1d00: 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  eTerm..**.** The
1d10: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
1d20: 62 65 72 73 20 61 72 65 20 73 6d 61 6c 6c 20 69  bers are small i
1d30: 6e 74 65 67 65 72 73 20 63 6f 6e 74 61 69 6e 65  ntegers containe
1d40: 64 20 69 6e 20 0a 2a 2a 20 53 72 63 4c 69 73 74  d in .** SrcList
1d50: 5f 69 74 65 6d 2e 69 43 75 72 73 6f 72 20 61 6e  _item.iCursor an
1d60: 64 20 45 78 70 72 2e 69 54 61 62 6c 65 20 66 69  d Expr.iTable fi
1d70: 65 6c 64 73 2e 20 20 46 6f 72 20 61 6e 79 20 67  elds.  For any g
1d80: 69 76 65 6e 20 57 48 45 52 45 20 0a 2a 2a 20 63  iven WHERE .** c
1d90: 6c 61 75 73 65 2c 20 74 68 65 20 63 75 72 73 6f  lause, the curso
1da0: 72 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20  r numbers might 
1db0: 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  not begin with 0
1dc0: 20 61 6e 64 20 74 68 65 79 20 6d 69 67 68 74 0a   and they might.
1dd0: 2a 2a 20 63 6f 6e 74 61 69 6e 20 67 61 70 73 20  ** contain gaps 
1de0: 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 69 6e 67  in the numbering
1df0: 20 73 65 71 75 65 6e 63 65 2e 20 20 42 75 74 20   sequence.  But 
1e00: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
1e10: 6d 61 78 69 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f  maximum.** use o
1e20: 66 20 74 68 65 20 62 69 74 73 20 69 6e 20 6f 75  f the bits in ou
1e30: 72 20 62 69 74 6d 61 73 6b 73 2e 20 20 54 68 69  r bitmasks.  Thi
1e40: 73 20 73 74 72 75 63 74 75 72 65 20 70 72 6f 76  s structure prov
1e50: 69 64 65 73 20 61 20 6d 61 70 70 69 6e 67 0a 2a  ides a mapping.*
1e60: 2a 20 66 72 6f 6d 20 74 68 65 20 73 70 61 72 73  * from the spars
1e70: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
1e80: 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69 76   into consecutiv
1e90: 65 20 69 6e 74 65 67 65 72 73 20 62 65 67 69 6e  e integers begin
1ea0: 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20 30 2e 0a  ning.** with 0..
1eb0: 2a 2a 0a 2a 2a 20 49 66 20 57 68 65 72 65 4d 61  **.** If WhereMa
1ec0: 73 6b 53 65 74 2e 69 78 5b 41 5d 3d 3d 42 20 69  skSet.ix[A]==B i
1ed0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 54 68 65  t means that The
1ee0: 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 42   A-th bit of a B
1ef0: 69 74 6d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73  itmask.** corres
1f00: 70 6f 6e 64 73 20 56 44 42 45 20 63 75 72 73 6f  ponds VDBE curso
1f10: 72 20 6e 75 6d 62 65 72 20 42 2e 20 20 54 68 65  r number B.  The
1f20: 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 62   A-th bit of a b
1f30: 69 74 6d 61 73 6b 20 69 73 20 31 3c 3c 41 2e 0a  itmask is 1<<A..
1f40: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1f50: 65 2c 20 69 66 20 74 68 65 20 57 48 45 52 45 20  e, if the WHERE 
1f60: 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69 6f  clause expressio
1f70: 6e 20 75 73 65 64 20 74 68 65 73 65 20 56 44 42  n used these VDB
1f80: 45 0a 2a 2a 20 63 75 72 73 6f 72 73 3a 20 20 34  E.** cursors:  4
1f90: 2c 20 35 2c 20 38 2c 20 32 39 2c 20 35 37 2c 20  , 5, 8, 29, 57, 
1fa0: 37 33 2e 20 20 54 68 65 6e 20 74 68 65 20 20 57  73.  Then the  W
1fb0: 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75  hereMaskSet stru
1fc0: 63 74 75 72 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d  cture.** would m
1fd0: 61 70 20 74 68 6f 73 65 20 63 75 72 73 6f 72 20  ap those cursor 
1fe0: 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74  numbers into bit
1ff0: 73 20 30 20 74 68 72 6f 75 67 68 20 35 2e 0a 2a  s 0 through 5..*
2000: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
2010: 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f  he mapping is no
2020: 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 6f 72  t necessarily or
2030: 64 65 72 65 64 2e 20 20 49 6e 20 74 68 65 20 65  dered.  In the e
2040: 78 61 6d 70 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c  xample.** above,
2050: 20 74 68 65 20 6d 61 70 70 69 6e 67 20 6d 69 67   the mapping mig
2060: 68 74 20 67 6f 20 6c 69 6b 65 20 74 68 69 73 3a  ht go like this:
2070: 20 20 34 2d 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d    4->3, 5->1, 8-
2080: 3e 32 2c 20 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37  >2, 29->0,.** 57
2090: 2d 3e 35 2c 20 37 33 2d 3e 34 2e 20 20 4f 72 20  ->5, 73->4.  Or 
20a0: 6f 6e 65 20 6f 66 20 37 31 39 20 6f 74 68 65 72  one of 719 other
20b0: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6d 69   combinations mi
20c0: 67 68 74 20 62 65 20 75 73 65 64 2e 20 49 74 0a  ght be used. It.
20d0: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 6c  ** does not real
20e0: 6c 79 20 6d 61 74 74 65 72 2e 20 20 57 68 61 74  ly matter.  What
20f0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 73   is important is
2100: 20 74 68 61 74 20 73 70 61 72 73 65 20 63 75 72   that sparse cur
2110: 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 61  sor.** numbers a
2120: 6c 6c 20 67 65 74 20 6d 61 70 70 65 64 20 69 6e  ll get mapped in
2130: 74 6f 20 62 69 74 20 6e 75 6d 62 65 72 73 20 74  to bit numbers t
2140: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  hat begin with 0
2150: 20 61 6e 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20   and contain.** 
2160: 6e 6f 20 67 61 70 73 2e 0a 2a 2f 0a 73 74 72 75  no gaps..*/.stru
2170: 63 74 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  ct WhereMaskSet 
2180: 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  {.  int n;      
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
21b0: 73 73 69 67 6e 65 64 20 63 75 72 73 6f 72 20 76  ssigned cursor v
21c0: 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  alues */.  int i
21d0: 78 5b 42 4d 53 5d 3b 20 20 20 20 20 20 20 20 20  x[BMS];         
21e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
21f0: 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65  or assigned to e
2200: 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b 0a 0a 2f  ach bit */.};../
2210: 2a 0a 2a 2a 20 41 20 57 68 65 72 65 43 6f 73 74  *.** A WhereCost
2220: 20 6f 62 6a 65 63 74 20 72 65 63 6f 72 64 73 20   object records 
2230: 61 20 6c 6f 6f 6b 75 70 20 73 74 72 61 74 65 67  a lookup strateg
2240: 79 20 61 6e 64 20 74 68 65 20 65 73 74 69 6d 61  y and the estima
2250: 74 65 64 0a 2a 2a 20 63 6f 73 74 20 6f 66 20 70  ted.** cost of p
2260: 75 72 73 75 69 6e 67 20 74 68 61 74 20 73 74 72  ursuing that str
2270: 61 74 65 67 79 2e 0a 2a 2f 0a 73 74 72 75 63 74  ategy..*/.struct
2280: 20 57 68 65 72 65 43 6f 73 74 20 7b 0a 20 20 57   WhereCost {.  W
2290: 68 65 72 65 50 6c 61 6e 20 70 6c 61 6e 3b 20 20  herePlan plan;  
22a0: 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20    /* The lookup 
22b0: 73 74 72 61 74 65 67 79 20 2a 2f 0a 20 20 64 6f  strategy */.  do
22c0: 75 62 6c 65 20 72 43 6f 73 74 3b 20 20 20 20 20  uble rCost;     
22d0: 20 2f 2a 20 4f 76 65 72 61 6c 6c 20 63 6f 73 74   /* Overall cost
22e0: 20 6f 66 20 70 75 72 73 75 69 6e 67 20 74 68 69   of pursuing thi
22f0: 73 20 73 65 61 72 63 68 20 73 74 72 61 74 65 67  s search strateg
2300: 79 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 75  y */.  Bitmask u
2310: 73 65 64 3b 20 20 20 20 20 20 2f 2a 20 42 69 74  sed;      /* Bit
2320: 6d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20  mask of cursors 
2330: 75 73 65 64 20 62 79 20 74 68 69 73 20 70 6c 61  used by this pla
2340: 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42  n */.};../*.** B
2350: 69 74 6d 61 73 6b 73 20 66 6f 72 20 74 68 65 20  itmasks for the 
2360: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 69  operators that i
2370: 6e 64 69 63 65 73 20 61 72 65 20 61 62 6c 65 20  ndices are able 
2380: 74 6f 20 65 78 70 6c 6f 69 74 2e 20 20 41 6e 0a  to exploit.  An.
2390: 2a 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61  ** OR-ed combina
23a0: 74 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 76 61  tion of these va
23b0: 6c 75 65 73 20 63 61 6e 20 62 65 20 75 73 65 64  lues can be used
23c0: 20 77 68 65 6e 20 73 65 61 72 63 68 69 6e 67 20   when searching 
23d0: 66 6f 72 0a 2a 2a 20 74 65 72 6d 73 20 69 6e 20  for.** terms in 
23e0: 74 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65  the where clause
23f0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f  ..*/.#define WO_
2400: 49 4e 20 20 20 20 20 30 78 30 30 31 0a 23 64 65  IN     0x001.#de
2410: 66 69 6e 65 20 57 4f 5f 45 51 20 20 20 20 20 30  fine WO_EQ     0
2420: 78 30 30 32 0a 23 64 65 66 69 6e 65 20 57 4f 5f  x002.#define WO_
2430: 4c 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28  LT     (WO_EQ<<(
2440: 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29 0a 23 64  TK_LT-TK_EQ)).#d
2450: 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20 20 20 20  efine WO_LE     
2460: 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d 54  (WO_EQ<<(TK_LE-T
2470: 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57  K_EQ)).#define W
2480: 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f 45 51 3c  O_GT     (WO_EQ<
2490: 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51 29 29 0a  <(TK_GT-TK_EQ)).
24a0: 23 64 65 66 69 6e 65 20 57 4f 5f 47 45 20 20 20  #define WO_GE   
24b0: 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 45    (WO_EQ<<(TK_GE
24c0: 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65  -TK_EQ)).#define
24d0: 20 57 4f 5f 4d 41 54 43 48 20 20 30 78 30 34 30   WO_MATCH  0x040
24e0: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49 53 4e 55  .#define WO_ISNU
24f0: 4c 4c 20 30 78 30 38 30 0a 23 64 65 66 69 6e 65  LL 0x080.#define
2500: 20 57 4f 5f 4f 52 20 20 20 20 20 30 78 31 30 30   WO_OR     0x100
2510: 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72         /* Two or
2520: 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74   more OR-connect
2530: 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23 64 65 66  ed terms */.#def
2540: 69 6e 65 20 57 4f 5f 41 4e 44 20 20 20 20 30 78  ine WO_AND    0x
2550: 32 30 30 20 20 20 20 20 20 20 2f 2a 20 54 77 6f  200       /* Two
2560: 20 6f 72 20 6d 6f 72 65 20 41 4e 44 2d 63 6f 6e   or more AND-con
2570: 6e 65 63 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a  nected terms */.
2580: 23 64 65 66 69 6e 65 20 57 4f 5f 4e 4f 4f 50 20  #define WO_NOOP 
2590: 20 20 30 78 38 30 30 20 20 20 20 20 20 20 2f 2a    0x800       /*
25a0: 20 54 68 69 73 20 74 65 72 6d 20 64 6f 65 73 20   This term does 
25b0: 6e 6f 74 20 72 65 73 74 72 69 63 74 20 73 65 61  not restrict sea
25c0: 72 63 68 20 73 70 61 63 65 20 2a 2f 0a 0a 23 64  rch space */..#d
25d0: 65 66 69 6e 65 20 57 4f 5f 41 4c 4c 20 20 20 20  efine WO_ALL    
25e0: 30 78 66 66 66 20 20 20 20 20 20 20 2f 2a 20 4d  0xfff       /* M
25f0: 61 73 6b 20 6f 66 20 61 6c 6c 20 70 6f 73 73 69  ask of all possi
2600: 62 6c 65 20 57 4f 5f 2a 20 76 61 6c 75 65 73 20  ble WO_* values 
2610: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 53 49  */.#define WO_SI
2620: 4e 47 4c 45 20 30 78 30 66 66 20 20 20 20 20 20  NGLE 0x0ff      
2630: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20   /* Mask of all 
2640: 6e 6f 6e 2d 63 6f 6d 70 6f 75 6e 64 20 57 4f 5f  non-compound WO_
2650: 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 0a 2f 2a 0a  * values */../*.
2660: 2a 2a 20 56 61 6c 75 65 20 66 6f 72 20 77 73 46  ** Value for wsF
2670: 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79  lags returned by
2680: 20 62 65 73 74 49 6e 64 65 78 28 29 20 61 6e 64   bestIndex() and
2690: 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 57 68   stored in.** Wh
26a0: 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67 73  ereLevel.wsFlags
26b0: 2e 20 20 54 68 65 73 65 20 66 6c 61 67 73 20 64  .  These flags d
26c0: 65 74 65 72 6d 69 6e 65 20 77 68 69 63 68 20 73  etermine which s
26d0: 65 61 72 63 68 0a 2a 2a 20 73 74 72 61 74 65 67  earch.** strateg
26e0: 69 65 73 20 61 72 65 20 61 70 70 72 6f 70 72 69  ies are appropri
26f0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ate..**.** The l
2700: 65 61 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74  east significant
2710: 20 31 32 20 62 69 74 73 20 69 73 20 72 65 73 65   12 bits is rese
2720: 72 76 65 64 20 61 73 20 61 20 6d 61 73 6b 20 66  rved as a mask f
2730: 6f 72 20 57 4f 5f 20 76 61 6c 75 65 73 20 61 62  or WO_ values ab
2740: 6f 76 65 2e 0a 2a 2a 20 54 68 65 20 57 68 65 72  ove..** The Wher
2750: 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67 73 20 66  eLevel.wsFlags f
2760: 69 65 6c 64 20 69 73 20 75 73 75 61 6c 6c 79 20  ield is usually 
2770: 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f 5f  set to WO_IN|WO_
2780: 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2e 0a 2a 2a  EQ|WO_ISNULL..**
2790: 20 42 75 74 20 69 66 20 74 68 65 20 74 61 62 6c   But if the tabl
27a0: 65 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  e is the right t
27b0: 61 62 6c 65 20 6f 66 20 61 20 6c 65 66 74 20 6a  able of a left j
27c0: 6f 69 6e 2c 20 57 68 65 72 65 4c 65 76 65 6c 2e  oin, WhereLevel.
27d0: 77 73 46 6c 61 67 73 0a 2a 2a 20 69 73 20 73 65  wsFlags.** is se
27e0: 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f 5f 45 51  t to WO_IN|WO_EQ
27f0: 2e 20 20 54 68 65 20 57 68 65 72 65 4c 65 76 65  .  The WhereLeve
2800: 6c 2e 77 73 46 6c 61 67 73 20 66 69 65 6c 64 20  l.wsFlags field 
2810: 63 61 6e 20 74 68 65 6e 20 62 65 20 75 73 65 64  can then be used
2820: 20 61 73 0a 2a 2a 20 74 68 65 20 22 6f 70 22 20   as.** the "op" 
2830: 70 61 72 61 6d 65 74 65 72 20 74 6f 20 66 69 6e  parameter to fin
2840: 64 54 65 72 6d 20 77 68 65 6e 20 77 65 20 61 72  dTerm when we ar
2850: 65 20 72 65 73 6f 6c 76 69 6e 67 20 65 71 75 61  e resolving equa
2860: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
2870: 2e 0a 2a 2a 20 49 53 4e 55 4c 4c 20 63 6f 6e 73  ..** ISNULL cons
2880: 74 72 61 69 6e 74 73 20 77 69 6c 6c 20 74 68 65  traints will the
2890: 6e 20 6e 6f 74 20 62 65 20 75 73 65 64 20 6f 6e  n not be used on
28a0: 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
28b0: 20 6f 66 20 61 20 6c 65 66 74 0a 2a 2a 20 6a 6f   of a left.** jo
28c0: 69 6e 2e 20 20 54 69 63 6b 65 74 73 20 23 32 31  in.  Tickets #21
28d0: 37 37 20 61 6e 64 20 23 32 31 38 39 2e 0a 2a 2f  77 and #2189..*/
28e0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52  .#define WHERE_R
28f0: 4f 57 49 44 5f 45 51 20 20 20 20 20 30 78 30 30  OWID_EQ     0x00
2900: 30 30 31 30 30 30 20 20 2f 2a 20 72 6f 77 69 64  001000  /* rowid
2910: 3d 45 58 50 52 20 6f 72 20 72 6f 77 69 64 20 49  =EXPR or rowid I
2920: 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69  N (...) */.#defi
2930: 6e 65 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52  ne WHERE_ROWID_R
2940: 41 4e 47 45 20 20 30 78 30 30 30 30 32 30 30 30  ANGE  0x00002000
2950: 20 20 2f 2a 20 72 6f 77 69 64 3c 45 58 50 52 20    /* rowid<EXPR 
2960: 61 6e 64 2f 6f 72 20 72 6f 77 69 64 3e 45 58 50  and/or rowid>EXP
2970: 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  R */.#define WHE
2980: 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 20 20 20  RE_COLUMN_EQ    
2990: 30 78 30 30 30 31 30 30 30 30 20 20 2f 2a 20 78  0x00010000  /* x
29a0: 3d 45 58 50 52 20 6f 72 20 78 20 49 4e 20 28 2e  =EXPR or x IN (.
29b0: 2e 2e 29 20 6f 72 20 78 20 49 53 20 4e 55 4c 4c  ..) or x IS NULL
29c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
29d0: 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 30  E_COLUMN_RANGE 0
29e0: 78 30 30 30 32 30 30 30 30 20 20 2f 2a 20 78 3c  x00020000  /* x<
29f0: 45 58 50 52 20 61 6e 64 2f 6f 72 20 78 3e 45 58  EXPR and/or x>EX
2a00: 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  PR */.#define WH
2a10: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 20 20  ERE_COLUMN_IN   
2a20: 20 30 78 30 30 30 34 30 30 30 30 20 20 2f 2a 20   0x00040000  /* 
2a30: 78 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64  x IN (...) */.#d
2a40: 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55  efine WHERE_COLU
2a50: 4d 4e 5f 4e 55 4c 4c 20 20 30 78 30 30 30 38 30  MN_NULL  0x00080
2a60: 30 30 30 20 20 2f 2a 20 78 20 49 53 20 4e 55 4c  000  /* x IS NUL
2a70: 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  L */.#define WHE
2a80: 52 45 5f 49 4e 44 45 58 45 44 20 20 20 20 20 20  RE_INDEXED      
2a90: 30 78 30 30 30 66 30 30 30 30 20 20 2f 2a 20 41  0x000f0000  /* A
2aa0: 6e 79 74 68 69 6e 67 20 74 68 61 74 20 75 73 65  nything that use
2ab0: 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 23 64  s an index */.#d
2ac0: 65 66 69 6e 65 20 57 48 45 52 45 5f 4e 4f 54 5f  efine WHERE_NOT_
2ad0: 46 55 4c 4c 53 43 41 4e 20 30 78 31 30 30 66 33  FULLSCAN 0x100f3
2ae0: 30 30 30 20 20 2f 2a 20 44 6f 65 73 20 6e 6f 74  000  /* Does not
2af0: 20 64 6f 20 61 20 66 75 6c 6c 20 74 61 62 6c 65   do a full table
2b00: 20 73 63 61 6e 20 2a 2f 0a 23 64 65 66 69 6e 65   scan */.#define
2b10: 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 20   WHERE_IN_ABLE  
2b20: 20 20 20 20 30 78 30 30 30 66 31 30 30 30 20 20      0x000f1000  
2b30: 2f 2a 20 41 62 6c 65 20 74 6f 20 73 75 70 70 6f  /* Able to suppo
2b40: 72 74 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  rt an IN operato
2b50: 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  r */.#define WHE
2b60: 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 20 20 20  RE_TOP_LIMIT    
2b70: 30 78 30 30 31 30 30 30 30 30 20 20 2f 2a 20 78  0x00100000  /* x
2b80: 3c 45 58 50 52 20 6f 72 20 78 3c 3d 45 58 50 52  <EXPR or x<=EXPR
2b90: 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23   constraint */.#
2ba0: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 42 54 4d  define WHERE_BTM
2bb0: 5f 4c 49 4d 49 54 20 20 20 20 30 78 30 30 32 30  _LIMIT    0x0020
2bc0: 30 30 30 30 20 20 2f 2a 20 78 3e 45 58 50 52 20  0000  /* x>EXPR 
2bd0: 6f 72 20 78 3e 3d 45 58 50 52 20 63 6f 6e 73 74  or x>=EXPR const
2be0: 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65  raint */.#define
2bf0: 20 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49   WHERE_BOTH_LIMI
2c00: 54 20 20 20 30 78 30 30 33 30 30 30 30 30 20 20  T   0x00300000  
2c10: 2f 2a 20 42 6f 74 68 20 78 3e 45 58 50 52 20 61  /* Both x>EXPR a
2c20: 6e 64 20 78 3c 45 58 50 52 20 2a 2f 0a 23 64 65  nd x<EXPR */.#de
2c30: 66 69 6e 65 20 57 48 45 52 45 5f 49 44 58 5f 4f  fine WHERE_IDX_O
2c40: 4e 4c 59 20 20 20 20 20 30 78 30 30 34 30 30 30  NLY     0x004000
2c50: 30 30 20 20 2f 2a 20 55 73 65 20 69 6e 64 65 78  00  /* Use index
2c60: 20 6f 6e 6c 79 20 2d 20 6f 6d 69 74 20 74 61 62   only - omit tab
2c70: 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  le */.#define WH
2c80: 45 52 45 5f 4f 52 44 45 52 45 44 20 20 20 20 20  ERE_ORDERED     
2c90: 20 30 78 30 30 38 30 30 30 30 30 20 20 2f 2a 20   0x00800000  /* 
2ca0: 4f 75 74 70 75 74 20 77 69 6c 6c 20 61 70 70 65  Output will appe
2cb0: 61 72 20 69 6e 20 63 6f 72 72 65 63 74 20 6f 72  ar in correct or
2cc0: 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  der */.#define W
2cd0: 48 45 52 45 5f 52 45 56 45 52 53 45 20 20 20 20  HERE_REVERSE    
2ce0: 20 20 30 78 30 31 30 30 30 30 30 30 20 20 2f 2a    0x01000000  /*
2cf0: 20 53 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65   Scan in reverse
2d00: 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e   order */.#defin
2d10: 65 20 57 48 45 52 45 5f 55 4e 49 51 55 45 20 20  e WHERE_UNIQUE  
2d20: 20 20 20 20 20 30 78 30 32 30 30 30 30 30 30 20       0x02000000 
2d30: 20 2f 2a 20 53 65 6c 65 63 74 73 20 6e 6f 20 6d   /* Selects no m
2d40: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77  ore than one row
2d50: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
2d60: 45 5f 41 4c 4c 5f 55 4e 49 51 55 45 20 20 20 30  E_ALL_UNIQUE   0
2d70: 78 30 34 30 30 30 30 30 30 20 20 2f 2a 20 54 68  x04000000  /* Th
2d80: 69 73 20 61 6e 64 20 61 6c 6c 20 70 72 69 6f 72  is and all prior
2d90: 20 68 61 76 65 20 6f 6e 65 20 72 6f 77 20 2a 2f   have one row */
2da0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 56  .#define WHERE_V
2db0: 49 52 54 55 41 4c 54 41 42 4c 45 20 30 78 30 38  IRTUALTABLE 0x08
2dc0: 30 30 30 30 30 30 20 20 2f 2a 20 55 73 65 20 76  000000  /* Use v
2dd0: 69 72 74 75 61 6c 2d 74 61 62 6c 65 20 70 72 6f  irtual-table pro
2de0: 63 65 73 73 69 6e 67 20 2a 2f 0a 23 64 65 66 69  cessing */.#defi
2df0: 6e 65 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f  ne WHERE_MULTI_O
2e00: 52 20 20 20 20 20 30 78 31 30 30 30 30 30 30 30  R     0x10000000
2e10: 20 20 2f 2a 20 4f 52 20 75 73 69 6e 67 20 6d 75    /* OR using mu
2e20: 6c 74 69 70 6c 65 20 69 6e 64 69 63 65 73 20 2a  ltiple indices *
2e30: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
2e40: 54 45 4d 50 5f 49 4e 44 45 58 20 20 20 30 78 32  TEMP_INDEX   0x2
2e50: 30 30 30 30 30 30 30 20 20 2f 2a 20 55 73 65 73  0000000  /* Uses
2e60: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e   an ephemeral in
2e70: 64 65 78 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  dex */.#define W
2e80: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 20 20 20  HERE_DISTINCT   
2e90: 20 20 30 78 34 30 30 30 30 30 30 30 20 20 2f 2a    0x40000000  /*
2ea0: 20 43 6f 72 72 65 63 74 20 6f 72 64 65 72 20 66   Correct order f
2eb0: 6f 72 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 23  or DISTINCT */.#
2ec0: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 56  define WHERE_COV
2ed0: 45 52 5f 53 43 41 4e 20 20 20 30 78 38 30 30 30  ER_SCAN   0x8000
2ee0: 30 30 30 30 20 20 2f 2a 20 46 75 6c 6c 20 73 63  0000  /* Full sc
2ef0: 61 6e 20 6f 66 20 61 20 63 6f 76 65 72 69 6e 67  an of a covering
2f00: 20 69 6e 64 65 78 20 2a 2f 0a 0a 2f 2a 0a 2a 2a   index */../*.**
2f10: 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 63 6f 6e   This module con
2f20: 74 61 69 6e 73 20 6d 61 6e 79 20 73 65 70 61 72  tains many separ
2f30: 61 74 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20  ate subroutines 
2f40: 74 68 61 74 20 77 6f 72 6b 20 74 6f 67 65 74 68  that work togeth
2f50: 65 72 20 74 6f 0a 2a 2a 20 66 69 6e 64 20 74 68  er to.** find th
2f60: 65 20 62 65 73 74 20 69 6e 64 69 63 65 73 20 74  e best indices t
2f70: 6f 20 75 73 65 20 66 6f 72 20 61 63 63 65 73 73  o use for access
2f80: 69 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61 72  ing a particular
2f90: 20 74 61 62 6c 65 20 69 6e 20 61 20 71 75 65 72   table in a quer
2fa0: 79 2e 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  y..** An instanc
2fb0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
2fc0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 68 6f 6c  ng structure hol
2fd0: 64 73 20 63 6f 6e 74 65 78 74 20 69 6e 66 6f 72  ds context infor
2fe0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
2ff0: 0a 2a 2a 20 69 6e 64 65 78 20 73 65 61 72 63 68  .** index search
3000: 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20   so that it can 
3010: 62 65 20 6d 6f 72 65 20 65 61 73 69 6c 79 20 70  be more easily p
3020: 61 73 73 65 64 20 62 65 74 77 65 65 6e 20 74 68  assed between th
3030: 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20 72 6f 75  e various.** rou
3040: 74 69 6e 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65  tines..*/.typede
3050: 66 20 73 74 72 75 63 74 20 57 68 65 72 65 42 65  f struct WhereBe
3060: 73 74 49 64 78 20 57 68 65 72 65 42 65 73 74 49  stIdx WhereBestI
3070: 64 78 3b 0a 73 74 72 75 63 74 20 57 68 65 72 65  dx;.struct Where
3080: 42 65 73 74 49 64 78 20 7b 0a 20 20 50 61 72 73  BestIdx {.  Pars
3090: 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
30b0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
30c0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
30d0: 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 20  pWC;            
30e0: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
30f0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
3100: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
3110: 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54  *pSrc;      /* T
3120: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
3130: 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  erm to search */
3140: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
3150: 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ady;            
3160: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75     /* Mask of cu
3170: 72 73 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c 61  rsors not availa
3180: 62 6c 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ble */.  Bitmask
3190: 20 6e 6f 74 56 61 6c 69 64 3b 20 20 20 20 20 20   notValid;      
31a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
31b0: 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  ors not availabl
31c0: 65 20 66 6f 72 20 61 6e 79 20 70 75 72 70 6f 73  e for any purpos
31d0: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
31e0: 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20  *pOrderBy;      
31f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52         /* The OR
3200: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
3210: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69  .  ExprList *pDi
3220: 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20  stinct;         
3230: 20 20 20 2f 2a 20 54 68 65 20 73 65 6c 65 63 74     /* The select
3240: 2d 6c 69 73 74 20 69 66 20 71 75 65 72 79 20 69  -list if query i
3250: 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  s DISTINCT */.  
3260: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
3270: 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66 6f 3b 20  fo **ppIdxInfo; 
3280: 2f 2a 20 49 6e 64 65 78 20 69 6e 66 6f 72 6d 61  /* Index informa
3290: 74 69 6f 6e 20 70 61 73 73 65 64 20 74 6f 20 78  tion passed to x
32a0: 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a 20 20 69  BestIndex */.  i
32b0: 6e 74 20 69 2c 20 6e 3b 20 20 20 20 20 20 20 20  nt i, n;        
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32d0: 2a 20 57 68 69 63 68 20 6c 6f 6f 70 20 69 73 20  * Which loop is 
32e0: 62 65 69 6e 67 20 63 6f 64 65 64 3b 20 23 20 6f  being coded; # o
32f0: 66 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 57 68 65  f loops */.  Whe
3300: 72 65 4c 65 76 65 6c 20 2a 61 4c 65 76 65 6c 3b  reLevel *aLevel;
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3320: 49 6e 66 6f 20 61 62 6f 75 74 20 6f 75 74 65 72  Info about outer
3330: 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 57 68 65 72   loops */.  Wher
3340: 65 43 6f 73 74 20 63 6f 73 74 3b 20 20 20 20 20  eCost cost;     
3350: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
3360: 6f 77 65 73 74 20 63 6f 73 74 20 71 75 65 72 79  owest cost query
3370: 20 70 6c 61 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   plan */.};../*.
3380: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
3390: 66 20 74 68 65 20 70 72 6f 62 65 20 63 6f 73 74  f the probe cost
33a0: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68   is less than th
33b0: 65 20 62 61 73 65 6c 69 6e 65 20 63 6f 73 74 0a  e baseline cost.
33c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
33d0: 6d 70 61 72 65 43 6f 73 74 28 63 6f 6e 73 74 20  mpareCost(const 
33e0: 57 68 65 72 65 43 6f 73 74 20 2a 70 50 72 6f 62  WhereCost *pProb
33f0: 65 2c 20 63 6f 6e 73 74 20 57 68 65 72 65 43 6f  e, const WhereCo
3400: 73 74 20 2a 70 42 61 73 65 6c 69 6e 65 29 7b 0a  st *pBaseline){.
3410: 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 72 43    if( pProbe->rC
3420: 6f 73 74 3c 70 42 61 73 65 6c 69 6e 65 2d 3e 72  ost<pBaseline->r
3430: 43 6f 73 74 20 29 20 72 65 74 75 72 6e 20 31 3b  Cost ) return 1;
3440: 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 72  .  if( pProbe->r
3450: 43 6f 73 74 3e 70 42 61 73 65 6c 69 6e 65 2d 3e  Cost>pBaseline->
3460: 72 43 6f 73 74 20 29 20 72 65 74 75 72 6e 20 30  rCost ) return 0
3470: 3b 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e  ;.  if( pProbe->
3480: 70 6c 61 6e 2e 6e 4f 42 53 61 74 3e 70 42 61 73  plan.nOBSat>pBas
3490: 65 6c 69 6e 65 2d 3e 70 6c 61 6e 2e 6e 4f 42 53  eline->plan.nOBS
34a0: 61 74 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  at ) return 1;. 
34b0: 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 70 6c 61   if( pProbe->pla
34c0: 6e 2e 6e 52 6f 77 3c 70 42 61 73 65 6c 69 6e 65  n.nRow<pBaseline
34d0: 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 20 29 20 72 65  ->plan.nRow ) re
34e0: 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
34f0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69   0;.}../*.** Ini
3500: 74 69 61 6c 69 7a 65 20 61 20 70 72 65 61 6c 6c  tialize a preall
3510: 6f 63 61 74 65 64 20 57 68 65 72 65 43 6c 61 75  ocated WhereClau
3520: 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
3530: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
3540: 72 65 43 6c 61 75 73 65 49 6e 69 74 28 0a 20 20  reClauseInit(.  
3550: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
3560: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
3570: 57 68 65 72 65 43 6c 61 75 73 65 20 74 6f 20 62  WhereClause to b
3580: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  e initialized */
3590: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
35a0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
35b0: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
35c0: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73  xt */.  WhereMas
35d0: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
35e0: 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
35f0: 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 6e 75   table cursor nu
3600: 6d 62 65 72 73 20 74 6f 20 62 69 74 6d 61 73 6b  mbers to bitmask
3610: 73 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c  s */.  u16 wctrl
3620: 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
3630: 2f 2a 20 4d 69 67 68 74 20 69 6e 63 6c 75 64 65  /* Might include
3640: 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20   WHERE_AND_ONLY 
3650: 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d 3e 70 50 61  */.){.  pWC->pPa
3660: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
3670: 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 20 3d 20  pWC->pMaskSet = 
3680: 70 4d 61 73 6b 53 65 74 3b 0a 20 20 70 57 43 2d  pMaskSet;.  pWC-
3690: 3e 70 4f 75 74 65 72 20 3d 20 30 3b 0a 20 20 70  >pOuter = 0;.  p
36a0: 57 43 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20  WC->nTerm = 0;. 
36b0: 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41 72   pWC->nSlot = Ar
36c0: 72 61 79 53 69 7a 65 28 70 57 43 2d 3e 61 53 74  raySize(pWC->aSt
36d0: 61 74 69 63 29 3b 0a 20 20 70 57 43 2d 3e 61 20  atic);.  pWC->a 
36e0: 3d 20 70 57 43 2d 3e 61 53 74 61 74 69 63 3b 0a  = pWC->aStatic;.
36f0: 20 20 70 57 43 2d 3e 76 6d 61 73 6b 20 3d 20 30    pWC->vmask = 0
3700: 3b 0a 20 20 70 57 43 2d 3e 77 63 74 72 6c 46 6c  ;.  pWC->wctrlFl
3710: 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67 73  ags = wctrlFlags
3720: 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
3730: 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
3740: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c  tic void whereCl
3750: 61 75 73 65 43 6c 65 61 72 28 57 68 65 72 65 43  auseClear(WhereC
3760: 6c 61 75 73 65 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  lause*);../*.** 
3770: 44 65 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d  Deallocate all m
3780: 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
3790: 20 77 69 74 68 20 61 20 57 68 65 72 65 4f 72 49   with a WhereOrI
37a0: 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  nfo object..*/.s
37b0: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
37c0: 4f 72 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c  OrInfoDelete(sql
37d0: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4f  ite3 *db, WhereO
37e0: 72 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68 65  rInfo *p){.  whe
37f0: 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70  reClauseClear(&p
3800: 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  ->wc);.  sqlite3
3810: 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d  DbFree(db, p);.}
3820: 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
3830: 74 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73  te all memory as
3840: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
3850: 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 6f 62 6a  WhereAndInfo obj
3860: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
3870: 6f 69 64 20 77 68 65 72 65 41 6e 64 49 6e 66 6f  oid whereAndInfo
3880: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
3890: 64 62 2c 20 57 68 65 72 65 41 6e 64 49 6e 66 6f  db, WhereAndInfo
38a0: 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 43 6c 61   *p){.  whereCla
38b0: 75 73 65 43 6c 65 61 72 28 26 70 2d 3e 77 63 29  useClear(&p->wc)
38c0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
38d0: 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
38e0: 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20  ** Deallocate a 
38f0: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
3900: 63 74 75 72 65 2e 20 20 54 68 65 20 57 68 65 72  cture.  The Wher
3910: 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
3920: 65 0a 2a 2a 20 69 74 73 65 6c 66 20 69 73 20 6e  e.** itself is n
3930: 6f 74 20 66 72 65 65 64 2e 20 20 54 68 69 73 20  ot freed.  This 
3940: 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 69  routine is the i
3950: 6e 76 65 72 73 65 20 6f 66 20 77 68 65 72 65 43  nverse of whereC
3960: 6c 61 75 73 65 49 6e 69 74 28 29 2e 0a 2a 2f 0a  lauseInit()..*/.
3970: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
3980: 65 43 6c 61 75 73 65 43 6c 65 61 72 28 57 68 65  eClauseClear(Whe
3990: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a  reClause *pWC){.
39a0: 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65    int i;.  Where
39b0: 54 65 72 6d 20 2a 61 3b 0a 20 20 73 71 6c 69 74  Term *a;.  sqlit
39c0: 65 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 50  e3 *db = pWC->pP
39d0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28  arse->db;.  for(
39e0: 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20  i=pWC->nTerm-1, 
39f0: 61 3d 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20  a=pWC->a; i>=0; 
3a00: 69 2d 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69  i--, a++){.    i
3a10: 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20  f( a->wtFlags & 
3a20: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a  TERM_DYNAMIC ){.
3a30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
3a40: 72 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70  rDelete(db, a->p
3a50: 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Expr);.    }.   
3a60: 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20   if( a->wtFlags 
3a70: 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b  & TERM_ORINFO ){
3a80: 0a 20 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e  .      whereOrIn
3a90: 66 6f 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e  foDelete(db, a->
3aa0: 75 2e 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20  u.pOrInfo);.    
3ab0: 7d 65 6c 73 65 20 69 66 28 20 61 2d 3e 77 74 46  }else if( a->wtF
3ac0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 41 4e 44 49  lags & TERM_ANDI
3ad0: 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65  NFO ){.      whe
3ae0: 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28  reAndInfoDelete(
3af0: 64 62 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66  db, a->u.pAndInf
3b00: 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  o);.    }.  }.  
3b10: 69 66 28 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d  if( pWC->a!=pWC-
3b20: 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20  >aStatic ){.    
3b30: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3b40: 2c 20 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d  , pWC->a);.  }.}
3b50: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69  ../*.** Add a si
3b60: 6e 67 6c 65 20 6e 65 77 20 57 68 65 72 65 54 65  ngle new WhereTe
3b70: 72 6d 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  rm entry to the 
3b80: 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65  WhereClause obje
3b90: 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e  ct pWC..** The n
3ba0: 65 77 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a  ew WhereTerm obj
3bb0: 65 63 74 20 69 73 20 63 6f 6e 73 74 72 75 63 74  ect is construct
3bc0: 65 64 20 66 72 6f 6d 20 45 78 70 72 20 70 20 61  ed from Expr p a
3bd0: 6e 64 20 77 69 74 68 20 77 74 46 6c 61 67 73 2e  nd with wtFlags.
3be0: 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69 6e  .** The index in
3bf0: 20 70 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65   pWC->a[] of the
3c00: 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 69   new WhereTerm i
3c10: 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
3c20: 63 63 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72  ccess..** 0 is r
3c30: 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 6e  eturned if the n
3c40: 65 77 20 57 68 65 72 65 54 65 72 6d 20 63 6f 75  ew WhereTerm cou
3c50: 6c 64 20 6e 6f 74 20 62 65 20 61 64 64 65 64 20  ld not be added 
3c60: 64 75 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a  due to a memory.
3c70: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ** allocation er
3c80: 72 6f 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79  ror.  The memory
3c90: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
3ca0: 75 72 65 20 77 69 6c 6c 20 62 65 20 72 65 63 6f  ure will be reco
3cb0: 72 64 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64  rded in.** the d
3cc0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
3cd0: 66 6c 61 67 20 73 6f 20 74 68 61 74 20 68 69 67  flag so that hig
3ce0: 68 65 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69  her-level functi
3cf0: 6f 6e 73 20 63 61 6e 20 64 65 74 65 63 74 20 69  ons can detect i
3d00: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
3d10: 75 74 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65  utine will incre
3d20: 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ase the size of 
3d30: 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72  the pWC->a[] arr
3d40: 61 79 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  ay as necessary.
3d50: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 74  .**.** If the wt
3d60: 46 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69  Flags argument i
3d70: 6e 63 6c 75 64 65 73 20 54 45 52 4d 5f 44 59 4e  ncludes TERM_DYN
3d80: 41 4d 49 43 2c 20 74 68 65 6e 20 72 65 73 70 6f  AMIC, then respo
3d90: 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72  nsibility.** for
3da0: 20 66 72 65 65 69 6e 67 20 74 68 65 20 65 78 70   freeing the exp
3db0: 72 65 73 73 69 6f 6e 20 70 20 69 73 20 61 73 73  ression p is ass
3dc0: 75 6d 65 64 20 62 79 20 74 68 65 20 57 68 65 72  umed by the Wher
3dd0: 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70  eClause object p
3de0: 57 43 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  WC..** This is t
3df0: 72 75 65 20 65 76 65 6e 20 69 66 20 74 68 69 73  rue even if this
3e00: 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 74   routine fails t
3e10: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  o allocate a new
3e20: 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a   WhereTerm..**.*
3e30: 2a 20 57 41 52 4e 49 4e 47 3a 20 20 54 68 69 73  * WARNING:  This
3e40: 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72   routine might r
3e50: 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70  eallocate the sp
3e60: 61 63 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72  ace used to stor
3e70: 65 0a 2a 2a 20 57 68 65 72 65 54 65 72 6d 73 2e  e.** WhereTerms.
3e80: 20 20 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74    All pointers t
3e90: 6f 20 57 68 65 72 65 54 65 72 6d 73 20 73 68 6f  o WhereTerms sho
3ea0: 75 6c 64 20 62 65 20 69 6e 76 61 6c 69 64 61 74  uld be invalidat
3eb0: 65 64 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c  ed after.** call
3ec0: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
3ed0: 2e 20 20 53 75 63 68 20 70 6f 69 6e 74 65 72 73  .  Such pointers
3ee0: 20 6d 61 79 20 62 65 20 72 65 69 6e 69 74 69 61   may be reinitia
3ef0: 6c 69 7a 65 64 20 62 79 20 72 65 66 65 72 65 6e  lized by referen
3f00: 63 69 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d  cing.** the pWC-
3f10: 3e 61 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73  >a[] array..*/.s
3f20: 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 43  tatic int whereC
3f30: 6c 61 75 73 65 49 6e 73 65 72 74 28 57 68 65 72  lauseInsert(Wher
3f40: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78  eClause *pWC, Ex
3f50: 70 72 20 2a 70 2c 20 75 38 20 77 74 46 6c 61 67  pr *p, u8 wtFlag
3f60: 73 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  s){.  WhereTerm 
3f70: 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64  *pTerm;.  int id
3f80: 78 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 77  x;.  testcase( w
3f90: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
3fa0: 52 54 55 41 4c 20 29 3b 20 20 2f 2a 20 45 56 3a  RTUAL );  /* EV:
3fb0: 20 52 2d 30 30 32 31 31 2d 31 35 31 30 30 20 2a   R-00211-15100 *
3fc0: 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65  /.  if( pWC->nTe
3fd0: 72 6d 3e 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20 29  rm>=pWC->nSlot )
3fe0: 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  {.    WhereTerm 
3ff0: 2a 70 4f 6c 64 20 3d 20 70 57 43 2d 3e 61 3b 0a  *pOld = pWC->a;.
4000: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
4010: 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 2d 3e 64  = pWC->pParse->d
4020: 62 3b 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d 20  b;.    pWC->a = 
4030: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
4040: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 57  aw(db, sizeof(pW
4050: 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53  C->a[0])*pWC->nS
4060: 6c 6f 74 2a 32 20 29 3b 0a 20 20 20 20 69 66 28  lot*2 );.    if(
4070: 20 70 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20   pWC->a==0 ){.  
4080: 20 20 20 20 69 66 28 20 77 74 46 6c 61 67 73 20      if( wtFlags 
4090: 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29  & TERM_DYNAMIC )
40a0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
40b0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
40c0: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
40d0: 20 20 70 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b    pWC->a = pOld;
40e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
40f0: 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
4100: 79 28 70 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20  y(pWC->a, pOld, 
4110: 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d  sizeof(pWC->a[0]
4120: 29 2a 70 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20  )*pWC->nTerm);. 
4130: 20 20 20 69 66 28 20 70 4f 6c 64 21 3d 70 57 43     if( pOld!=pWC
4140: 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20  ->aStatic ){.   
4150: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
4160: 28 64 62 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20  (db, pOld);.    
4170: 7d 0a 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74  }.    pWC->nSlot
4180: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
4190: 6f 63 53 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e  ocSize(db, pWC->
41a0: 61 29 2f 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61  a)/sizeof(pWC->a
41b0: 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72  [0]);.  }.  pTer
41c0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 20  m = &pWC->a[idx 
41d0: 3d 20 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b  = pWC->nTerm++];
41e0: 0a 20 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20  .  pTerm->pExpr 
41f0: 3d 20 70 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74  = p;.  pTerm->wt
4200: 46 6c 61 67 73 20 3d 20 77 74 46 6c 61 67 73 3b  Flags = wtFlags;
4210: 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20  .  pTerm->pWC = 
4220: 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50  pWC;.  pTerm->iP
4230: 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65  arent = -1;.  re
4240: 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a  turn idx;.}../*.
4250: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4260: 69 64 65 6e 74 69 66 69 65 73 20 73 75 62 65 78  identifies subex
4270: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
4280: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 77 68   WHERE clause wh
4290: 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65  ere.** each sube
42a0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70  xpression is sep
42b0: 61 72 61 74 65 64 20 62 79 20 74 68 65 20 41 4e  arated by the AN
42c0: 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f  D operator or so
42d0: 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72  me other.** oper
42e0: 61 74 6f 72 20 73 70 65 63 69 66 69 65 64 20 69  ator specified i
42f0: 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74  n the op paramet
4300: 65 72 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c  er.  The WhereCl
4310: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a  ause structure.*
4320: 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  * is filled with
4330: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62   pointers to sub
4340: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f  expressions.  Fo
4350: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
4360: 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68      WHERE  a=='h
4370: 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73  ello' AND coales
4380: 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20  ce(b,11)<10 AND 
4390: 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32  (c+12!=d OR c==2
43a0: 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  2).**           
43b0: 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c  \________/     \
43c0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
43d0: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
43e0: 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20  ______/.**      
43f0: 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20        slot[0]   
4400: 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d           slot[1]
4410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
4420: 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65  lot[2].**.** The
4430: 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20   original WHERE 
4440: 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72 20  clause in pExpr 
4450: 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41  is unaltered.  A
4460: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ll this routine.
4470: 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20  ** does is make 
4480: 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70  slot[] entries p
4490: 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63  oint to substruc
44a0: 74 75 72 65 20 77 69 74 68 69 6e 20 70 45 78 70  ture within pExp
44b0: 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  r..**.** In the 
44c0: 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63  previous sentenc
44d0: 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61  e and in the dia
44e0: 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72  gram, "slot[]" r
44f0: 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20  efers to.** the 
4500: 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20  WhereClause.a[] 
4510: 61 72 72 61 79 2e 20 20 54 68 65 20 73 6c 6f 74  array.  The slot
4520: 5b 5d 20 61 72 72 61 79 20 67 72 6f 77 73 20 61  [] array grows a
4530: 73 20 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e 74  s needed to cont
4540: 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73  ain.** all terms
4550: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
4560: 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ause..*/.static 
4570: 76 6f 69 64 20 77 68 65 72 65 53 70 6c 69 74 28  void whereSplit(
4580: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
4590: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
45a0: 6e 74 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f  nt op){.  pWC->o
45b0: 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 69 66  p = (u8)op;.  if
45c0: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
45d0: 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72  urn;.  if( pExpr
45e0: 2d 3e 6f 70 21 3d 6f 70 20 29 7b 0a 20 20 20 20  ->op!=op ){.    
45f0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
4600: 74 28 70 57 43 2c 20 70 45 78 70 72 2c 20 30 29  t(pWC, pExpr, 0)
4610: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
4620: 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70  hereSplit(pWC, p
4630: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 6f 70 29  Expr->pLeft, op)
4640: 3b 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69 74  ;.    whereSplit
4650: 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70 52 69  (pWC, pExpr->pRi
4660: 67 68 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a  ght, op);.  }.}.
4670: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
4680: 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
4690: 6d 61 73 6b 20 73 65 74 20 28 61 20 57 68 65 72  mask set (a Wher
46a0: 65 4d 61 73 6b 53 65 74 20 6f 62 6a 65 63 74 29  eMaskSet object)
46b0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 69 74  .*/.#define init
46c0: 4d 61 73 6b 53 65 74 28 50 29 20 20 6d 65 6d 73  MaskSet(P)  mems
46d0: 65 74 28 50 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(P, 0, sizeof(
46e0: 2a 50 29 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  *P))../*.** Retu
46f0: 72 6e 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66  rn the bitmask f
4700: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63 75 72  or the given cur
4710: 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20 52 65 74  sor number.  Ret
4720: 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69 43 75 72  urn 0 if.** iCur
4730: 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68  sor is not in th
4740: 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  e set..*/.static
4750: 20 42 69 74 6d 61 73 6b 20 67 65 74 4d 61 73 6b   Bitmask getMask
4760: 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70  (WhereMaskSet *p
4770: 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75  MaskSet, int iCu
4780: 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  rsor){.  int i;.
4790: 20 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53    assert( pMaskS
47a0: 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69 7a 65  et->n<=(int)size
47b0: 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 3b  of(Bitmask)*8 );
47c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d  .  for(i=0; i<pM
47d0: 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b  askSet->n; i++){
47e0: 0a 20 20 20 20 69 66 28 20 70 4d 61 73 6b 53 65  .    if( pMaskSe
47f0: 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f  t->ix[i]==iCurso
4800: 72 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  r ){.      retur
4810: 6e 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c  n ((Bitmask)1)<<
4820: 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  i;.    }.  }.  r
4830: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
4840: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d  * Create a new m
4850: 61 73 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69  ask for cursor i
4860: 43 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  Cursor..**.** Th
4870: 65 72 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f  ere is one curso
4880: 72 20 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74  r per table in t
4890: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  he FROM clause. 
48a0: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   The number of.*
48b0: 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  * tables in the 
48c0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c  FROM clause is l
48d0: 69 6d 69 74 65 64 20 62 79 20 61 20 74 65 73 74  imited by a test
48e0: 20 65 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a   early in the.**
48f0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
4900: 69 6e 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53  in() routine.  S
4910: 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  o we know that t
4920: 68 65 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b  he pMaskSet->ix[
4930: 5d 0a 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20  ].** array will 
4940: 6e 65 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a  never overflow..
4950: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
4960: 72 65 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d  reateMask(WhereM
4970: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
4980: 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a  , int iCursor){.
4990: 20 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53    assert( pMaskS
49a0: 65 74 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a  et->n < ArraySiz
49b0: 65 28 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20  e(pMaskSet->ix) 
49c0: 29 3b 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69  );.  pMaskSet->i
49d0: 78 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d  x[pMaskSet->n++]
49e0: 20 3d 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f   = iCursor;.}../
49f0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
4a00: 65 20 77 61 6c 6b 73 20 28 72 65 63 75 72 73 69  e walks (recursi
4a10: 76 65 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73  vely) an express
4a20: 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e  ion tree and gen
4a30: 65 72 61 74 65 73 0a 2a 2a 20 61 20 62 69 74 6d  erates.** a bitm
4a40: 61 73 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77  ask indicating w
4a50: 68 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20  hich tables are 
4a60: 75 73 65 64 20 69 6e 20 74 68 61 74 20 65 78 70  used in that exp
4a70: 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e  ression.** tree.
4a80: 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20  .**.** In order 
4a90: 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  for this routine
4aa0: 20 74 6f 20 77 6f 72 6b 2c 20 74 68 65 20 63 61   to work, the ca
4ab0: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d  lling function m
4ac0: 75 73 74 20 68 61 76 65 0a 2a 2a 20 70 72 65 76  ust have.** prev
4ad0: 69 6f 75 73 6c 79 20 69 6e 76 6f 6b 65 64 20 73  iously invoked s
4ae0: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
4af0: 72 4e 61 6d 65 73 28 29 20 6f 6e 20 74 68 65 20  rNames() on the 
4b00: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 53 65 65  expression.  See
4b10: 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 63  .** the header c
4b20: 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72  omment on that r
4b30: 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74  outine for addit
4b40: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
4b50: 6e 2e 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  n..** The sqlite
4b60: 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
4b70: 73 28 29 20 72 6f 75 74 69 6e 65 73 20 6c 6f 6f  s() routines loo
4b80: 6b 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e 61  ks for column na
4b90: 6d 65 73 20 61 6e 64 0a 2a 2a 20 73 65 74 73 20  mes and.** sets 
4ba0: 74 68 65 69 72 20 6f 70 63 6f 64 65 73 20 74 6f  their opcodes to
4bb0: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74   TK_COLUMN and t
4bc0: 68 65 69 72 20 45 78 70 72 2e 69 54 61 62 6c 65  heir Expr.iTable
4bd0: 20 66 69 65 6c 64 73 20 74 6f 0a 2a 2a 20 74 68   fields to.** th
4be0: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  e VDBE cursor nu
4bf0: 6d 62 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c  mber of the tabl
4c00: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
4c10: 20 6a 75 73 74 20 68 61 73 20 74 6f 0a 2a 2a 20   just has to.** 
4c20: 74 72 61 6e 73 6c 61 74 65 20 74 68 65 20 63 75  translate the cu
4c30: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74  rsor numbers int
4c40: 6f 20 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73  o bitmask values
4c50: 20 61 6e 64 20 4f 52 20 61 6c 6c 0a 2a 2a 20 74   and OR all.** t
4c60: 68 65 20 62 69 74 6d 61 73 6b 73 20 74 6f 67 65  he bitmasks toge
4c70: 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ther..*/.static 
4c80: 42 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74  Bitmask exprList
4c90: 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65  TableUsage(Where
4ca0: 4d 61 73 6b 53 65 74 2a 2c 20 45 78 70 72 4c 69  MaskSet*, ExprLi
4cb0: 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 42 69 74  st*);.static Bit
4cc0: 6d 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54  mask exprSelectT
4cd0: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
4ce0: 61 73 6b 53 65 74 2a 2c 20 53 65 6c 65 63 74 2a  askSet*, Select*
4cf0: 29 3b 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  );.static Bitmas
4d00: 6b 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  k exprTableUsage
4d10: 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70  (WhereMaskSet *p
4d20: 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 20 2a 70  MaskSet, Expr *p
4d30: 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73  ){.  Bitmask mas
4d40: 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d  k = 0;.  if( p==
4d50: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
4d60: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
4d70: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 6d 61 73 6b  LUMN ){.    mask
4d80: 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   = getMask(pMask
4d90: 53 65 74 2c 20 70 2d 3e 69 54 61 62 6c 65 29 3b  Set, p->iTable);
4da0: 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 61 73 6b  .    return mask
4db0: 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b 20 3d 20 65  ;.  }.  mask = e
4dc0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
4dd0: 61 73 6b 53 65 74 2c 20 70 2d 3e 70 52 69 67 68  askSet, p->pRigh
4de0: 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20 65 78  t);.  mask |= ex
4df0: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
4e00: 73 6b 53 65 74 2c 20 70 2d 3e 70 4c 65 66 74 29  skSet, p->pLeft)
4e10: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
4e20: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49  roperty(p, EP_xI
4e30: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
4e40: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65  mask |= exprSele
4e50: 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  ctTableUsage(pMa
4e60: 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 53 65 6c  skSet, p->x.pSel
4e70: 65 63 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ect);.  }else{. 
4e80: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c     mask |= exprL
4e90: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
4ea0: 61 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 4c 69  askSet, p->x.pLi
4eb0: 73 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  st);.  }.  retur
4ec0: 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63  n mask;.}.static
4ed0: 20 42 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73   Bitmask exprLis
4ee0: 74 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72  tTableUsage(Wher
4ef0: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
4f00: 65 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  et, ExprList *pL
4f10: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
4f20: 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20   Bitmask mask = 
4f30: 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  0;.  if( pList )
4f40: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
4f50: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
4f60: 2b 2b 29 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20  ++){.      mask 
4f70: 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67  |= exprTableUsag
4f80: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73  e(pMaskSet, pLis
4f90: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
4fa0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
4fb0: 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69  rn mask;.}.stati
4fc0: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 53 65  c Bitmask exprSe
4fd0: 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 57  lectTableUsage(W
4fe0: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
4ff0: 73 6b 53 65 74 2c 20 53 65 6c 65 63 74 20 2a 70  skSet, Select *p
5000: 53 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61  S){.  Bitmask ma
5010: 73 6b 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  sk = 0;.  while(
5020: 20 70 53 20 29 7b 0a 20 20 20 20 53 72 63 4c 69   pS ){.    SrcLi
5030: 73 74 20 2a 70 53 72 63 20 3d 20 70 53 2d 3e 70  st *pSrc = pS->p
5040: 53 72 63 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  Src;.    mask |=
5050: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
5060: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
5070: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 6d  ->pEList);.    m
5080: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
5090: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
50a0: 65 74 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42 79  et, pS->pGroupBy
50b0: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
50c0: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
50d0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
50e0: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 6d  pOrderBy);.    m
50f0: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
5100: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
5110: 70 53 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  pS->pWhere);.   
5120: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
5130: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
5140: 2c 20 70 53 2d 3e 70 48 61 76 69 6e 67 29 3b 0a  , pS->pHaving);.
5150: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
5160: 53 72 63 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  Src!=0) ){.     
5170: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
5180: 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e  r(i=0; i<pSrc->n
5190: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
51a0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53     mask |= exprS
51b0: 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28  electTableUsage(
51c0: 70 4d 61 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e  pMaskSet, pSrc->
51d0: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20  a[i].pSelect);. 
51e0: 20 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65         mask |= e
51f0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
5200: 61 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e 61 5b  askSet, pSrc->a[
5210: 69 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 7d  i].pOn);.      }
5220: 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 20 3d 20  .    }.    pS = 
5230: 70 53 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a  pS->pPrior;.  }.
5240: 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d    return mask;.}
5250: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
5260: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
5270: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 6f 6e 65   operator is one
5280: 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   of the operator
5290: 73 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 6c 6c  s that is.** all
52a0: 6f 77 65 64 20 66 6f 72 20 61 6e 20 69 6e 64 65  owed for an inde
52b0: 78 61 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75  xable WHERE clau
52c0: 73 65 20 74 65 72 6d 2e 20 20 54 68 65 20 61 6c  se term.  The al
52d0: 6c 6f 77 65 64 20 6f 70 65 72 61 74 6f 72 73 20  lowed operators 
52e0: 61 72 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c  are.** "=", "<",
52f0: 20 22 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22   ">", "<=", ">="
5300: 2c 20 61 6e 64 20 22 49 4e 22 2e 0a 2a 2a 0a 2a  , and "IN"..**.*
5310: 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
5320: 2d 4f 46 3a 20 52 2d 35 39 39 32 36 2d 32 36 33  -OF: R-59926-263
5330: 39 33 20 54 6f 20 62 65 20 75 73 61 62 6c 65 20  93 To be usable 
5340: 62 79 20 61 6e 20 69 6e 64 65 78 20 61 20 74 65  by an index a te
5350: 72 6d 20 6d 75 73 74 20 62 65 0a 2a 2a 20 6f 66  rm must be.** of
5360: 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c   one of the foll
5370: 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 20 63 6f 6c  owing forms: col
5380: 75 6d 6e 20 3d 20 65 78 70 72 65 73 73 69 6f 6e  umn = expression
5390: 20 63 6f 6c 75 6d 6e 20 3e 20 65 78 70 72 65 73   column > expres
53a0: 73 69 6f 6e 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 3e  sion.** column >
53b0: 3d 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c  = expression col
53c0: 75 6d 6e 20 3c 20 65 78 70 72 65 73 73 69 6f 6e  umn < expression
53d0: 20 63 6f 6c 75 6d 6e 20 3c 3d 20 65 78 70 72 65   column <= expre
53e0: 73 73 69 6f 6e 0a 2a 2a 20 65 78 70 72 65 73 73  ssion.** express
53f0: 69 6f 6e 20 3d 20 63 6f 6c 75 6d 6e 20 65 78 70  ion = column exp
5400: 72 65 73 73 69 6f 6e 20 3e 20 63 6f 6c 75 6d 6e  ression > column
5410: 20 65 78 70 72 65 73 73 69 6f 6e 20 3e 3d 20 63   expression >= c
5420: 6f 6c 75 6d 6e 0a 2a 2a 20 65 78 70 72 65 73 73  olumn.** express
5430: 69 6f 6e 20 3c 20 63 6f 6c 75 6d 6e 20 65 78 70  ion < column exp
5440: 72 65 73 73 69 6f 6e 20 3c 3d 20 63 6f 6c 75 6d  ression <= colum
5450: 6e 20 63 6f 6c 75 6d 6e 20 49 4e 0a 2a 2a 20 28  n column IN.** (
5460: 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 29  expression-list)
5470: 20 63 6f 6c 75 6d 6e 20 49 4e 20 28 73 75 62 71   column IN (subq
5480: 75 65 72 79 29 20 63 6f 6c 75 6d 6e 20 49 53 20  uery) column IS 
5490: 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 69  NULL.*/.static i
54a0: 6e 74 20 61 6c 6c 6f 77 65 64 4f 70 28 69 6e 74  nt allowedOp(int
54b0: 20 6f 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   op){.  assert( 
54c0: 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 26 26 20 54  TK_GT>TK_EQ && T
54d0: 4b 5f 47 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20  K_GT<TK_GE );.  
54e0: 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3e 54 4b  assert( TK_LT>TK
54f0: 5f 45 51 20 26 26 20 54 4b 5f 4c 54 3c 54 4b 5f  _EQ && TK_LT<TK_
5500: 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
5510: 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20 26 26 20 54  TK_LE>TK_EQ && T
5520: 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29 3b 0a 20 20  K_LE<TK_GE );.  
5530: 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54  assert( TK_GE==T
5540: 4b 5f 45 51 2b 34 20 29 3b 0a 20 20 72 65 74 75  K_EQ+4 );.  retu
5550: 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20  rn op==TK_IN || 
5560: 28 6f 70 3e 3d 54 4b 5f 45 51 20 26 26 20 6f 70  (op>=TK_EQ && op
5570: 3c 3d 54 4b 5f 47 45 29 20 7c 7c 20 6f 70 3d 3d  <=TK_GE) || op==
5580: 54 4b 5f 49 53 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a  TK_ISNULL;.}../*
5590: 0a 2a 2a 20 53 77 61 70 20 74 77 6f 20 6f 62 6a  .** Swap two obj
55a0: 65 63 74 73 20 6f 66 20 74 79 70 65 20 54 59 50  ects of type TYP
55b0: 45 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 57  E..*/.#define SW
55c0: 41 50 28 54 59 50 45 2c 41 2c 42 29 20 7b 54 59  AP(TYPE,A,B) {TY
55d0: 50 45 20 74 3d 41 3b 20 41 3d 42 3b 20 42 3d 74  PE t=A; A=B; B=t
55e0: 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75 74  ;}../*.** Commut
55f0: 65 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  e a comparison o
5600: 70 65 72 61 74 6f 72 2e 20 20 45 78 70 72 65 73  perator.  Expres
5610: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72  sions of the for
5620: 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a 20 61 72  m "X op Y".** ar
5630: 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
5640: 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2a 0a 2a 2a   "Y op X"..**.**
5650: 20 49 66 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20   If a collation 
5660: 73 65 71 75 65 6e 63 65 20 69 73 20 61 73 73 6f  sequence is asso
5670: 63 69 61 74 65 64 20 77 69 74 68 20 65 69 74 68  ciated with eith
5680: 65 72 20 74 68 65 20 6c 65 66 74 20 6f 72 20 72  er the left or r
5690: 69 67 68 74 0a 2a 2a 20 73 69 64 65 20 6f 66 20  ight.** side of 
56a0: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20  the comparison, 
56b0: 69 74 20 72 65 6d 61 69 6e 73 20 61 73 73 6f 63  it remains assoc
56c0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 73  iated with the s
56d0: 61 6d 65 20 73 69 64 65 20 61 66 74 65 72 0a 2a  ame side after.*
56e0: 2a 20 74 68 65 20 63 6f 6d 6d 75 74 61 74 69 6f  * the commutatio
56f0: 6e 2e 20 53 6f 20 22 59 20 63 6f 6c 6c 61 74 65  n. So "Y collate
5700: 20 4e 4f 43 41 53 45 20 6f 70 20 58 22 20 62 65   NOCASE op X" be
5710: 63 6f 6d 65 73 20 0a 2a 2a 20 22 58 20 63 6f 6c  comes .** "X col
5720: 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f 70 20 59  late NOCASE op Y
5730: 22 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  ". This is becau
5740: 73 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e  se any collation
5750: 20 73 65 71 75 65 6e 63 65 20 6f 6e 0a 2a 2a 20   sequence on.** 
5760: 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 73 69  the left hand si
5770: 64 65 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73  de of a comparis
5780: 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79  on overrides any
5790: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
57a0: 6e 63 65 20 0a 2a 2a 20 61 74 74 61 63 68 65 64  nce .** attached
57b0: 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e 20 46   to the right. F
57c0: 6f 72 20 74 68 65 20 73 61 6d 65 20 72 65 61 73  or the same reas
57d0: 6f 6e 20 74 68 65 20 45 50 5f 45 78 70 43 6f 6c  on the EP_ExpCol
57e0: 6c 61 74 65 20 66 6c 61 67 0a 2a 2a 20 69 73 20  late flag.** is 
57f0: 6e 6f 74 20 63 6f 6d 6d 75 74 65 64 2e 0a 2a 2f  not commuted..*/
5800: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
5810: 72 43 6f 6d 6d 75 74 65 28 50 61 72 73 65 20 2a  rCommute(Parse *
5820: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
5830: 78 70 72 29 7b 0a 20 20 75 31 36 20 65 78 70 52  xpr){.  u16 expR
5840: 69 67 68 74 20 3d 20 28 70 45 78 70 72 2d 3e 70  ight = (pExpr->p
5850: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45  Right->flags & E
5860: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3b 0a 20  P_ExpCollate);. 
5870: 20 75 31 36 20 65 78 70 4c 65 66 74 20 3d 20 28   u16 expLeft = (
5880: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c  pExpr->pLeft->fl
5890: 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c  ags & EP_ExpColl
58a0: 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ate);.  assert( 
58b0: 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70 72 2d  allowedOp(pExpr-
58c0: 3e 6f 70 29 20 26 26 20 70 45 78 70 72 2d 3e 6f  >op) && pExpr->o
58d0: 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 70 45  p!=TK_IN );.  pE
58e0: 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 70 43 6f  xpr->pRight->pCo
58f0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
5900: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
5910: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
5920: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e    pExpr->pLeft->
5930: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
5940: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
5950: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
5960: 3b 0a 20 20 53 57 41 50 28 43 6f 6c 6c 53 65 71  ;.  SWAP(CollSeq
5970: 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d  *,pExpr->pRight-
5980: 3e 70 43 6f 6c 6c 2c 70 45 78 70 72 2d 3e 70 4c  >pColl,pExpr->pL
5990: 65 66 74 2d 3e 70 43 6f 6c 6c 29 3b 0a 20 20 70  eft->pColl);.  p
59a0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c  Expr->pRight->fl
59b0: 61 67 73 20 3d 20 28 70 45 78 70 72 2d 3e 70 52  ags = (pExpr->pR
59c0: 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 7e 45  ight->flags & ~E
59d0: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 20 7c 20  P_ExpCollate) | 
59e0: 65 78 70 4c 65 66 74 3b 0a 20 20 70 45 78 70 72  expLeft;.  pExpr
59f0: 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 3d  ->pLeft->flags =
5a00: 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e   (pExpr->pLeft->
5a10: 66 6c 61 67 73 20 26 20 7e 45 50 5f 45 78 70 43  flags & ~EP_ExpC
5a20: 6f 6c 6c 61 74 65 29 20 7c 20 65 78 70 52 69 67  ollate) | expRig
5a30: 68 74 3b 0a 20 20 53 57 41 50 28 45 78 70 72 2a  ht;.  SWAP(Expr*
5a40: 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 70  ,pExpr->pRight,p
5a50: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
5a60: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54  if( pExpr->op>=T
5a70: 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61 73 73 65  K_GT ){.    asse
5a80: 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54  rt( TK_LT==TK_GT
5a90: 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +2 );.    assert
5aa0: 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b 32  ( TK_GE==TK_LE+2
5ab0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
5ac0: 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29 3b 0a 20  TK_GT>TK_EQ );. 
5ad0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
5ae0: 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73  <TK_LE );.    as
5af0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3e  sert( pExpr->op>
5b00: 3d 54 4b 5f 47 54 20 26 26 20 70 45 78 70 72 2d  =TK_GT && pExpr-
5b10: 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20 20  >op<=TK_GE );.  
5b20: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28 28    pExpr->op = ((
5b30: 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54 29  pExpr->op-TK_GT)
5b40: 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a 7d  ^2)+TK_GT;.  }.}
5b50: 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74  ../*.** Translat
5b60: 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20 6f 70 65  e from TK_xx ope
5b70: 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78 78 20 62  rator to WO_xx b
5b80: 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  itmask..*/.stati
5b90: 63 20 75 31 36 20 6f 70 65 72 61 74 6f 72 4d 61  c u16 operatorMa
5ba0: 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20 20 75 31  sk(int op){.  u1
5bb0: 36 20 63 3b 0a 20 20 61 73 73 65 72 74 28 20 61  6 c;.  assert( a
5bc0: 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 3b 0a  llowedOp(op) );.
5bd0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20    if( op==TK_IN 
5be0: 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 4e  ){.    c = WO_IN
5bf0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
5c00: 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  ==TK_ISNULL ){. 
5c10: 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e 55 4c 4c     c = WO_ISNULL
5c20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
5c30: 73 73 65 72 74 28 20 28 57 4f 5f 45 51 3c 3c 28  ssert( (WO_EQ<<(
5c40: 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20 30 78 37  op-TK_EQ)) < 0x7
5c50: 66 66 66 20 29 3b 0a 20 20 20 20 63 20 3d 20 28  fff );.    c = (
5c60: 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d  u16)(WO_EQ<<(op-
5c70: 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a 20 20 61  TK_EQ));.  }.  a
5c80: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49 53  ssert( op!=TK_IS
5c90: 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f 49 53  NULL || c==WO_IS
5ca0: 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  NULL );.  assert
5cb0: 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63  ( op!=TK_IN || c
5cc0: 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61 73 73  ==WO_IN );.  ass
5cd0: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51 20 7c  ert( op!=TK_EQ |
5ce0: 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20  | c==WO_EQ );.  
5cf0: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c  assert( op!=TK_L
5d00: 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b  T || c==WO_LT );
5d10: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
5d20: 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45  K_LE || c==WO_LE
5d30: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
5d40: 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f  !=TK_GT || c==WO
5d50: 5f 47 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GT );.  assert(
5d60: 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d   op!=TK_GE || c=
5d70: 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65 74 75  =WO_GE );.  retu
5d80: 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn c;.}../*.** S
5d90: 65 61 72 63 68 20 66 6f 72 20 61 20 74 65 72 6d  earch for a term
5da0: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
5db0: 61 75 73 65 20 74 68 61 74 20 69 73 20 6f 66 20  ause that is of 
5dc0: 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e  the form "X <op>
5dd0: 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77 68 65 72   <expr>".** wher
5de0: 65 20 58 20 69 73 20 61 20 72 65 66 65 72 65 6e  e X is a referen
5df0: 63 65 20 74 6f 20 74 68 65 20 69 43 6f 6c 75 6d  ce to the iColum
5e00: 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72 20  n of table iCur 
5e10: 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20  and <op> is one 
5e20: 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f 78 78 20  of.** the WO_xx 
5e30: 6f 70 65 72 61 74 6f 72 20 63 6f 64 65 73 20 73  operator codes s
5e40: 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20  pecified by the 
5e50: 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  op parameter..**
5e60: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
5e70: 72 20 74 6f 20 74 68 65 20 74 65 72 6d 2e 20 20  r to the term.  
5e80: 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 20  Return 0 if not 
5e90: 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
5ea0: 20 57 68 65 72 65 54 65 72 6d 20 2a 66 69 6e 64   WhereTerm *find
5eb0: 54 65 72 6d 28 0a 20 20 57 68 65 72 65 43 6c 61  Term(.  WhereCla
5ec0: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a  use *pWC,     /*
5ed0: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
5ee0: 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64  e to be searched
5ef0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20   */.  int iCur, 
5f00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
5f10: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
5f20: 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  LHS */.  int iCo
5f30: 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 2f  lumn,          /
5f40: 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  * Column number 
5f50: 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d  of LHS */.  Bitm
5f60: 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
5f70: 20 20 2f 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f    /* RHS must no
5f80: 74 20 6f 76 65 72 6c 61 70 20 77 69 74 68 20 74  t overlap with t
5f90: 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 33  his mask */.  u3
5fa0: 32 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  2 op,           
5fb0: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57      /* Mask of W
5fc0: 4f 5f 78 78 20 76 61 6c 75 65 73 20 64 65 73 63  O_xx values desc
5fd0: 72 69 62 69 6e 67 20 6f 70 65 72 61 74 6f 72 20  ribing operator 
5fe0: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
5ff0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75             /* Mu
6000: 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  st be compatible
6010: 20 77 69 74 68 20 74 68 69 73 20 69 6e 64 65 78   with this index
6020: 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f  , if not NULL */
6030: 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  .){.  WhereTerm 
6040: 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6b 3b  *pTerm;.  int k;
6050: 0a 20 20 61 73 73 65 72 74 28 20 69 43 75 72 3e  .  assert( iCur>
6060: 3d 30 20 29 3b 0a 20 20 6f 70 20 26 3d 20 57 4f  =0 );.  op &= WO
6070: 5f 41 4c 4c 3b 0a 20 20 66 6f 72 28 3b 20 70 57  _ALL;.  for(; pW
6080: 43 3b 20 70 57 43 3d 70 57 43 2d 3e 70 4f 75 74  C; pWC=pWC->pOut
6090: 65 72 29 7b 0a 20 20 20 20 66 6f 72 28 70 54 65  er){.    for(pTe
60a0: 72 6d 3d 70 57 43 2d 3e 61 2c 20 6b 3d 70 57 43  rm=pWC->a, k=pWC
60b0: 2d 3e 6e 54 65 72 6d 3b 20 6b 3b 20 6b 2d 2d 2c  ->nTerm; k; k--,
60c0: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
60d0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
60e0: 43 75 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20  Cursor==iCur.   
60f0: 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d        && (pTerm-
6100: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e  >prereqRight & n
6110: 6f 74 52 65 61 64 79 29 3d 3d 30 0a 20 20 20 20  otReady)==0.    
6120: 20 20 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 75       && pTerm->u
6130: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f  .leftColumn==iCo
6140: 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20 20 26 26  lumn.         &&
6150: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
6160: 6f 72 20 26 20 6f 70 29 21 3d 30 0a 20 20 20 20  or & op)!=0.    
6170: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28    ){.        if(
6180: 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70   iColumn>=0 && p
6190: 49 64 78 20 26 26 20 70 54 65 72 6d 2d 3e 65 4f  Idx && pTerm->eO
61a0: 70 65 72 61 74 6f 72 21 3d 57 4f 5f 49 53 4e 55  perator!=WO_ISNU
61b0: 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LL ){.          
61c0: 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
61d0: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
61e0: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
61f0: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  l;.          cha
6200: 72 20 69 64 78 61 66 66 3b 0a 20 20 20 20 20 20  r idxaff;.      
6210: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
6220: 20 20 20 20 20 50 61 72 73 65 20 2a 70 50 61 72       Parse *pPar
6230: 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65  se = pWC->pParse
6240: 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 69  ;.  .          i
6250: 64 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54  dxaff = pIdx->pT
6260: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75  able->aCol[iColu
6270: 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  mn].affinity;.  
6280: 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c          if( !sql
6290: 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
62a0: 79 4f 6b 28 70 58 2c 20 69 64 78 61 66 66 29 20  yOk(pX, idxaff) 
62b0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 0a 20  ) continue;.  . 
62c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 67 75           /* Figu
62d0: 72 65 20 6f 75 74 20 74 68 65 20 63 6f 6c 6c 61  re out the colla
62e0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 72 65  tion sequence re
62f0: 71 75 69 72 65 64 20 66 72 6f 6d 20 61 6e 20 69  quired from an i
6300: 6e 64 65 78 20 66 6f 72 0a 20 20 20 20 20 20 20  ndex for.       
6310: 20 20 20 2a 2a 20 69 74 20 74 6f 20 62 65 20 75     ** it to be u
6320: 73 65 66 75 6c 20 66 6f 72 20 6f 70 74 69 6d 69  seful for optimi
6330: 73 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20  sing expression 
6340: 70 58 2e 20 53 74 6f 72 65 20 74 68 69 73 0a 20  pX. Store this. 
6350: 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75           ** valu
6360: 65 20 69 6e 20 76 61 72 69 61 62 6c 65 20 70 43  e in variable pC
6370: 6f 6c 6c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  oll..          *
6380: 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
6390: 72 74 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20  rt(pX->pLeft);. 
63a0: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
63b0: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
63c0: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
63d0: 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20  rse, pX->pLeft, 
63e0: 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pX->pRight);.   
63f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70 43         assert(pC
6400: 6f 6c 6c 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  oll || pParse->n
6410: 45 72 72 29 3b 0a 20 20 0a 20 20 20 20 20 20 20  Err);.  .       
6420: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 70 49 64 78     for(j=0; pIdx
6430: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69  ->aiColumn[j]!=i
6440: 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Column; j++){.  
6450: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4e 45            if( NE
6460: 56 45 52 28 6a 3e 3d 70 49 64 78 2d 3e 6e 43 6f  VER(j>=pIdx->nCo
6470: 6c 75 6d 6e 29 20 29 20 72 65 74 75 72 6e 20 30  lumn) ) return 0
6480: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
6490: 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
64a0: 6c 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  l && sqlite3StrI
64b0: 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
64c0: 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a  , pIdx->azColl[j
64d0: 5d 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ]) ) continue;. 
64e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
64f0: 20 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20   return pTerm;. 
6500: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6510: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
6520: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
6530: 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76  ence */.static v
6540: 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28  oid exprAnalyze(
6550: 53 72 63 4c 69 73 74 2a 2c 20 57 68 65 72 65 43  SrcList*, WhereC
6560: 6c 61 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f  lause*, int);../
6570: 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41 6e  *.** Call exprAn
6580: 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65 72  alyze on all ter
6590: 6d 73 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c  ms in a WHERE cl
65a0: 61 75 73 65 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2f  ause.  .**.**.*/
65b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
65c0: 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20 20 53  rAnalyzeAll(.  S
65d0: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
65e0: 2c 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46  ,       /* the F
65f0: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
6600: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
6610: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
6620: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
6630: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29  be analyzed */.)
6640: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
6650: 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b  (i=pWC->nTerm-1;
6660: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
6670: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61   exprAnalyze(pTa
6680: 62 4c 69 73 74 2c 20 70 57 43 2c 20 69 29 3b 0a  bList, pWC, i);.
6690: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
66a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f  QLITE_OMIT_LIKE_
66b0: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a  OPTIMIZATION./*.
66c0: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
66d0: 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  if the given exp
66e0: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 4c 49 4b  ression is a LIK
66f0: 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74  E or GLOB operat
6700: 6f 72 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62  or that.** can b
6710: 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e  e optimized usin
6720: 67 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  g inequality con
6730: 73 74 72 61 69 6e 74 73 2e 20 20 52 65 74 75 72  straints.  Retur
6740: 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73 0a  n TRUE if it is.
6750: 2a 2a 20 73 6f 20 61 6e 64 20 66 61 6c 73 65 20  ** so and false 
6760: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e  if not..**.** In
6770: 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20 6f   order for the o
6780: 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 70  perator to be op
6790: 74 69 6d 69 7a 69 62 6c 65 2c 20 74 68 65 20 52  timizible, the R
67a0: 48 53 20 6d 75 73 74 20 62 65 20 61 20 73 74 72  HS must be a str
67b0: 69 6e 67 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 74  ing.** literal t
67c0: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67  hat does not beg
67d0: 69 6e 20 77 69 74 68 20 61 20 77 69 6c 64 63 61  in with a wildca
67e0: 72 64 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  rd.  .*/.static 
67f0: 69 6e 74 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62  int isLikeOrGlob
6800: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
6810: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
6820: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
6830: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
6840: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
6850: 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73      /* Test this
6860: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
6870: 20 45 78 70 72 20 2a 2a 70 70 50 72 65 66 69 78   Expr **ppPrefix
6880: 2c 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  ,  /* Pointer to
6890: 20 54 4b 5f 53 54 52 49 4e 47 20 65 78 70 72 65   TK_STRING expre
68a0: 73 73 69 6f 6e 20 77 69 74 68 20 70 61 74 74 65  ssion with patte
68b0: 72 6e 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 69  rn prefix */.  i
68c0: 6e 74 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 2c  nt *pisComplete,
68d0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
68e0: 6f 6e 6c 79 20 77 69 6c 64 63 61 72 64 20 69 73  only wildcard is
68f0: 20 25 20 69 6e 20 74 68 65 20 6c 61 73 74 20 63   % in the last c
6900: 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 69 6e  haracter */.  in
6910: 74 20 2a 70 6e 6f 43 61 73 65 20 20 20 20 20 20  t *pnoCase      
6920: 2f 2a 20 54 72 75 65 20 69 66 20 75 70 70 65 72  /* True if upper
6930: 63 61 73 65 20 69 73 20 65 71 75 69 76 61 6c 65  case is equivale
6940: 6e 74 20 74 6f 20 6c 6f 77 65 72 63 61 73 65 20  nt to lowercase 
6950: 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
6960: 61 72 20 2a 7a 20 3d 20 30 3b 20 20 20 20 20 20  ar *z = 0;      
6970: 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 6e 20     /* String on 
6980: 52 48 53 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72  RHS of LIKE oper
6990: 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ator */.  Expr *
69a0: 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 20  pRight, *pLeft; 
69b0: 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 61 6e       /* Right an
69c0: 64 20 6c 65 66 74 20 73 69 7a 65 20 6f 66 20 4c  d left size of L
69d0: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  IKE operator */.
69e0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
69f0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
6a00: 4c 69 73 74 20 6f 66 20 6f 70 65 72 61 6e 64 73  List of operands
6a10: 20 74 6f 20 74 68 65 20 4c 49 4b 45 20 6f 70 65   to the LIKE ope
6a20: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 63  rator */.  int c
6a30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6a40: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 68 61        /* One cha
6a50: 72 61 63 74 65 72 20 69 6e 20 7a 5b 5d 20 2a 2f  racter in z[] */
6a60: 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20  .  int cnt;     
6a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6a80: 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 77   Number of non-w
6a90: 69 6c 64 63 61 72 64 20 70 72 65 66 69 78 20 63  ildcard prefix c
6aa0: 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 63  haracters */.  c
6ab0: 68 61 72 20 77 63 5b 33 5d 3b 20 20 20 20 20 20  har wc[3];      
6ac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c            /* Wil
6ad0: 64 63 61 72 64 20 63 68 61 72 61 63 74 65 72 73  dcard characters
6ae0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
6af0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
6b00: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
6b10: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  nection */.  sql
6b20: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
6b30: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6f 70 3b 20   = 0;.  int op; 
6b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b50: 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 6f 66 20     /* Opcode of 
6b60: 70 52 69 67 68 74 20 2a 2f 0a 0a 20 20 69 66 28  pRight */..  if(
6b70: 20 21 73 71 6c 69 74 65 33 49 73 4c 69 6b 65 46   !sqlite3IsLikeF
6b80: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 45 78 70  unction(db, pExp
6b90: 72 2c 20 70 6e 6f 43 61 73 65 2c 20 77 63 29 20  r, pnoCase, wc) 
6ba0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
6bb0: 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
6bc0: 54 45 5f 45 42 43 44 49 43 0a 20 20 69 66 28 20  TE_EBCDIC.  if( 
6bd0: 2a 70 6e 6f 43 61 73 65 20 29 20 72 65 74 75 72  *pnoCase ) retur
6be0: 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4c  n 0;.#endif.  pL
6bf0: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
6c00: 4c 69 73 74 3b 0a 20 20 70 4c 65 66 74 20 3d 20  List;.  pLeft = 
6c10: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
6c20: 72 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e  r;.  if( pLeft->
6c30: 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20  op!=TK_COLUMN . 
6c40: 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72    || sqlite3Expr
6c50: 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 21  Affinity(pLeft)!
6c60: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
6c70: 20 0a 20 20 20 7c 7c 20 49 73 56 69 72 74 75 61   .   || IsVirtua
6c80: 6c 28 70 4c 65 66 74 2d 3e 70 54 61 62 29 0a 20  l(pLeft->pTab). 
6c90: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 4d 50 3a 20   ){.    /* IMP: 
6ca0: 52 2d 30 32 30 36 35 2d 34 39 34 36 35 20 54 68  R-02065-49465 Th
6cb0: 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65  e left-hand side
6cc0: 20 6f 66 20 74 68 65 20 4c 49 4b 45 20 6f 72 20   of the LIKE or 
6cd0: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 6d 75  GLOB operator mu
6ce0: 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65  st.    ** be the
6cf0: 20 6e 61 6d 65 20 6f 66 20 61 6e 20 69 6e 64 65   name of an inde
6d00: 78 65 64 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20  xed column with 
6d10: 54 45 58 54 20 61 66 66 69 6e 69 74 79 2e 20 2a  TEXT affinity. *
6d20: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  /.    return 0;.
6d30: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c    }.  assert( pL
6d40: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 28 2d  eft->iColumn!=(-
6d50: 31 29 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65  1) ); /* Because
6d60: 20 49 50 4b 20 6e 65 76 65 72 20 68 61 73 20 41   IPK never has A
6d70: 46 46 5f 54 45 58 54 20 2a 2f 0a 0a 20 20 70 52  FF_TEXT */..  pR
6d80: 69 67 68 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  ight = pList->a[
6d90: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 6f 70 20 3d  0].pExpr;.  op =
6da0: 20 70 52 69 67 68 74 2d 3e 6f 70 3b 0a 20 20 69   pRight->op;.  i
6db0: 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  f( op==TK_REGIST
6dc0: 45 52 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 70  ER ){.    op = p
6dd0: 52 69 67 68 74 2d 3e 6f 70 32 3b 0a 20 20 7d 0a  Right->op2;.  }.
6de0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52    if( op==TK_VAR
6df0: 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 56 64 62  IABLE ){.    Vdb
6e00: 65 20 2a 70 52 65 70 72 65 70 61 72 65 20 3d 20  e *pReprepare = 
6e10: 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61  pParse->pReprepa
6e20: 72 65 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c  re;.    int iCol
6e30: 20 3d 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75   = pRight->iColu
6e40: 6d 6e 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 73  mn;.    pVal = s
6e50: 71 6c 69 74 65 33 56 64 62 65 47 65 74 56 61 6c  qlite3VdbeGetVal
6e60: 75 65 28 70 52 65 70 72 65 70 61 72 65 2c 20 69  ue(pReprepare, i
6e70: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  Col, SQLITE_AFF_
6e80: 4e 4f 4e 45 29 3b 0a 20 20 20 20 69 66 28 20 70  NONE);.    if( p
6e90: 56 61 6c 20 26 26 20 73 71 6c 69 74 65 33 5f 76  Val && sqlite3_v
6ea0: 61 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3d  alue_type(pVal)=
6eb0: 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a  =SQLITE_TEXT ){.
6ec0: 20 20 20 20 20 20 7a 20 3d 20 28 63 68 61 72 20        z = (char 
6ed0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
6ee0: 74 65 78 74 28 70 56 61 6c 29 3b 0a 20 20 20 20  text(pVal);.    
6ef0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
6f00: 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72  eSetVarmask(pPar
6f10: 73 65 2d 3e 70 56 64 62 65 2c 20 69 43 6f 6c 29  se->pVdbe, iCol)
6f20: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  ;.    assert( pR
6f30: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52  ight->op==TK_VAR
6f40: 49 41 42 4c 45 20 7c 7c 20 70 52 69 67 68 74 2d  IABLE || pRight-
6f50: 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op==TK_REGISTER
6f60: 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
6f70: 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b  op==TK_STRING ){
6f80: 0a 20 20 20 20 7a 20 3d 20 70 52 69 67 68 74 2d  .    z = pRight-
6f90: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20  >u.zToken;.  }. 
6fa0: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 63 6e   if( z ){.    cn
6fb0: 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  t = 0;.    while
6fc0: 28 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20  ( (c=z[cnt])!=0 
6fd0: 26 26 20 63 21 3d 77 63 5b 30 5d 20 26 26 20 63  && c!=wc[0] && c
6fe0: 21 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d 77 63  !=wc[1] && c!=wc
6ff0: 5b 32 5d 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  [2] ){.      cnt
7000: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
7010: 28 20 63 6e 74 21 3d 30 20 26 26 20 32 35 35 21  ( cnt!=0 && 255!
7020: 3d 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b  =(u8)z[cnt-1] ){
7030: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 50 72  .      Expr *pPr
7040: 65 66 69 78 3b 0a 20 20 20 20 20 20 2a 70 69 73  efix;.      *pis
7050: 43 6f 6d 70 6c 65 74 65 20 3d 20 63 3d 3d 77 63  Complete = c==wc
7060: 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d  [0] && z[cnt+1]=
7070: 3d 30 3b 0a 20 20 20 20 20 20 70 50 72 65 66 69  =0;.      pPrefi
7080: 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  x = sqlite3Expr(
7090: 64 62 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20 7a  db, TK_STRING, z
70a0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  );.      if( pPr
70b0: 65 66 69 78 20 29 20 70 50 72 65 66 69 78 2d 3e  efix ) pPrefix->
70c0: 75 2e 7a 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20  u.zToken[cnt] = 
70d0: 30 3b 0a 20 20 20 20 20 20 2a 70 70 50 72 65 66  0;.      *ppPref
70e0: 69 78 20 3d 20 70 50 72 65 66 69 78 3b 0a 20 20  ix = pPrefix;.  
70f0: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56      if( op==TK_V
7100: 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 20  ARIABLE ){.     
7110: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61     Vdbe *v = pPa
7120: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20  rse->pVdbe;.    
7130: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
7140: 65 74 56 61 72 6d 61 73 6b 28 76 2c 20 70 52 69  etVarmask(v, pRi
7150: 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  ght->iColumn);. 
7160: 20 20 20 20 20 20 20 69 66 28 20 2a 70 69 73 43         if( *pisC
7170: 6f 6d 70 6c 65 74 65 20 26 26 20 70 52 69 67 68  omplete && pRigh
7180: 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 20 29  t->u.zToken[1] )
7190: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
71a0: 66 20 74 68 65 20 72 68 73 20 6f 66 20 74 68 65  f the rhs of the
71b0: 20 4c 49 4b 45 20 65 78 70 72 65 73 73 69 6f 6e   LIKE expression
71c0: 20 69 73 20 61 20 76 61 72 69 61 62 6c 65 2c 20   is a variable, 
71d0: 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a  and the current.
71e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c            ** val
71f0: 75 65 20 6f 66 20 74 68 65 20 76 61 72 69 61 62  ue of the variab
7200: 6c 65 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69  le means there i
7210: 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 76  s no need to inv
7220: 6f 6b 65 20 74 68 65 20 4c 49 4b 45 0a 20 20 20  oke the LIKE.   
7230: 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
7240: 6f 6e 2c 20 74 68 65 6e 20 6e 6f 20 4f 50 5f 56  on, then no OP_V
7250: 61 72 69 61 62 6c 65 20 77 69 6c 6c 20 62 65 20  ariable will be 
7260: 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 72 6f  added to the pro
7270: 67 72 61 6d 2e 0a 20 20 20 20 20 20 20 20 20 20  gram..          
7280: 2a 2a 20 54 68 69 73 20 63 61 75 73 65 73 20 70  ** This causes p
7290: 72 6f 62 6c 65 6d 73 20 66 6f 72 20 74 68 65 20  roblems for the 
72a0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
72b0: 61 6d 65 74 65 72 5f 6e 61 6d 65 28 29 0a 20 20  ameter_name().  
72c0: 20 20 20 20 20 20 20 20 2a 2a 20 41 50 49 2e 20          ** API. 
72d0: 54 6f 20 77 6f 72 6b 61 72 6f 75 6e 64 20 74 68  To workaround th
72e0: 65 6d 2c 20 61 64 64 20 61 20 64 75 6d 6d 79 20  em, add a dummy 
72f0: 4f 50 5f 56 61 72 69 61 62 6c 65 20 68 65 72 65  OP_Variable here
7300: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 20 0a  ..          */ .
7310: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31            int r1
7320: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
7330: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
7340: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
7350: 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
7360: 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 31  arse, pRight, r1
7370: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
7380: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
7390: 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
73a0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c  urrentAddr(v)-1,
73b0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   0);.          s
73c0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
73d0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
73e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
73f0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
7400: 20 20 20 20 20 7a 20 3d 20 30 3b 0a 20 20 20 20       z = 0;.    
7410: 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
7420: 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
7430: 0a 20 20 72 65 74 75 72 6e 20 28 7a 21 3d 30 29  .  return (z!=0)
7440: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
7450: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
7460: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
7470: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7480: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
7490: 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  E./*.** Check to
74a0: 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65   see if the give
74b0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
74c0: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a  of the form.**.*
74d0: 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  *         column
74e0: 20 4d 41 54 43 48 20 65 78 70 72 0a 2a 2a 0a 2a   MATCH expr.**.*
74f0: 2a 20 49 66 20 69 74 20 69 73 20 74 68 65 6e 20  * If it is then 
7500: 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66  return TRUE.  If
7510: 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 46 41 4c   not, return FAL
7520: 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  SE..*/.static in
7530: 74 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d  t isMatchOfColum
7540: 6e 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  n(.  Expr *pExpr
7550: 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68        /* Test th
7560: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  is expression */
7570: 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
7580: 70 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45  pList;..  if( pE
7590: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43  xpr->op!=TK_FUNC
75a0: 54 49 4f 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  TION ){.    retu
75b0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
75c0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
75d0: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22  Expr->u.zToken,"
75e0: 6d 61 74 63 68 22 29 21 3d 30 20 29 7b 0a 20 20  match")!=0 ){.  
75f0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
7600: 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d    pList = pExpr-
7610: 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20  >x.pList;.  if( 
7620: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20  pList->nExpr!=2 
7630: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
7640: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74  .  }.  if( pList
7650: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[1].pExpr->op
7660: 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b   != TK_COLUMN ){
7670: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
7680: 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
7690: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
76a0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
76b0: 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66  BLE */../*.** If
76c0: 20 74 68 65 20 70 42 61 73 65 20 65 78 70 72 65   the pBase expre
76d0: 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64  ssion originated
76e0: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
76f0: 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a  ING clause of.**
7700: 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72   a join, then tr
7710: 61 6e 73 66 65 72 20 74 68 65 20 61 70 70 72 6f  ansfer the appro
7720: 70 72 69 61 74 65 20 6d 61 72 6b 69 6e 67 73 20  priate markings 
7730: 6f 76 65 72 20 74 6f 20 64 65 72 69 76 65 64 2e  over to derived.
7740: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7750: 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b  transferJoinMark
7760: 69 6e 67 73 28 45 78 70 72 20 2a 70 44 65 72 69  ings(Expr *pDeri
7770: 76 65 64 2c 20 45 78 70 72 20 2a 70 42 61 73 65  ved, Expr *pBase
7780: 29 7b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e 66  ){.  pDerived->f
7790: 6c 61 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e 66  lags |= pBase->f
77a0: 6c 61 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a 6f  lags & EP_FromJo
77b0: 69 6e 3b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e  in;.  pDerived->
77c0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
77d0: 3d 20 70 42 61 73 65 2d 3e 69 52 69 67 68 74 4a  = pBase->iRightJ
77e0: 6f 69 6e 54 61 62 6c 65 3b 0a 7d 0a 0a 23 69 66  oinTable;.}..#if
77f0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
7800: 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
7810: 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e  ATION) && !defin
7820: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
7830: 55 42 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20 41  UBQUERY)./*.** A
7840: 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68  nalyze a term th
7850: 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74  at consists of t
7860: 77 6f 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f  wo or more OR-co
7870: 6e 6e 65 63 74 65 64 0a 2a 2a 20 73 75 62 74 65  nnected.** subte
7880: 72 6d 73 2e 20 20 53 6f 20 69 6e 3a 0a 2a 2a 0a  rms.  So in:.**.
7890: 2a 2a 20 20 20 20 20 2e 2e 2e 20 57 48 45 52 45  **     ... WHERE
78a0: 20 20 28 61 3d 35 29 20 41 4e 44 20 28 62 3d 37    (a=5) AND (b=7
78b0: 20 4f 52 20 63 3d 39 20 4f 52 20 64 3d 31 33 29   OR c=9 OR d=13)
78c0: 20 41 4e 44 20 28 64 3d 31 33 29 0a 2a 2a 20 20   AND (d=13).**  
78d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78e0: 20 20 20 20 20 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e          ^^^^^^^^
78f0: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a  ^^^^^^^^^^^^.**.
7900: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7910: 61 6e 61 6c 79 7a 65 73 20 74 65 72 6d 73 20 73  analyzes terms s
7920: 75 63 68 20 61 73 20 74 68 65 20 6d 69 64 64 6c  uch as the middl
7930: 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20 61 62  e term in the ab
7940: 6f 76 65 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a 20  ove example..** 
7950: 41 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62  A WhereOrTerm ob
7960: 6a 65 63 74 20 69 73 20 63 6f 6d 70 75 74 65 64  ject is computed
7970: 20 61 6e 64 20 61 74 74 61 63 68 65 64 20 74 6f   and attached to
7980: 20 74 68 65 20 74 65 72 6d 20 75 6e 64 65 72 0a   the term under.
7990: 2a 2a 20 61 6e 61 6c 79 73 69 73 2c 20 72 65 67  ** analysis, reg
79a0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f  ardless of the o
79b0: 75 74 63 6f 6d 65 20 6f 66 20 74 68 65 20 61 6e  utcome of the an
79c0: 61 6c 79 73 69 73 2e 20 20 48 65 6e 63 65 3a 0a  alysis.  Hence:.
79d0: 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54  **.**     WhereT
79e0: 65 72 6d 2e 77 74 46 6c 61 67 73 20 20 20 7c 3d  erm.wtFlags   |=
79f0: 20 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a    TERM_ORINFO.**
7a00: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 75       WhereTerm.u
7a10: 2e 70 4f 72 49 6e 66 6f 20 20 3d 20 20 61 20 64  .pOrInfo  =  a d
7a20: 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  ynamically alloc
7a30: 61 74 65 64 20 57 68 65 72 65 4f 72 54 65 72 6d  ated WhereOrTerm
7a40: 20 6f 62 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68   object.**.** Th
7a50: 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61 6e 61  e term being ana
7a60: 6c 79 7a 65 64 20 6d 75 73 74 20 68 61 76 65 20  lyzed must have 
7a70: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 66 20 4f  two or more of O
7a80: 52 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 74  R-connected subt
7a90: 65 72 6d 73 2e 0a 2a 2a 20 41 20 73 69 6e 67 6c  erms..** A singl
7aa0: 65 20 73 75 62 74 65 72 6d 20 6d 69 67 68 74 20  e subterm might 
7ab0: 62 65 20 61 20 73 65 74 20 6f 66 20 41 4e 44 2d  be a set of AND-
7ac0: 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 2d 73 75  connected sub-su
7ad0: 62 74 65 72 6d 73 2e 0a 2a 2a 20 45 78 61 6d 70  bterms..** Examp
7ae0: 6c 65 73 20 6f 66 20 74 65 72 6d 73 20 75 6e 64  les of terms und
7af0: 65 72 20 61 6e 61 6c 79 73 69 73 3a 0a 2a 2a 0a  er analysis:.**.
7b00: 2a 2a 20 20 20 20 20 28 41 29 20 20 20 20 20 74  **     (A)     t
7b10: 31 2e 78 3d 74 32 2e 79 20 4f 52 20 74 31 2e 78  1.x=t2.y OR t1.x
7b20: 3d 74 32 2e 7a 20 4f 52 20 74 31 2e 79 3d 31 35  =t2.z OR t1.y=15
7b30: 20 4f 52 20 74 31 2e 7a 3d 74 33 2e 61 2b 35 0a   OR t1.z=t3.a+5.
7b40: 2a 2a 20 20 20 20 20 28 42 29 20 20 20 20 20 78  **     (B)     x
7b50: 3d 65 78 70 72 31 20 4f 52 20 65 78 70 72 32 3d  =expr1 OR expr2=
7b60: 78 20 4f 52 20 78 3d 65 78 70 72 33 0a 2a 2a 20  x OR x=expr3.** 
7b70: 20 20 20 20 28 43 29 20 20 20 20 20 74 31 2e 78      (C)     t1.x
7b80: 3d 74 32 2e 79 20 4f 52 20 28 74 31 2e 78 3d 74  =t2.y OR (t1.x=t
7b90: 32 2e 7a 20 41 4e 44 20 74 31 2e 79 3d 31 35 29  2.z AND t1.y=15)
7ba0: 0a 2a 2a 20 20 20 20 20 28 44 29 20 20 20 20 20  .**     (D)     
7bb0: 78 3d 65 78 70 72 31 20 4f 52 20 28 79 3e 31 31  x=expr1 OR (y>11
7bc0: 20 41 4e 44 20 79 3c 32 32 20 41 4e 44 20 7a 20   AND y<22 AND z 
7bd0: 4c 49 4b 45 20 27 2a 68 65 6c 6c 6f 2a 27 29 0a  LIKE '*hello*').
7be0: 2a 2a 20 20 20 20 20 28 45 29 20 20 20 20 20 28  **     (E)     (
7bf0: 70 2e 61 3d 31 20 41 4e 44 20 71 2e 62 3d 32 20  p.a=1 AND q.b=2 
7c00: 41 4e 44 20 72 2e 63 3d 33 29 20 4f 52 20 28 70  AND r.c=3) OR (p
7c10: 2e 78 3d 34 20 41 4e 44 20 71 2e 79 3d 35 20 41  .x=4 AND q.y=5 A
7c20: 4e 44 20 72 2e 7a 3d 36 29 0a 2a 2a 0a 2a 2a 20  ND r.z=6).**.** 
7c30: 43 41 53 45 20 31 3a 0a 2a 2a 0a 2a 2a 20 49 66  CASE 1:.**.** If
7c40: 20 61 6c 6c 20 73 75 62 74 65 72 6d 73 20 61 72   all subterms ar
7c50: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 54 2e  e of the form T.
7c60: 43 3d 65 78 70 72 20 66 6f 72 20 73 6f 6d 65 20  C=expr for some 
7c70: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66  single column of
7c80: 20 43 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74   C.** a single t
7c90: 61 62 6c 65 20 54 20 28 61 73 20 73 68 6f 77 6e  able T (as shown
7ca0: 20 69 6e 20 65 78 61 6d 70 6c 65 20 42 20 61 62   in example B ab
7cb0: 6f 76 65 29 20 74 68 65 6e 20 63 72 65 61 74 65  ove) then create
7cc0: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a   a new virtual.*
7cd0: 2a 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 61  * term that is a
7ce0: 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 49 4e 20  n equivalent IN 
7cf0: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20  expression.  In 
7d00: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
7d10: 74 68 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e  the term.** bein
7d20: 67 20 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a  g analyzed is:.*
7d30: 2a 0a 2a 2a 20 20 20 20 20 20 78 20 3d 20 65 78  *.**      x = ex
7d40: 70 72 31 20 20 4f 52 20 20 65 78 70 72 32 20 3d  pr1  OR  expr2 =
7d50: 20 78 20 20 4f 52 20 20 78 20 3d 20 65 78 70 72   x  OR  x = expr
7d60: 33 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65  3.**.** then cre
7d70: 61 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61  ate a new virtua
7d80: 6c 20 74 65 72 6d 20 6c 69 6b 65 20 74 68 69 73  l term like this
7d90: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49  :.**.**      x I
7da0: 4e 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65  N (expr1,expr2,e
7db0: 78 70 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45  xpr3).**.** CASE
7dc0: 20 32 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c   2:.**.** If all
7dd0: 20 73 75 62 74 65 72 6d 73 20 61 72 65 20 69 6e   subterms are in
7de0: 64 65 78 61 62 6c 65 20 62 79 20 61 20 73 69 6e  dexable by a sin
7df0: 67 6c 65 20 74 61 62 6c 65 20 54 2c 20 74 68 65  gle table T, the
7e00: 6e 20 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20  n set.**.**     
7e10: 57 68 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61  WhereTerm.eOpera
7e20: 74 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20  tor             
7e30: 20 3d 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20   =  WO_OR.**    
7e40: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72   WhereTerm.u.pOr
7e50: 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20  Info->indexable 
7e60: 20 7c 3d 20 20 74 68 65 20 63 75 72 73 6f 72 20   |=  the cursor 
7e70: 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65  number for table
7e80: 20 54 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65   T.**.** A subte
7e90: 72 6d 20 69 73 20 22 69 6e 64 65 78 61 62 6c 65  rm is "indexable
7ea0: 22 20 69 66 20 69 74 20 69 73 20 6f 66 20 74 68  " if it is of th
7eb0: 65 20 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c  e form.** "T.C <
7ec0: 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72  op> <expr>" wher
7ed0: 65 20 43 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d  e C is any colum
7ee0: 6e 20 6f 66 20 74 61 62 6c 65 20 54 20 61 6e 64  n of table T and
7ef0: 20 0a 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65   .** <op> is one
7f00: 20 6f 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c   of "=", "<", "<
7f10: 3d 22 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22  =", ">", ">=", "
7f20: 49 53 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e  IS NULL", or "IN
7f30: 22 2e 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20  "..** A subterm 
7f40: 69 73 20 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c  is also indexabl
7f50: 65 20 69 66 20 69 74 20 69 73 20 61 6e 20 41 4e  e if it is an AN
7f60: 44 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  D of two or more
7f70: 0a 2a 2a 20 73 75 62 73 75 62 74 65 72 6d 73 20  .** subsubterms 
7f80: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20  at least one of 
7f90: 77 68 69 63 68 20 69 73 20 69 6e 64 65 78 61 62  which is indexab
7fa0: 6c 65 2e 20 20 49 6e 64 65 78 61 62 6c 65 20 41  le.  Indexable A
7fb0: 4e 44 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20  ND .** subterms 
7fc0: 68 61 76 65 20 74 68 65 69 72 20 65 4f 70 65 72  have their eOper
7fd0: 61 74 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f 41  ator set to WO_A
7fe0: 4e 44 20 61 6e 64 20 74 68 65 79 20 68 61 76 65  ND and they have
7ff0: 0a 2a 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73  .** u.pAndInfo s
8000: 65 74 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61  et to a dynamica
8010: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68  lly allocated Wh
8020: 65 72 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63  ereAndTerm objec
8030: 74 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e  t..**.** From an
8040: 6f 74 68 65 72 20 70 6f 69 6e 74 20 6f 66 20 76  other point of v
8050: 69 65 77 2c 20 22 69 6e 64 65 78 61 62 6c 65 22  iew, "indexable"
8060: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
8070: 73 75 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a  subterm could.**
8080: 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20   potentially be 
8090: 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64  used with an ind
80a0: 65 78 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72  ex if an appropr
80b0: 69 61 74 65 20 69 6e 64 65 78 20 65 78 69 73 74  iate index exist
80c0: 73 2e 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79  s..** This analy
80d0: 73 69 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  sis does not con
80e0: 73 69 64 65 72 20 77 68 65 74 68 65 72 20 6f 72  sider whether or
80f0: 20 6e 6f 74 20 74 68 65 20 69 6e 64 65 78 20 65   not the index e
8100: 78 69 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69  xists; that.** i
8110: 73 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 65 20  s something the 
8120: 62 65 73 74 49 6e 64 65 78 28 29 20 72 6f 75 74  bestIndex() rout
8130: 69 6e 65 20 77 69 6c 6c 20 64 65 74 65 72 6d 69  ine will determi
8140: 6e 65 2e 20 20 54 68 69 73 20 61 6e 61 6c 79 73  ne.  This analys
8150: 69 73 0a 2a 2a 20 6f 6e 6c 79 20 6c 6f 6f 6b 73  is.** only looks
8160: 20 61 74 20 77 68 65 74 68 65 72 20 73 75 62 74   at whether subt
8170: 65 72 6d 73 20 61 70 70 72 6f 70 72 69 61 74 65  erms appropriate
8180: 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 65 78   for indexing ex
8190: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65  ist..**.** All e
81a0: 78 61 6d 70 6c 65 73 20 41 20 74 68 72 6f 75 67  xamples A throug
81b0: 68 20 45 20 61 62 6f 76 65 20 61 6c 6c 20 73 61  h E above all sa
81c0: 74 69 73 66 79 20 63 61 73 65 20 32 2e 20 20 42  tisfy case 2.  B
81d0: 75 74 20 69 66 20 61 20 74 65 72 6d 0a 2a 2a 20  ut if a term.** 
81e0: 61 6c 73 6f 20 73 74 61 74 69 73 66 69 65 73 20  also statisfies 
81f0: 63 61 73 65 20 31 20 28 73 75 63 68 20 61 73 20  case 1 (such as 
8200: 42 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  B) we know that 
8210: 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 77 69  the optimizer wi
8220: 6c 6c 0a 2a 2a 20 61 6c 77 61 79 73 20 70 72 65  ll.** always pre
8230: 66 65 72 20 63 61 73 65 20 31 2c 20 73 6f 20 69  fer case 1, so i
8240: 6e 20 74 68 61 74 20 63 61 73 65 20 77 65 20 70  n that case we p
8250: 72 65 74 65 6e 64 20 74 68 61 74 20 63 61 73 65  retend that case
8260: 20 32 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 61 74   2 is not.** sat
8270: 69 73 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74  isfied..**.** It
8280: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
8290: 73 65 20 74 68 61 74 20 6d 75 6c 74 69 70 6c 65  se that multiple
82a0: 20 74 61 62 6c 65 73 20 61 72 65 20 69 6e 64 65   tables are inde
82b0: 78 61 62 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d  xable.  For exam
82c0: 70 6c 65 2c 0a 2a 2a 20 28 45 29 20 61 62 6f 76  ple,.** (E) abov
82d0: 65 20 69 73 20 69 6e 64 65 78 61 62 6c 65 20 6f  e is indexable o
82e0: 6e 20 74 61 62 6c 65 73 20 50 2c 20 51 2c 20 61  n tables P, Q, a
82f0: 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d  nd R..**.** Term
8300: 73 20 74 68 61 74 20 73 61 74 69 73 66 79 20 63  s that satisfy c
8310: 61 73 65 20 32 20 61 72 65 20 63 61 6e 64 69 64  ase 2 are candid
8320: 61 74 65 73 20 66 6f 72 20 6c 6f 6f 6b 75 70 20  ates for lookup 
8330: 62 79 20 75 73 69 6e 67 0a 2a 2a 20 73 65 70 61  by using.** sepa
8340: 72 61 74 65 20 69 6e 64 69 63 65 73 20 74 6f 20  rate indices to 
8350: 66 69 6e 64 20 72 6f 77 69 64 73 20 66 6f 72 20  find rowids for 
8360: 65 61 63 68 20 73 75 62 74 65 72 6d 20 61 6e 64  each subterm and
8370: 20 63 6f 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74 68   composing.** th
8380: 65 20 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 72  e union of all r
8390: 6f 77 69 64 73 20 75 73 69 6e 67 20 61 20 52 6f  owids using a Ro
83a0: 77 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68  wSet object.  Th
83b0: 69 73 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a  is is similar.**
83c0: 20 74 6f 20 22 62 69 74 6d 61 70 20 69 6e 64 69   to "bitmap indi
83d0: 63 65 73 22 20 69 6e 20 6f 74 68 65 72 20 64 61  ces" in other da
83e0: 74 61 62 61 73 65 20 65 6e 67 69 6e 65 73 2e 0a  tabase engines..
83f0: 2a 2a 0a 2a 2a 20 4f 54 48 45 52 57 49 53 45 3a  **.** OTHERWISE:
8400: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65  .**.** If neithe
8410: 72 20 63 61 73 65 20 31 20 6e 6f 72 20 63 61 73  r case 1 nor cas
8420: 65 20 32 20 61 70 70 6c 79 2c 20 74 68 65 6e 20  e 2 apply, then 
8430: 6c 65 61 76 65 20 74 68 65 20 65 4f 70 65 72 61  leave the eOpera
8440: 74 6f 72 20 73 65 74 20 74 6f 0a 2a 2a 20 7a 65  tor set to.** ze
8450: 72 6f 2e 20 20 54 68 69 73 20 74 65 72 6d 20 69  ro.  This term i
8460: 73 20 6e 6f 74 20 75 73 65 66 75 6c 20 66 6f 72  s not useful for
8470: 20 73 65 61 72 63 68 2e 0a 2a 2f 0a 73 74 61 74   search..*/.stat
8480: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
8490: 79 7a 65 4f 72 54 65 72 6d 28 0a 20 20 53 72 63  yzeOrTerm(.  Src
84a0: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
84b0: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52         /* the FR
84c0: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  OM clause */.  W
84d0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
84e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
84f0: 63 6f 6d 70 6c 65 74 65 20 57 48 45 52 45 20 63  complete WHERE c
8500: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
8510: 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20 20  dxTerm          
8520: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
8530: 20 74 68 65 20 4f 52 2d 74 65 72 6d 20 74 6f 20   the OR-term to 
8540: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29  be analyzed */.)
8550: 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
8560: 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 3b  e = pWC->pParse;
8570: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
8580: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
8590: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
85a0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
85b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
85c0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
85d0: 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  n */.  WhereTerm
85e0: 20 2a 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e   *pTerm = &pWC->
85f0: 61 5b 69 64 78 54 65 72 6d 5d 3b 20 20 20 20 2f  a[idxTerm];    /
8600: 2a 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65  * The term to be
8610: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 45   analyzed */.  E
8620: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65  xpr *pExpr = pTe
8630: 72 6d 2d 3e 70 45 78 70 72 3b 20 20 20 20 20 20  rm->pExpr;      
8640: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
8650: 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20  pression of the 
8660: 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4d  term */.  WhereM
8670: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
8680: 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74   = pWC->pMaskSet
8690: 3b 20 2f 2a 20 54 61 62 6c 65 20 75 73 65 20 6d  ; /* Table use m
86a0: 61 73 6b 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  asks */.  int i;
86b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86d0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
86e0: 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  rs */.  WhereCla
86f0: 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 20  use *pOrWc;     
8700: 20 20 2f 2a 20 42 72 65 61 6b 75 70 20 6f 66 20    /* Breakup of 
8710: 70 54 65 72 6d 20 69 6e 74 6f 20 73 75 62 74 65  pTerm into subte
8720: 72 6d 73 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  rms */.  WhereTe
8730: 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 20 20 20 20  rm *pOrTerm;    
8740: 20 20 20 2f 2a 20 41 20 53 75 62 2d 74 65 72 6d     /* A Sub-term
8750: 20 77 69 74 68 69 6e 20 74 68 65 20 70 4f 72 57   within the pOrW
8760: 63 20 2a 2f 0a 20 20 57 68 65 72 65 4f 72 49 6e  c */.  WhereOrIn
8770: 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 20  fo *pOrInfo;    
8780: 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 69   /* Additional i
8790: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 73 73 6f 63  nformation assoc
87a0: 69 61 74 65 64 20 77 69 74 68 20 70 54 65 72 6d  iated with pTerm
87b0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 63 68   */.  Bitmask ch
87c0: 6e 67 54 6f 49 4e 3b 20 20 20 20 20 20 20 20 20  ngToIN;         
87d0: 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d  /* Tables that m
87e0: 69 67 68 74 20 73 61 74 69 73 66 79 20 63 61 73  ight satisfy cas
87f0: 65 20 31 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  e 1 */.  Bitmask
8800: 20 69 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20   indexable;     
8810: 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61     /* Tables tha
8820: 74 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2c  t are indexable,
8830: 20 73 61 74 69 73 66 79 69 6e 67 20 63 61 73 65   satisfying case
8840: 20 32 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a   2 */..  /*.  **
8850: 20 42 72 65 61 6b 20 74 68 65 20 4f 52 20 63 6c   Break the OR cl
8860: 61 75 73 65 20 69 6e 74 6f 20 69 74 73 20 73 65  ause into its se
8870: 70 61 72 61 74 65 20 73 75 62 74 65 72 6d 73 2e  parate subterms.
8880: 20 20 54 68 65 20 73 75 62 74 65 72 6d 73 20 61    The subterms a
8890: 72 65 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69  re.  ** stored i
88a0: 6e 20 61 20 57 68 65 72 65 43 6c 61 75 73 65 20  n a WhereClause 
88b0: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
88c0: 6e 69 6e 67 20 77 69 74 68 69 6e 20 74 68 65 20  ning within the 
88d0: 57 68 65 72 65 4f 72 49 6e 66 6f 0a 20 20 2a 2a  WhereOrInfo.  **
88e0: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20   object that is 
88f0: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
8900: 6f 72 69 67 69 6e 61 6c 20 4f 52 20 63 6c 61 75  original OR clau
8910: 73 65 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20  se term..  */.  
8920: 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
8930: 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
8940: 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 4f 52 49  DYNAMIC|TERM_ORI
8950: 4e 46 4f 7c 54 45 52 4d 5f 41 4e 44 49 4e 46 4f  NFO|TERM_ANDINFO
8960: 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ))==0 );.  asser
8970: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
8980: 5f 4f 52 20 29 3b 0a 20 20 70 54 65 72 6d 2d 3e  _OR );.  pTerm->
8990: 75 2e 70 4f 72 49 6e 66 6f 20 3d 20 70 4f 72 49  u.pOrInfo = pOrI
89a0: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
89b0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
89c0: 7a 65 6f 66 28 2a 70 4f 72 49 6e 66 6f 29 29 3b  zeof(*pOrInfo));
89d0: 0a 20 20 69 66 28 20 70 4f 72 49 6e 66 6f 3d 3d  .  if( pOrInfo==
89e0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54  0 ) return;.  pT
89f0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
8a00: 54 45 52 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20 70  TERM_ORINFO;.  p
8a10: 4f 72 57 63 20 3d 20 26 70 4f 72 49 6e 66 6f 2d  OrWc = &pOrInfo-
8a20: 3e 77 63 3b 0a 20 20 77 68 65 72 65 43 6c 61 75  >wc;.  whereClau
8a30: 73 65 49 6e 69 74 28 70 4f 72 57 63 2c 20 70 57  seInit(pOrWc, pW
8a40: 43 2d 3e 70 50 61 72 73 65 2c 20 70 4d 61 73 6b  C->pParse, pMask
8a50: 53 65 74 2c 20 70 57 43 2d 3e 77 63 74 72 6c 46  Set, pWC->wctrlF
8a60: 6c 61 67 73 29 3b 0a 20 20 77 68 65 72 65 53 70  lags);.  whereSp
8a70: 6c 69 74 28 70 4f 72 57 63 2c 20 70 45 78 70 72  lit(pOrWc, pExpr
8a80: 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20 65 78 70 72  , TK_OR);.  expr
8a90: 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c  AnalyzeAll(pSrc,
8aa0: 20 70 4f 72 57 63 29 3b 0a 20 20 69 66 28 20 64   pOrWc);.  if( d
8ab0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
8ac0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
8ad0: 72 74 28 20 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  rt( pOrWc->nTerm
8ae0: 3e 3d 32 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  >=2 );..  /*.  *
8af0: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 73 65  * Compute the se
8b00: 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74  t of tables that
8b10: 20 6d 69 67 68 74 20 73 61 74 69 73 66 79 20 63   might satisfy c
8b20: 61 73 65 73 20 31 20 6f 72 20 32 2e 0a 20 20 2a  ases 1 or 2..  *
8b30: 2f 0a 20 20 69 6e 64 65 78 61 62 6c 65 20 3d 20  /.  indexable = 
8b40: 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 63  ~(Bitmask)0;.  c
8b50: 68 6e 67 54 6f 49 4e 20 3d 20 7e 28 70 57 43 2d  hngToIN = ~(pWC-
8b60: 3e 76 6d 61 73 6b 29 3b 0a 20 20 66 6f 72 28 69  >vmask);.  for(i
8b70: 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c  =pOrWc->nTerm-1,
8b80: 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e   pOrTerm=pOrWc->
8b90: 61 3b 20 69 3e 3d 30 20 26 26 20 69 6e 64 65 78  a; i>=0 && index
8ba0: 61 62 6c 65 3b 20 69 2d 2d 2c 20 70 4f 72 54 65  able; i--, pOrTe
8bb0: 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28  rm++){.    if( (
8bc0: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
8bd0: 6f 72 20 26 20 57 4f 5f 53 49 4e 47 4c 45 29 3d  or & WO_SINGLE)=
8be0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  =0 ){.      Wher
8bf0: 65 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e  eAndInfo *pAndIn
8c00: 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  fo;.      assert
8c10: 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72  ( pOrTerm->eOper
8c20: 61 74 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ator==0 );.     
8c30: 20 61 73 73 65 72 74 28 20 28 70 4f 72 54 65 72   assert( (pOrTer
8c40: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
8c50: 52 4d 5f 41 4e 44 49 4e 46 4f 7c 54 45 52 4d 5f  RM_ANDINFO|TERM_
8c60: 4f 52 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20  ORINFO))==0 );. 
8c70: 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20       chngToIN = 
8c80: 30 3b 0a 20 20 20 20 20 20 70 41 6e 64 49 6e 66  0;.      pAndInf
8c90: 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
8ca0: 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
8cb0: 66 28 2a 70 41 6e 64 49 6e 66 6f 29 29 3b 0a 20  f(*pAndInfo));. 
8cc0: 20 20 20 20 20 69 66 28 20 70 41 6e 64 49 6e 66       if( pAndInf
8cd0: 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65  o ){.        Whe
8ce0: 72 65 43 6c 61 75 73 65 20 2a 70 41 6e 64 57 43  reClause *pAndWC
8cf0: 3b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 54  ;.        WhereT
8d00: 65 72 6d 20 2a 70 41 6e 64 54 65 72 6d 3b 0a 20  erm *pAndTerm;. 
8d10: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
8d20: 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20        Bitmask b 
8d30: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  = 0;.        pOr
8d40: 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f  Term->u.pAndInfo
8d50: 20 3d 20 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20   = pAndInfo;.   
8d60: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74       pOrTerm->wt
8d70: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 41 4e  Flags |= TERM_AN
8d80: 44 49 4e 46 4f 3b 0a 20 20 20 20 20 20 20 20 70  DINFO;.        p
8d90: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
8da0: 72 20 3d 20 57 4f 5f 41 4e 44 3b 0a 20 20 20 20  r = WO_AND;.    
8db0: 20 20 20 20 70 41 6e 64 57 43 20 3d 20 26 70 41      pAndWC = &pA
8dc0: 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20  ndInfo->wc;.    
8dd0: 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 49      whereClauseI
8de0: 6e 69 74 28 70 41 6e 64 57 43 2c 20 70 57 43 2d  nit(pAndWC, pWC-
8df0: 3e 70 50 61 72 73 65 2c 20 70 4d 61 73 6b 53 65  >pParse, pMaskSe
8e00: 74 2c 20 70 57 43 2d 3e 77 63 74 72 6c 46 6c 61  t, pWC->wctrlFla
8e10: 67 73 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65  gs);.        whe
8e20: 72 65 53 70 6c 69 74 28 70 41 6e 64 57 43 2c 20  reSplit(pAndWC, 
8e30: 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  pOrTerm->pExpr, 
8e40: 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 20 20 20  TK_AND);.       
8e50: 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28   exprAnalyzeAll(
8e60: 70 53 72 63 2c 20 70 41 6e 64 57 43 29 3b 0a 20  pSrc, pAndWC);. 
8e70: 20 20 20 20 20 20 20 70 41 6e 64 57 43 2d 3e 70         pAndWC->p
8e80: 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20  Outer = pWC;.   
8e90: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64       testcase( d
8ea0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
8eb0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
8ec0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8ed0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   ){.          fo
8ee0: 72 28 6a 3d 30 2c 20 70 41 6e 64 54 65 72 6d 3d  r(j=0, pAndTerm=
8ef0: 70 41 6e 64 57 43 2d 3e 61 3b 20 6a 3c 70 41 6e  pAndWC->a; j<pAn
8f00: 64 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c  dWC->nTerm; j++,
8f10: 20 70 41 6e 64 54 65 72 6d 2b 2b 29 7b 0a 20 20   pAndTerm++){.  
8f20: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
8f30: 28 20 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70  ( pAndTerm->pExp
8f40: 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r );.           
8f50: 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70   if( allowedOp(p
8f60: 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  AndTerm->pExpr->
8f70: 6f 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  op) ){.         
8f80: 20 20 20 20 20 62 20 7c 3d 20 67 65 74 4d 61 73       b |= getMas
8f90: 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 41 6e 64  k(pMaskSet, pAnd
8fa0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
8fb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
8fc0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
8fd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
8fe0: 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20  ndexable &= b;. 
8ff0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
9000: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74   if( pOrTerm->wt
9010: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50  Flags & TERM_COP
9020: 49 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  IED ){.      /* 
9030: 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d 20 66  Skip this term f
9040: 6f 72 20 6e 6f 77 2e 20 20 57 65 20 72 65 76 69  or now.  We revi
9050: 73 69 74 20 69 74 20 77 68 65 6e 20 77 65 20 70  sit it when we p
9060: 72 6f 63 65 73 73 20 74 68 65 0a 20 20 20 20 20  rocess the.     
9070: 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e   ** correspondin
9080: 67 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 74  g TERM_VIRTUAL t
9090: 65 72 6d 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  erm */.    }else
90a0: 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
90b0: 62 3b 0a 20 20 20 20 20 20 62 20 3d 20 67 65 74  b;.      b = get
90c0: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
90d0: 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
90e0: 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  or);.      if( p
90f0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
9100: 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
9110: 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 54  {.        WhereT
9120: 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70  erm *pOther = &p
9130: 4f 72 57 63 2d 3e 61 5b 70 4f 72 54 65 72 6d 2d  OrWc->a[pOrTerm-
9140: 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20  >iParent];.     
9150: 20 20 20 62 20 7c 3d 20 67 65 74 4d 61 73 6b 28     b |= getMask(
9160: 70 4d 61 73 6b 53 65 74 2c 20 70 4f 74 68 65 72  pMaskSet, pOther
9170: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20  ->leftCursor);. 
9180: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 64       }.      ind
9190: 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20 20  exable &= b;.   
91a0: 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
91b0: 65 4f 70 65 72 61 74 6f 72 21 3d 57 4f 5f 45 51  eOperator!=WO_EQ
91c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67   ){.        chng
91d0: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20  ToIN = 0;.      
91e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
91f0: 68 6e 67 54 6f 49 4e 20 26 3d 20 62 3b 0a 20 20  hngToIN &= b;.  
9200: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9210: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 63 6f 72  .  /*.  ** Recor
9220: 64 20 74 68 65 20 73 65 74 20 6f 66 20 74 61 62  d the set of tab
9230: 6c 65 73 20 74 68 61 74 20 73 61 74 69 73 66 79  les that satisfy
9240: 20 63 61 73 65 20 32 2e 20 20 54 68 65 20 73 65   case 2.  The se
9250: 74 20 6d 69 67 68 74 20 62 65 0a 20 20 2a 2a 20  t might be.  ** 
9260: 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 70 4f  empty..  */.  pO
9270: 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65  rInfo->indexable
9280: 20 3d 20 69 6e 64 65 78 61 62 6c 65 3b 0a 20 20   = indexable;.  
9290: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
92a0: 20 3d 20 69 6e 64 65 78 61 62 6c 65 3d 3d 30 20   = indexable==0 
92b0: 3f 20 30 20 3a 20 57 4f 5f 4f 52 3b 0a 0a 20 20  ? 0 : WO_OR;..  
92c0: 2f 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e  /*.  ** chngToIN
92d0: 20 68 6f 6c 64 73 20 61 20 73 65 74 20 6f 66 20   holds a set of 
92e0: 74 61 62 6c 65 73 20 74 68 61 74 20 2a 6d 69 67  tables that *mig
92f0: 68 74 2a 20 73 61 74 69 73 66 79 20 63 61 73 65  ht* satisfy case
9300: 20 31 2e 20 20 42 75 74 0a 20 20 2a 2a 20 77 65   1.  But.  ** we
9310: 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65   have to do some
9320: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 68 65 63   additional chec
9330: 6b 69 6e 67 20 74 6f 20 73 65 65 20 69 66 20 63  king to see if c
9340: 61 73 65 20 31 20 72 65 61 6c 6c 79 0a 20 20 2a  ase 1 really.  *
9350: 2a 20 69 73 20 73 61 74 69 73 66 69 65 64 2e 0a  * is satisfied..
9360: 20 20 2a 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f    **.  ** chngTo
9370: 49 4e 20 77 69 6c 6c 20 68 6f 6c 64 20 65 69 74  IN will hold eit
9380: 68 65 72 20 30 2c 20 31 2c 20 6f 72 20 32 20 62  her 0, 1, or 2 b
9390: 69 74 73 2e 20 20 54 68 65 20 30 2d 62 69 74 20  its.  The 0-bit 
93a0: 63 61 73 65 20 6d 65 61 6e 73 0a 20 20 2a 2a 20  case means.  ** 
93b0: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
93c0: 20 70 6f 73 73 69 62 69 6c 69 74 79 20 6f 66 20   possibility of 
93d0: 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65  transforming the
93e0: 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20   OR clause into 
93f0: 61 6e 0a 20 20 2a 2a 20 49 4e 20 6f 70 65 72 61  an.  ** IN opera
9400: 74 6f 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20  tor because one 
9410: 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 69 6e  or more terms in
9420: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 63   the OR clause c
9430: 6f 6e 74 61 69 6e 0a 20 20 2a 2a 20 73 6f 6d 65  ontain.  ** some
9440: 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
9450: 20 3d 3d 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20   == on a column 
9460: 69 6e 20 74 68 65 20 73 69 6e 67 6c 65 20 74 61  in the single ta
9470: 62 6c 65 2e 20 20 54 68 65 20 31 2d 62 69 74 0a  ble.  The 1-bit.
9480: 20 20 2a 2a 20 63 61 73 65 20 6d 65 61 6e 73 20    ** case means 
9490: 74 68 61 74 20 65 76 65 72 79 20 74 65 72 6d 20  that every term 
94a0: 6f 66 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  of the OR clause
94b0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a   is of the form.
94c0: 20 20 2a 2a 20 22 74 61 62 6c 65 2e 63 6f 6c 75    ** "table.colu
94d0: 6d 6e 3d 65 78 70 72 22 20 66 6f 72 20 73 6f 6d  mn=expr" for som
94e0: 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20  e single table. 
94f0: 20 54 68 65 20 6f 6e 65 20 62 69 74 20 74 68 61   The one bit tha
9500: 74 20 69 73 20 73 65 74 0a 20 20 2a 2a 20 77 69  t is set.  ** wi
9510: 6c 6c 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ll correspond to
9520: 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c   the common tabl
9530: 65 2e 20 20 57 65 20 73 74 69 6c 6c 20 6e 65 65  e.  We still nee
9540: 64 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 6d 61  d to check to ma
9550: 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 74 68 65  ke.  ** sure the
9560: 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 73 20   same column is 
9570: 75 73 65 64 20 6f 6e 20 61 6c 6c 20 74 65 72 6d  used on all term
9580: 73 2e 20 20 54 68 65 20 32 2d 62 69 74 20 63 61  s.  The 2-bit ca
9590: 73 65 20 69 73 20 77 68 65 6e 0a 20 20 2a 2a 20  se is when.  ** 
95a0: 74 68 65 20 61 6c 6c 20 74 65 72 6d 73 20 61 72  the all terms ar
95b0: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 74  e of the form "t
95c0: 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 3d 74 61 62  able1.column=tab
95d0: 6c 65 32 2e 63 6f 6c 75 6d 6e 22 2e 20 20 49 74  le2.column".  It
95e0: 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 70  .  ** might be p
95f0: 6f 73 73 69 62 6c 65 20 74 6f 20 66 6f 72 6d 20  ossible to form 
9600: 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77  an IN operator w
9610: 69 74 68 20 65 69 74 68 65 72 20 74 61 62 6c 65  ith either table
9620: 31 2e 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 72  1.column.  ** or
9630: 20 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 20 61   table2.column a
9640: 73 20 74 68 65 20 4c 48 53 20 69 66 20 65 69 74  s the LHS if eit
9650: 68 65 72 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f  her is common to
9660: 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 0a 20   every term of. 
9670: 20 2a 2a 20 74 68 65 20 4f 52 20 63 6c 61 75 73   ** the OR claus
9680: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74  e..  **.  ** Not
9690: 65 20 74 68 61 74 20 74 65 72 6d 73 20 6f 66 20  e that terms of 
96a0: 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 2e  the form "table.
96b0: 63 6f 6c 75 6d 6e 31 3d 74 61 62 6c 65 2e 63 6f  column1=table.co
96c0: 6c 75 6d 6e 32 22 20 28 74 68 65 0a 20 20 2a 2a  lumn2" (the.  **
96d0: 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 6e 20 62   same table on b
96e0: 6f 74 68 20 73 69 7a 65 73 20 6f 66 20 74 68 65  oth sizes of the
96f0: 20 3d 3d 29 20 63 61 6e 6e 6f 74 20 62 65 20 6f   ==) cannot be o
9700: 70 74 69 6d 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  ptimized..  */. 
9710: 20 69 66 28 20 63 68 6e 67 54 6f 49 4e 20 29 7b   if( chngToIN ){
9720: 0a 20 20 20 20 69 6e 74 20 6f 6b 54 6f 43 68 6e  .    int okToChn
9730: 67 54 6f 49 4e 20 3d 20 30 3b 20 20 20 20 20 2f  gToIN = 0;     /
9740: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 63 6f  * True if the co
9750: 6e 76 65 72 73 69 6f 6e 20 74 6f 20 49 4e 20 69  nversion to IN i
9760: 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 20 20 69  s valid */.    i
9770: 6e 74 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  nt iColumn = -1;
9780: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
9790: 6d 6e 20 69 6e 64 65 78 20 6f 6e 20 6c 68 73 20  mn index on lhs 
97a0: 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  of IN operator *
97b0: 2f 0a 20 20 20 20 69 6e 74 20 69 43 75 72 73 6f  /.    int iCurso
97c0: 72 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  r = -1;         
97d0: 2f 2a 20 54 61 62 6c 65 20 63 75 72 73 6f 72 20  /* Table cursor 
97e0: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 74 65  common to all te
97f0: 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a  rms */.    int j
9800: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
9810: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
9820: 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  nter */..    /* 
9830: 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 61 62  Search for a tab
9840: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 74 68  le and column th
9850: 61 74 20 61 70 70 65 61 72 73 20 6f 6e 20 6f 6e  at appears on on
9860: 65 20 73 69 64 65 20 6f 72 20 74 68 65 0a 20 20  e side or the.  
9870: 20 20 2a 2a 20 6f 74 68 65 72 20 6f 66 20 74 68    ** other of th
9880: 65 20 3d 3d 20 6f 70 65 72 61 74 6f 72 20 69 6e  e == operator in
9890: 20 65 76 65 72 79 20 73 75 62 74 65 72 6d 2e 20   every subterm. 
98a0: 20 54 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20   That table and 
98b0: 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2a 20 77 69  column.    ** wi
98c0: 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20 69  ll be recorded i
98d0: 6e 20 69 43 75 72 73 6f 72 20 61 6e 64 20 69 43  n iCursor and iC
98e0: 6f 6c 75 6d 6e 2e 20 20 54 68 65 72 65 20 6d 69  olumn.  There mi
98f0: 67 68 74 20 6e 6f 74 20 62 65 20 61 6e 79 0a 20  ght not be any. 
9900: 20 20 20 2a 2a 20 73 75 63 68 20 74 61 62 6c 65     ** such table
9910: 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 53 65   and column.  Se
9920: 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69  t okToChngToIN i
9930: 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  f an appropriate
9940: 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 61 6e   table.    ** an
9950: 64 20 63 6f 6c 75 6d 6e 20 69 73 20 66 6f 75 6e  d column is foun
9960: 64 20 62 75 74 20 6c 65 61 76 65 20 6f 6b 54 6f  d but leave okTo
9970: 43 68 6e 67 54 6f 49 4e 20 66 61 6c 73 65 20 69  ChngToIN false i
9980: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 20  f not found..   
9990: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   */.    for(j=0;
99a0: 20 6a 3c 32 20 26 26 20 21 6f 6b 54 6f 43 68 6e   j<2 && !okToChn
99b0: 67 54 6f 49 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  gToIN; j++){.   
99c0: 20 20 20 70 4f 72 54 65 72 6d 20 3d 20 70 4f 72     pOrTerm = pOr
99d0: 57 63 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72  Wc->a;.      for
99e0: 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d  (i=pOrWc->nTerm-
99f0: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f  1; i>=0; i--, pO
9a00: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
9a10: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
9a20: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
9a30: 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 70  _EQ );.        p
9a40: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
9a50: 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a  &= ~TERM_OR_OK;.
9a60: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 54          if( pOrT
9a70: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
9a80: 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  =iCursor ){.    
9a90: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73        /* This is
9aa0: 20 74 68 65 20 32 2d 62 69 74 20 63 61 73 65 20   the 2-bit case 
9ab0: 61 6e 64 20 77 65 20 61 72 65 20 6f 6e 20 74 68  and we are on th
9ac0: 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69  e second iterati
9ad0: 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  on and.         
9ae0: 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 65 72 6d   ** current term
9af0: 20 69 73 20 66 72 6f 6d 20 74 68 65 20 66 69 72   is from the fir
9b00: 73 74 20 69 74 65 72 61 74 69 6f 6e 2e 20 20 53  st iteration.  S
9b10: 6f 20 73 6b 69 70 20 74 68 69 73 20 74 65 72 6d  o skip this term
9b20: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  . */.          a
9b30: 73 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20  ssert( j==1 );. 
9b40: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
9b50: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
9b60: 20 20 20 20 20 69 66 28 20 28 63 68 6e 67 54 6f       if( (chngTo
9b70: 49 4e 20 26 20 67 65 74 4d 61 73 6b 28 70 4d 61  IN & getMask(pMa
9b80: 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e  skSet, pOrTerm->
9b90: 6c 65 66 74 43 75 72 73 6f 72 29 29 3d 3d 30 20  leftCursor))==0 
9ba0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
9bb0: 54 68 69 73 20 74 65 72 6d 20 6d 75 73 74 20 62  This term must b
9bc0: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 74 31  e of the form t1
9bd0: 2e 61 3d 3d 74 32 2e 62 20 77 68 65 72 65 20 74  .a==t2.b where t
9be0: 32 20 69 73 20 69 6e 20 74 68 65 0a 20 20 20 20  2 is in the.    
9bf0: 20 20 20 20 20 20 2a 2a 20 63 68 6e 67 54 6f 49        ** chngToI
9c00: 4e 20 73 65 74 20 62 75 74 20 74 31 20 69 73 20  N set but t1 is 
9c10: 6e 6f 74 2e 20 20 54 68 69 73 20 74 65 72 6d 20  not.  This term 
9c20: 77 69 6c 6c 20 62 65 20 65 69 74 68 65 72 20 70  will be either p
9c30: 72 65 63 65 65 64 65 64 0a 20 20 20 20 20 20 20  receeded.       
9c40: 20 20 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77 65 64     ** or follwed
9c50: 20 62 79 20 61 6e 20 69 6e 76 65 72 74 65 64 20   by an inverted 
9c60: 63 6f 70 79 20 28 74 32 2e 62 3d 3d 74 31 2e 61  copy (t2.b==t1.a
9c70: 29 2e 20 20 53 6b 69 70 20 74 68 69 73 20 74 65  ).  Skip this te
9c80: 72 6d 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  rm .          **
9c90: 20 61 6e 64 20 75 73 65 20 69 74 73 20 69 6e 76   and use its inv
9ca0: 65 72 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  ersion. */.     
9cb0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
9cc0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
9cd0: 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 3b  & TERM_COPIED );
9ce0: 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
9cf0: 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74  ase( pOrTerm->wt
9d00: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
9d10: 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 20 20  TUAL );.        
9d20: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
9d30: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
9d40: 52 4d 5f 43 4f 50 49 45 44 7c 54 45 52 4d 5f 56  RM_COPIED|TERM_V
9d50: 49 52 54 55 41 4c 29 20 29 3b 0a 20 20 20 20 20  IRTUAL) );.     
9d60: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
9d70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9d80: 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72 54 65   iColumn = pOrTe
9d90: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
9da0: 3b 0a 20 20 20 20 20 20 20 20 69 43 75 72 73 6f  ;.        iCurso
9db0: 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  r = pOrTerm->lef
9dc0: 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20  tCursor;.       
9dd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
9de0: 20 20 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b        if( i<0 ){
9df0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63  .        /* No c
9e00: 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65 2b 63  andidate table+c
9e10: 6f 6c 75 6d 6e 20 77 61 73 20 66 6f 75 6e 64 2e  olumn was found.
9e20: 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20    This can only 
9e30: 6f 63 63 75 72 0a 20 20 20 20 20 20 20 20 2a 2a  occur.        **
9e40: 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69   on the second i
9e50: 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  teration */.    
9e60: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31      assert( j==1
9e70: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
9e80: 72 74 28 20 28 63 68 6e 67 54 6f 49 4e 26 28 63  rt( (chngToIN&(c
9e90: 68 6e 67 54 6f 49 4e 2d 31 29 29 3d 3d 30 20 29  hngToIN-1))==0 )
9ea0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
9eb0: 28 20 63 68 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d  ( chngToIN==getM
9ec0: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 69 43  ask(pMaskSet, iC
9ed0: 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20  ursor) );.      
9ee0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
9ef0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
9f00: 20 6a 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20   j==1 );..      
9f10: 2f 2a 20 57 65 20 68 61 76 65 20 66 6f 75 6e 64  /* We have found
9f20: 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 61 62   a candidate tab
9f30: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20  le and column.  
9f40: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
9f50: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 74 61  that.      ** ta
9f60: 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69  ble and column i
9f70: 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72  s common to ever
9f80: 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20 4f 52  y term in the OR
9f90: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
9fa0: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20   okToChngToIN = 
9fb0: 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 69  1;.      for(; i
9fc0: 3e 3d 30 20 26 26 20 6f 6b 54 6f 43 68 6e 67 54  >=0 && okToChngT
9fd0: 6f 49 4e 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72  oIN; i--, pOrTer
9fe0: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  m++){.        as
9ff0: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65  sert( pOrTerm->e
a000: 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20  Operator==WO_EQ 
a010: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
a020: 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
a030: 6f 72 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20  or!=iCursor ){. 
a040: 20 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d           pOrTerm
a050: 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45  ->wtFlags &= ~TE
a060: 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20  RM_OR_OK;.      
a070: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54    }else if( pOrT
a080: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
a090: 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  n!=iColumn ){.  
a0a0: 20 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67          okToChng
a0b0: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20  ToIN = 0;.      
a0c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a0d0: 20 20 20 69 6e 74 20 61 66 66 4c 65 66 74 2c 20     int affLeft, 
a0e0: 61 66 66 52 69 67 68 74 3b 0a 20 20 20 20 20 20  affRight;.      
a0f0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 69      /* If the ri
a100: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
a110: 20 61 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20   also a column, 
a120: 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74  then the affinit
a130: 69 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ies.          **
a140: 20 6f 66 20 62 6f 74 68 20 72 69 67 68 74 20 61   of both right a
a150: 6e 64 20 6c 65 66 74 20 73 69 64 65 73 20 6d 75  nd left sides mu
a160: 73 74 20 62 65 20 73 75 63 68 20 74 68 61 74 20  st be such that 
a170: 6e 6f 20 74 79 70 65 0a 20 20 20 20 20 20 20 20  no type.        
a180: 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73    ** conversions
a190: 20 61 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e   are required on
a1a0: 20 74 68 65 20 72 69 67 68 74 2e 20 20 28 54 69   the right.  (Ti
a1b0: 63 6b 65 74 20 23 32 32 34 39 29 0a 20 20 20 20  cket #2249).    
a1c0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
a1d0: 20 20 20 61 66 66 52 69 67 68 74 20 3d 20 73 71     affRight = sq
a1e0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
a1f0: 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  y(pOrTerm->pExpr
a200: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
a210: 20 20 20 20 20 61 66 66 4c 65 66 74 20 3d 20 73       affLeft = s
a220: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
a230: 74 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70  ty(pOrTerm->pExp
a240: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
a250: 20 20 20 20 20 69 66 28 20 61 66 66 52 69 67 68       if( affRigh
a260: 74 21 3d 30 20 26 26 20 61 66 66 52 69 67 68 74  t!=0 && affRight
a270: 21 3d 61 66 66 4c 65 66 74 20 29 7b 0a 20 20 20  !=affLeft ){.   
a280: 20 20 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e           okToChn
a290: 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20  gToIN = 0;.     
a2a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a2b0: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
a2c0: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
a2d0: 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  _OR_OK;.        
a2e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
a2f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
a300: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
a310: 74 2c 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  t, okToChngToIN 
a320: 69 73 20 74 72 75 65 20 69 66 20 6f 72 69 67 69  is true if origi
a330: 6e 61 6c 20 70 54 65 72 6d 20 73 61 74 69 73 66  nal pTerm satisf
a340: 69 65 73 0a 20 20 20 20 2a 2a 20 63 61 73 65 20  ies.    ** case 
a350: 31 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  1.  In that case
a360: 2c 20 63 6f 6e 73 74 72 75 63 74 20 61 20 6e 65  , construct a ne
a370: 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 74  w virtual term t
a380: 68 61 74 20 69 73 20 0a 20 20 20 20 2a 2a 20 70  hat is .    ** p
a390: 54 65 72 6d 20 63 6f 6e 76 65 72 74 65 64 20 69  Term converted i
a3a0: 6e 74 6f 20 61 6e 20 49 4e 20 6f 70 65 72 61 74  nto an IN operat
a3b0: 6f 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  or..    **.    *
a3c0: 2a 20 45 56 3a 20 52 2d 30 30 32 31 31 2d 31 35  * EV: R-00211-15
a3d0: 31 30 30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  100.    */.    i
a3e0: 66 28 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  f( okToChngToIN 
a3f0: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
a400: 44 75 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Dup;            
a410: 2f 2a 20 41 20 74 72 61 6e 73 69 65 6e 74 20 64  /* A transient d
a420: 75 70 6c 69 63 61 74 65 20 65 78 70 72 65 73 73  uplicate express
a430: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
a440: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 30  rList *pList = 0
a450: 3b 20 20 20 2f 2a 20 54 68 65 20 52 48 53 20 6f  ;   /* The RHS o
a460: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
a470: 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  r */.      Expr 
a480: 2a 70 4c 65 66 74 20 3d 20 30 3b 20 20 20 20 20  *pLeft = 0;     
a490: 20 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20    /* The LHS of 
a4a0: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
a4b0: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
a4c0: 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
a4d0: 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20  /* The complete 
a4e0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 0a  IN operator */..
a4f0: 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57        for(i=pOrW
a500: 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54  c->nTerm-1, pOrT
a510: 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e  erm=pOrWc->a; i>
a520: 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  =0; i--, pOrTerm
a530: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
a540: 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61   (pOrTerm->wtFla
a550: 67 73 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29  gs & TERM_OR_OK)
a560: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
a570: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a580: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
a590: 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20  or==WO_EQ );.   
a5a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
a5b0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
a5c0: 3d 3d 69 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ==iCursor );.   
a5d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
a5e0: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
a5f0: 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20  mn==iColumn );. 
a600: 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71         pDup = sq
a610: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
a620: 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d   pOrTerm->pExpr-
a630: 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20  >pRight, 0);.   
a640: 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c       pList = sql
a650: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
a660: 6e 64 28 70 57 43 2d 3e 70 50 61 72 73 65 2c 20  nd(pWC->pParse, 
a670: 70 4c 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20  pList, pDup);.  
a680: 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4f        pLeft = pO
a690: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c  rTerm->pExpr->pL
a6a0: 65 66 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eft;.      }.   
a6b0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74     assert( pLeft
a6c0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44 75  !=0 );.      pDu
a6d0: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
a6e0: 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29  up(db, pLeft, 0)
a6f0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73  ;.      pNew = s
a700: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
a710: 73 65 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c  se, TK_IN, pDup,
a720: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
a730: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
a740: 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20    int idxNew;.  
a750: 20 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f        transferJo
a760: 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c  inMarkings(pNew,
a770: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
a780: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
a790: 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  sProperty(pNew, 
a7a0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
a7b0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78  .        pNew->x
a7c0: 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a  .pList = pList;.
a7d0: 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d          idxNew =
a7e0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
a7f0: 72 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45  rt(pWC, pNew, TE
a800: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
a810: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
a820: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
a830: 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ew==0 );.       
a840: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
a850: 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b  c, pWC, idxNew);
a860: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
a870: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
a880: 5d 3b 0a 20 20 20 20 20 20 20 20 70 57 43 2d 3e  ];.        pWC->
a890: 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e  a[idxNew].iParen
a8a0: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
a8b0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69       pTerm->nChi
a8c0: 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  ld = 1;.      }e
a8d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
a8e0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
a8f0: 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
a900: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 65       }.      pTe
a910: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
a920: 57 4f 5f 4e 4f 4f 50 3b 20 20 2f 2a 20 63 61 73  WO_NOOP;  /* cas
a930: 65 20 31 20 74 72 75 6d 70 73 20 63 61 73 65 20  e 1 trumps case 
a940: 32 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  2 */.    }.  }.}
a950: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
a960: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
a970: 49 5a 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49  IZATION && !SQLI
a980: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
a990: 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   */.../*.** The 
a9a0: 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f  input to this ro
a9b0: 75 74 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72  utine is an Wher
a9c0: 65 54 65 72 6d 20 73 74 72 75 63 74 75 72 65 20  eTerm structure 
a9d0: 77 69 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a  with only the.**
a9e0: 20 22 70 45 78 70 72 22 20 66 69 65 6c 64 20 66   "pExpr" field f
a9f0: 69 6c 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a  illed in.  The j
aa00: 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ob of this routi
aa10: 6e 65 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65  ne is to analyze
aa20: 20 74 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65   the.** subexpre
aa30: 73 73 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61  ssion and popula
aa40: 74 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72  te all the other
aa50: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57   fields of the W
aa60: 68 65 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75  hereTerm.** stru
aa70: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
aa80: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
aa90: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c  s of the form "<
aaa0: 65 78 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74  expr> <op> X" it
aab0: 20 67 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a   gets commuted.*
aac0: 2a 20 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72  * to the standar
aad0: 64 20 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70  d form of "X <op
aae0: 3e 20 3c 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a  > <expr>"..**.**
aaf0: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
ab00: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
ab10: 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65  m "X <op> Y" whe
ab20: 72 65 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20  re both X and Y 
ab30: 61 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20  are.** columns, 
ab40: 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  then the origina
ab50: 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  l expression is 
ab60: 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20  unchanged and a 
ab70: 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74  new virtual.** t
ab80: 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  erm of the form 
ab90: 22 59 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64  "Y <op> X" is ad
aba0: 64 65 64 20 74 6f 20 74 68 65 20 57 48 45 52 45  ded to the WHERE
abb0: 20 63 6c 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61   clause and.** a
abc0: 6e 61 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65  nalyzed separate
abd0: 6c 79 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61  ly.  The origina
abe0: 6c 20 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64  l term is marked
abf0: 20 77 69 74 68 20 54 45 52 4d 5f 43 4f 50 49 45   with TERM_COPIE
ac00: 44 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77  D.** and the new
ac10: 20 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20   term is marked 
ac20: 77 69 74 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49  with TERM_DYNAMI
ac30: 43 20 28 62 65 63 61 75 73 65 20 69 74 27 73 20  C (because it's 
ac40: 70 45 78 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74  pExpr.** needs t
ac50: 6f 20 62 65 20 66 72 65 65 64 20 77 69 74 68 20  o be freed with 
ac60: 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 29  the WhereClause)
ac70: 20 61 6e 64 20 54 45 52 4d 5f 56 49 52 54 55 41   and TERM_VIRTUA
ac80: 4c 20 28 62 65 63 61 75 73 65 20 69 74 0a 2a 2a  L (because it.**
ac90: 20 69 73 20 61 20 63 6f 6d 6d 75 74 65 64 20 63   is a commuted c
aca0: 6f 70 79 20 6f 66 20 61 20 70 72 69 6f 72 20 74  opy of a prior t
acb0: 65 72 6d 2e 29 20 20 54 68 65 20 6f 72 69 67 69  erm.)  The origi
acc0: 6e 61 6c 20 74 65 72 6d 20 68 61 73 20 6e 43 68  nal term has nCh
acd0: 69 6c 64 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65  ild=1.** and the
ace0: 20 63 6f 70 79 20 68 61 73 20 69 64 78 50 61 72   copy has idxPar
acf0: 65 6e 74 20 73 65 74 20 74 6f 20 74 68 65 20 69  ent set to the i
ad00: 6e 64 65 78 20 6f 66 20 74 68 65 20 6f 72 69 67  ndex of the orig
ad10: 69 6e 61 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74  inal term..*/.st
ad20: 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e  atic void exprAn
ad30: 61 6c 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74  alyze(.  SrcList
ad40: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20   *pSrc,         
ad50: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
ad60: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
ad70: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
ad80: 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52       /* the WHER
ad90: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  E clause */.  in
ada0: 74 20 69 64 78 54 65 72 6d 20 20 20 20 20 20 20  t idxTerm       
adb0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
adc0: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 74 6f 20   of the term to 
add0: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29  be analyzed */.)
ade0: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
adf0: 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
ae00: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d       /* The term
ae10: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
ae20: 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
ae30: 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20  t *pMaskSet;    
ae40: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20        /* Set of 
ae50: 74 61 62 6c 65 20 69 6e 64 65 78 20 6d 61 73 6b  table index mask
ae60: 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  s */.  Expr *pEx
ae70: 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
ae80: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
ae90: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
aea0: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42 69  analyzed */.  Bi
aeb0: 74 6d 61 73 6b 20 70 72 65 72 65 71 4c 65 66 74  tmask prereqLeft
aec0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
aed0: 2a 20 50 72 65 72 65 71 75 65 73 69 74 65 73 20  * Prerequesites 
aee0: 6f 66 20 74 68 65 20 70 45 78 70 72 2d 3e 70 4c  of the pExpr->pL
aef0: 65 66 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  eft */.  Bitmask
af00: 20 70 72 65 72 65 71 41 6c 6c 3b 20 20 20 20 20   prereqAll;     
af10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
af20: 72 65 71 75 65 73 69 74 65 73 20 6f 66 20 70 45  requesites of pE
af30: 78 70 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  xpr */.  Bitmask
af40: 20 65 78 74 72 61 52 69 67 68 74 20 3d 20 30 3b   extraRight = 0;
af50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
af60: 72 61 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  ra dependencies 
af70: 6f 6e 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a  on LEFT JOIN */.
af80: 20 20 45 78 70 72 20 2a 70 53 74 72 31 20 3d 20    Expr *pStr1 = 
af90: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
afa0: 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b     /* RHS of LIK
afb0: 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20  E/GLOB operator 
afc0: 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c  */.  int isCompl
afd0: 65 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ete = 0;        
afe0: 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20        /* RHS of 
aff0: 4c 49 4b 45 2f 47 4c 4f 42 20 65 6e 64 73 20 77  LIKE/GLOB ends w
b000: 69 74 68 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a  ith wildcard */.
b010: 20 20 69 6e 74 20 6e 6f 43 61 73 65 20 3d 20 30    int noCase = 0
b020: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b030: 20 20 20 2f 2a 20 4c 49 4b 45 2f 47 4c 4f 42 20     /* LIKE/GLOB 
b040: 64 69 73 74 69 6e 67 75 69 73 68 65 73 20 63 61  distinguishes ca
b050: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20  se */.  int op; 
b060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b070: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 2d           /* Top-
b080: 6c 65 76 65 6c 20 6f 70 65 72 61 74 6f 72 2e 20  level operator. 
b090: 20 70 45 78 70 72 2d 3e 6f 70 20 2a 2f 0a 20 20   pExpr->op */.  
b0a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
b0b0: 70 57 43 2d 3e 70 50 61 72 73 65 3b 20 20 20 20  pWC->pParse;    
b0c0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
b0d0: 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
b0e0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
b0f0: 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  b;        /* Dat
b100: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
b110: 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d   */..  if( db->m
b120: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
b130: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
b140: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
b150: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 70 4d 61  [idxTerm];.  pMa
b160: 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61  skSet = pWC->pMa
b170: 73 6b 53 65 74 3b 0a 20 20 70 45 78 70 72 20 3d  skSet;.  pExpr =
b180: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
b190: 20 70 72 65 72 65 71 4c 65 66 74 20 3d 20 65 78   prereqLeft = ex
b1a0: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
b1b0: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c  skSet, pExpr->pL
b1c0: 65 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70 45 78  eft);.  op = pEx
b1d0: 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70  pr->op;.  if( op
b1e0: 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61  ==TK_IN ){.    a
b1f0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52  ssert( pExpr->pR
b200: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69  ight==0 );.    i
b210: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
b220: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
b230: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
b240: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
b250: 67 68 74 20 3d 20 65 78 70 72 53 65 6c 65 63 74  ght = exprSelect
b260: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
b270: 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53  Set, pExpr->x.pS
b280: 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73  elect);.    }els
b290: 65 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  e{.      pTerm->
b2a0: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78  prereqRight = ex
b2b0: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
b2c0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
b2d0: 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
b2e0: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  }.  }else if( op
b2f0: 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  ==TK_ISNULL ){. 
b300: 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71     pTerm->prereq
b310: 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  Right = 0;.  }el
b320: 73 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70  se{.    pTerm->p
b330: 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70  rereqRight = exp
b340: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
b350: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  kSet, pExpr->pRi
b360: 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72  ght);.  }.  prer
b370: 65 71 41 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c  eqAll = exprTabl
b380: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
b390: 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 45   pExpr);.  if( E
b3a0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
b3b0: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
b3c0: 6e 29 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73  n) ){.    Bitmas
b3d0: 6b 20 78 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d  k x = getMask(pM
b3e0: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 69  askSet, pExpr->i
b3f0: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b  RightJoinTable);
b400: 0a 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20 7c  .    prereqAll |
b410: 3d 20 78 3b 0a 20 20 20 20 65 78 74 72 61 52 69  = x;.    extraRi
b420: 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f  ght = x-1;  /* O
b430: 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d  N clause terms m
b440: 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77  ay not be used w
b450: 69 74 68 20 61 6e 20 69 6e 64 65 78 0a 20 20 20  ith an index.   
b460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b470: 20 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 74      ** on left t
b480: 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  able of a LEFT J
b490: 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20 23 33 30  OIN.  Ticket #30
b4a0: 31 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 65 72  15 */.  }.  pTer
b4b0: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70  m->prereqAll = p
b4c0: 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72  rereqAll;.  pTer
b4d0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  m->leftCursor = 
b4e0: 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61  -1;.  pTerm->iPa
b4f0: 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65  rent = -1;.  pTe
b500: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
b510: 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65 64  0;.  if( allowed
b520: 4f 70 28 6f 70 29 20 26 26 20 28 70 54 65 72 6d  Op(op) && (pTerm
b530: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
b540: 70 72 65 72 65 71 4c 65 66 74 29 3d 3d 30 20 29  prereqLeft)==0 )
b550: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66  {.    Expr *pLef
b560: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
b570: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67  ;.    Expr *pRig
b580: 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67  ht = pExpr->pRig
b590: 68 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66  ht;.    if( pLef
b5a0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
b5b0: 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d   ){.      pTerm-
b5c0: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
b5d0: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
b5e0: 20 20 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74     pTerm->u.left
b5f0: 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e  Column = pLeft->
b600: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70  iColumn;.      p
b610: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
b620: 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 6f  = operatorMask(o
b630: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  p);.    }.    if
b640: 28 20 70 52 69 67 68 74 20 26 26 20 70 52 69 67  ( pRight && pRig
b650: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  ht->op==TK_COLUM
b660: 4e 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  N ){.      Where
b670: 54 65 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Term *pNew;.    
b680: 20 20 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20    Expr *pDup;.  
b690: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
b6a0: 65 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a  eftCursor>=0 ){.
b6b0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e          int idxN
b6c0: 65 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70  ew;.        pDup
b6d0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
b6e0: 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  p(db, pExpr, 0);
b6f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
b700: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
b710: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
b720: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
b730: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20   pDup);.        
b740: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
b750: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 64 78 4e    }.        idxN
b760: 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  ew = whereClause
b770: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75 70  Insert(pWC, pDup
b780: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
b790: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
b7a0: 20 20 20 20 20 20 69 66 28 20 69 64 78 4e 65 77        if( idxNew
b7b0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
b7c0: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57        pNew = &pW
b7d0: 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20  C->a[idxNew];.  
b7e0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 50 61 72        pNew->iPar
b7f0: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
b800: 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26         pTerm = &
b810: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
b820: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  .        pTerm->
b830: 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
b840: 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
b850: 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45  gs |= TERM_COPIE
b860: 44 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  D;.      }else{.
b870: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 70          pDup = p
b880: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e  Expr;.        pN
b890: 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  ew = pTerm;.    
b8a0: 20 20 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f    }.      exprCo
b8b0: 6d 6d 75 74 65 28 70 50 61 72 73 65 2c 20 70 44  mmute(pParse, pD
b8c0: 75 70 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74  up);.      pLeft
b8d0: 20 3d 20 70 44 75 70 2d 3e 70 4c 65 66 74 3b 0a   = pDup->pLeft;.
b8e0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74        pNew->left
b8f0: 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e  Cursor = pLeft->
b900: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e  iTable;.      pN
b910: 65 77 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  ew->u.leftColumn
b920: 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
b930: 6e 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  n;.      testcas
b940: 65 28 20 28 70 72 65 72 65 71 4c 65 66 74 20 7c  e( (prereqLeft |
b950: 20 65 78 74 72 61 52 69 67 68 74 29 20 21 3d 20   extraRight) != 
b960: 70 72 65 72 65 71 4c 65 66 74 20 29 3b 0a 20 20  prereqLeft );.  
b970: 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
b980: 52 69 67 68 74 20 3d 20 70 72 65 72 65 71 4c 65  Right = prereqLe
b990: 66 74 20 7c 20 65 78 74 72 61 52 69 67 68 74 3b  ft | extraRight;
b9a0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  .      pNew->pre
b9b0: 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41  reqAll = prereqA
b9c0: 6c 6c 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ll;.      pNew->
b9d0: 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72  eOperator = oper
b9e0: 61 74 6f 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f  atorMask(pDup->o
b9f0: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  p);.    }.  }..#
ba00: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ba10: 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d  IT_BETWEEN_OPTIM
ba20: 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20  IZATION.  /* If 
ba30: 61 20 74 65 72 6d 20 69 73 20 74 68 65 20 42 45  a term is the BE
ba40: 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20  TWEEN operator, 
ba50: 63 72 65 61 74 65 20 74 77 6f 20 6e 65 77 20 76  create two new v
ba60: 69 72 74 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a  irtual terms.  *
ba70: 2a 20 74 68 61 74 20 64 65 66 69 6e 65 20 74 68  * that define th
ba80: 65 20 72 61 6e 67 65 20 74 68 61 74 20 74 68 65  e range that the
ba90: 20 42 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65   BETWEEN impleme
baa0: 6e 74 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  nts.  For exampl
bab0: 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  e:.  **.  **    
bac0: 20 20 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e    a BETWEEN b AN
bad0: 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73  D c.  **.  ** is
bae0: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 3a   converted into:
baf0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
bb00: 28 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44  (a BETWEEN b AND
bb10: 20 63 29 20 41 4e 44 20 28 61 3e 3d 62 29 20 41   c) AND (a>=b) A
bb20: 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a 20  ND (a<=c).  **. 
bb30: 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e 65 77 20   ** The two new 
bb40: 74 65 72 6d 73 20 61 72 65 20 61 64 64 65 64 20  terms are added 
bb50: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
bb60: 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  the WhereClause 
bb70: 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65  object..  ** The
bb80: 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20 22   new terms are "
bb90: 64 79 6e 61 6d 69 63 22 20 61 6e 64 20 61 72 65  dynamic" and are
bba0: 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74 68 65   children of the
bbb0: 20 6f 72 69 67 69 6e 61 6c 20 42 45 54 57 45 45   original BETWEE
bbc0: 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54 68  N.  ** term.  Th
bbd0: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66  at means that if
bbe0: 20 74 68 65 20 42 45 54 57 45 45 4e 20 74 65 72   the BETWEEN ter
bbf0: 6d 20 69 73 20 63 6f 64 65 64 2c 20 74 68 65 20  m is coded, the 
bc00: 63 68 69 6c 64 72 65 6e 20 61 72 65 0a 20 20 2a  children are.  *
bc10: 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c 20  * skipped.  Or, 
bc20: 69 66 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20  if the children 
bc30: 61 72 65 20 73 61 74 69 73 66 69 65 64 20 62 79  are satisfied by
bc40: 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f   an index, the o
bc50: 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45 54  riginal.  ** BET
bc60: 57 45 45 4e 20 74 65 72 6d 20 69 73 20 73 6b 69  WEEN term is ski
bc70: 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  pped..  */.  els
bc80: 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d  e if( pExpr->op=
bc90: 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26 26 20 70  =TK_BETWEEN && p
bca0: 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  WC->op==TK_AND )
bcb0: 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
bcc0: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
bcd0: 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20  .pList;.    int 
bce0: 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  i;.    static co
bcf0: 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b  nst u8 ops[] = {
bd00: 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20  TK_GE, TK_LE};. 
bd10: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
bd20: 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
bd30: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  t( pList->nExpr=
bd40: 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  =2 );.    for(i=
bd50: 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<2; i++){.  
bd60: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
bd70: 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64  pr;.      int id
bd80: 78 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77  xNew;.      pNew
bd90: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
bda0: 78 70 72 28 70 50 61 72 73 65 2c 20 6f 70 73 5b  xpr(pParse, ops[
bdb0: 69 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  i], .           
bdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdd0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
bde0: 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  (db, pExpr->pLef
bdf0: 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20  t, 0),.         
be00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be10: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
be20: 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  up(db, pList->a[
be30: 69 5d 2e 70 45 78 70 72 2c 20 30 29 2c 20 30 29  i].pExpr, 0), 0)
be40: 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d  ;.      idxNew =
be50: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
be60: 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72  rt(pWC, pNewExpr
be70: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
be80: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
be90: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64      testcase( id
bea0: 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20  xNew==0 );.     
beb0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
bec0: 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b  c, pWC, idxNew);
bed0: 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26  .      pTerm = &
bee0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
bef0: 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64  .      pWC->a[id
bf00: 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20  xNew].iParent = 
bf10: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20  idxTerm;.    }. 
bf20: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
bf30: 20 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 2;.  }.#endif
bf40: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
bf50: 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41  BETWEEN_OPTIMIZA
bf60: 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64 65  TION */..#if !de
bf70: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
bf80: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
bf90: 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  N) && !defined(S
bfa0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
bfb0: 45 52 59 29 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a  ERY).  /* Analyz
bfc0: 65 20 61 20 74 65 72 6d 20 74 68 61 74 20 69 73  e a term that is
bfd0: 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20 74 77 6f   composed of two
bfe0: 20 6f 72 20 6d 6f 72 65 20 73 75 62 74 65 72 6d   or more subterm
bff0: 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20  s connected by. 
c000: 20 2a 2a 20 61 6e 20 4f 52 20 6f 70 65 72 61 74   ** an OR operat
c010: 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  or..  */.  else 
c020: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
c030: 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 61 73 73 65  K_OR ){.    asse
c040: 72 74 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f  rt( pWC->op==TK_
c050: 41 4e 44 20 29 3b 0a 20 20 20 20 65 78 70 72 41  AND );.    exprA
c060: 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 70 53 72  nalyzeOrTerm(pSr
c070: 63 2c 20 70 57 43 2c 20 69 64 78 54 65 72 6d 29  c, pWC, idxTerm)
c080: 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70  ;.    pTerm = &p
c090: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
c0a0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
c0b0: 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
c0c0: 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69  IMIZATION */..#i
c0d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c0e0: 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54  T_LIKE_OPTIMIZAT
c0f0: 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e  ION.  /* Add con
c100: 73 74 72 61 69 6e 74 73 20 74 6f 20 72 65 64 75  straints to redu
c110: 63 65 20 74 68 65 20 73 65 61 72 63 68 20 73 70  ce the search sp
c120: 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72  ace on a LIKE or
c130: 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61   GLOB.  ** opera
c140: 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  tor..  **.  ** A
c150: 20 6c 69 6b 65 20 70 61 74 74 65 72 6e 20 6f 66   like pattern of
c160: 20 74 68 65 20 66 6f 72 6d 20 22 78 20 4c 49 4b   the form "x LIK
c170: 45 20 27 61 62 63 25 27 22 20 69 73 20 63 68 61  E 'abc%'" is cha
c180: 6e 67 65 64 20 69 6e 74 6f 20 63 6f 6e 73 74 72  nged into constr
c190: 61 69 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20  aints.  **.  ** 
c1a0: 20 20 20 20 20 20 20 20 20 78 3e 3d 27 61 62 63           x>='abc
c1b0: 27 20 41 4e 44 20 78 3c 27 61 62 64 27 20 41 4e  ' AND x<'abd' AN
c1c0: 44 20 78 20 4c 49 4b 45 20 27 61 62 63 25 27 0a  D x LIKE 'abc%'.
c1d0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 61    **.  ** The la
c1e0: 73 74 20 63 68 61 72 61 63 74 65 72 20 6f 66 20  st character of 
c1f0: 74 68 65 20 70 72 65 66 69 78 20 22 61 62 63 22  the prefix "abc"
c200: 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
c210: 74 6f 20 66 6f 72 6d 20 74 68 65 0a 20 20 2a 2a  to form the.  **
c220: 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e   termination con
c230: 64 69 74 69 6f 6e 20 22 61 62 64 22 2e 0a 20 20  dition "abd"..  
c240: 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e 6f 70  */.  if( pWC->op
c250: 3d 3d 54 4b 5f 41 4e 44 20 0a 20 20 20 26 26 20  ==TK_AND .   && 
c260: 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 50 61  isLikeOrGlob(pPa
c270: 72 73 65 2c 20 70 45 78 70 72 2c 20 26 70 53 74  rse, pExpr, &pSt
c280: 72 31 2c 20 26 69 73 43 6f 6d 70 6c 65 74 65 2c  r1, &isComplete,
c290: 20 26 6e 6f 43 61 73 65 29 0a 20 20 29 7b 0a 20   &noCase).  ){. 
c2a0: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20     Expr *pLeft; 
c2b0: 20 20 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66 20        /* LHS of 
c2c0: 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74  LIKE/GLOB operat
c2d0: 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a  or */.    Expr *
c2e0: 70 53 74 72 32 3b 20 20 20 20 20 20 20 2f 2a 20  pStr2;       /* 
c2f0: 43 6f 70 79 20 6f 66 20 70 53 74 72 31 20 2d 20  Copy of pStr1 - 
c300: 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42  RHS of LIKE/GLOB
c310: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
c320: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 31   Expr *pNewExpr1
c330: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  ;.    Expr *pNew
c340: 45 78 70 72 32 3b 0a 20 20 20 20 69 6e 74 20 69  Expr2;.    int i
c350: 64 78 4e 65 77 31 3b 0a 20 20 20 20 69 6e 74 20  dxNew1;.    int 
c360: 69 64 78 4e 65 77 32 3b 0a 20 20 20 20 43 6f 6c  idxNew2;.    Col
c370: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
c380: 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
c390: 75 65 6e 63 65 20 74 6f 20 75 73 65 20 2a 2f 0a  uence to use */.
c3a0: 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78  .    pLeft = pEx
c3b0: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31  pr->x.pList->a[1
c3c0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74  ].pExpr;.    pSt
c3d0: 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
c3e0: 44 75 70 28 64 62 2c 20 70 53 74 72 31 2c 20 30  Dup(db, pStr1, 0
c3f0: 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e  );.    if( !db->
c400: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
c410: 20 20 20 20 20 20 75 38 20 63 2c 20 2a 70 43 3b        u8 c, *pC;
c420: 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 63         /* Last c
c430: 68 61 72 61 63 74 65 72 20 62 65 66 6f 72 65 20  haracter before 
c440: 74 68 65 20 66 69 72 73 74 20 77 69 6c 64 63 61  the first wildca
c450: 72 64 20 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d  rd */.      pC =
c460: 20 28 75 38 2a 29 26 70 53 74 72 32 2d 3e 75 2e   (u8*)&pStr2->u.
c470: 7a 54 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53 74  zToken[sqlite3St
c480: 72 6c 65 6e 33 30 28 70 53 74 72 32 2d 3e 75 2e  rlen30(pStr2->u.
c490: 7a 54 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20 20  zToken)-1];.    
c4a0: 20 20 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20    c = *pC;.     
c4b0: 20 69 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20   if( noCase ){. 
c4c0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f         /* The po
c4d0: 69 6e 74 20 69 73 20 74 6f 20 69 6e 63 72 65 6d  int is to increm
c4e0: 65 6e 74 20 74 68 65 20 6c 61 73 74 20 63 68 61  ent the last cha
c4f0: 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74 68  racter before th
c500: 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 20 20  e first.        
c510: 2a 2a 20 77 69 6c 64 63 61 72 64 2e 20 20 42 75  ** wildcard.  Bu
c520: 74 20 69 66 20 77 65 20 69 6e 63 72 65 6d 65 6e  t if we incremen
c530: 74 20 27 40 27 2c 20 74 68 61 74 20 77 69 6c 6c  t '@', that will
c540: 20 70 75 73 68 20 69 74 20 69 6e 74 6f 20 74 68   push it into th
c550: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 70  e.        ** alp
c560: 68 61 62 65 74 69 63 20 72 61 6e 67 65 20 77 68  habetic range wh
c570: 65 72 65 20 63 61 73 65 20 63 6f 6e 76 65 72 73  ere case convers
c580: 69 6f 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20 75  ions will mess u
c590: 70 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  p the .        *
c5a0: 2a 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 54  * inequality.  T
c5b0: 6f 20 61 76 6f 69 64 20 74 68 69 73 2c 20 6d 61  o avoid this, ma
c5c0: 6b 65 20 73 75 72 65 20 74 6f 20 61 6c 73 6f 20  ke sure to also 
c5d0: 72 75 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20 20  run the full.   
c5e0: 20 20 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20       ** LIKE on 
c5f0: 61 6c 6c 20 63 61 6e 64 69 64 61 74 65 20 65 78  all candidate ex
c600: 70 72 65 73 73 69 6f 6e 73 20 62 79 20 63 6c 65  pressions by cle
c610: 61 72 69 6e 67 20 74 68 65 20 69 73 43 6f 6d 70  aring the isComp
c620: 6c 65 74 65 20 66 6c 61 67 0a 20 20 20 20 20 20  lete flag.      
c630: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
c640: 20 63 3d 3d 27 41 27 2d 31 20 29 20 69 73 43 6f   c=='A'-1 ) isCo
c650: 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20 20 2f 2a  mplete = 0;   /*
c660: 20 45 56 3a 20 52 2d 36 34 33 33 39 2d 30 38 32   EV: R-64339-082
c670: 30 37 20 2a 2f 0a 0a 0a 20 20 20 20 20 20 20 20  07 */...        
c680: 63 20 3d 20 73 71 6c 69 74 65 33 55 70 70 65 72  c = sqlite3Upper
c690: 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20 20 20  ToLower[c];.    
c6a0: 20 20 7d 0a 20 20 20 20 20 20 2a 70 43 20 3d 20    }.      *pC = 
c6b0: 63 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  c + 1;.    }.   
c6c0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
c6d0: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
c6e0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 6e 6f 43  SQLITE_UTF8, noC
c6f0: 61 73 65 20 3f 20 22 4e 4f 43 41 53 45 22 20 3a  ase ? "NOCASE" :
c700: 20 22 42 49 4e 41 52 59 22 2c 30 29 3b 0a 20 20   "BINARY",0);.  
c710: 20 20 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71    pNewExpr1 = sq
c720: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
c730: 65 2c 20 54 4b 5f 47 45 2c 20 0a 20 20 20 20 20  e, TK_GE, .     
c740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c750: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 43 6f  sqlite3ExprSetCo
c760: 6c 6c 28 73 71 6c 69 74 65 33 45 78 70 72 44 75  ll(sqlite3ExprDu
c770: 70 28 64 62 2c 70 4c 65 66 74 2c 30 29 2c 20 70  p(db,pLeft,0), p
c780: 43 6f 6c 6c 29 2c 0a 20 20 20 20 20 20 20 20 20  Coll),.         
c790: 20 20 20 20 20 20 20 20 20 20 20 20 70 53 74 72              pStr
c7a0: 31 2c 20 30 29 3b 0a 20 20 20 20 69 64 78 4e 65  1, 0);.    idxNe
c7b0: 77 31 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  w1 = whereClause
c7c0: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
c7d0: 45 78 70 72 31 2c 20 54 45 52 4d 5f 56 49 52 54  Expr1, TERM_VIRT
c7e0: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
c7f0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
c800: 20 69 64 78 4e 65 77 31 3d 3d 30 20 29 3b 0a 20   idxNew1==0 );. 
c810: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70     exprAnalyze(p
c820: 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77  Src, pWC, idxNew
c830: 31 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72  1);.    pNewExpr
c840: 32 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  2 = sqlite3PExpr
c850: 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 0a  (pParse, TK_LT,.
c860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c870: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
c880: 53 65 74 43 6f 6c 6c 28 73 71 6c 69 74 65 33 45  SetColl(sqlite3E
c890: 78 70 72 44 75 70 28 64 62 2c 70 4c 65 66 74 2c  xprDup(db,pLeft,
c8a0: 30 29 2c 20 70 43 6f 6c 6c 29 2c 0a 20 20 20 20  0), pColl),.    
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8c0: 20 70 53 74 72 32 2c 20 30 29 3b 0a 20 20 20 20   pStr2, 0);.    
c8d0: 69 64 78 4e 65 77 32 20 3d 20 77 68 65 72 65 43  idxNew2 = whereC
c8e0: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
c8f0: 20 70 4e 65 77 45 78 70 72 32 2c 20 54 45 52 4d   pNewExpr2, TERM
c900: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
c910: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73 74  NAMIC);.    test
c920: 63 61 73 65 28 20 69 64 78 4e 65 77 32 3d 3d 30  case( idxNew2==0
c930: 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c   );.    exprAnal
c940: 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69  yze(pSrc, pWC, i
c950: 64 78 4e 65 77 32 29 3b 0a 20 20 20 20 70 54 65  dxNew2);.    pTe
c960: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
c970: 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20 69  Term];.    if( i
c980: 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20  sComplete ){.   
c990: 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77     pWC->a[idxNew
c9a0: 31 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  1].iParent = idx
c9b0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 57 43 2d  Term;.      pWC-
c9c0: 3e 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61 72  >a[idxNew2].iPar
c9d0: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
c9e0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69       pTerm->nChi
c9f0: 6c 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20  ld = 2;.    }.  
ca00: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
ca10: 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54  TE_OMIT_LIKE_OPT
ca20: 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69  IMIZATION */..#i
ca30: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ca40: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
ca50: 20 2f 2a 20 41 64 64 20 61 20 57 4f 5f 4d 41 54   /* Add a WO_MAT
ca60: 43 48 20 61 75 78 69 6c 69 61 72 79 20 74 65 72  CH auxiliary ter
ca70: 6d 20 74 6f 20 74 68 65 20 63 6f 6e 73 74 72 61  m to the constra
ca80: 69 6e 74 20 73 65 74 20 69 66 20 74 68 65 0a 20  int set if the. 
ca90: 20 2a 2a 20 63 75 72 72 65 6e 74 20 65 78 70 72   ** current expr
caa0: 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ession is of the
cab0: 20 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d   form:  column M
cac0: 41 54 43 48 20 65 78 70 72 2e 0a 20 20 2a 2a 20  ATCH expr..  ** 
cad0: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
cae0: 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
caf0: 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f  xBestIndex metho
cb00: 64 73 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74 75  ds of.  ** virtu
cb10: 61 6c 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20  al tables.  The 
cb20: 6e 61 74 69 76 65 20 71 75 65 72 79 20 6f 70 74  native query opt
cb30: 69 6d 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20  imizer does not 
cb40: 61 74 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20  attempt.  ** to 
cb50: 64 6f 20 61 6e 79 74 68 69 6e 67 20 77 69 74 68  do anything with
cb60: 20 4d 41 54 43 48 20 66 75 6e 63 74 69 6f 6e 73   MATCH functions
cb70: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d  ..  */.  if( isM
cb80: 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 70 45 78  atchOfColumn(pEx
cb90: 70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  pr) ){.    int i
cba0: 64 78 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 20  dxNew;.    Expr 
cbb0: 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b  *pRight, *pLeft;
cbc0: 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
cbd0: 70 4e 65 77 54 65 72 6d 3b 0a 20 20 20 20 42 69  pNewTerm;.    Bi
cbe0: 74 6d 61 73 6b 20 70 72 65 72 65 71 43 6f 6c 75  tmask prereqColu
cbf0: 6d 6e 2c 20 70 72 65 72 65 71 45 78 70 72 3b 0a  mn, prereqExpr;.
cc00: 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45  .    pRight = pE
cc10: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
cc20: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 4c  0].pExpr;.    pL
cc30: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  eft = pExpr->x.p
cc40: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
cc50: 3b 0a 20 20 20 20 70 72 65 72 65 71 45 78 70 72  ;.    prereqExpr
cc60: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
cc70: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 69 67  e(pMaskSet, pRig
cc80: 68 74 29 3b 0a 20 20 20 20 70 72 65 72 65 71 43  ht);.    prereqC
cc90: 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61 62 6c  olumn = exprTabl
cca0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
ccb0: 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28   pLeft);.    if(
ccc0: 20 28 70 72 65 72 65 71 45 78 70 72 20 26 20 70   (prereqExpr & p
ccd0: 72 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20  rereqColumn)==0 
cce0: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
ccf0: 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20 70  NewExpr;.      p
cd00: 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
cd10: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
cd20: 4b 5f 4d 41 54 43 48 2c 20 0a 20 20 20 20 20 20  K_MATCH, .      
cd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd40: 20 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74          0, sqlit
cd50: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 52  e3ExprDup(db, pR
cd60: 69 67 68 74 2c 20 30 29 2c 20 30 29 3b 0a 20 20  ight, 0), 0);.  
cd70: 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65      idxNew = whe
cd80: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
cd90: 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45  WC, pNewExpr, TE
cda0: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
cdb0: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
cdc0: 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77  testcase( idxNew
cdd0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  ==0 );.      pNe
cde0: 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  wTerm = &pWC->a[
cdf0: 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70  idxNew];.      p
ce00: 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  NewTerm->prereqR
ce10: 69 67 68 74 20 3d 20 70 72 65 72 65 71 45 78 70  ight = prereqExp
ce20: 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  r;.      pNewTer
ce30: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  m->leftCursor = 
ce40: 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20  pLeft->iTable;. 
ce50: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75       pNewTerm->u
ce60: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
ce70: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
ce80: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f      pNewTerm->eO
ce90: 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d 41 54  perator = WO_MAT
cea0: 43 48 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  CH;.      pNewTe
ceb0: 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64  rm->iParent = id
cec0: 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65  xTerm;.      pTe
ced0: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
cee0: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65  Term];.      pTe
cef0: 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a  rm->nChild = 1;.
cf00: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
cf10: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50  lags |= TERM_COP
cf20: 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  IED;.      pNewT
cf30: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  erm->prereqAll =
cf40: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c   pTerm->prereqAl
cf50: 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  l;.    }.  }.#en
cf60: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
cf70: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
cf80: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
cf90: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20  E_ENABLE_STAT3. 
cfa0: 20 2f 2a 20 57 68 65 6e 20 73 71 6c 69 74 65 5f   /* When sqlite_
cfb0: 73 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20  stat3 histogram 
cfc0: 64 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c  data is availabl
cfd0: 65 20 61 6e 20 6f 70 65 72 61 74 6f 72 20 6f 66  e an operator of
cfe0: 20 74 68 65 0a 20 20 2a 2a 20 66 6f 72 6d 20 22   the.  ** form "
cff0: 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 63  x IS NOT NULL" c
d000: 61 6e 20 73 6f 6d 65 74 69 6d 65 73 20 62 65 20  an sometimes be 
d010: 65 76 61 6c 75 61 74 65 64 20 6d 6f 72 65 20 65  evaluated more e
d020: 66 66 69 63 69 65 6e 74 6c 79 0a 20 20 2a 2a 20  fficiently.  ** 
d030: 61 73 20 22 78 3e 4e 55 4c 4c 22 20 69 66 20 78  as "x>NULL" if x
d040: 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47   is not an INTEG
d050: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20  ER PRIMARY KEY. 
d060: 20 53 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 0a   So construct a.
d070: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 65 72    ** virtual ter
d080: 6d 20 6f 66 20 74 68 61 74 20 66 6f 72 6d 2e 0a  m of that form..
d090: 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74    **.  ** Note t
d0a0: 68 61 74 20 74 68 65 20 76 69 72 74 75 61 6c 20  hat the virtual 
d0b0: 74 65 72 6d 20 6d 75 73 74 20 62 65 20 74 61 67  term must be tag
d0c0: 67 65 64 20 77 69 74 68 20 54 45 52 4d 5f 56 4e  ged with TERM_VN
d0d0: 55 4c 4c 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  ULL.  This.  ** 
d0e0: 54 45 52 4d 5f 56 4e 55 4c 4c 20 74 61 67 20 77  TERM_VNULL tag w
d0f0: 69 6c 6c 20 73 75 70 70 72 65 73 73 20 74 68 65  ill suppress the
d100: 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20   not-null check 
d110: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
d120: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f  .  ** of the loo
d130: 70 2e 20 20 57 69 74 68 6f 75 74 20 74 68 65 20  p.  Without the 
d140: 54 45 52 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c  TERM_VNULL flag,
d150: 20 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68   the not-null ch
d160: 65 63 6b 20 61 74 0a 20 20 2a 2a 20 74 68 65 20  eck at.  ** the 
d170: 73 74 61 72 74 20 6f 66 20 74 68 65 20 6c 6f 6f  start of the loo
d180: 70 20 77 69 6c 6c 20 70 72 65 76 65 6e 74 20 61  p will prevent a
d190: 6e 79 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  ny results from 
d1a0: 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0a  being returned..
d1b0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72    */.  if( pExpr
d1c0: 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ->op==TK_NOTNULL
d1d0: 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c  .   && pExpr->pL
d1e0: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  eft->op==TK_COLU
d1f0: 4d 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e  MN.   && pExpr->
d200: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pLeft->iColumn>=
d210: 30 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72 20  0.  ){.    Expr 
d220: 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 45  *pNewExpr;.    E
d230: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
d240: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 69  pr->pLeft;.    i
d250: 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 57  nt idxNew;.    W
d260: 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 54 65  hereTerm *pNewTe
d270: 72 6d 3b 0a 0a 20 20 20 20 70 4e 65 77 45 78 70  rm;..    pNewExp
d280: 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
d290: 28 70 50 61 72 73 65 2c 20 54 4b 5f 47 54 2c 0a  (pParse, TK_GT,.
d2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
d2c0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
d2d0: 4c 65 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20  Left, 0),.      
d2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 45 78        sqlite3PEx
d300: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e 55  pr(pParse, TK_NU
d310: 4c 4c 2c 20 30 2c 20 30 2c 20 30 29 2c 20 30 29  LL, 0, 0, 0), 0)
d320: 3b 0a 0a 20 20 20 20 69 64 78 4e 65 77 20 3d 20  ;..    idxNew = 
d330: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
d340: 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c  t(pWC, pNewExpr,
d350: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
d370: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
d380: 5f 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 56 4e  _DYNAMIC|TERM_VN
d390: 55 4c 4c 29 3b 0a 20 20 20 20 69 66 28 20 69 64  ULL);.    if( id
d3a0: 78 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e  xNew ){.      pN
d3b0: 65 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61  ewTerm = &pWC->a
d3c0: 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20  [idxNew];.      
d3d0: 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71  pNewTerm->prereq
d3e0: 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20  Right = 0;.     
d3f0: 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43   pNewTerm->leftC
d400: 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69  ursor = pLeft->i
d410: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65  Table;.      pNe
d420: 77 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  wTerm->u.leftCol
d430: 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f  umn = pLeft->iCo
d440: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77  lumn;.      pNew
d450: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
d460: 3d 20 57 4f 5f 47 54 3b 0a 20 20 20 20 20 20 70  = WO_GT;.      p
d470: 4e 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  NewTerm->iParent
d480: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
d490: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
d4a0: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
d4b0: 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
d4c0: 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  = 1;.      pTerm
d4d0: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
d4e0: 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20  M_COPIED;.      
d4f0: 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71  pNewTerm->prereq
d500: 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65  All = pTerm->pre
d510: 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20  reqAll;.    }.  
d520: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
d530: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 20 2a  TE_ENABLE_STAT *
d540: 2f 0a 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74 20  /..  /* Prevent 
d550: 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  ON clause terms 
d560: 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 66  of a LEFT JOIN f
d570: 72 6f 6d 20 62 65 69 6e 67 20 75 73 65 64 20 74  rom being used t
d580: 6f 20 64 72 69 76 65 0a 20 20 2a 2a 20 61 6e 20  o drive.  ** an 
d590: 69 6e 64 65 78 20 66 6f 72 20 74 61 62 6c 65 73  index for tables
d5a0: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
d5b0: 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20  the join..  */. 
d5c0: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
d5d0: 67 68 74 20 7c 3d 20 65 78 74 72 61 52 69 67 68  ght |= extraRigh
d5e0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t;.}../*.** This
d5f0: 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63 68   function search
d600: 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  es the expressio
d610: 6e 20 6c 69 73 74 20 70 61 73 73 65 64 20 61 73  n list passed as
d620: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
d630: 6d 65 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 20 65  ment.** for an e
d640: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 79 70  xpression of typ
d650: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 74 68 61 74  e TK_COLUMN that
d660: 20 72 65 66 65 72 73 20 74 6f 20 74 68 65 20 73   refers to the s
d670: 61 6d 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 0a 2a  ame column and.*
d680: 2a 20 75 73 65 73 20 74 68 65 20 73 61 6d 65 20  * uses the same 
d690: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
d6a0: 63 65 20 61 73 20 74 68 65 20 69 43 6f 6c 27 74  ce as the iCol't
d6b0: 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65  h column of inde
d6c0: 78 20 70 49 64 78 2e 0a 2a 2a 20 41 72 67 75 6d  x pIdx..** Argum
d6d0: 65 6e 74 20 69 42 61 73 65 20 69 73 20 74 68 65  ent iBase is the
d6e0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 75   cursor number u
d6f0: 73 65 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c  sed for the tabl
d700: 65 20 74 68 61 74 20 70 49 64 78 20 72 65 66 65  e that pIdx refe
d710: 72 73 0a 2a 2a 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20  rs.** to..**.** 
d720: 49 66 20 73 75 63 68 20 61 6e 20 65 78 70 72 65  If such an expre
d730: 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20  ssion is found, 
d740: 69 74 73 20 69 6e 64 65 78 20 69 6e 20 70 4c 69  its index in pLi
d750: 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75 72  st->a[] is retur
d760: 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 78  ned. If.** no ex
d770: 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e  pression is foun
d780: 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65  d, -1 is returne
d790: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
d7a0: 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a 20   findIndexCol(. 
d7b0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7d0: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
d7e0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
d7f0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  *pList,         
d800: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
d810: 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65 61  sion list to sea
d820: 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61  rch */.  int iBa
d830: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
d840: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
d850: 6f 72 20 66 6f 72 20 74 61 62 6c 65 20 61 73 73  or for table ass
d860: 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49 64  ociated with pId
d870: 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  x */.  Index *pI
d880: 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
d890: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
d8a0: 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20  to match column 
d8b0: 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  of */.  int iCol
d8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8d0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
d8e0: 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d 61  n of index to ma
d8f0: 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tch */.){.  int 
d900: 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  i;.  const char 
d910: 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61  *zColl = pIdx->a
d920: 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20  zColl[iCol];..  
d930: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
d940: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
d950: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 4c 69     Expr *p = pLi
d960: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
d970: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
d980: 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26  K_COLUMN.     &&
d990: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64   p->iColumn==pId
d9a0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c  x->aiColumn[iCol
d9b0: 5d 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 54 61  ].     && p->iTa
d9c0: 62 6c 65 3d 3d 69 42 61 73 65 0a 20 20 20 20 29  ble==iBase.    )
d9d0: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
d9e0: 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *pColl = sqlite3
d9f0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
da00: 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 69 66  se, p);.      if
da10: 28 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20  ( ALWAYS(pColl) 
da20: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
da30: 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ICmp(pColl->zNam
da40: 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, zColl) ){.   
da50: 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20       return i;. 
da60: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
da70: 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  ..  return -1;.}
da80: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
da90: 74 69 6e 65 20 64 65 74 65 72 6d 69 6e 65 73 20  tine determines 
daa0: 69 66 20 70 49 64 78 20 63 61 6e 20 62 65 20 75  if pIdx can be u
dab0: 73 65 64 20 74 6f 20 61 73 73 69 73 74 20 69 6e  sed to assist in
dac0: 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a   processing a.**
dad0: 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66   DISTINCT qualif
dae0: 69 65 72 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f  ier. In other wo
daf0: 72 64 73 2c 20 69 74 20 74 65 73 74 73 20 77 68  rds, it tests wh
db00: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 75 73 69  ether or not usi
db10: 6e 67 20 74 68 69 73 0a 2a 2a 20 69 6e 64 65 78  ng this.** index
db20: 20 66 6f 72 20 74 68 65 20 6f 75 74 65 72 20 6c   for the outer l
db30: 6f 6f 70 20 67 75 61 72 61 6e 74 65 65 73 20 74  oop guarantees t
db40: 68 61 74 20 72 6f 77 73 20 77 69 74 68 20 65 71  hat rows with eq
db50: 75 61 6c 20 76 61 6c 75 65 73 20 66 6f 72 0a 2a  ual values for.*
db60: 2a 20 61 6c 6c 20 65 78 70 72 65 73 73 69 6f 6e  * all expression
db70: 73 20 69 6e 20 74 68 65 20 70 44 69 73 74 69 6e  s in the pDistin
db80: 63 74 20 6c 69 73 74 20 61 72 65 20 64 65 6c 69  ct list are deli
db90: 76 65 72 65 64 20 67 72 6f 75 70 65 64 20 74 6f  vered grouped to
dba0: 67 65 74 68 65 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f  gether..**.** Fo
dbb0: 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 71  r example, the q
dbc0: 75 65 72 79 20 0a 2a 2a 0a 2a 2a 20 20 20 53 45  uery .**.**   SE
dbd0: 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 61 2c  LECT DISTINCT a,
dbe0: 20 62 2c 20 63 20 46 52 4f 4d 20 74 62 6c 20 57   b, c FROM tbl W
dbf0: 48 45 52 45 20 61 20 3d 20 3f 0a 2a 2a 0a 2a 2a  HERE a = ?.**.**
dc00: 20 63 61 6e 20 62 65 6e 65 66 69 74 20 66 72 6f   can benefit fro
dc10: 6d 20 61 6e 79 20 69 6e 64 65 78 20 6f 6e 20 63  m any index on c
dc20: 6f 6c 75 6d 6e 73 20 22 62 22 20 61 6e 64 20 22  olumns "b" and "
dc30: 63 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  c"..*/.static in
dc40: 74 20 69 73 44 69 73 74 69 6e 63 74 49 6e 64 65  t isDistinctInde
dc50: 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
dc60: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
dc70: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
dc80: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
dc90: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
dca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dcb0: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
dcc0: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
dcd0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
dce0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
dcf0: 65 78 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65  ex being conside
dd00: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73  red */.  int bas
dd10: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
dd20: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
dd30: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
dd40: 65 20 74 61 62 6c 65 20 70 49 64 78 20 69 73 20  e table pIdx is 
dd50: 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  on */.  ExprList
dd60: 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 20 20 20   *pDistinct,    
dd70: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 44          /* The D
dd80: 49 53 54 49 4e 43 54 20 65 78 70 72 65 73 73 69  ISTINCT expressi
dd90: 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71  ons */.  int nEq
dda0: 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  Col             
ddb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
ddc0: 65 72 20 6f 66 20 69 6e 64 65 78 20 63 6f 6c 75  er of index colu
ddd0: 6d 6e 73 20 77 69 74 68 20 3d 3d 20 2a 2f 0a 29  mns with == */.)
dde0: 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b  {.  Bitmask mask
ddf0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
de00: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 75      /* Mask of u
de10: 6e 61 63 63 6f 75 6e 74 65 64 20 66 6f 72 20 70  naccounted for p
de20: 44 69 73 74 69 6e 63 74 20 65 78 70 72 73 20 2a  Distinct exprs *
de30: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
de40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de50: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
de60: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 61  variable */..  a
de70: 73 73 65 72 74 28 20 70 44 69 73 74 69 6e 63 74  ssert( pDistinct
de80: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 49 64  !=0 );.  if( pId
de90: 78 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 70  x->zName==0 || p
dea0: 44 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3e  Distinct->nExpr>
deb0: 3d 42 4d 53 20 29 20 72 65 74 75 72 6e 20 30 3b  =BMS ) return 0;
dec0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 44 69  .  testcase( pDi
ded0: 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3d 3d 42  stinct->nExpr==B
dee0: 4d 53 2d 31 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  MS-1 );..  /* Lo
def0: 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 74  op through all t
df00: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  he expressions i
df10: 6e 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 6c  n the distinct l
df20: 69 73 74 2e 20 49 66 20 61 6e 79 20 6f 66 20 74  ist. If any of t
df30: 68 65 6d 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 74  hem.  ** are not
df40: 20 73 69 6d 70 6c 65 20 63 6f 6c 75 6d 6e 20 72   simple column r
df50: 65 66 65 72 65 6e 63 65 73 2c 20 72 65 74 75 72  eferences, retur
df60: 6e 20 65 61 72 6c 79 2e 20 4f 74 68 65 72 77 69  n early. Otherwi
df70: 73 65 2c 20 74 65 73 74 20 69 66 20 74 68 65 0a  se, test if the.
df80: 20 20 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73    ** WHERE claus
df90: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 22 63 6f  e contains a "co
dfa0: 6c 3d 58 22 20 63 6c 61 75 73 65 2e 20 49 66 20  l=X" clause. If 
dfb0: 69 74 20 64 6f 65 73 2c 20 74 68 65 20 65 78 70  it does, the exp
dfc0: 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 63 61 6e  ression.  ** can
dfd0: 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 49 66 20   be ignored. If 
dfe0: 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 61 6e 64  it does not, and
dff0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 6f 65 73   the column does
e000: 20 6e 6f 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74   not belong to t
e010: 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61 62  he.  ** same tab
e020: 6c 65 20 61 73 20 69 6e 64 65 78 20 70 49 64 78  le as index pIdx
e030: 2c 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20  , return early. 
e040: 46 69 6e 61 6c 6c 79 2c 20 69 66 20 74 68 65 72  Finally, if ther
e050: 65 20 69 73 20 6e 6f 0a 20 20 2a 2a 20 6d 61 74  e is no.  ** mat
e060: 63 68 69 6e 67 20 22 63 6f 6c 3d 58 22 20 65 78  ching "col=X" ex
e070: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 74 68 65  pression and the
e080: 20 63 6f 6c 75 6d 6e 20 69 73 20 6f 6e 20 74 68   column is on th
e090: 65 20 73 61 6d 65 20 74 61 62 6c 65 20 61 73 20  e same table as 
e0a0: 70 49 64 78 2c 0a 20 20 2a 2a 20 73 65 74 20 74  pIdx,.  ** set t
e0b0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
e0c0: 20 62 69 74 20 69 6e 20 76 61 72 69 61 62 6c 65   bit in variable
e0d0: 20 6d 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20 66 6f   mask..  */.  fo
e0e0: 72 28 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e  r(i=0; i<pDistin
e0f0: 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ct->nExpr; i++){
e100: 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
e110: 70 54 65 72 6d 3b 0a 20 20 20 20 45 78 70 72 20  pTerm;.    Expr 
e120: 2a 70 20 3d 20 70 44 69 73 74 69 6e 63 74 2d 3e  *p = pDistinct->
e130: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
e140: 69 66 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  if( p->op!=TK_CO
e150: 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  LUMN ) return 0;
e160: 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e  .    pTerm = fin
e170: 64 54 65 72 6d 28 70 57 43 2c 20 70 2d 3e 69 54  dTerm(pWC, p->iT
e180: 61 62 6c 65 2c 20 70 2d 3e 69 43 6f 6c 75 6d 6e  able, p->iColumn
e190: 2c 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20 57  , ~(Bitmask)0, W
e1a0: 4f 5f 45 51 2c 20 30 29 3b 0a 20 20 20 20 69 66  O_EQ, 0);.    if
e1b0: 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 20  ( pTerm ){.     
e1c0: 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72   Expr *pX = pTer
e1d0: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
e1e0: 43 6f 6c 6c 53 65 71 20 2a 70 31 20 3d 20 73 71  CollSeq *p1 = sq
e1f0: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
e200: 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
e210: 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d  , pX->pLeft, pX-
e220: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
e230: 43 6f 6c 6c 53 65 71 20 2a 70 32 20 3d 20 73 71  CollSeq *p2 = sq
e240: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
e250: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
e260: 20 20 20 69 66 28 20 70 31 3d 3d 70 32 20 29 20     if( p1==p2 ) 
e270: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
e280: 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 6c      if( p->iTabl
e290: 65 21 3d 62 61 73 65 20 29 20 72 65 74 75 72 6e  e!=base ) return
e2a0: 20 30 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20   0;.    mask |= 
e2b0: 28 28 28 42 69 74 6d 61 73 6b 29 31 29 20 3c 3c  (((Bitmask)1) <<
e2c0: 20 69 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28   i);.  }..  for(
e2d0: 69 3d 6e 45 71 43 6f 6c 3b 20 6d 61 73 6b 20 26  i=nEqCol; mask &
e2e0: 26 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  & i<pIdx->nColum
e2f0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  n; i++){.    int
e300: 20 69 45 78 70 72 20 3d 20 66 69 6e 64 49 6e 64   iExpr = findInd
e310: 65 78 43 6f 6c 28 70 50 61 72 73 65 2c 20 70 44  exCol(pParse, pD
e320: 69 73 74 69 6e 63 74 2c 20 62 61 73 65 2c 20 70  istinct, base, p
e330: 49 64 78 2c 20 69 29 3b 0a 20 20 20 20 69 66 28  Idx, i);.    if(
e340: 20 69 45 78 70 72 3c 30 20 29 20 62 72 65 61 6b   iExpr<0 ) break
e350: 3b 0a 20 20 20 20 6d 61 73 6b 20 26 3d 20 7e 28  ;.    mask &= ~(
e360: 28 28 42 69 74 6d 61 73 6b 29 31 29 20 3c 3c 20  ((Bitmask)1) << 
e370: 69 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 72  iExpr);.  }..  r
e380: 65 74 75 72 6e 20 28 6d 61 73 6b 3d 3d 30 29 3b  eturn (mask==0);
e390: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
e3a0: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49  n true if the DI
e3b0: 53 54 49 4e 43 54 20 65 78 70 72 65 73 73 69 6f  STINCT expressio
e3c0: 6e 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61 73  n-list passed as
e3d0: 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
e3e0: 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64  ent.** is redund
e3f0: 61 6e 74 2e 20 41 20 44 49 53 54 49 4e 43 54 20  ant. A DISTINCT 
e400: 6c 69 73 74 20 69 73 20 72 65 64 75 6e 64 61 6e  list is redundan
e410: 74 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  t if the databas
e420: 65 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20  e contains a.** 
e430: 55 4e 49 51 55 45 20 69 6e 64 65 78 20 74 68 61  UNIQUE index tha
e440: 74 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  t guarantees tha
e450: 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  t the result of 
e460: 74 68 65 20 71 75 65 72 79 20 77 69 6c 6c 20 62  the query will b
e470: 65 20 64 69 73 74 69 6e 63 74 0a 2a 2a 20 61 6e  e distinct.** an
e480: 79 77 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  yway..*/.static 
e490: 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 52 65  int isDistinctRe
e4a0: 64 75 6e 64 61 6e 74 28 0a 20 20 50 61 72 73 65  dundant(.  Parse
e4b0: 20 2a 70 50 61 72 73 65 2c 0a 20 20 53 72 63 4c   *pParse,.  SrcL
e4c0: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 0a 20  ist *pTabList,. 
e4d0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
e4e0: 43 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  C,.  ExprList *p
e4f0: 44 69 73 74 69 6e 63 74 0a 29 7b 0a 20 20 54 61  Distinct.){.  Ta
e500: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64  ble *pTab;.  Ind
e510: 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20  ex *pIdx;.  int 
e520: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
e530: 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 69              .  i
e540: 6e 74 20 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20  nt iBase;..  /* 
e550: 49 66 20 74 68 65 72 65 20 69 73 20 6d 6f 72 65  If there is more
e560: 20 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20   than one table 
e570: 6f 72 20 73 75 62 2d 73 65 6c 65 63 74 20 69 6e  or sub-select in
e580: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
e590: 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 71 75   of.  ** this qu
e5a0: 65 72 79 2c 20 74 68 65 6e 20 69 74 20 77 69 6c  ery, then it wil
e5b0: 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c  l not be possibl
e5c0: 65 20 74 6f 20 73 68 6f 77 20 74 68 61 74 20 74  e to show that t
e5d0: 68 65 20 44 49 53 54 49 4e 43 54 20 0a 20 20 2a  he DISTINCT .  *
e5e0: 2a 20 63 6c 61 75 73 65 20 69 73 20 72 65 64 75  * clause is redu
e5f0: 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20  ndant. */.  if( 
e600: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d  pTabList->nSrc!=
e610: 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  1 ) return 0;.  
e620: 69 42 61 73 65 20 3d 20 70 54 61 62 4c 69 73 74  iBase = pTabList
e630: 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a  ->a[0].iCursor;.
e640: 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
e650: 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20  t->a[0].pTab;.. 
e660: 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68   /* If any of th
e670: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 73  e expressions is
e680: 20 61 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f   an IPK column o
e690: 6e 20 74 61 62 6c 65 20 69 42 61 73 65 2c 20 74  n table iBase, t
e6a0: 68 65 6e 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a  hen return .  **
e6b0: 20 74 72 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65   true. Note: The
e6c0: 20 28 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61   (p->iTable==iBa
e6d0: 73 65 29 20 70 61 72 74 20 6f 66 20 74 68 69 73  se) part of this
e6e0: 20 74 65 73 74 20 6d 61 79 20 62 65 20 66 61 6c   test may be fal
e6f0: 73 65 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63  se if the.  ** c
e700: 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 73  urrent SELECT is
e710: 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75   a correlated su
e720: 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  b-query..  */.  
e730: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69 73 74  for(i=0; i<pDist
e740: 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  inct->nExpr; i++
e750: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d  ){.    Expr *p =
e760: 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d   pDistinct->a[i]
e770: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
e780: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
e790: 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69   && p->iTable==i
e7a0: 42 61 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75  Base && p->iColu
e7b0: 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b  mn<0 ) return 1;
e7c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  .  }..  /* Loop 
e7d0: 74 68 72 6f 75 67 68 20 61 6c 6c 20 69 6e 64 69  through all indi
e7e0: 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ces on the table
e7f0: 2c 20 63 68 65 63 6b 69 6e 67 20 65 61 63 68 20  , checking each 
e800: 74 6f 20 73 65 65 20 69 66 20 69 74 20 6d 61 6b  to see if it mak
e810: 65 73 0a 20 20 2a 2a 20 74 68 65 20 44 49 53 54  es.  ** the DIST
e820: 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20 72  INCT qualifier r
e830: 65 64 75 6e 64 61 6e 74 2e 20 49 74 20 64 6f 65  edundant. It doe
e840: 73 20 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20 20  s so if:.  **.  
e850: 2a 2a 20 20 20 31 2e 20 54 68 65 20 69 6e 64 65  **   1. The inde
e860: 78 20 69 73 20 69 74 73 65 6c 66 20 55 4e 49 51  x is itself UNIQ
e870: 55 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20 20 2a  UE, and.  **.  *
e880: 2a 20 20 20 32 2e 20 41 6c 6c 20 6f 66 20 74 68  *   2. All of th
e890: 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  e columns in the
e8a0: 20 69 6e 64 65 78 20 61 72 65 20 65 69 74 68 65   index are eithe
e8b0: 72 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 44  r part of the pD
e8c0: 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 20 20 20  istinct.  **    
e8d0: 20 20 6c 69 73 74 2c 20 6f 72 20 65 6c 73 65 20    list, or else 
e8e0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
e8f0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 74 65 72 6d   contains a term
e900: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 63 6f   of the form "co
e910: 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20 20 20 20 20  l=X",.  **      
e920: 77 68 65 72 65 20 58 20 69 73 20 61 20 63 6f 6e  where X is a con
e930: 73 74 61 6e 74 20 76 61 6c 75 65 2e 20 54 68 65  stant value. The
e940: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
e950: 6e 63 65 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a  nces of the.  **
e960: 20 20 20 20 20 20 63 6f 6d 70 61 72 69 73 6f 6e        comparison
e970: 20 61 6e 64 20 73 65 6c 65 63 74 2d 6c 69 73 74   and select-list
e980: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73   expressions mus
e990: 74 20 6d 61 74 63 68 20 74 68 6f 73 65 20 6f 66  t match those of
e9a0: 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2a   the index..  **
e9b0: 0a 20 20 2a 2a 20 20 20 33 2e 20 41 6c 6c 20 6f  .  **   3. All o
e9c0: 66 20 74 68 6f 73 65 20 69 6e 64 65 78 20 63 6f  f those index co
e9d0: 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69 63 68 20  lumns for which 
e9e0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
e9f0: 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 20   does not.  **  
ea00: 20 20 20 20 63 6f 6e 74 61 69 6e 20 61 20 22 63      contain a "c
ea10: 6f 6c 3d 58 22 20 74 65 72 6d 20 61 72 65 20 73  ol=X" term are s
ea20: 75 62 6a 65 63 74 20 74 6f 20 61 20 4e 4f 54 20  ubject to a NOT 
ea30: 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 2e  NULL constraint.
ea40: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78  .  */.  for(pIdx
ea50: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
ea60: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
ea70: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
ea80: 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
ea90: 45 5f 4e 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75  E_None ) continu
eaa0: 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e;.    for(i=0; 
eab0: 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  i<pIdx->nColumn;
eac0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
ead0: 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69   iCol = pIdx->ai
eae0: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
eaf0: 20 69 66 28 20 30 3d 3d 66 69 6e 64 54 65 72 6d   if( 0==findTerm
eb00: 28 70 57 43 2c 20 69 42 61 73 65 2c 20 69 43 6f  (pWC, iBase, iCo
eb10: 6c 2c 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20  l, ~(Bitmask)0, 
eb20: 57 4f 5f 45 51 2c 20 70 49 64 78 29 20 29 7b 0a  WO_EQ, pIdx) ){.
eb30: 20 20 20 20 20 20 20 20 69 6e 74 20 69 49 64 78          int iIdx
eb40: 43 6f 6c 20 3d 20 66 69 6e 64 49 6e 64 65 78 43  Col = findIndexC
eb50: 6f 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73 74  ol(pParse, pDist
eb60: 69 6e 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64  inct, iBase, pId
eb70: 78 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69  x, i);.        i
eb80: 66 28 20 69 49 64 78 43 6f 6c 3c 30 20 7c 7c 20  f( iIdxCol<0 || 
eb90: 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d  pTab->aCol[pIdx-
eba0: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 6e 6f  >aiColumn[i]].no
ebb0: 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  tNull==0 ){.    
ebc0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ebd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
ebe0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d     }.    if( i==
ebf0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b  pIdx->nColumn ){
ec00: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69  .      /* This i
ec10: 6e 64 65 78 20 69 6d 70 6c 69 65 73 20 74 68 61  ndex implies tha
ec20: 74 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 71  t the DISTINCT q
ec30: 75 61 6c 69 66 69 65 72 20 69 73 20 72 65 64 75  ualifier is redu
ec40: 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  ndant. */.      
ec50: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
ec60: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b    }..  return 0;
ec70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72  .}../*.** Prepar
ec80: 65 20 61 20 63 72 75 64 65 20 65 73 74 69 6d 61  e a crude estima
ec90: 74 65 20 6f 66 20 74 68 65 20 6c 6f 67 61 72 69  te of the logari
eca0: 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74  thm of the input
ecb0: 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72   value..** The r
ecc0: 65 73 75 6c 74 73 20 6e 65 65 64 20 6e 6f 74 20  esults need not 
ecd0: 62 65 20 65 78 61 63 74 2e 20 20 54 68 69 73 20  be exact.  This 
ece0: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  is only used for
ecf0: 20 65 73 74 69 6d 61 74 69 6e 67 0a 2a 2a 20 74   estimating.** t
ed00: 68 65 20 74 6f 74 61 6c 20 63 6f 73 74 20 6f 66  he total cost of
ed10: 20 70 65 72 66 6f 72 6d 69 6e 67 20 6f 70 65 72   performing oper
ed20: 61 74 69 6f 6e 73 20 77 69 74 68 20 4f 28 6c 6f  ations with O(lo
ed30: 67 4e 29 20 6f 72 20 4f 28 4e 6c 6f 67 4e 29 0a  gN) or O(NlogN).
ed40: 2a 2a 20 63 6f 6d 70 6c 65 78 69 74 79 2e 20 20  ** complexity.  
ed50: 42 65 63 61 75 73 65 20 4e 20 69 73 20 6a 75 73  Because N is jus
ed60: 74 20 61 20 67 75 65 73 73 2c 20 69 74 20 69 73  t a guess, it is
ed70: 20 6e 6f 20 67 72 65 61 74 20 74 72 61 67 65 64   no great traged
ed80: 79 20 69 66 0a 2a 2a 20 6c 6f 67 4e 20 69 73 20  y if.** logN is 
ed90: 61 20 6c 69 74 74 6c 65 20 6f 66 66 2e 0a 2a 2f  a little off..*/
eda0: 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 65  .static double e
edb0: 73 74 4c 6f 67 28 64 6f 75 62 6c 65 20 4e 29 7b  stLog(double N){
edc0: 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 67 4e 20 3d  .  double logN =
edd0: 20 31 3b 0a 20 20 64 6f 75 62 6c 65 20 78 20 3d   1;.  double x =
ede0: 20 31 30 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e   10;.  while( N>
edf0: 78 20 29 7b 0a 20 20 20 20 6c 6f 67 4e 20 2b 3d  x ){.    logN +=
ee00: 20 31 3b 0a 20 20 20 20 78 20 2a 3d 20 31 30 3b   1;.    x *= 10;
ee10: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6c 6f  .  }.  return lo
ee20: 67 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f  gN;.}../*.** Two
ee30: 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 72   routines for pr
ee40: 69 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  inting the conte
ee50: 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33  nt of an sqlite3
ee60: 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73  _index_info.** s
ee70: 74 72 75 63 74 75 72 65 2e 20 20 55 73 65 64 20  tructure.  Used 
ee80: 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
ee90: 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20  debugging only. 
eea0: 20 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53   If neither.** S
eeb0: 51 4c 49 54 45 5f 54 45 53 54 20 6f 72 20 53 51  QLITE_TEST or SQ
eec0: 4c 49 54 45 5f 44 45 42 55 47 20 61 72 65 20 64  LITE_DEBUG are d
eed0: 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65  efined, then the
eee0: 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61  se routines.** a
eef0: 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69  re no-ops..*/.#i
ef00: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
ef10: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
ef20: 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  BLE) && defined(
ef30: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74  SQLITE_DEBUG).st
ef40: 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f  atic void TRACE_
ef50: 49 44 58 5f 49 4e 50 55 54 53 28 73 71 6c 69 74  IDX_INPUTS(sqlit
ef60: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
ef70: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
ef80: 28 20 21 73 71 6c 69 74 65 33 57 68 65 72 65 54  ( !sqlite3WhereT
ef90: 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  race ) return;. 
efa0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
efb0: 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
efc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
efd0: 75 67 50 72 69 6e 74 66 28 22 20 20 63 6f 6e 73  ugPrintf("  cons
efe0: 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d  traint[%d]: col=
eff0: 25 64 20 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d  %d termid=%d op=
f000: 25 64 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22  %d usabled=%d\n"
f010: 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20  ,.       i,.    
f020: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
f030: 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20  t[i].iColumn,.  
f040: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
f050: 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73  int[i].iTermOffs
f060: 65 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  et,.       p->aC
f070: 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c  onstraint[i].op,
f080: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
f090: 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65  traint[i].usable
f0a0: 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
f0b0: 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b  ; i<p->nOrderBy;
f0c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
f0d0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
f0e0: 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f   orderby[%d]: co
f0f0: 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c  l=%d desc=%d\n",
f100: 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20  .       i,.     
f110: 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d    p->aOrderBy[i]
f120: 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  .iColumn,.      
f130: 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e   p->aOrderBy[i].
f140: 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  desc);.  }.}.sta
f150: 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49  tic void TRACE_I
f160: 44 58 5f 4f 55 54 50 55 54 53 28 73 71 6c 69 74  DX_OUTPUTS(sqlit
f170: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
f180: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
f190: 28 20 21 73 71 6c 69 74 65 33 57 68 65 72 65 54  ( !sqlite3WhereT
f1a0: 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  race ) return;. 
f1b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
f1c0: 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
f1d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
f1e0: 75 67 50 72 69 6e 74 66 28 22 20 20 75 73 61 67  ugPrintf("  usag
f1f0: 65 5b 25 64 5d 3a 20 61 72 67 76 49 64 78 3d 25  e[%d]: argvIdx=%
f200: 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20  d omit=%d\n",.  
f210: 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70       i,.       p
f220: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
f230: 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c  ge[i].argvIndex,
f240: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
f250: 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f  traintUsage[i].o
f260: 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  mit);.  }.  sqli
f270: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
f280: 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20    idxNum=%d\n", 
f290: 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71  p->idxNum);.  sq
f2a0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
f2b0: 28 22 20 20 69 64 78 53 74 72 3d 25 73 5c 6e 22  ("  idxStr=%s\n"
f2c0: 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  , p->idxStr);.  
f2d0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
f2e0: 74 66 28 22 20 20 6f 72 64 65 72 42 79 43 6f 6e  tf("  orderByCon
f2f0: 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e  sumed=%d\n", p->
f300: 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29  orderByConsumed)
f310: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
f320: 50 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61  Printf("  estima
f330: 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70  tedCost=%g\n", p
f340: 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29  ->estimatedCost)
f350: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
f360: 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55  e TRACE_IDX_INPU
f370: 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20 54 52  TS(A).#define TR
f380: 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28  ACE_IDX_OUTPUTS(
f390: 41 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a  A).#endif../* .*
f3a0: 2a 20 52 65 71 75 69 72 65 64 20 62 65 63 61 75  * Required becau
f3b0: 73 65 20 62 65 73 74 49 6e 64 65 78 28 29 20 69  se bestIndex() i
f3c0: 73 20 63 61 6c 6c 65 64 20 62 79 20 62 65 73 74  s called by best
f3d0: 4f 72 43 6c 61 75 73 65 49 6e 64 65 78 28 29 20  OrClauseIndex() 
f3e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f3f0: 62 65 73 74 49 6e 64 65 78 28 57 68 65 72 65 42  bestIndex(WhereB
f400: 65 73 74 49 64 78 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  estIdx*);../*.**
f410: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
f420: 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 61  tempts to find a
f430: 6e 20 73 63 61 6e 6e 69 6e 67 20 73 74 72 61 74  n scanning strat
f440: 65 67 79 20 74 68 61 74 20 63 61 6e 20 62 65 20  egy that can be 
f450: 75 73 65 64 20 0a 2a 2a 20 74 6f 20 6f 70 74 69  used .** to opti
f460: 6d 69 7a 65 20 61 6e 20 27 4f 52 27 20 65 78 70  mize an 'OR' exp
f470: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20  ression that is 
f480: 70 61 72 74 20 6f 66 20 61 20 57 48 45 52 45 20  part of a WHERE 
f490: 63 6c 61 75 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 54  clause. .**.** T
f4a0: 68 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61  he table associa
f4b0: 74 65 64 20 77 69 74 68 20 46 52 4f 4d 20 63 6c  ted with FROM cl
f4c0: 61 75 73 65 20 74 65 72 6d 20 70 53 72 63 20 6d  ause term pSrc m
f4d0: 61 79 20 62 65 20 65 69 74 68 65 72 20 61 0a 2a  ay be either a.*
f4e0: 2a 20 72 65 67 75 6c 61 72 20 42 2d 54 72 65 65  * regular B-Tree
f4f0: 20 74 61 62 6c 65 20 6f 72 20 61 20 76 69 72 74   table or a virt
f500: 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ual table..*/.st
f510: 61 74 69 63 20 76 6f 69 64 20 62 65 73 74 4f 72  atic void bestOr
f520: 43 6c 61 75 73 65 49 6e 64 65 78 28 57 68 65 72  ClauseIndex(Wher
f530: 65 42 65 73 74 49 64 78 20 2a 70 29 7b 0a 23 69  eBestIdx *p){.#i
f540: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f550: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
f560: 4e 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  N.  WhereClause 
f570: 2a 70 57 43 20 3d 20 70 2d 3e 70 57 43 3b 20 20  *pWC = p->pWC;  
f580: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
f590: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
f5a0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
f5b0: 5f 69 74 65 6d 20 2a 70 53 72 63 20 3d 20 70 2d  _item *pSrc = p-
f5c0: 3e 70 53 72 63 3b 20 2f 2a 20 54 68 65 20 46 52  >pSrc; /* The FR
f5d0: 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  OM clause term t
f5e0: 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 63 6f  o search */.  co
f5f0: 6e 73 74 20 69 6e 74 20 69 43 75 72 20 3d 20 70  nst int iCur = p
f600: 53 72 63 2d 3e 69 43 75 72 73 6f 72 3b 20 20 20  Src->iCursor;   
f610: 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
f620: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 20 2a   of the table  *
f630: 2f 0a 20 20 63 6f 6e 73 74 20 42 69 74 6d 61 73  /.  const Bitmas
f640: 6b 20 6d 61 73 6b 53 72 63 20 3d 20 67 65 74 4d  k maskSrc = getM
f650: 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65  ask(pWC->pMaskSe
f660: 74 2c 20 69 43 75 72 29 3b 20 20 2f 2a 20 42 69  t, iCur);  /* Bi
f670: 74 6d 61 73 6b 20 66 6f 72 20 70 53 72 63 20 2a  tmask for pSrc *
f680: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20  /.  WhereTerm * 
f690: 63 6f 6e 73 74 20 70 57 43 45 6e 64 20 3d 20 26  const pWCEnd = &
f6a0: 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
f6b0: 6d 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e  m];        /* En
f6c0: 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f  d of pWC->a[] */
f6d0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
f6e0: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
f6f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
f700: 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20  gle term of the 
f710: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
f720: 0a 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63 6c 61  .  /* The OR-cla
f730: 75 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  use optimization
f740: 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 69   is disallowed i
f750: 66 20 74 68 65 20 49 4e 44 45 58 45 44 20 42 59  f the INDEXED BY
f760: 20 6f 72 0a 20 20 2a 2a 20 4e 4f 54 20 49 4e 44   or.  ** NOT IND
f770: 45 58 45 44 20 63 6c 61 75 73 65 73 20 61 72 65  EXED clauses are
f780: 20 75 73 65 64 20 6f 72 20 69 66 20 74 68 65 20   used or if the 
f790: 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20 62  WHERE_AND_ONLY b
f7a0: 69 74 20 69 73 20 73 65 74 2e 20 2a 2f 0a 20 20  it is set. */.  
f7b0: 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64  if( pSrc->notInd
f7c0: 65 78 65 64 20 7c 7c 20 70 53 72 63 2d 3e 70 49  exed || pSrc->pI
f7d0: 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20 20 72  ndex!=0 ){.    r
f7e0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
f7f0: 20 70 57 43 2d 3e 77 63 74 72 6c 46 6c 61 67 73   pWC->wctrlFlags
f800: 20 26 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c   & WHERE_AND_ONL
f810: 59 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  Y ){.    return;
f820: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
f830: 68 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  h the WHERE clau
f840: 73 65 20 74 65 72 6d 73 20 66 6f 72 20 61 20 75  se terms for a u
f850: 73 61 62 6c 65 20 57 4f 5f 4f 52 20 74 65 72 6d  sable WO_OR term
f860: 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d  . */.  for(pTerm
f870: 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70  =pWC->a; pTerm<p
f880: 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  WCEnd; pTerm++){
f890: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
f8a0: 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52  eOperator==WO_OR
f8b0: 20 0a 20 20 20 20 20 26 26 20 28 28 70 54 65 72   .     && ((pTer
f8c0: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 7e  m->prereqAll & ~
f8d0: 6d 61 73 6b 53 72 63 29 20 26 20 70 2d 3e 6e 6f  maskSrc) & p->no
f8e0: 74 52 65 61 64 79 29 3d 3d 30 0a 20 20 20 20 20  tReady)==0.     
f8f0: 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72  && (pTerm->u.pOr
f900: 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20  Info->indexable 
f910: 26 20 6d 61 73 6b 53 72 63 29 21 3d 30 20 0a 20  & maskSrc)!=0 . 
f920: 20 20 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72     ){.      Wher
f930: 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74 20  eClause * const 
f940: 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e  pOrWC = &pTerm->
f950: 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20  u.pOrInfo->wc;. 
f960: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
f970: 20 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64 20   const pOrWCEnd 
f980: 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57  = &pOrWC->a[pOrW
f990: 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20  C->nTerm];.     
f9a0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54   WhereTerm *pOrT
f9b0: 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 66  erm;.      int f
f9c0: 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 4d 55 4c  lags = WHERE_MUL
f9d0: 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20 64 6f 75  TI_OR;.      dou
f9e0: 62 6c 65 20 72 54 6f 74 61 6c 20 3d 20 30 3b 0a  ble rTotal = 0;.
f9f0: 20 20 20 20 20 20 64 6f 75 62 6c 65 20 6e 52 6f        double nRo
fa00: 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 42 69 74  w = 0;.      Bit
fa10: 6d 61 73 6b 20 75 73 65 64 20 3d 20 30 3b 0a 20  mask used = 0;. 
fa20: 20 20 20 20 20 57 68 65 72 65 42 65 73 74 49 64       WhereBestId
fa30: 78 20 73 42 4f 49 3b 0a 0a 20 20 20 20 20 20 73  x sBOI;..      s
fa40: 42 4f 49 20 3d 20 2a 70 3b 0a 20 20 20 20 20 20  BOI = *p;.      
fa50: 73 42 4f 49 2e 70 4f 72 64 65 72 42 79 20 3d 20  sBOI.pOrderBy = 
fa60: 30 3b 0a 20 20 20 20 20 20 73 42 4f 49 2e 70 44  0;.      sBOI.pD
fa70: 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20  istinct = 0;.   
fa80: 20 20 20 73 42 4f 49 2e 70 70 49 64 78 49 6e 66     sBOI.ppIdxInf
fa90: 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72  o = 0;.      for
faa0: 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e  (pOrTerm=pOrWC->
fab0: 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43  a; pOrTerm<pOrWC
fac0: 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  End; pOrTerm++){
fad0: 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52  .        WHERETR
fae0: 41 43 45 28 28 22 2e 2e 2e 20 4d 75 6c 74 69 2d  ACE(("... Multi-
faf0: 69 6e 64 65 78 20 4f 52 20 74 65 73 74 69 6e 67  index OR testing
fb00: 20 66 6f 72 20 74 65 72 6d 20 25 64 20 6f 66 20   for term %d of 
fb10: 25 64 2e 2e 2e 2e 5c 6e 22 2c 20 0a 20 20 20 20  %d....\n", .    
fb20: 20 20 20 20 20 20 28 70 4f 72 54 65 72 6d 20 2d        (pOrTerm -
fb30: 20 70 4f 72 57 43 2d 3e 61 29 2c 20 28 70 54 65   pOrWC->a), (pTe
fb40: 72 6d 20 2d 20 70 57 43 2d 3e 61 29 0a 20 20 20  rm - pWC->a).   
fb50: 20 20 20 20 20 29 29 3b 0a 20 20 20 20 20 20 20       ));.       
fb60: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f   if( pOrTerm->eO
fb70: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20  perator==WO_AND 
fb80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 42 4f  ){.          sBO
fb90: 49 2e 70 57 43 20 3d 20 26 70 4f 72 54 65 72 6d  I.pWC = &pOrTerm
fba0: 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63  ->u.pAndInfo->wc
fbb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74  ;.          best
fbc0: 49 6e 64 65 78 28 26 73 42 4f 49 29 3b 0a 20 20  Index(&sBOI);.  
fbd0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
fbe0: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
fbf0: 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20  sor==iCur ){.   
fc00: 20 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75         WhereClau
fc10: 73 65 20 74 65 6d 70 57 43 3b 0a 20 20 20 20 20  se tempWC;.     
fc20: 20 20 20 20 20 74 65 6d 70 57 43 2e 70 50 61 72       tempWC.pPar
fc30: 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65  se = pWC->pParse
fc40: 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
fc50: 57 43 2e 70 4d 61 73 6b 53 65 74 20 3d 20 70 57  WC.pMaskSet = pW
fc60: 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a 20 20 20  C->pMaskSet;.   
fc70: 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4f         tempWC.pO
fc80: 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20  uter = pWC;.    
fc90: 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20        tempWC.op 
fca0: 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20  = TK_AND;.      
fcb0: 20 20 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70      tempWC.a = p
fcc0: 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  OrTerm;.        
fcd0: 20 20 74 65 6d 70 57 43 2e 77 63 74 72 6c 46 6c    tempWC.wctrlFl
fce0: 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ags = 0;.       
fcf0: 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20     tempWC.nTerm 
fd00: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73  = 1;.          s
fd10: 42 4f 49 2e 70 57 43 20 3d 20 26 74 65 6d 70 57  BOI.pWC = &tempW
fd20: 43 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65 73  C;.          bes
fd30: 74 49 6e 64 65 78 28 26 73 42 4f 49 29 3b 0a 20  tIndex(&sBOI);. 
fd40: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
fd50: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
fd60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
fd70: 20 20 20 20 72 54 6f 74 61 6c 20 2b 3d 20 73 42      rTotal += sB
fd80: 4f 49 2e 63 6f 73 74 2e 72 43 6f 73 74 3b 0a 20  OI.cost.rCost;. 
fd90: 20 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 73         nRow += s
fda0: 42 4f 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 52  BOI.cost.plan.nR
fdb0: 6f 77 3b 0a 20 20 20 20 20 20 20 20 75 73 65 64  ow;.        used
fdc0: 20 7c 3d 20 73 42 4f 49 2e 63 6f 73 74 2e 75 73   |= sBOI.cost.us
fdd0: 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ed;.        if( 
fde0: 72 54 6f 74 61 6c 3e 3d 70 2d 3e 63 6f 73 74 2e  rTotal>=p->cost.
fdf0: 72 43 6f 73 74 20 29 20 62 72 65 61 6b 3b 0a 20  rCost ) break;. 
fe00: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
fe10: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
fe20: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
fe30: 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 73 63   increase the sc
fe40: 61 6e 20 63 6f 73 74 20 74 6f 20 61 63 63 6f 75  an cost to accou
fe50: 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  nt .      ** for
fe60: 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65   the cost of the
fe70: 20 73 6f 72 74 2e 20 2a 2f 0a 20 20 20 20 20 20   sort. */.      
fe80: 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 21  if( p->pOrderBy!
fe90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 57 48  =0 ){.        WH
fea0: 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 73  ERETRACE(("... s
feb0: 6f 72 74 69 6e 67 20 69 6e 63 72 65 61 73 65 73  orting increases
fec0: 20 4f 52 20 63 6f 73 74 20 25 2e 39 67 20 74 6f   OR cost %.9g to
fed0: 20 25 2e 39 67 5c 6e 22 2c 0a 20 20 20 20 20 20   %.9g\n",.      
fee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 54                rT
fef0: 6f 74 61 6c 2c 20 72 54 6f 74 61 6c 2b 6e 52 6f  otal, rTotal+nRo
ff00: 77 2a 65 73 74 4c 6f 67 28 6e 52 6f 77 29 29 29  w*estLog(nRow)))
ff10: 3b 0a 20 20 20 20 20 20 20 20 72 54 6f 74 61 6c  ;.        rTotal
ff20: 20 2b 3d 20 6e 52 6f 77 2a 65 73 74 4c 6f 67 28   += nRow*estLog(
ff30: 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  nRow);.      }..
ff40: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
ff50: 63 6f 73 74 20 6f 66 20 73 63 61 6e 6e 69 6e 67  cost of scanning
ff60: 20 75 73 69 6e 67 20 74 68 69 73 20 4f 52 20 74   using this OR t
ff70: 65 72 6d 20 66 6f 72 20 6f 70 74 69 6d 69 7a 61  erm for optimiza
ff80: 74 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a  tion is.      **
ff90: 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 63   less than the c
ffa0: 75 72 72 65 6e 74 20 63 6f 73 74 20 73 74 6f 72  urrent cost stor
ffb0: 65 64 20 69 6e 20 70 43 6f 73 74 2c 20 72 65 70  ed in pCost, rep
ffc0: 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  lace the content
ffd0: 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 43  s.      ** of pC
ffe0: 6f 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 57 48  ost. */.      WH
fff0: 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 6d  ERETRACE(("... m
10000 75 6c 74 69 2d 69 6e 64 65 78 20 4f 52 20 63 6f  ulti-index OR co
10010 73 74 3d 25 2e 39 67 20 6e 72 6f 77 3d 25 2e 39  st=%.9g nrow=%.9
10020 67 5c 6e 22 2c 20 72 54 6f 74 61 6c 2c 20 6e 52  g\n", rTotal, nR
10030 6f 77 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ow));.      if( 
10040 72 54 6f 74 61 6c 3c 70 2d 3e 63 6f 73 74 2e 72  rTotal<p->cost.r
10050 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Cost ){.        
10060 70 2d 3e 63 6f 73 74 2e 72 43 6f 73 74 20 3d 20  p->cost.rCost = 
10070 72 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 20 20  rTotal;.        
10080 70 2d 3e 63 6f 73 74 2e 75 73 65 64 20 3d 20 75  p->cost.used = u
10090 73 65 64 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  sed;.        p->
100a0 63 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77 20 3d  cost.plan.nRow =
100b0 20 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 70   nRow;.        p
100c0 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 4f 42 53  ->cost.plan.nOBS
100d0 61 74 20 3d 20 70 2d 3e 69 20 3f 20 70 2d 3e 61  at = p->i ? p->a
100e0 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d 2e 70 6c  Level[p->i-1].pl
100f0 61 6e 2e 6e 4f 42 53 61 74 20 3a 20 30 3b 0a 20  an.nOBSat : 0;. 
10100 20 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70         p->cost.p
10110 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 66 6c  lan.wsFlags = fl
10120 61 67 73 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ags;.        p->
10130 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 54 65 72  cost.plan.u.pTer
10140 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  m = pTerm;.     
10150 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
10160 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
10170 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
10180 4f 4e 20 2a 2f 0a 7d 0a 0a 23 69 66 6e 64 65 66  ON */.}..#ifndef
10190 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
101a0 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a  OMATIC_INDEX./*.
101b0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
101c0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
101d0 73 65 20 74 65 72 6d 20 70 54 65 72 6d 20 69 73  se term pTerm is
101e0 20 6f 66 20 61 20 66 6f 72 6d 20 77 68 65 72 65   of a form where
101f0 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20   it.** could be 
10200 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64  used with an ind
10210 65 78 20 74 6f 20 61 63 63 65 73 73 20 70 53 72  ex to access pSr
10220 63 2c 20 61 73 73 75 6d 69 6e 67 20 61 6e 20 61  c, assuming an a
10230 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e  ppropriate.** in
10240 64 65 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a  dex existed..*/.
10250 73 74 61 74 69 63 20 69 6e 74 20 74 65 72 6d 43  static int termC
10260 61 6e 44 72 69 76 65 49 6e 64 65 78 28 0a 20 20  anDriveIndex(.  
10270 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
10280 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
10290 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  * WHERE clause t
102a0 65 72 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  erm to check */.
102b0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
102c0 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20  _item *pSrc,    
102d0 20 2f 2a 20 54 61 62 6c 65 20 77 65 20 61 72 65   /* Table we are
102e0 20 74 72 79 69 6e 67 20 74 6f 20 61 63 63 65 73   trying to acces
102f0 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  s */.  Bitmask n
10300 6f 74 52 65 61 64 79 20 20 20 20 20 20 20 20 20  otReady         
10310 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
10320 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f  in outer loops o
10330 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b  f the join */.){
10340 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 69  .  char aff;.  i
10350 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
10360 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75 72  rsor!=pSrc->iCur
10370 73 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  sor ) return 0;.
10380 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
10390 65 72 61 74 6f 72 21 3d 57 4f 5f 45 51 20 29 20  erator!=WO_EQ ) 
103a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
103b0 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
103c0 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 21  ght & notReady)!
103d0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
103e0 20 61 66 66 20 3d 20 70 53 72 63 2d 3e 70 54 61   aff = pSrc->pTa
103f0 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e 75  b->aCol[pTerm->u
10400 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66 66  .leftColumn].aff
10410 69 6e 69 74 79 3b 0a 20 20 69 66 28 20 21 73 71  inity;.  if( !sq
10420 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
10430 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70 45 78 70  tyOk(pTerm->pExp
10440 72 2c 20 61 66 66 29 20 29 20 72 65 74 75 72 6e  r, aff) ) return
10450 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   0;.  return 1;.
10460 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
10470 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
10480 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a  TOMATIC_INDEX./*
10490 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79  .** If the query
104a0 20 70 6c 61 6e 20 66 6f 72 20 70 53 72 63 20 73   plan for pSrc s
104b0 70 65 63 69 66 69 65 64 20 69 6e 20 70 43 6f 73  pecified in pCos
104c0 74 20 69 73 20 61 20 66 75 6c 6c 20 74 61 62 6c  t is a full tabl
104d0 65 20 73 63 61 6e 0a 2a 2a 20 61 6e 64 20 69 6e  e scan.** and in
104e0 64 65 78 69 6e 67 20 69 73 20 61 6c 6c 6f 77 73  dexing is allows
104f0 20 28 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f   (if there is no
10500 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61   NOT INDEXED cla
10510 75 73 65 29 20 61 6e 64 20 69 74 0a 2a 2a 20 70  use) and it.** p
10520 6f 73 73 69 62 6c 65 20 74 6f 20 63 6f 6e 73 74  ossible to const
10530 72 75 63 74 20 61 20 74 72 61 6e 73 69 65 6e 74  ruct a transient
10540 20 69 6e 64 65 78 20 74 68 61 74 20 77 6f 75 6c   index that woul
10550 64 20 70 65 72 66 6f 72 6d 20 62 65 74 74 65 72  d perform better
10560 0a 2a 2a 20 74 68 61 6e 20 61 20 66 75 6c 6c 20  .** than a full 
10570 74 61 62 6c 65 20 73 63 61 6e 20 65 76 65 6e 20  table scan even 
10580 77 68 65 6e 20 74 68 65 20 63 6f 73 74 20 6f 66  when the cost of
10590 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 74 68   constructing th
105a0 65 20 69 6e 64 65 78 0a 2a 2a 20 69 73 20 74 61  e index.** is ta
105b0 6b 65 6e 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74  ken into account
105c0 2c 20 74 68 65 6e 20 61 6c 74 65 72 20 74 68 65  , then alter the
105d0 20 71 75 65 72 79 20 70 6c 61 6e 20 74 6f 20 75   query plan to u
105e0 73 65 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 69  se the.** transi
105f0 65 6e 74 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  ent index..*/.st
10600 61 74 69 63 20 76 6f 69 64 20 62 65 73 74 41 75  atic void bestAu
10610 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 57 68 65  tomaticIndex(Whe
10620 72 65 42 65 73 74 49 64 78 20 2a 70 29 7b 0a 20  reBestIdx *p){. 
10630 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
10640 20 70 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20   p->pParse;     
10650 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
10660 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
10670 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
10680 70 57 43 20 3d 20 70 2d 3e 70 57 43 3b 20 20 20  pWC = p->pWC;   
10690 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
106a0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
106b0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
106c0 5f 69 74 65 6d 20 2a 70 53 72 63 20 3d 20 70 2d  _item *pSrc = p-
106d0 3e 70 53 72 63 3b 20 20 2f 2a 20 54 68 65 20 46  >pSrc;  /* The F
106e0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
106f0 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 64  to search */.  d
10700 6f 75 62 6c 65 20 6e 54 61 62 6c 65 52 6f 77 3b  ouble nTableRow;
10710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10720 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 69 6e 20       /* Rows in 
10730 74 68 65 20 69 6e 70 75 74 20 74 61 62 6c 65 20  the input table 
10740 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 67 4e  */.  double logN
10750 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f             /* lo
10770 67 28 6e 54 61 62 6c 65 52 6f 77 29 20 2a 2f 0a  g(nTableRow) */.
10780 20 20 64 6f 75 62 6c 65 20 63 6f 73 74 54 65 6d    double costTem
10790 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 2f 2a  pIdx;         /*
107a0 20 70 65 72 2d 71 75 65 72 79 20 63 6f 73 74 20   per-query cost 
107b0 6f 66 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74  of the transient
107c0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72   index */.  Wher
107d0 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
107e0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
107f0 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20  gle term of the 
10800 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
10810 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43    WhereTerm *pWC
10820 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  End;          /*
10830 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d   End of pWC->a[]
10840 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
10850 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ble;            
10860 20 20 2f 2a 20 54 61 62 6c 65 20 74 68 74 20 6d    /* Table tht m
10870 69 67 68 74 20 62 65 20 69 6e 64 65 78 65 64 20  ight be indexed 
10880 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  */..  if( pParse
10890 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3c 3d 28 64  ->nQueryLoop<=(d
108a0 6f 75 62 6c 65 29 31 20 29 7b 0a 20 20 20 20 2f  ouble)1 ){.    /
108b0 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 70 6f  * There is no po
108c0 69 6e 74 20 69 6e 20 62 75 69 6c 64 69 6e 67 20  int in building 
108d0 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
108e0 65 78 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ex for a single 
108f0 73 63 61 6e 20 2a 2f 0a 20 20 20 20 72 65 74 75  scan */.    retu
10900 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70  rn;.  }.  if( (p
10910 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
10920 20 26 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e   & SQLITE_AutoIn
10930 64 65 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  dex)==0 ){.    /
10940 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69  * Automatic indi
10950 63 65 73 20 61 72 65 20 64 69 73 61 62 6c 65 64  ces are disabled
10960 20 61 74 20 72 75 6e 2d 74 69 6d 65 20 2a 2f 0a   at run-time */.
10970 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
10980 20 20 69 66 28 20 28 70 2d 3e 63 6f 73 74 2e 70    if( (p->cost.p
10990 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
109a0 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e  ERE_NOT_FULLSCAN
109b0 29 21 3d 30 0a 20 20 20 26 26 20 28 70 2d 3e 63  )!=0.   && (p->c
109c0 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  ost.plan.wsFlags
109d0 20 26 20 57 48 45 52 45 5f 43 4f 56 45 52 5f 53   & WHERE_COVER_S
109e0 43 41 4e 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20  CAN)==0.  ){.   
109f0 20 2f 2a 20 57 65 20 61 6c 72 65 61 64 79 20 68   /* We already h
10a00 61 76 65 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66  ave some kind of
10a10 20 69 6e 64 65 78 20 69 6e 20 75 73 65 20 66 6f   index in use fo
10a20 72 20 74 68 69 73 20 71 75 65 72 79 2e 20 2a 2f  r this query. */
10a30 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
10a40 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 76 69 61  .  if( pSrc->via
10a50 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  Coroutine ){.   
10a60 20 2f 2a 20 43 61 6e 6e 6f 74 20 69 6e 64 65 78   /* Cannot index
10a70 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f   a co-routine */
10a80 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
10a90 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74  .  if( pSrc->not
10aa0 49 6e 64 65 78 65 64 20 29 7b 0a 20 20 20 20 2f  Indexed ){.    /
10ab0 2a 20 54 68 65 20 4e 4f 54 20 49 4e 44 45 58 45  * The NOT INDEXE
10ac0 44 20 63 6c 61 75 73 65 20 61 70 70 65 61 72 73  D clause appears
10ad0 20 69 6e 20 74 68 65 20 53 51 4c 2e 20 2a 2f 0a   in the SQL. */.
10ae0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
10af0 20 20 69 66 28 20 70 53 72 63 2d 3e 69 73 43 6f    if( pSrc->isCo
10b00 72 72 65 6c 61 74 65 64 20 29 7b 0a 20 20 20 20  rrelated ){.    
10b10 2f 2a 20 54 68 65 20 73 6f 75 72 63 65 20 69 73  /* The source is
10b20 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75   a correlated su
10b30 62 2d 71 75 65 72 79 2e 20 4e 6f 20 70 6f 69 6e  b-query. No poin
10b40 74 20 69 6e 20 69 6e 64 65 78 69 6e 67 20 69 74  t in indexing it
10b50 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b  . */.    return;
10b60 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
10b70 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
10b80 6f 70 20 3e 3d 20 28 64 6f 75 62 6c 65 29 31 20  op >= (double)1 
10b90 29 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20 70 53  );.  pTable = pS
10ba0 72 63 2d 3e 70 54 61 62 3b 0a 20 20 6e 54 61 62  rc->pTab;.  nTab
10bb0 6c 65 52 6f 77 20 3d 20 70 54 61 62 6c 65 2d 3e  leRow = pTable->
10bc0 6e 52 6f 77 45 73 74 3b 0a 20 20 6c 6f 67 4e 20  nRowEst;.  logN 
10bd0 3d 20 65 73 74 4c 6f 67 28 6e 54 61 62 6c 65 52  = estLog(nTableR
10be0 6f 77 29 3b 0a 20 20 63 6f 73 74 54 65 6d 70 49  ow);.  costTempI
10bf0 64 78 20 3d 20 32 2a 6c 6f 67 4e 2a 28 6e 54 61  dx = 2*logN*(nTa
10c00 62 6c 65 52 6f 77 2f 70 50 61 72 73 65 2d 3e 6e  bleRow/pParse->n
10c10 51 75 65 72 79 4c 6f 6f 70 20 2b 20 31 29 3b 0a  QueryLoop + 1);.
10c20 20 20 69 66 28 20 63 6f 73 74 54 65 6d 70 49 64    if( costTempId
10c30 78 3e 3d 70 2d 3e 63 6f 73 74 2e 72 43 6f 73 74  x>=p->cost.rCost
10c40 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63   ){.    /* The c
10c50 6f 73 74 20 6f 66 20 63 72 65 61 74 69 6e 67 20  ost of creating 
10c60 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61  the transient ta
10c70 62 6c 65 20 77 6f 75 6c 64 20 62 65 20 67 72 65  ble would be gre
10c80 61 74 65 72 20 74 68 61 6e 0a 20 20 20 20 2a 2a  ater than.    **
10c90 20 64 6f 69 6e 67 20 74 68 65 20 66 75 6c 6c 20   doing the full 
10ca0 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20  table scan */.  
10cb0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
10cc0 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
10cd0 6e 79 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70  ny equality comp
10ce0 61 72 69 73 6f 6e 20 74 65 72 6d 20 2a 2f 0a 20  arison term */. 
10cf0 20 70 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e   pWCEnd = &pWC->
10d00 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20  a[pWC->nTerm];. 
10d10 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
10d20 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b  a; pTerm<pWCEnd;
10d30 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
10d40 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  f( termCanDriveI
10d50 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63  ndex(pTerm, pSrc
10d60 2c 20 70 2d 3e 6e 6f 74 52 65 61 64 79 29 20 29  , p->notReady) )
10d70 7b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  {.      WHERETRA
10d80 43 45 28 28 22 61 75 74 6f 2d 69 6e 64 65 78 20  CE(("auto-index 
10d90 72 65 64 75 63 65 73 20 63 6f 73 74 20 66 72 6f  reduces cost fro
10da0 6d 20 25 2e 31 66 20 74 6f 20 25 2e 31 66 5c 6e  m %.1f to %.1f\n
10db0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
10dc0 20 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 72         p->cost.r
10dd0 43 6f 73 74 2c 20 63 6f 73 74 54 65 6d 70 49 64  Cost, costTempId
10de0 78 29 29 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f  x));.      p->co
10df0 73 74 2e 72 43 6f 73 74 20 3d 20 63 6f 73 74 54  st.rCost = costT
10e00 65 6d 70 49 64 78 3b 0a 20 20 20 20 20 20 70 2d  empIdx;.      p-
10e10 3e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77 20  >cost.plan.nRow 
10e20 3d 20 6c 6f 67 4e 20 2b 20 31 3b 0a 20 20 20 20  = logN + 1;.    
10e30 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77    p->cost.plan.w
10e40 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 54  sFlags = WHERE_T
10e50 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20  EMP_INDEX;.     
10e60 20 70 2d 3e 63 6f 73 74 2e 75 73 65 64 20 3d 20   p->cost.used = 
10e70 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
10e80 68 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ht;.      break;
10e90 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c  .    }.  }.}.#el
10ea0 73 65 0a 23 20 64 65 66 69 6e 65 20 62 65 73 74  se.# define best
10eb0 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 41  AutomaticIndex(A
10ec0 29 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 23  )  /* no-op */.#
10ed0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
10ee0 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
10ef0 4e 44 45 58 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65  NDEX */...#ifnde
10f00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
10f10 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a  TOMATIC_INDEX./*
10f20 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
10f30 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74  e to construct t
10f40 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  he Index object 
10f50 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  for an automatic
10f60 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 6f   index.** and to
10f70 20 73 65 74 20 75 70 20 74 68 65 20 57 68 65 72   set up the Wher
10f80 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20 70 4c  eLevel object pL
10f90 65 76 65 6c 20 73 6f 20 74 68 61 74 20 74 68 65  evel so that the
10fa0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a   code generator.
10fb0 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f 66 20  ** makes use of 
10fc0 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
10fd0 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
10fe0 6f 69 64 20 63 6f 6e 73 74 72 75 63 74 41 75 74  oid constructAut
10ff0 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20 50  omaticIndex(.  P
11000 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
11010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11020 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
11030 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
11040 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
11050 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
11060 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
11070 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
11080 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46  *pSrc,  /* The F
11090 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
110a0 74 6f 20 67 65 74 20 74 68 65 20 6e 65 78 74 20  to get the next 
110b0 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61  index */.  Bitma
110c0 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
110d0 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
110e0 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61  f cursors that a
110f0 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  re not available
11100 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
11110 20 2a 70 4c 65 76 65 6c 20 20 20 20 20 20 20 20   *pLevel        
11120 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 69    /* Write new i
11130 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ndex here */.){.
11140 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 20 20    int nColumn;  
11150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11160 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
11170 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72  ns in the constr
11180 75 63 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20  ucted index */. 
11190 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
111a0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
111b0 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66  A single term of
111c0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
111d0 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
111e0 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20 20   *pWCEnd;       
111f0 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43     /* End of pWC
11200 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  ->a[] */.  int n
11210 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
11220 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
11230 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65 64 20  f memory needed 
11240 66 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e  for pIdx */.  In
11250 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
11260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a            /* Obj
11270 65 63 74 20 64 65 73 63 72 69 62 69 6e 67 20 74  ect describing t
11280 68 65 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64  he transient ind
11290 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ex */.  Vdbe *v;
112a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112b0 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20      /* Prepared 
112c0 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  statement under 
112d0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
112e0 20 20 69 6e 74 20 61 64 64 72 49 6e 69 74 3b 20    int addrInit; 
112f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11300 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
11310 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 62  initialization b
11320 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f 0a 20 20  ypass jump */.  
11330 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20  Table *pTable;  
11340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11350 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69  he table being i
11360 6e 64 65 78 65 64 20 2a 2f 0a 20 20 4b 65 79 49  ndexed */.  KeyI
11370 6e 66 6f 20 2a 70 4b 65 79 69 6e 66 6f 3b 20 20  nfo *pKeyinfo;  
11380 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 20 69          /* Key i
11390 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
113a0 68 65 20 69 6e 64 65 78 20 2a 2f 20 20 20 0a 20  he index */   . 
113b0 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20   int addrTop;   
113c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
113d0 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78  Top of the index
113e0 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20 20   fill loop */.  
113f0 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20  int regRecord;  
11400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
11410 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
11420 61 6e 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  an index record 
11430 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
11440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11450 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e 74   /* Column count
11460 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  er */.  int i;  
11470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11480 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
11490 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 42  ter */.  int mxB
114a0 69 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  itCol;          
114b0 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
114c0 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63 2d 3e  column in pSrc->
114d0 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43 6f 6c  colUsed */.  Col
114e0 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
114f0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
11500 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74  ating sequence t
11510 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f  o on a column */
11520 0a 20 20 42 69 74 6d 61 73 6b 20 69 64 78 43 6f  .  Bitmask idxCo
11530 6c 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ls;            /
11540 2a 20 42 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75  * Bitmap of colu
11550 6d 6e 73 20 75 73 65 64 20 66 6f 72 20 69 6e 64  mns used for ind
11560 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61  exing */.  Bitma
11570 73 6b 20 65 78 74 72 61 43 6f 6c 73 3b 20 20 20  sk extraCols;   
11580 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70         /* Bitmap
11590 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63   of additional c
115a0 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 2f 2a 20  olumns */..  /* 
115b0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
115c0 20 73 6b 69 70 20 6f 76 65 72 20 74 68 65 20 63   skip over the c
115d0 72 65 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69 74  reation and init
115e0 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68  ialization of th
115f0 65 0a 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74  e.  ** transient
11600 20 69 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61 6e   index on 2nd an
11610 64 20 73 75 62 73 65 71 75 65 6e 74 20 69 74 65  d subsequent ite
11620 72 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c  rations of the l
11630 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70 50  oop. */.  v = pP
11640 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
11650 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
11660 20 61 64 64 72 49 6e 69 74 20 3d 20 73 71 6c 69   addrInit = sqli
11670 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72  te3CodeOnce(pPar
11680 73 65 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74  se);..  /* Count
11690 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
116a0 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c  olumns that will
116b0 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
116c0 20 69 6e 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20   index.  ** and 
116d0 75 73 65 64 20 74 6f 20 6d 61 74 63 68 20 57 48  used to match WH
116e0 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
116f0 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6e 43 6f 6c  raints */.  nCol
11700 75 6d 6e 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c  umn = 0;.  pTabl
11710 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a  e = pSrc->pTab;.
11720 20 20 70 57 43 45 6e 64 20 3d 20 26 70 57 43 2d    pWCEnd = &pWC-
11730 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a  >a[pWC->nTerm];.
11740 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20    idxCols = 0;. 
11750 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
11760 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b  a; pTerm<pWCEnd;
11770 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
11780 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  f( termCanDriveI
11790 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63  ndex(pTerm, pSrc
117a0 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20  , notReady) ){. 
117b0 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
117c0 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
117d0 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61  umn;.      Bitma
117e0 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e  sk cMask = iCol>
117f0 3d 42 4d 53 20 3f 20 28 28 42 69 74 6d 61 73 6b  =BMS ? ((Bitmask
11800 29 31 29 3c 3c 28 42 4d 53 2d 31 29 20 3a 20 28  )1)<<(BMS-1) : (
11810 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69 43 6f  (Bitmask)1)<<iCo
11820 6c 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  l;.      testcas
11830 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a  e( iCol==BMS );.
11840 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
11850 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  iCol==BMS-1 );. 
11860 20 20 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c       if( (idxCol
11870 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b  s & cMask)==0 ){
11880 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e  .        nColumn
11890 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43  ++;.        idxC
118a0 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20  ols |= cMask;.  
118b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
118c0 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
118d0 6e 3e 30 20 29 3b 0a 20 20 70 4c 65 76 65 6c 2d  n>0 );.  pLevel-
118e0 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20 6e 43 6f 6c  >plan.nEq = nCol
118f0 75 6d 6e 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74  umn;..  /* Count
11900 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
11910 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
11920 73 20 6e 65 65 64 65 64 20 74 6f 20 63 72 65 61  s needed to crea
11930 74 65 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69  te a.  ** coveri
11940 6e 67 20 69 6e 64 65 78 2e 20 20 41 20 22 63 6f  ng index.  A "co
11950 76 65 72 69 6e 67 20 69 6e 64 65 78 22 20 69 73  vering index" is
11960 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63   an index that c
11970 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a  ontains all.  **
11980 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72   columns that ar
11990 65 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20  e needed by the 
119a0 71 75 65 72 79 2e 20 20 57 69 74 68 20 61 20 63  query.  With a c
119b0 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74  overing index, t
119c0 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c  he.  ** original
119d0 20 74 61 62 6c 65 20 6e 65 76 65 72 20 6e 65 65   table never nee
119e0 64 73 20 74 6f 20 62 65 20 61 63 63 65 73 73 65  ds to be accesse
119f0 64 2e 20 20 41 75 74 6f 6d 61 74 69 63 20 69 6e  d.  Automatic in
11a00 64 69 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20  dices must.  ** 
11a10 62 65 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  be a covering in
11a20 64 65 78 20 62 65 63 61 75 73 65 20 74 68 65 20  dex because the 
11a30 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62  index will not b
11a40 65 20 75 70 64 61 74 65 64 20 69 66 20 74 68 65  e updated if the
11a50 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74  .  ** original t
11a60 61 62 6c 65 20 63 68 61 6e 67 65 73 20 61 6e 64  able changes and
11a70 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74   the index and t
11a80 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68  able cannot both
11a90 20 62 65 20 75 73 65 64 0a 20 20 2a 2a 20 69 66   be used.  ** if
11aa0 20 74 68 65 79 20 67 6f 20 6f 75 74 20 6f 66 20   they go out of 
11ab0 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74  sync..  */.  ext
11ac0 72 61 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63  raCols = pSrc->c
11ad0 6f 6c 55 73 65 64 20 26 20 28 7e 69 64 78 43 6f  olUsed & (~idxCo
11ae0 6c 73 20 7c 20 28 28 28 42 69 74 6d 61 73 6b 29  ls | (((Bitmask)
11af0 31 29 3c 3c 28 42 4d 53 2d 31 29 29 29 3b 0a 20  1)<<(BMS-1)));. 
11b00 20 6d 78 42 69 74 43 6f 6c 20 3d 20 28 70 54 61   mxBitCol = (pTa
11b10 62 6c 65 2d 3e 6e 43 6f 6c 20 3e 3d 20 42 4d 53  ble->nCol >= BMS
11b20 2d 31 29 20 3f 20 42 4d 53 2d 31 20 3a 20 70 54  -1) ? BMS-1 : pT
11b30 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a 20 20 74 65  able->nCol;.  te
11b40 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e  stcase( pTable->
11b50 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  nCol==BMS-1 );. 
11b60 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 6c   testcase( pTabl
11b70 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29  e->nCol==BMS-2 )
11b80 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d  ;.  for(i=0; i<m
11b90 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  xBitCol; i++){. 
11ba0 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73     if( extraCols
11bb0 20 26 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29   & (((Bitmask)1)
11bc0 3c 3c 69 29 20 29 20 6e 43 6f 6c 75 6d 6e 2b 2b  <<i) ) nColumn++
11bd0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63  ;.  }.  if( pSrc
11be0 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 28 28 42  ->colUsed & (((B
11bf0 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d  itmask)1)<<(BMS-
11c00 31 29 29 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 75  1)) ){.    nColu
11c10 6d 6e 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43  mn += pTable->nC
11c20 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20  ol - BMS + 1;.  
11c30 7d 0a 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  }.  pLevel->plan
11c40 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  .wsFlags |= WHER
11c50 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48  E_COLUMN_EQ | WH
11c60 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57  ERE_IDX_ONLY | W
11c70 4f 5f 45 51 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73  O_EQ;..  /* Cons
11c80 74 72 75 63 74 20 74 68 65 20 49 6e 64 65 78 20  truct the Index 
11c90 6f 62 6a 65 63 74 20 74 6f 20 64 65 73 63 72 69  object to descri
11ca0 62 65 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f  be this index */
11cb0 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
11cc0 66 28 49 6e 64 65 78 29 3b 0a 20 20 6e 42 79 74  f(Index);.  nByt
11cd0 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a  e += nColumn*siz
11ce0 65 6f 66 28 69 6e 74 29 3b 20 20 20 20 20 2f 2a  eof(int);     /*
11cf0 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20   Index.aiColumn 
11d00 2a 2f 0a 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43  */.  nByte += nC
11d10 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66 28 63 68 61  olumn*sizeof(cha
11d20 72 2a 29 3b 20 20 20 2f 2a 20 49 6e 64 65 78 2e  r*);   /* Index.
11d30 61 7a 43 6f 6c 6c 20 2a 2f 0a 20 20 6e 42 79 74  azColl */.  nByt
11d40 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20  e += nColumn;   
11d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11d60 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64 65   Index.aSortOrde
11d70 72 20 2a 2f 0a 20 20 70 49 64 78 20 3d 20 73 71  r */.  pIdx = sq
11d80 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
11d90 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 42  o(pParse->db, nB
11da0 79 74 65 29 3b 0a 20 20 69 66 28 20 70 49 64 78  yte);.  if( pIdx
11db0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
11dc0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70  pLevel->plan.u.p
11dd0 49 64 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49  Idx = pIdx;.  pI
11de0 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68  dx->azColl = (ch
11df0 61 72 2a 2a 29 26 70 49 64 78 5b 31 5d 3b 0a 20  ar**)&pIdx[1];. 
11e00 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20   pIdx->aiColumn 
11e10 3d 20 28 69 6e 74 2a 29 26 70 49 64 78 2d 3e 61  = (int*)&pIdx->a
11e20 7a 43 6f 6c 6c 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a  zColl[nColumn];.
11e30 20 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64    pIdx->aSortOrd
11e40 65 72 20 3d 20 28 75 38 2a 29 26 70 49 64 78 2d  er = (u8*)&pIdx-
11e50 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d  >aiColumn[nColum
11e60 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d  n];.  pIdx->zNam
11e70 65 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22  e = "auto-index"
11e80 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ;.  pIdx->nColum
11e90 6e 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 70  n = nColumn;.  p
11ea0 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54  Idx->pTable = pT
11eb0 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20  able;.  n = 0;. 
11ec0 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20   idxCols = 0;.  
11ed0 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
11ee0 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20  ; pTerm<pWCEnd; 
11ef0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
11f00 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
11f10 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
11f20 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20   notReady) ){.  
11f30 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
11f40 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
11f50 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  mn;.      Bitmas
11f60 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d  k cMask = iCol>=
11f70 42 4d 53 20 3f 20 28 28 42 69 74 6d 61 73 6b 29  BMS ? ((Bitmask)
11f80 31 29 3c 3c 28 42 4d 53 2d 31 29 20 3a 20 28 28  1)<<(BMS-1) : ((
11f90 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69 43 6f 6c  Bitmask)1)<<iCol
11fa0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 64 78  ;.      if( (idx
11fb0 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30  Cols & cMask)==0
11fc0 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
11fd0 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45   *pX = pTerm->pE
11fe0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 64 78  xpr;.        idx
11ff0 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20  Cols |= cMask;. 
12000 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43         pIdx->aiC
12010 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72 6d  olumn[n] = pTerm
12020 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  ->u.leftColumn;.
12030 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
12040 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
12050 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  pareCollSeq(pPar
12060 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70  se, pX->pLeft, p
12070 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  X->pRight);.    
12080 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
12090 5b 6e 5d 20 3d 20 41 4c 57 41 59 53 28 70 43 6f  [n] = ALWAYS(pCo
120a0 6c 6c 29 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  ll) ? pColl->zNa
120b0 6d 65 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a 20  me : "BINARY";. 
120c0 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20         n++;.    
120d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
120e0 61 73 73 65 72 74 28 20 28 75 33 32 29 6e 3d 3d  assert( (u32)n==
120f0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71  pLevel->plan.nEq
12100 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61 64   );..  /* Add ad
12110 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73  ditional columns
12120 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65 20   needed to make 
12130 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
12140 64 65 78 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20  dex into.  ** a 
12150 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a  covering index *
12160 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d  /.  for(i=0; i<m
12170 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  xBitCol; i++){. 
12180 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73     if( extraCols
12190 20 26 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29   & (((Bitmask)1)
121a0 3c 3c 69 29 20 29 7b 0a 20 20 20 20 20 20 70 49  <<i) ){.      pI
121b0 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20  dx->aiColumn[n] 
121c0 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d  = i;.      pIdx-
121d0 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49  >azColl[n] = "BI
121e0 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b  NARY";.      n++
121f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
12200 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  ( pSrc->colUsed 
12210 26 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c  & (((Bitmask)1)<
12220 3c 28 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20 20  <(BMS-1)) ){.   
12230 20 66 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69 3c   for(i=BMS-1; i<
12240 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b  pTable->nCol; i+
12250 2b 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e  +){.      pIdx->
12260 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b  aiColumn[n] = i;
12270 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43  .      pIdx->azC
12280 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59  oll[n] = "BINARY
12290 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20  ";.      n++;.  
122a0 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
122b0 28 20 6e 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  ( n==nColumn );.
122c0 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65  .  /* Create the
122d0 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
122e0 20 2a 2f 0a 20 20 70 4b 65 79 69 6e 66 6f 20 3d   */.  pKeyinfo =
122f0 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79   sqlite3IndexKey
12300 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  info(pParse, pId
12310 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  x);.  assert( pL
12320 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30  evel->iIdxCur>=0
12330 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
12340 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
12350 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65  enAutoindex, pLe
12360 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 43  vel->iIdxCur, nC
12370 6f 6c 75 6d 6e 2b 31 2c 20 30 2c 0a 20 20 20 20  olumn+1, 0,.    
12380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12390 28 63 68 61 72 2a 29 70 4b 65 79 69 6e 66 6f 2c  (char*)pKeyinfo,
123a0 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
123b0 4f 46 46 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  OFF);.  VdbeComm
123c0 65 6e 74 28 28 76 2c 20 22 66 6f 72 20 25 73 22  ent((v, "for %s"
123d0 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
123e0 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68  );..  /* Fill th
123f0 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
12400 78 20 77 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a  x with content *
12410 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71  /.  addrTop = sq
12420 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
12430 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c  v, OP_Rewind, pL
12440 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b 0a  evel->iTabCur);.
12450 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71    regRecord = sq
12460 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
12470 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
12480 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b  e3GenerateIndexK
12490 65 79 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c  ey(pParse, pIdx,
124a0 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
124b0 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 31 29 3b  , regRecord, 1);
124c0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
124d0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
124e0 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  sert, pLevel->iI
124f0 64 78 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64  dxCur, regRecord
12500 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
12510 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
12520 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
12530 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
12540 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
12550 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  t, pLevel->iTabC
12560 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a  ur, addrTop+1);.
12570 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
12580 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
12590 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49  STMTSTATUS_AUTOI
125a0 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65 33  NDEX);.  sqlite3
125b0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
125c0 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69  addrTop);.  sqli
125d0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
125e0 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63  g(pParse, regRec
125f0 6f 72 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75  ord);.  .  /* Ju
12600 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69  mp here when ski
12610 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61  pping the initia
12620 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  lization */.  sq
12630 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
12640 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a  e(v, addrInit);.
12650 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
12660 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
12670 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e  C_INDEX */..#ifn
12680 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12690 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a  VIRTUALTABLE./*.
126a0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
126b0 70 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c 69  populate an sqli
126c0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
126d0 74 72 75 63 74 75 72 65 2e 20 49 74 20 69 73 20  tructure. It is 
126e0 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69  the .** responsi
126f0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
12700 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
12710 6c 79 20 72 65 6c 65 61 73 65 20 74 68 65 20 73  ly release the s
12720 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20 70  tructure.** by p
12730 61 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e 74  assing the point
12740 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  er returned by t
12750 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  his function to 
12760 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
12770 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
12780 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61 6c  3_index_info *al
12790 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28  locateIndexInfo(
127a0 57 68 65 72 65 42 65 73 74 49 64 78 20 2a 70 29  WhereBestIdx *p)
127b0 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
127c0 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 20 0a  e = p->pParse; .
127d0 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
127e0 57 43 20 3d 20 70 2d 3e 70 57 43 3b 0a 20 20 73  WC = p->pWC;.  s
127f0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
12800 65 6d 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53  em *pSrc = p->pS
12810 72 63 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  rc;.  ExprList *
12820 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
12830 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 69 2c  rderBy;.  int i,
12840 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b   j;.  int nTerm;
12850 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
12860 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
12870 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20  nt *pIdxCons;.  
12880 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
12890 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a 70 49  ndex_orderby *pI
128a0 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73 74 72  dxOrderBy;.  str
128b0 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
128c0 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
128d0 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68  ge *pUsage;.  Wh
128e0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
128f0 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a    int nOrderBy;.
12900 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
12910 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a  info *pIdxInfo;.
12920 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22  .  WHERETRACE(("
12930 52 65 63 6f 6d 70 75 74 69 6e 67 20 69 6e 64 65  Recomputing inde
12940 78 20 69 6e 66 6f 20 66 6f 72 20 25 73 2e 2e 2e  x info for %s...
12950 5c 6e 22 2c 20 70 53 72 63 2d 3e 70 54 61 62 2d  \n", pSrc->pTab-
12960 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20  >zName));..  /* 
12970 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
12980 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57 48 45   of possible WHE
12990 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72  RE clause constr
129a0 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e 67 0a  aints referring.
129b0 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 76 69 72    ** to this vir
129c0 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tual table */.  
129d0 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20 70  for(i=nTerm=0, p
129e0 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70  Term=pWC->a; i<p
129f0 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20  WC->nTerm; i++, 
12a00 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
12a10 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
12a20 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75  sor != pSrc->iCu
12a30 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  rsor ) continue;
12a40 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54  .    assert( (pT
12a50 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28  erm->eOperator&(
12a60 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
12a70 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 74  -1))==0 );.    t
12a80 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
12a90 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e  eOperator==WO_IN
12aa0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
12ab0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
12ac0 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  or==WO_ISNULL );
12ad0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
12ae0 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
12af0 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20  IN|WO_ISNULL) ) 
12b00 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
12b10 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
12b20 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20   & TERM_VNULL ) 
12b30 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54  continue;.    nT
12b40 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  erm++;.  }..  /*
12b50 20 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   If the ORDER BY
12b60 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
12b70 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   only columns in
12b80 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20   the current .  
12b90 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
12ba0 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73   then allocate s
12bb0 70 61 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72  pace for the aOr
12bc0 64 65 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20  derBy part of.  
12bd0 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ** the sqlite3_i
12be0 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
12bf0 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64  ure..  */.  nOrd
12c00 65 72 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  erBy = 0;.  if( 
12c10 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
12c20 69 6e 74 20 6e 20 3d 20 70 4f 72 64 65 72 42 79  int n = pOrderBy
12c30 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72  ->nExpr;.    for
12c40 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
12c50 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
12c60 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pr = pOrderBy->a
12c70 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
12c80 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
12c90 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78  TK_COLUMN || pEx
12ca0 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63  pr->iTable!=pSrc
12cb0 2d 3e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61  ->iCursor ) brea
12cc0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
12cd0 20 69 3d 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f   i==n){.      nO
12ce0 72 64 65 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20  rderBy = n;.    
12cf0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
12d00 63 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 33  cate the sqlite3
12d10 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
12d20 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64  cture.  */.  pId
12d30 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  xInfo = sqlite3D
12d40 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
12d50 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a  se->db, sizeof(*
12d60 70 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20  pIdxInfo).      
12d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d80 20 20 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a       + (sizeof(*
12d90 70 49 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65  pIdxCons) + size
12da0 6f 66 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65  of(*pUsage))*nTe
12db0 72 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  rm.             
12dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
12dd0 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65  sizeof(*pIdxOrde
12de0 72 42 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b  rBy)*nOrderBy );
12df0 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d  .  if( pIdxInfo=
12e00 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
12e10 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
12e20 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  , "out of memory
12e30 22 29 3b 0a 20 20 20 20 2f 2a 20 28 64 6f 75 62  ");.    /* (doub
12e40 6c 65 29 30 20 49 6e 20 63 61 73 65 20 6f 66 20  le)0 In case of 
12e50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
12e60 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f  TING_POINT... */
12e70 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
12e80 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
12e90 69 7a 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ize the structur
12ea0 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  e.  The sqlite3_
12eb0 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
12ec0 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20  ture contains.  
12ed0 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74  ** many fields t
12ee0 68 61 74 20 61 72 65 20 64 65 63 6c 61 72 65 64  hat are declared
12ef0 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76   "const" to prev
12f00 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20 66  ent xBestIndex f
12f10 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e  rom.  ** changin
12f20 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65  g them.  We have
12f30 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b   to do some funk
12f40 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64  y casting in ord
12f50 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69  er to.  ** initi
12f60 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c  alize those fiel
12f70 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43  ds..  */.  pIdxC
12f80 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73 71  ons = (struct sq
12f90 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
12fa0 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66  traint*)&pIdxInf
12fb0 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65  o[1];.  pIdxOrde
12fc0 72 42 79 20 3d 20 28 73 74 72 75 63 74 20 73 71  rBy = (struct sq
12fd0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
12fe0 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e  rby*)&pIdxCons[n
12ff0 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20  Term];.  pUsage 
13000 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65  = (struct sqlite
13010 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
13020 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f  nt_usage*)&pIdxO
13030 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d  rderBy[nOrderBy]
13040 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78  ;.  *(int*)&pIdx
13050 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
13060 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69  t = nTerm;.  *(i
13070 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt*)&pIdxInfo->n
13080 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72  OrderBy = nOrder
13090 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  By;.  *(struct s
130a0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
130b0 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
130c0 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
130d0 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a   = pIdxCons;.  *
130e0 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
130f0 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29  index_orderby**)
13100 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65  &pIdxInfo->aOrde
13110 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42  rBy = pIdxOrderB
13120 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  y;.  *(struct sq
13130 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
13140 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26  traint_usage**)&
13150 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
13160 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20  raintUsage =.   
13170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131b0 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69  pUsage;..  for(i
131c0 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  =j=0, pTerm=pWC-
131d0 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
131e0 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
131f0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
13200 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53  leftCursor != pS
13210 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f  rc->iCursor ) co
13220 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
13230 72 74 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  rt( (pTerm->eOpe
13240 72 61 74 6f 72 26 28 70 54 65 72 6d 2d 3e 65 4f  rator&(pTerm->eO
13250 70 65 72 61 74 6f 72 2d 31 29 29 3d 3d 30 20 29  perator-1))==0 )
13260 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
13270 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
13280 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74  ==WO_IN );.    t
13290 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
132a0 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53  eOperator==WO_IS
132b0 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20  NULL );.    if( 
132c0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
132d0 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e   & (WO_IN|WO_ISN
132e0 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ULL) ) continue;
132f0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
13300 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
13310 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  NULL ) continue;
13320 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d  .    pIdxCons[j]
13330 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d  .iColumn = pTerm
13340 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  ->u.leftColumn;.
13350 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
13360 69 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b  iTermOffset = i;
13370 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d  .    pIdxCons[j]
13380 2e 6f 70 20 3d 20 28 75 38 29 70 54 65 72 6d 2d  .op = (u8)pTerm-
13390 3e 65 4f 70 65 72 61 74 6f 72 3b 0a 20 20 20 20  >eOperator;.    
133a0 2f 2a 20 54 68 65 20 64 69 72 65 63 74 20 61 73  /* The direct as
133b0 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20  signment in the 
133c0 70 72 65 76 69 6f 75 73 20 6c 69 6e 65 20 69 73  previous line is
133d0 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62   possible only b
133e0 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68  ecause.    ** th
133f0 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45  e WO_ and SQLITE
13400 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
13410 54 5f 20 63 6f 64 65 73 20 61 72 65 20 69 64 65  T_ codes are ide
13420 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a 20 20 20  ntical.  The.   
13430 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73   ** following as
13440 73 65 72 74 73 20 76 65 72 69 66 79 20 74 68 69  serts verify thi
13450 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 20 20 61  s fact. */.    a
13460 73 73 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51  ssert( WO_EQ==SQ
13470 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
13480 52 41 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20  RAINT_EQ );.    
13490 61 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53  assert( WO_LT==S
134a0 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
134b0 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20  TRAINT_LT );.   
134c0 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d   assert( WO_LE==
134d0 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
134e0 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20  STRAINT_LE );.  
134f0 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 54 3d    assert( WO_GT=
13500 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
13510 4e 53 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20  NSTRAINT_GT );. 
13520 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 45     assert( WO_GE
13530 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
13540 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a  ONSTRAINT_GE );.
13550 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4d      assert( WO_M
13560 41 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  ATCH==SQLITE_IND
13570 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41  EX_CONSTRAINT_MA
13580 54 43 48 20 29 3b 0a 20 20 20 20 61 73 73 65 72  TCH );.    asser
13590 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  t( pTerm->eOpera
135a0 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  tor & (WO_EQ|WO_
135b0 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57  LT|WO_LE|WO_GT|W
135c0 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29  O_GE|WO_MATCH) )
135d0 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20  ;.    j++;.  }. 
135e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
135f0 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
13600 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f  Expr *pExpr = pO
13610 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
13620 70 72 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65  pr;.    pIdxOrde
13630 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d  rBy[i].iColumn =
13640 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
13650 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79  .    pIdxOrderBy
13660 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65  [i].desc = pOrde
13670 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
13680 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  der;.  }..  retu
13690 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a  rn pIdxInfo;.}..
136a0 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  /*.** The table 
136b0 6f 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65  object reference
136c0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
136d0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
136e0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  o this function.
136f0 2a 2a 20 6d 75 73 74 20 72 65 70 72 65 73 65 6e  ** must represen
13700 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
13710 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
13720 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 42 65   invokes the xBe
13730 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74  stIndex().** met
13740 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75  hod of the virtu
13750 61 6c 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  al table with th
13760 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
13770 69 6e 66 6f 20 70 6f 69 6e 74 65 72 20 70 61 73  info pointer pas
13780 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 61 72  sed.** as the ar
13790 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  gument..**.** If
137a0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
137b0 2c 20 70 50 61 72 73 65 20 69 73 20 70 6f 70 75  , pParse is popu
137c0 6c 61 74 65 64 20 77 69 74 68 20 61 6e 20 65 72  lated with an er
137d0 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20  ror message and 
137e0 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  a.** non-zero va
137f0 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  lue is returned.
13800 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73   Otherwise, 0 is
13810 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
13820 65 20 6f 75 74 70 75 74 0a 2a 2a 20 70 61 72 74  e output.** part
13830 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
13840 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
13850 74 75 72 65 20 69 73 20 6c 65 66 74 20 70 6f 70  ture is left pop
13860 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68  ulated..**.** Wh
13870 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20  ether or not an 
13880 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
13890 64 2c 20 69 74 20 69 73 20 74 68 65 20 72 65 73  d, it is the res
138a0 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
138b0 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20  he.** caller to 
138c0 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20  eventually free 
138d0 70 2d 3e 69 64 78 53 74 72 20 69 66 20 70 2d 3e  p->idxStr if p->
138e0 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
138f0 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74 68   indicates.** th
13900 61 74 20 74 68 69 73 20 69 73 20 72 65 71 75 69  at this is requi
13910 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
13920 6e 74 20 76 74 61 62 42 65 73 74 49 6e 64 65 78  nt vtabBestIndex
13930 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
13940 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c  Table *pTab, sql
13950 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
13960 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  *p){.  sqlite3_v
13970 74 61 62 20 2a 70 56 74 61 62 20 3d 20 73 71 6c  tab *pVtab = sql
13980 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 70 50  ite3GetVTable(pP
13990 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d  arse->db, pTab)-
139a0 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 69 3b  >pVtab;.  int i;
139b0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 57 48  .  int rc;..  WH
139c0 45 52 45 54 52 41 43 45 28 28 22 78 42 65 73 74  ERETRACE(("xBest
139d0 49 6e 64 65 78 20 66 6f 72 20 25 73 5c 6e 22 2c  Index for %s\n",
139e0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a   pTab->zName));.
139f0 20 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55    TRACE_IDX_INPU
13a00 54 53 28 70 29 3b 0a 20 20 72 63 20 3d 20 70 56  TS(p);.  rc = pV
13a10 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42  tab->pModule->xB
13a20 65 73 74 49 6e 64 65 78 28 70 56 74 61 62 2c 20  estIndex(pVtab, 
13a30 70 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f  p);.  TRACE_IDX_
13a40 4f 55 54 50 55 54 53 28 70 29 3b 0a 0a 20 20 69  OUTPUTS(p);..  i
13a50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13a60 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   ){.    if( rc==
13a70 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
13a80 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62        pParse->db
13a90 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
13aa0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   1;.    }else if
13ab0 28 20 21 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  ( !pVtab->zErrMs
13ac0 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
13ad0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
13ae0 65 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33  e, "%s", sqlite3
13af0 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20 20 20  ErrStr(rc));.   
13b00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
13b10 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
13b20 61 72 73 65 2c 20 22 25 73 22 2c 20 70 56 74 61  arse, "%s", pVta
13b30 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  b->zErrMsg);.   
13b40 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
13b50 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72  _free(pVtab->zEr
13b60 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e  rMsg);.  pVtab->
13b70 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20  zErrMsg = 0;..  
13b80 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
13b90 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b  onstraint; i++){
13ba0 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 61 43 6f  .    if( !p->aCo
13bb0 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62  nstraint[i].usab
13bc0 6c 65 20 26 26 20 70 2d 3e 61 43 6f 6e 73 74 72  le && p->aConstr
13bd0 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67  aintUsage[i].arg
13be0 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20 20  vIndex>0 ){.    
13bf0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
13c00 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
13c10 20 20 20 20 20 22 74 61 62 6c 65 20 25 73 3a 20       "table %s: 
13c20 78 42 65 73 74 49 6e 64 65 78 20 72 65 74 75 72  xBestIndex retur
13c30 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69 64 20 70  ned an invalid p
13c40 6c 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  lan", pTab->zNam
13c50 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
13c60 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e   return pParse->
13c70 6e 45 72 72 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  nErr;.}.../*.** 
13c80 43 6f 6d 70 75 74 65 20 74 68 65 20 62 65 73 74  Compute the best
13c90 20 69 6e 64 65 78 20 66 6f 72 20 61 20 76 69 72   index for a vir
13ca0 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  tual table..**.*
13cb0 2a 20 54 68 65 20 62 65 73 74 20 69 6e 64 65 78  * The best index
13cc0 20 69 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20   is computed by 
13cd0 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d  the xBestIndex m
13ce0 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72  ethod of the vir
13cf0 74 75 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 6d 6f  tual.** table mo
13d00 64 75 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74  dule.  This rout
13d10 69 6e 65 20 69 73 20 72 65 61 6c 6c 79 20 6a 75  ine is really ju
13d20 73 74 20 61 20 77 72 61 70 70 65 72 20 74 68 61  st a wrapper tha
13d30 74 20 73 65 74 73 20 75 70 0a 2a 2a 20 74 68 65  t sets up.** the
13d40 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
13d50 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
13d60 61 74 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f  at is used to co
13d70 6d 6d 75 6e 69 63 61 74 65 20 77 69 74 68 0a 2a  mmunicate with.*
13d80 2a 20 78 42 65 73 74 49 6e 64 65 78 2e 0a 2a 2a  * xBestIndex..**
13d90 0a 2a 2a 20 49 6e 20 61 20 6a 6f 69 6e 2c 20 74  .** In a join, t
13da0 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
13db0 74 20 62 65 20 63 61 6c 6c 65 64 20 6d 75 6c 74  t be called mult
13dc0 69 70 6c 65 20 74 69 6d 65 73 20 66 6f 72 20 74  iple times for t
13dd0 68 65 0a 2a 2a 20 73 61 6d 65 20 76 69 72 74 75  he.** same virtu
13de0 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 20 73  al table.  The s
13df0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
13e00 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63  o structure is c
13e10 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 69 6e  reated.** and in
13e20 69 74 69 61 6c 69 7a 65 64 20 6f 6e 20 74 68 65  itialized on the
13e30 20 66 69 72 73 74 20 69 6e 76 6f 63 61 74 69 6f   first invocatio
13e40 6e 20 61 6e 64 20 72 65 75 73 65 64 20 6f 6e 20  n and reused on 
13e50 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a  all subsequent.*
13e60 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 20 20  * invocations.  
13e70 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  The sqlite3_inde
13e80 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
13e90 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68   is also used wh
13ea0 65 6e 0a 2a 2a 20 63 6f 64 65 20 69 73 20 67 65  en.** code is ge
13eb0 6e 65 72 61 74 65 64 20 74 6f 20 61 63 63 65 73  nerated to acces
13ec0 73 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  s the virtual ta
13ed0 62 6c 65 2e 20 20 54 68 65 20 77 68 65 72 65 49  ble.  The whereI
13ee0 6e 66 6f 44 65 6c 65 74 65 28 29 20 0a 2a 2a 20  nfoDelete() .** 
13ef0 72 6f 75 74 69 6e 65 20 74 61 6b 65 73 20 63 61  routine takes ca
13f00 72 65 20 6f 66 20 66 72 65 65 69 6e 67 20 74 68  re of freeing th
13f10 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
13f20 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 61  info structure a
13f30 66 74 65 72 0a 2a 2a 20 65 76 65 72 79 62 6f 64  fter.** everybod
13f40 79 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 77  y has finished w
13f50 69 74 68 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69  ith it..*/.stati
13f60 63 20 76 6f 69 64 20 62 65 73 74 56 69 72 74 75  c void bestVirtu
13f70 61 6c 49 6e 64 65 78 28 57 68 65 72 65 42 65 73  alIndex(WhereBes
13f80 74 49 64 78 20 2a 70 29 7b 0a 20 20 50 61 72 73  tIdx *p){.  Pars
13f90 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70  e *pParse = p->p
13fa0 50 61 72 73 65 3b 20 20 20 20 20 20 2f 2a 20 54  Parse;      /* T
13fb0 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
13fc0 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
13fd0 75 73 65 20 2a 70 57 43 20 3d 20 70 2d 3e 70 57  use *pWC = p->pW
13fe0 43 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57  C;      /* The W
13ff0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
14000 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
14010 69 74 65 6d 20 2a 70 53 72 63 20 3d 20 70 2d 3e  item *pSrc = p->
14020 70 53 72 63 3b 20 2f 2a 20 54 68 65 20 46 52 4f  pSrc; /* The FRO
14030 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  M clause term to
14040 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 54 61 62   search */.  Tab
14050 6c 65 20 2a 70 54 61 62 20 3d 20 70 53 72 63 2d  le *pTab = pSrc-
14060 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  >pTab;.  sqlite3
14070 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64  _index_info *pId
14080 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  xInfo;.  struct 
14090 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
140a0 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f  nstraint *pIdxCo
140b0 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  ns;.  struct sql
140c0 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
140d0 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73  raint_usage *pUs
140e0 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  age;.  WhereTerm
140f0 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69   *pTerm;.  int i
14100 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65  , j;.  int nOrde
14110 72 42 79 3b 0a 20 20 64 6f 75 62 6c 65 20 72 43  rBy;.  double rC
14120 6f 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  ost;..  /* Make 
14130 73 75 72 65 20 77 73 46 6c 61 67 73 20 69 73 20  sure wsFlags is 
14140 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 73  initialized to s
14150 6f 6d 65 20 73 61 6e 65 20 76 61 6c 75 65 2e 20  ome sane value. 
14160 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
14170 65 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 69  e .  ** malloc i
14180 6e 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49  n allocateIndexI
14190 6e 66 6f 28 29 20 66 61 69 6c 73 20 61 6e 64 20  nfo() fails and 
141a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
141b0 74 75 72 6e 73 20 6c 65 61 76 69 6e 67 0a 20 20  turns leaving.  
141c0 2a 2a 20 77 73 46 6c 61 67 73 20 69 6e 20 61 6e  ** wsFlags in an
141d0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73   uninitialized s
141e0 74 61 74 65 2c 20 74 68 65 20 63 61 6c 6c 65 72  tate, the caller
141f0 20 6d 61 79 20 62 65 68 61 76 65 20 75 6e 70 72   may behave unpr
14200 65 64 69 63 74 61 62 6c 79 2e 0a 20 20 2a 2f 0a  edictably..  */.
14210 20 20 6d 65 6d 73 65 74 28 26 70 2d 3e 63 6f 73    memset(&p->cos
14220 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  t, 0, sizeof(p->
14230 63 6f 73 74 29 29 3b 0a 20 20 70 2d 3e 63 6f 73  cost));.  p->cos
14240 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d  t.plan.wsFlags =
14250 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
14260 42 4c 45 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  BLE;..  /* If th
14270 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
14280 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 68  info structure h
14290 61 73 20 6e 6f 74 20 62 65 65 6e 20 70 72 65 76  as not been prev
142a0 69 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f  iously.  ** allo
142b0 63 61 74 65 64 20 61 6e 64 20 69 6e 69 74 69 61  cated and initia
142c0 6c 69 7a 65 64 2c 20 74 68 65 6e 20 61 6c 6c 6f  lized, then allo
142d0 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
142e0 69 7a 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f  ize it now..  */
142f0 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 2a 70  .  pIdxInfo = *p
14300 2d 3e 70 70 49 64 78 49 6e 66 6f 3b 0a 20 20 69  ->ppIdxInfo;.  i
14310 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29  f( pIdxInfo==0 )
14320 7b 0a 20 20 20 20 2a 70 2d 3e 70 70 49 64 78 49  {.    *p->ppIdxI
14330 6e 66 6f 20 3d 20 70 49 64 78 49 6e 66 6f 20 3d  nfo = pIdxInfo =
14340 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e   allocateIndexIn
14350 66 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28  fo(p);.  }.  if(
14360 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a   pIdxInfo==0 ){.
14370 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
14380 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
14390 69 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33  int, the sqlite3
143a0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
143b0 63 74 75 72 65 20 74 68 61 74 20 70 49 64 78 49  cture that pIdxI
143c0 6e 66 6f 20 70 6f 69 6e 74 73 0a 20 20 2a 2a 20  nfo points.  ** 
143d0 74 6f 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  to will have bee
143e0 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 65  n initialized, e
143f0 69 74 68 65 72 20 64 75 72 69 6e 67 20 74 68 65  ither during the
14400 20 63 75 72 72 65 6e 74 20 69 6e 76 6f 63 61 74   current invocat
14410 69 6f 6e 20 6f 72 0a 20 20 2a 2a 20 64 75 72 69  ion or.  ** duri
14420 6e 67 20 73 6f 6d 65 20 70 72 69 6f 72 20 69 6e  ng some prior in
14430 76 6f 63 61 74 69 6f 6e 2e 20 20 4e 6f 77 20 77  vocation.  Now w
14440 65 20 6a 75 73 74 20 68 61 76 65 20 74 6f 20 63  e just have to c
14450 75 73 74 6f 6d 69 7a 65 20 74 68 65 0a 20 20 2a  ustomize the.  *
14460 2a 20 64 65 74 61 69 6c 73 20 6f 66 20 70 49 64  * details of pId
14470 78 49 6e 66 6f 20 66 6f 72 20 74 68 65 20 63 75  xInfo for the cu
14480 72 72 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e  rrent invocation
14490 20 61 6e 64 20 70 61 73 73 20 69 74 20 74 6f 0a   and pass it to.
144a0 20 20 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 2e    ** xBestIndex.
144b0 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  .  */..  /* The 
144c0 6d 6f 64 75 6c 65 20 6e 61 6d 65 20 6d 75 73 74  module name must
144d0 20 62 65 20 64 65 66 69 6e 65 64 2e 20 41 6c 73   be defined. Als
144e0 6f 2c 20 62 79 20 74 68 69 73 20 70 6f 69 6e 74  o, by this point
144f0 20 74 68 65 72 65 20 6d 75 73 74 0a 20 20 2a 2a   there must.  **
14500 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   be a pointer to
14510 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62   an sqlite3_vtab
14520 20 73 74 72 75 63 74 75 72 65 2e 20 4f 74 68 65   structure. Othe
14530 72 77 69 73 65 0a 20 20 2a 2a 20 73 71 6c 69 74  rwise.  ** sqlit
14540 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
14550 61 6d 65 73 28 29 20 77 6f 75 6c 64 20 68 61 76  ames() would hav
14560 65 20 70 69 63 6b 65 64 20 75 70 20 74 68 65 20  e picked up the 
14570 65 72 72 6f 72 2e 20 0a 20 20 2a 2f 0a 20 20 61  error. .  */.  a
14580 73 73 65 72 74 28 20 70 54 61 62 2d 3e 61 7a 4d  ssert( pTab->azM
14590 6f 64 75 6c 65 41 72 67 20 26 26 20 70 54 61 62  oduleArg && pTab
145a0 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 30 5d  ->azModuleArg[0]
145b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
145c0 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 70  lite3GetVTable(p
145d0 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 29  Parse->db, pTab)
145e0 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68   );..  /* Set th
145f0 65 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e  e aConstraint[].
14600 75 73 61 62 6c 65 20 66 69 65 6c 64 73 20 61 6e  usable fields an
14610 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6c 6c  d initialize all
14620 20 0a 20 20 2a 2a 20 6f 75 74 70 75 74 20 76 61   .  ** output va
14630 72 69 61 62 6c 65 73 20 74 6f 20 7a 65 72 6f 2e  riables to zero.
14640 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 43 6f 6e 73  .  **.  ** aCons
14650 74 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c 65 20  traint[].usable 
14660 69 73 20 74 72 75 65 20 66 6f 72 20 63 6f 6e 73  is true for cons
14670 74 72 61 69 6e 74 73 20 77 68 65 72 65 20 74 68  traints where th
14680 65 20 72 69 67 68 74 2d 68 61 6e 64 0a 20 20 2a  e right-hand.  *
14690 2a 20 73 69 64 65 20 63 6f 6e 74 61 69 6e 73 20  * side contains 
146a0 6f 6e 6c 79 20 72 65 66 65 72 65 6e 63 65 73 20  only references 
146b0 74 6f 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  to tables to the
146c0 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63 75 72   left of the cur
146d0 72 65 6e 74 0a 20 20 2a 2a 20 74 61 62 6c 65 2e  rent.  ** table.
146e0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
146f0 2c 20 69 66 20 74 68 65 20 63 6f 6e 73 74 72 61  , if the constra
14700 69 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f  int is of the fo
14710 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  rm:.  **.  **   
14720 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 3d          column =
14730 20 65 78 70 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20   expr.  **.  ** 
14740 61 6e 64 20 77 65 20 61 72 65 20 65 76 61 6c 75  and we are evalu
14750 61 74 69 6e 67 20 61 20 6a 6f 69 6e 2c 20 74 68  ating a join, th
14760 65 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  en the constrain
14770 74 20 6f 6e 20 63 6f 6c 75 6d 6e 20 69 73 20 0a  t on column is .
14780 20 20 2a 2a 20 6f 6e 6c 79 20 76 61 6c 69 64 20    ** only valid 
14790 69 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 72 65  if all tables re
147a0 66 65 72 65 6e 63 65 64 20 69 6e 20 65 78 70 72  ferenced in expr
147b0 20 6f 63 63 75 72 20 74 6f 20 74 68 65 20 6c 65   occur to the le
147c0 66 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74  ft.  ** of the t
147d0 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
147e0 63 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a 0a 20 20 2a  column..  **.  *
147f0 2a 20 54 68 65 20 61 43 6f 6e 73 74 72 61 69 6e  * The aConstrain
14800 74 73 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61  ts[] array conta
14810 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20  ins entries for 
14820 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  all constraints.
14830 20 20 2a 2a 20 6f 6e 20 74 68 65 20 63 75 72 72    ** on the curr
14840 65 6e 74 20 74 61 62 6c 65 2e 20 20 54 68 61 74  ent table.  That
14850 20 77 61 79 20 77 65 20 6f 6e 6c 79 20 68 61 76   way we only hav
14860 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 69 74 20  e to compute it 
14870 6f 6e 63 65 0a 20 20 2a 2a 20 65 76 65 6e 20 74  once.  ** even t
14880 68 6f 75 67 68 20 77 65 20 6d 69 67 68 74 20 74  hough we might t
14890 72 79 20 74 6f 20 70 69 63 6b 20 74 68 65 20 62  ry to pick the b
148a0 65 73 74 20 69 6e 64 65 78 20 6d 75 6c 74 69 70  est index multip
148b0 6c 65 20 74 69 6d 65 73 2e 0a 20 20 2a 2a 20 46  le times..  ** F
148c0 6f 72 20 65 61 63 68 20 61 74 74 65 6d 70 74 20  or each attempt 
148d0 61 74 20 70 69 63 6b 69 6e 67 20 61 6e 20 69 6e  at picking an in
148e0 64 65 78 2c 20 74 68 65 20 6f 72 64 65 72 20 6f  dex, the order o
148f0 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 0a  f tables in the.
14900 20 20 2a 2a 20 6a 6f 69 6e 20 6d 69 67 68 74 20    ** join might 
14910 62 65 20 64 69 66 66 65 72 65 6e 74 20 73 6f 20  be different so 
14920 77 65 20 68 61 76 65 20 74 6f 20 72 65 63 6f 6d  we have to recom
14930 70 75 74 65 20 74 68 65 20 75 73 61 62 6c 65 20  pute the usable 
14940 66 6c 61 67 0a 20 20 2a 2a 20 65 61 63 68 20 74  flag.  ** each t
14950 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78  ime..  */.  pIdx
14960 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20  Cons = *(struct 
14970 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
14980 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
14990 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
149a0 74 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49  t;.  pUsage = pI
149b0 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
149c0 69 6e 74 55 73 61 67 65 3b 0a 20 20 66 6f 72 28  intUsage;.  for(
149d0 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d  i=0; i<pIdxInfo-
149e0 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
149f0 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a  +, pIdxCons++){.
14a00 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73      j = pIdxCons
14a10 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20  ->iTermOffset;. 
14a20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
14a30 3e 61 5b 6a 5d 3b 0a 20 20 20 20 70 49 64 78 43  >a[j];.    pIdxC
14a40 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70  ons->usable = (p
14a50 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
14a60 74 26 70 2d 3e 6e 6f 74 52 65 61 64 79 29 20 3f  t&p->notReady) ?
14a70 20 30 20 3a 20 31 3b 0a 20 20 7d 0a 20 20 6d 65   0 : 1;.  }.  me
14a80 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30 2c 20  mset(pUsage, 0, 
14a90 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b 30 5d  sizeof(pUsage[0]
14aa0 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  )*pIdxInfo->nCon
14ab0 73 74 72 61 69 6e 74 29 3b 0a 20 20 69 66 28 20  straint);.  if( 
14ac0 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
14ad0 46 72 65 65 49 64 78 53 74 72 20 29 7b 0a 20 20  FreeIdxStr ){.  
14ae0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
14af0 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29  IdxInfo->idxStr)
14b00 3b 0a 20 20 7d 0a 20 20 70 49 64 78 49 6e 66 6f  ;.  }.  pIdxInfo
14b10 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  ->idxStr = 0;.  
14b20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d  pIdxInfo->idxNum
14b30 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f   = 0;.  pIdxInfo
14b40 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
14b50 74 72 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e  tr = 0;.  pIdxIn
14b60 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75  fo->orderByConsu
14b70 6d 65 64 20 3d 20 30 3b 0a 20 20 2f 2a 20 28 28  med = 0;.  /* ((
14b80 64 6f 75 62 6c 65 29 32 29 20 49 6e 20 63 61 73  double)2) In cas
14b90 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  e of SQLITE_OMIT
14ba0 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e  _FLOATING_POINT.
14bb0 2e 2e 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f  .. */.  pIdxInfo
14bc0 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20  ->estimatedCost 
14bd0 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c  = SQLITE_BIG_DBL
14be0 20 2f 20 28 28 64 6f 75 62 6c 65 29 32 29 3b 0a   / ((double)2);.
14bf0 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 49 64    nOrderBy = pId
14c00 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 3b  xInfo->nOrderBy;
14c10 0a 20 20 69 66 28 20 21 70 2d 3e 70 4f 72 64 65  .  if( !p->pOrde
14c20 72 42 79 20 29 7b 0a 20 20 20 20 70 49 64 78 49  rBy ){.    pIdxI
14c30 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20  nfo->nOrderBy = 
14c40 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 76 74  0;.  }..  if( vt
14c50 61 62 42 65 73 74 49 6e 64 65 78 28 70 50 61 72  abBestIndex(pPar
14c60 73 65 2c 20 70 54 61 62 2c 20 70 49 64 78 49 6e  se, pTab, pIdxIn
14c70 66 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  fo) ){.    retur
14c80 6e 3b 0a 20 20 7d 0a 0a 20 20 70 49 64 78 43 6f  n;.  }..  pIdxCo
14c90 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71  ns = *(struct sq
14ca0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
14cb0 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
14cc0 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->aConstraint;
14cd0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
14ce0 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
14cf0 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  int; i++){.    i
14d00 66 28 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67  f( pUsage[i].arg
14d10 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20 20  vIndex>0 ){.    
14d20 20 20 70 2d 3e 63 6f 73 74 2e 75 73 65 64 20 7c    p->cost.used |
14d30 3d 20 70 57 43 2d 3e 61 5b 70 49 64 78 43 6f 6e  = pWC->a[pIdxCon
14d40 73 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  s[i].iTermOffset
14d50 5d 2e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20  ].prereqRight;. 
14d60 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
14d70 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
14d80 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 61  DER BY clause, a
14d90 6e 64 20 74 68 65 20 73 65 6c 65 63 74 65 64 20  nd the selected 
14da0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e  virtual table in
14db0 64 65 78 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f  dex.  ** does no
14dc0 74 20 73 61 74 69 73 66 79 20 69 74 2c 20 69 6e  t satisfy it, in
14dd0 63 72 65 61 73 65 20 74 68 65 20 63 6f 73 74 20  crease the cost 
14de0 6f 66 20 74 68 65 20 73 63 61 6e 20 61 63 63 6f  of the scan acco
14df0 72 64 69 6e 67 6c 79 2e 20 54 68 69 73 0a 20 20  rdingly. This.  
14e00 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20 70  ** matches the p
14e10 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 6e 6f  rocessing for no
14e20 6e 2d 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  n-virtual tables
14e30 20 69 6e 20 62 65 73 74 42 74 72 65 65 49 6e 64   in bestBtreeInd
14e40 65 78 28 29 2e 0a 20 20 2a 2f 0a 20 20 72 43 6f  ex()..  */.  rCo
14e50 73 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 65  st = pIdxInfo->e
14e60 73 74 69 6d 61 74 65 64 43 6f 73 74 3b 0a 20 20  stimatedCost;.  
14e70 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
14e80 26 26 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64  && pIdxInfo->ord
14e90 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 3d 30 20  erByConsumed==0 
14ea0 29 7b 0a 20 20 20 20 72 43 6f 73 74 20 2b 3d 20  ){.    rCost += 
14eb0 65 73 74 4c 6f 67 28 72 43 6f 73 74 29 2a 72 43  estLog(rCost)*rC
14ec0 6f 73 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  ost;.  }..  /* T
14ed0 68 65 20 63 6f 73 74 20 69 73 20 6e 6f 74 20 61  he cost is not a
14ee0 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 6c 61 72  llowed to be lar
14ef0 67 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  ger than SQLITE_
14f00 42 49 47 5f 44 42 4c 20 28 74 68 65 0a 20 20 2a  BIG_DBL (the.  *
14f10 2a 20 69 6e 69 74 61 6c 20 76 61 6c 75 65 20 6f  * inital value o
14f20 66 20 6c 6f 77 65 73 74 43 6f 73 74 20 69 6e 20  f lowestCost in 
14f30 74 68 69 73 20 6c 6f 6f 70 2e 20 49 66 20 69 74  this loop. If it
14f40 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20   is, then the.  
14f50 2a 2a 20 28 63 6f 73 74 3c 6c 6f 77 65 73 74 43  ** (cost<lowestC
14f60 6f 73 74 29 20 74 65 73 74 20 62 65 6c 6f 77 20  ost) test below 
14f70 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 74 72  will never be tr
14f80 75 65 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 55  ue..  ** .  ** U
14f90 73 65 20 22 28 64 6f 75 62 6c 65 29 32 22 20 69  se "(double)2" i
14fa0 6e 73 74 65 61 64 20 6f 66 20 22 32 2e 30 22 20  nstead of "2.0" 
14fb0 69 6e 20 63 61 73 65 20 4f 4d 49 54 5f 46 4c 4f  in case OMIT_FLO
14fc0 41 54 49 4e 47 5f 50 4f 49 4e 54 20 0a 20 20 2a  ATING_POINT .  *
14fd0 2a 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 20 20  * is defined..  
14fe0 2a 2f 0a 20 20 69 66 28 20 28 53 51 4c 49 54 45  */.  if( (SQLITE
14ff0 5f 42 49 47 5f 44 42 4c 2f 28 28 64 6f 75 62 6c  _BIG_DBL/((doubl
15000 65 29 32 29 29 3c 72 43 6f 73 74 20 29 7b 0a 20  e)2))<rCost ){. 
15010 20 20 20 70 2d 3e 63 6f 73 74 2e 72 43 6f 73 74     p->cost.rCost
15020 20 3d 20 28 53 51 4c 49 54 45 5f 42 49 47 5f 44   = (SQLITE_BIG_D
15030 42 4c 2f 28 28 64 6f 75 62 6c 65 29 32 29 29 3b  BL/((double)2));
15040 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d  .  }else{.    p-
15050 3e 63 6f 73 74 2e 72 43 6f 73 74 20 3d 20 72 43  >cost.rCost = rC
15060 6f 73 74 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 6f  ost;.  }.  p->co
15070 73 74 2e 70 6c 61 6e 2e 75 2e 70 56 74 61 62 49  st.plan.u.pVtabI
15080 64 78 20 3d 20 70 49 64 78 49 6e 66 6f 3b 0a 20  dx = pIdxInfo;. 
15090 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6f   if( pIdxInfo->o
150a0 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 29  rderByConsumed )
150b0 7b 0a 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c  {.    p->cost.pl
150c0 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  an.wsFlags |= WH
150d0 45 52 45 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20  ERE_ORDERED;.   
150e0 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 4f   p->cost.plan.nO
150f0 42 53 61 74 20 3d 20 6e 4f 72 64 65 72 42 79 3b  BSat = nOrderBy;
15100 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d  .  }else{.    p-
15110 3e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 4f 42 53 61  >cost.plan.nOBSa
15120 74 20 3d 20 70 2d 3e 69 20 3f 20 70 2d 3e 61 4c  t = p->i ? p->aL
15130 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d 2e 70 6c 61  evel[p->i-1].pla
15140 6e 2e 6e 4f 42 53 61 74 20 3a 20 30 3b 0a 20 20  n.nOBSat : 0;.  
15150 7d 0a 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e  }.  p->cost.plan
15160 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 70 49 64 78  .nEq = 0;.  pIdx
15170 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d  Info->nOrderBy =
15180 20 6e 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a   nOrderBy;..  /*
15190 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61 20 6d   Try to find a m
151a0 6f 72 65 20 65 66 66 69 63 69 65 6e 74 20 61 63  ore efficient ac
151b0 63 65 73 73 20 70 61 74 74 65 72 6e 20 62 79 20  cess pattern by 
151c0 75 73 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 69  using multiple i
151d0 6e 64 65 78 65 73 0a 20 20 2a 2a 20 74 6f 20 6f  ndexes.  ** to o
151e0 70 74 69 6d 69 7a 65 20 61 6e 20 4f 52 20 65 78  ptimize an OR ex
151f0 70 72 65 73 73 69 6f 6e 20 77 69 74 68 69 6e 20  pression within 
15200 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
15210 2e 20 0a 20 20 2a 2f 0a 20 20 62 65 73 74 4f 72  . .  */.  bestOr
15220 43 6c 61 75 73 65 49 6e 64 65 78 28 70 29 3b 0a  ClauseIndex(p);.
15230 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
15240 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
15250 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20  ABLE */..#ifdef 
15260 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
15270 41 54 33 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  AT3./*.** Estima
15280 74 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20  te the location 
15290 6f 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  of a particular 
152a0 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65  key among all ke
152b0 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65  ys in an.** inde
152c0 78 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72 65  x.  Store the re
152d0 73 75 6c 74 73 20 69 6e 20 61 53 74 61 74 20 61  sults in aStat a
152e0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
152f0 20 20 20 20 61 53 74 61 74 5b 30 5d 20 20 20 20      aStat[0]    
15300 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66    Est. number of
15310 20 72 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20   rows less than 
15320 70 56 61 6c 0a 2a 2a 20 20 20 20 61 53 74 61 74  pVal.**    aStat
15330 5b 31 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75  [1]      Est. nu
15340 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 71 75  mber of rows equ
15350 61 6c 20 74 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a  al to pVal.**.**
15360 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
15370 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f  K on success..*/
15380 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
15390 65 4b 65 79 53 74 61 74 73 28 0a 20 20 50 61 72  eKeyStats(.  Par
153a0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
153b0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
153c0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
153d0 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
153e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
153f0 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e   /* Index to con
15400 73 69 64 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20  sider domain of 
15410 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
15420 75 65 20 2a 70 56 61 6c 2c 20 20 20 20 20 20 20  ue *pVal,       
15430 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 63 6f 6e   /* Value to con
15440 73 69 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  sider */.  int r
15450 6f 75 6e 64 55 70 2c 20 20 20 20 20 20 20 20 20  oundUp,         
15460 20 20 20 20 20 20 20 2f 2a 20 52 6f 75 6e 64 20         /* Round 
15470 75 70 20 69 66 20 74 72 75 65 2e 20 20 52 6f 75  up if true.  Rou
15480 6e 64 20 64 6f 77 6e 20 69 66 20 66 61 6c 73 65  nd down if false
15490 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61   */.  tRowcnt *a
154a0 53 74 61 74 20 20 20 20 20 20 20 20 20 20 20 20  Stat            
154b0 20 20 2f 2a 20 4f 55 54 3a 20 73 74 61 74 73 20    /* OUT: stats 
154c0 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
154d0 29 7b 0a 20 20 74 52 6f 77 63 6e 74 20 6e 3b 0a  ){.  tRowcnt n;.
154e0 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61    IndexSample *a
154f0 53 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20 69 2c  Sample;.  int i,
15500 20 65 54 79 70 65 3b 0a 20 20 69 6e 74 20 69 73   eType;.  int is
15510 45 71 20 3d 20 30 3b 0a 20 20 69 36 34 20 76 3b  Eq = 0;.  i64 v;
15520 0a 20 20 64 6f 75 62 6c 65 20 72 2c 20 72 53 3b  .  double r, rS;
15530 0a 0a 20 20 61 73 73 65 72 74 28 20 72 6f 75 6e  ..  assert( roun
15540 64 55 70 3d 3d 30 20 7c 7c 20 72 6f 75 6e 64 55  dUp==0 || roundU
15550 70 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  p==1 );.  assert
15560 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3e  ( pIdx->nSample>
15570 30 20 29 3b 0a 20 20 69 66 28 20 70 56 61 6c 3d  0 );.  if( pVal=
15580 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
15590 54 45 5f 45 52 52 4f 52 3b 0a 20 20 6e 20 3d 20  TE_ERROR;.  n = 
155a0 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 5b 30  pIdx->aiRowEst[0
155b0 5d 3b 0a 20 20 61 53 61 6d 70 6c 65 20 3d 20 70  ];.  aSample = p
155c0 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20 20  Idx->aSample;.  
155d0 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 5f  eType = sqlite3_
155e0 76 61 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29  value_type(pVal)
155f0 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  ;..  if( eType==
15600 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29  SQLITE_INTEGER )
15610 7b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  {.    v = sqlite
15620 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 70 56  3_value_int64(pV
15630 61 6c 29 3b 0a 20 20 20 20 72 20 3d 20 28 69 36  al);.    r = (i6
15640 34 29 76 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  4)v;.    for(i=0
15650 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  ; i<pIdx->nSampl
15660 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  e; i++){.      i
15670 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54  f( aSample[i].eT
15680 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ype==SQLITE_NULL
15690 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
156a0 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69     if( aSample[i
156b0 5d 2e 65 54 79 70 65 3e 3d 53 51 4c 49 54 45 5f  ].eType>=SQLITE_
156c0 54 45 58 54 20 29 20 62 72 65 61 6b 3b 0a 20 20  TEXT ) break;.  
156d0 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b      if( aSample[
156e0 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  i].eType==SQLITE
156f0 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
15700 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b      if( aSample[
15710 69 5d 2e 75 2e 69 3e 3d 76 20 29 7b 0a 20 20 20  i].u.i>=v ){.   
15720 20 20 20 20 20 20 20 69 73 45 71 20 3d 20 61 53         isEq = aS
15730 61 6d 70 6c 65 5b 69 5d 2e 75 2e 69 3d 3d 76 3b  ample[i].u.i==v;
15740 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
15750 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15760 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15770 20 61 73 73 65 72 74 28 20 61 53 61 6d 70 6c 65   assert( aSample
15780 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54  [i].eType==SQLIT
15790 45 5f 46 4c 4f 41 54 20 29 3b 0a 20 20 20 20 20  E_FLOAT );.     
157a0 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69     if( aSample[i
157b0 5d 2e 75 2e 72 3e 3d 72 20 29 7b 0a 20 20 20 20  ].u.r>=r ){.    
157c0 20 20 20 20 20 20 69 73 45 71 20 3d 20 61 53 61        isEq = aSa
157d0 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3d 3d 72 3b 0a  mple[i].u.r==r;.
157e0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
157f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15800 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
15810 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49   if( eType==SQLI
15820 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20  TE_FLOAT ){.    
15830 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  r = sqlite3_valu
15840 65 5f 64 6f 75 62 6c 65 28 70 56 61 6c 29 3b 0a  e_double(pVal);.
15850 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
15860 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b  Idx->nSample; i+
15870 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53  +){.      if( aS
15880 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d  ample[i].eType==
15890 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 63 6f  SQLITE_NULL ) co
158a0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
158b0 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79  ( aSample[i].eTy
158c0 70 65 3e 3d 53 51 4c 49 54 45 5f 54 45 58 54 20  pe>=SQLITE_TEXT 
158d0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
158e0 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54  f( aSample[i].eT
158f0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41  ype==SQLITE_FLOA
15900 54 20 29 7b 0a 20 20 20 20 20 20 20 20 72 53 20  T ){.        rS 
15910 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72  = aSample[i].u.r
15920 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
15930 20 20 20 20 20 20 20 72 53 20 3d 20 61 53 61 6d         rS = aSam
15940 70 6c 65 5b 69 5d 2e 75 2e 69 3b 0a 20 20 20 20  ple[i].u.i;.    
15950 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 53    }.      if( rS
15960 3e 3d 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69  >=r ){.        i
15970 73 45 71 20 3d 20 72 53 3d 3d 72 3b 0a 20 20 20  sEq = rS==r;.   
15980 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15990 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
159a0 65 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c  e if( eType==SQL
159b0 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ITE_NULL ){.    
159c0 69 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 61  i = 0;.    if( a
159d0 53 61 6d 70 6c 65 5b 30 5d 2e 65 54 79 70 65 3d  Sample[0].eType=
159e0 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 69  =SQLITE_NULL ) i
159f0 73 45 71 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  sEq = 1;.  }else
15a00 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 54  {.    assert( eT
15a10 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54  ype==SQLITE_TEXT
15a20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
15a30 45 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 66 6f  E_BLOB );.    fo
15a40 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
15a50 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20  Sample; i++){.  
15a60 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b      if( aSample[
15a70 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  i].eType==SQLITE
15a80 5f 54 45 58 54 20 7c 7c 20 61 53 61 6d 70 6c 65  _TEXT || aSample
15a90 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54  [i].eType==SQLIT
15aa0 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20  E_BLOB ){.      
15ab0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
15ac0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
15ad0 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29  <pIdx->nSample )
15ae0 7b 20 20 20 20 20 20 0a 20 20 20 20 20 20 73 71  {      .      sq
15af0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
15b00 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 43 6f  se->db;.      Co
15b10 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
15b20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 3b      const u8 *z;
15b30 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
15b40 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b  ==SQLITE_BLOB ){
15b50 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 28 63 6f  .        z = (co
15b60 6e 73 74 20 75 38 20 2a 29 73 71 6c 69 74 65 33  nst u8 *)sqlite3
15b70 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70 56 61 6c  _value_blob(pVal
15b80 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  );.        pColl
15b90 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
15ba0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
15bb0 28 20 70 43 6f 6c 6c 2d 3e 65 6e 63 3d 3d 53 51  ( pColl->enc==SQ
15bc0 4c 49 54 45 5f 55 54 46 38 20 29 3b 0a 20 20 20  LITE_UTF8 );.   
15bd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15be0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
15bf0 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  3GetCollSeq(pPar
15c00 73 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  se, SQLITE_UTF8,
15c10 20 30 2c 20 2a 70 49 64 78 2d 3e 61 7a 43 6f 6c   0, *pIdx->azCol
15c20 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
15c30 70 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  pColl==0 ){.    
15c40 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
15c50 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
15c60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 20 3d     }.        z =
15c70 20 28 63 6f 6e 73 74 20 75 38 20 2a 29 73 71 6c   (const u8 *)sql
15c80 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 56  ite3ValueText(pV
15c90 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b  al, pColl->enc);
15ca0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 20  .        if( !z 
15cb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
15cc0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
15cd0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15ce0 20 20 20 20 61 73 73 65 72 74 28 20 7a 20 26 26      assert( z &&
15cf0 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d   pColl && pColl-
15d00 3e 78 43 6d 70 20 29 3b 0a 20 20 20 20 20 20 7d  >xCmp );.      }
15d10 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  .      n = sqlit
15d20 65 33 56 61 6c 75 65 42 79 74 65 73 28 70 56 61  e3ValueBytes(pVa
15d30 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a  l, pColl->enc);.
15d40 20 20 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 69    .      for(; i
15d50 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20  <pIdx->nSample; 
15d60 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
15d70 74 20 63 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  t c;.        int
15d80 20 65 53 61 6d 70 6c 65 74 79 70 65 20 3d 20 61   eSampletype = a
15d90 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3b  Sample[i].eType;
15da0 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 53 61  .        if( eSa
15db0 6d 70 6c 65 74 79 70 65 3c 65 54 79 70 65 20 29  mpletype<eType )
15dc0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
15dd0 20 20 20 69 66 28 20 65 53 61 6d 70 6c 65 74 79     if( eSamplety
15de0 70 65 21 3d 65 54 79 70 65 20 29 20 62 72 65 61  pe!=eType ) brea
15df0 6b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  k;.#ifndef SQLIT
15e00 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20  E_OMIT_UTF16.   
15e10 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 2d 3e       if( pColl->
15e20 65 6e 63 21 3d 53 51 4c 49 54 45 5f 55 54 46 38  enc!=SQLITE_UTF8
15e30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
15e40 74 20 6e 53 61 6d 70 6c 65 3b 0a 20 20 20 20 20  t nSample;.     
15e50 20 20 20 20 20 63 68 61 72 20 2a 7a 53 61 6d 70       char *zSamp
15e60 6c 65 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38  le = sqlite3Utf8
15e70 74 6f 31 36 28 0a 20 20 20 20 20 20 20 20 20 20  to16(.          
15e80 20 20 20 20 64 62 2c 20 70 43 6f 6c 6c 2d 3e 65      db, pColl->e
15e90 6e 63 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75  nc, aSample[i].u
15ea0 2e 7a 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e  .z, aSample[i].n
15eb0 42 79 74 65 2c 20 26 6e 53 61 6d 70 6c 65 0a 20  Byte, &nSample. 
15ec0 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
15ed0 20 20 20 20 20 20 69 66 28 20 21 7a 53 61 6d 70        if( !zSamp
15ee0 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  le ){.          
15ef0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
15f00 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
15f10 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
15f20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
15f30 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15f40 20 20 20 20 20 63 20 3d 20 70 43 6f 6c 6c 2d 3e       c = pColl->
15f50 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65  xCmp(pColl->pUse
15f60 72 2c 20 6e 53 61 6d 70 6c 65 2c 20 7a 53 61 6d  r, nSample, zSam
15f70 70 6c 65 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20  ple, n, z);.    
15f80 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
15f90 72 65 65 28 64 62 2c 20 7a 53 61 6d 70 6c 65 29  ree(db, zSample)
15fa0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  ;.        }else.
15fb0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b  #endif.        {
15fc0 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 70  .          c = p
15fd0 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c  Coll->xCmp(pColl
15fe0 2d 3e 70 55 73 65 72 2c 20 61 53 61 6d 70 6c 65  ->pUser, aSample
15ff0 5b 69 5d 2e 6e 42 79 74 65 2c 20 61 53 61 6d 70  [i].nByte, aSamp
16000 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 6e 2c 20 7a 29  le[i].u.z, n, z)
16010 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16020 20 20 20 20 69 66 28 20 63 3e 3d 30 20 29 7b 0a      if( c>=0 ){.
16030 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d            if( c=
16040 3d 30 20 29 20 69 73 45 71 20 3d 20 31 3b 0a 20  =0 ) isEq = 1;. 
16050 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
16060 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16070 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
16080 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
16090 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74   aSample[i] is t
160a0 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20  he first sample 
160b0 74 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20  that is greater 
160c0 74 68 61 6e 0a 20 20 2a 2a 20 6f 72 20 65 71 75  than.  ** or equ
160d0 61 6c 20 74 6f 20 70 56 61 6c 2e 20 20 4f 72 20  al to pVal.  Or 
160e0 69 66 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d  if i==pIdx->nSam
160f0 70 6c 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 61  ple, then all sa
16100 6d 70 6c 65 73 20 61 72 65 20 6c 65 73 73 0a 20  mples are less. 
16110 20 2a 2a 20 74 68 61 6e 20 70 56 61 6c 2e 20 20   ** than pVal.  
16120 49 66 20 61 53 61 6d 70 6c 65 5b 69 5d 3d 3d 70  If aSample[i]==p
16130 56 61 6c 2c 20 74 68 65 6e 20 69 73 45 71 3d 3d  Val, then isEq==
16140 31 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  1..  */.  if( is
16150 45 71 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  Eq ){.    assert
16160 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  ( i<pIdx->nSampl
16170 65 20 29 3b 0a 20 20 20 20 61 53 74 61 74 5b 30  e );.    aStat[0
16180 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e  ] = aSample[i].n
16190 4c 74 3b 0a 20 20 20 20 61 53 74 61 74 5b 31 5d  Lt;.    aStat[1]
161a0 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 45   = aSample[i].nE
161b0 71 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  q;.  }else{.    
161c0 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 2c 20  tRowcnt iLower, 
161d0 69 55 70 70 65 72 2c 20 69 47 61 70 3b 0a 20 20  iUpper, iGap;.  
161e0 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20    if( i==0 ){.  
161f0 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a      iLower = 0;.
16200 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 61        iUpper = a
16210 53 61 6d 70 6c 65 5b 30 5d 2e 6e 4c 74 3b 0a 20  Sample[0].nLt;. 
16220 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16230 69 55 70 70 65 72 20 3d 20 69 3e 3d 70 49 64 78  iUpper = i>=pIdx
16240 2d 3e 6e 53 61 6d 70 6c 65 20 3f 20 6e 20 3a 20  ->nSample ? n : 
16250 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 4c 74 3b 0a  aSample[i].nLt;.
16260 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61        iLower = a
16270 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 45 71 20  Sample[i-1].nEq 
16280 2b 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e  + aSample[i-1].n
16290 4c 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53  Lt;.    }.    aS
162a0 74 61 74 5b 31 5d 20 3d 20 70 49 64 78 2d 3e 61  tat[1] = pIdx->a
162b0 76 67 45 71 3b 0a 20 20 20 20 69 66 28 20 69 4c  vgEq;.    if( iL
162c0 6f 77 65 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a  ower>=iUpper ){.
162d0 20 20 20 20 20 20 69 47 61 70 20 3d 20 30 3b 0a        iGap = 0;.
162e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
162f0 20 69 47 61 70 20 3d 20 69 55 70 70 65 72 20 2d   iGap = iUpper -
16300 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20 7d 0a 20   iLower;.    }. 
16310 20 20 20 69 66 28 20 72 6f 75 6e 64 55 70 20 29     if( roundUp )
16320 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 28  {.      iGap = (
16330 69 47 61 70 2a 32 29 2f 33 3b 0a 20 20 20 20 7d  iGap*2)/3;.    }
16340 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70  else{.      iGap
16350 20 3d 20 69 47 61 70 2f 33 3b 0a 20 20 20 20 7d   = iGap/3;.    }
16360 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20  .    aStat[0] = 
16370 69 4c 6f 77 65 72 20 2b 20 69 47 61 70 3b 0a 20  iLower + iGap;. 
16380 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
16390 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
163a0 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
163b0 5f 53 54 41 54 33 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _STAT3 */../*.**
163c0 20 49 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70   If expression p
163d0 45 78 70 72 20 72 65 70 72 65 73 65 6e 74 73 20  Expr represents 
163e0 61 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 2c  a literal value,
163f0 20 73 65 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e   set *pp to poin
16400 74 20 74 6f 0a 2a 2a 20 61 6e 20 73 71 6c 69 74  t to.** an sqlit
16410 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75  e3_value structu
16420 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  re containing th
16430 65 20 73 61 6d 65 20 76 61 6c 75 65 2c 20 77 69  e same value, wi
16440 74 68 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 61  th affinity.** a
16450 66 66 20 61 70 70 6c 69 65 64 20 74 6f 20 69 74  ff applied to it
16460 2c 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  , before returni
16470 6e 67 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ng. It is the re
16480 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
16490 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 74  the .** caller t
164a0 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c  o eventually rel
164b0 65 61 73 65 20 74 68 69 73 20 73 74 72 75 63 74  ease this struct
164c0 75 72 65 20 62 79 20 70 61 73 73 69 6e 67 20 69  ure by passing i
164d0 74 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33  t to .** sqlite3
164e0 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2a 0a  ValueFree()..**.
164f0 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
16500 74 20 70 61 72 73 65 20 69 73 20 61 20 72 65 63  t parse is a rec
16510 6f 6d 70 69 6c 65 20 28 73 71 6c 69 74 65 33 52  ompile (sqlite3R
16520 65 70 72 65 70 61 72 65 28 29 29 20 61 6e 64 20  eprepare()) and 
16530 70 45 78 70 72 0a 2a 2a 20 69 73 20 61 6e 20 53  pExpr.** is an S
16540 51 4c 20 76 61 72 69 61 62 6c 65 20 74 68 61 74  QL variable that
16550 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61   currently has a
16560 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20   non-NULL value 
16570 62 6f 75 6e 64 20 74 6f 20 69 74 2c 0a 2a 2a 20  bound to it,.** 
16580 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65  create an sqlite
16590 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75 72  3_value structur
165a0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69  e containing thi
165b0 73 20 76 61 6c 75 65 2c 20 61 67 61 69 6e 20 77  s value, again w
165c0 69 74 68 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20  ith.** affinity 
165d0 61 66 66 20 61 70 70 6c 69 65 64 20 74 6f 20 69  aff applied to i
165e0 74 2c 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  t, instead..**.*
165f0 2a 20 49 66 20 6e 65 69 74 68 65 72 20 6f 66 20  * If neither of 
16600 74 68 65 20 61 62 6f 76 65 20 61 70 70 6c 79 2c  the above apply,
16610 20 73 65 74 20 2a 70 70 20 74 6f 20 4e 55 4c 4c   set *pp to NULL
16620 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
16630 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
16640 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
16650 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
16660 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 23 69 66 64 65  ITE_OK..*/.#ifde
16670 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
16680 53 54 41 54 33 0a 73 74 61 74 69 63 20 69 6e 74  STAT3.static int
16690 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 0a   valueFromExpr(.
166a0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
166b0 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c   .  Expr *pExpr,
166c0 20 0a 20 20 75 38 20 61 66 66 2c 20 0a 20 20 73   .  u8 aff, .  s
166d0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 70  qlite3_value **p
166e0 70 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  p.){.  if( pExpr
166f0 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  ->op==TK_VARIABL
16700 45 0a 20 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e  E.   || (pExpr->
16710 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
16720 26 26 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54  && pExpr->op2==T
16730 4b 5f 56 41 52 49 41 42 4c 45 29 0a 20 20 29 7b  K_VARIABLE).  ){
16740 0a 20 20 20 20 69 6e 74 20 69 56 61 72 20 3d 20  .    int iVar = 
16750 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
16760 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
16770 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65  etVarmask(pParse
16780 2d 3e 70 56 64 62 65 2c 20 69 56 61 72 29 3b 0a  ->pVdbe, iVar);.
16790 20 20 20 20 2a 70 70 20 3d 20 73 71 6c 69 74 65      *pp = sqlite
167a0 33 56 64 62 65 47 65 74 56 61 6c 75 65 28 70 50  3VdbeGetValue(pP
167b0 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65  arse->pReprepare
167c0 2c 20 69 56 61 72 2c 20 61 66 66 29 3b 0a 20 20  , iVar, aff);.  
167d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
167e0 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OK;.  }.  return
167f0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 6f   sqlite3ValueFro
16800 6d 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62  mExpr(pParse->db
16810 2c 20 70 45 78 70 72 2c 20 53 51 4c 49 54 45 5f  , pExpr, SQLITE_
16820 55 54 46 38 2c 20 61 66 66 2c 20 70 70 29 3b 0a  UTF8, aff, pp);.
16830 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
16840 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
16850 20 75 73 65 64 20 74 6f 20 65 73 74 69 6d 61 74   used to estimat
16860 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
16870 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62  rows that will b
16880 65 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20  e visited.** by 
16890 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65  scanning an inde
168a0 78 20 66 6f 72 20 61 20 72 61 6e 67 65 20 6f 66  x for a range of
168b0 20 76 61 6c 75 65 73 2e 20 54 68 65 20 72 61 6e   values. The ran
168c0 67 65 20 6d 61 79 20 68 61 76 65 20 61 6e 20 75  ge may have an u
168d0 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61  pper.** bound, a
168e0 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72   lower bound, or
168f0 20 62 6f 74 68 2e 20 54 68 65 20 57 48 45 52 45   both. The WHERE
16900 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68   clause terms th
16910 61 74 20 73 65 74 20 74 68 65 20 75 70 70 65 72  at set the upper
16920 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f  .** and lower bo
16930 75 6e 64 73 20 61 72 65 20 72 65 70 72 65 73 65  unds are represe
16940 6e 74 65 64 20 62 79 20 70 4c 6f 77 65 72 20 61  nted by pLower a
16950 6e 64 20 70 55 70 70 65 72 20 72 65 73 70 65 63  nd pUpper respec
16960 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65  tively. For.** e
16970 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67  xample, assuming
16980 20 74 68 61 74 20 69 6e 64 65 78 20 70 20 69 73   that index p is
16990 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a   on t1(a):.**.**
169a0 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57     ... FROM t1 W
169b0 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61  HERE a > ? AND a
169c0 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20   < ? ....**     
169d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
169e0 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c  _____|   |_____|
169f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
16a00 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
16a10 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20      |.**        
16a20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f               pLo
16a30 77 65 72 20 20 20 20 70 55 70 70 65 72 0a 2a 2a  wer    pUpper.**
16a40 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66  .** If either of
16a50 20 74 68 65 20 75 70 70 65 72 20 6f 72 20 6c 6f   the upper or lo
16a60 77 65 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74  wer bound is not
16a70 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e   present, then N
16a80 55 4c 4c 20 69 73 20 70 61 73 73 65 64 20 69 6e  ULL is passed in
16a90 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74 68 65  .** place of the
16aa0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57   corresponding W
16ab0 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
16ac0 54 68 65 20 6e 45 71 20 70 61 72 61 6d 65 74 65  The nEq paramete
16ad0 72 20 69 73 20 70 61 73 73 65 64 20 74 68 65 20  r is passed the 
16ae0 69 6e 64 65 78 20 6f 66 20 74 68 65 20 69 6e 64  index of the ind
16af0 65 78 20 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63  ex column subjec
16b00 74 20 74 6f 20 74 68 65 0a 2a 2a 20 72 61 6e 67  t to the.** rang
16b10 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72  e constraint. Or
16b20 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20  , equivalently, 
16b30 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 71  the number of eq
16b40 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
16b50 74 73 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 20  ts.** optimized 
16b60 62 79 20 74 68 65 20 70 72 6f 70 6f 73 65 64 20  by the proposed 
16b70 69 6e 64 65 78 20 73 63 61 6e 2e 20 46 6f 72 20  index scan. For 
16b80 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e  example, assumin
16b90 67 20 69 6e 64 65 78 20 70 20 69 73 0a 2a 2a 20  g index p is.** 
16ba0 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20 61 6e 64  on t1(a, b), and
16bb0 20 74 68 65 20 53 51 4c 20 71 75 65 72 79 20 69   the SQL query i
16bc0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46  s:.**.**   ... F
16bd0 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d  ROM t1 WHERE a =
16be0 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44   ? AND b > ? AND
16bf0 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a   b < ? ....**.**
16c00 20 74 68 65 6e 20 6e 45 71 20 73 68 6f 75 6c 64   then nEq should
16c10 20 62 65 20 70 61 73 73 65 64 20 74 68 65 20 76   be passed the v
16c20 61 6c 75 65 20 31 20 28 61 73 20 74 68 65 20 72  alue 1 (as the r
16c30 61 6e 67 65 20 72 65 73 74 72 69 63 74 65 64 20  ange restricted 
16c40 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 62 2c 20 69 73  column,.** b, is
16c50 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 65 66 74   the second left
16c60 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  -most column of 
16c70 74 68 65 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20  the index). Or, 
16c80 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73 3a  if the query is:
16c90 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f  .**.**   ... FRO
16ca0 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f  M t1 WHERE a > ?
16cb0 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a   AND a < ? ....*
16cc0 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 73 68  *.** then nEq sh
16cd0 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 30  ould be passed 0
16ce0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
16cf0 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 61 6e  rned value is an
16d00 20 69 6e 74 65 67 65 72 20 64 69 76 69 73 6f 72   integer divisor
16d10 20 74 6f 20 72 65 64 75 63 65 20 74 68 65 20 65   to reduce the e
16d20 73 74 69 6d 61 74 65 64 0a 2a 2a 20 73 65 61 72  stimated.** sear
16d30 63 68 20 73 70 61 63 65 2e 20 20 41 20 72 65 74  ch space.  A ret
16d40 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 31 20 6d  urn value of 1 m
16d50 65 61 6e 73 20 74 68 61 74 20 72 61 6e 67 65 20  eans that range 
16d60 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 0a  constraints are.
16d70 2a 2a 20 6e 6f 20 68 65 6c 70 20 61 74 20 61 6c  ** no help at al
16d80 6c 2e 20 20 41 20 72 65 74 75 72 6e 20 76 61 6c  l.  A return val
16d90 75 65 20 6f 66 20 32 20 6d 65 61 6e 73 20 72 61  ue of 2 means ra
16da0 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  nge constraints 
16db0 61 72 65 0a 2a 2a 20 65 78 70 65 63 74 65 64 20  are.** expected 
16dc0 74 6f 20 72 65 64 75 63 65 20 74 68 65 20 73 65  to reduce the se
16dd0 61 72 63 68 20 73 70 61 63 65 20 62 79 20 68 61  arch space by ha
16de0 6c 66 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74  lf.  And so fort
16df0 68 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  h....**.** In th
16e00 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73 71 6c  e absence of sql
16e10 69 74 65 5f 73 74 61 74 33 20 41 4e 41 4c 59 5a  ite_stat3 ANALYZ
16e20 45 20 64 61 74 61 2c 20 65 61 63 68 20 72 61 6e  E data, each ran
16e30 67 65 20 69 6e 65 71 75 61 6c 69 74 79 0a 2a 2a  ge inequality.**
16e40 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61   reduces the sea
16e50 72 63 68 20 73 70 61 63 65 20 62 79 20 61 20 66  rch space by a f
16e60 61 63 74 6f 72 20 6f 66 20 34 2e 20 20 48 65 6e  actor of 4.  Hen
16e70 63 65 20 61 20 73 69 6e 67 6c 65 20 63 6f 6e 73  ce a single cons
16e80 74 72 61 69 6e 74 20 28 78 3e 3f 29 0a 2a 2a 20  traint (x>?).** 
16e90 72 65 73 75 6c 74 73 20 69 6e 20 61 20 72 65 74  results in a ret
16ea0 75 72 6e 20 6f 66 20 34 20 61 6e 64 20 61 20 72  urn of 4 and a r
16eb0 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ange constraint 
16ec0 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65  (x>? AND x<?) re
16ed0 73 75 6c 74 73 0a 2a 2a 20 69 6e 20 61 20 72 65  sults.** in a re
16ee0 74 75 72 6e 20 6f 66 20 31 36 2e 0a 2a 2f 0a 73  turn of 16..*/.s
16ef0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 52  tatic int whereR
16f00 61 6e 67 65 53 63 61 6e 45 73 74 28 0a 20 20 50  angeScanEst(.  P
16f10 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
16f20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26      /* Parsing &
16f30 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
16f40 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e   context */.  In
16f50 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
16f60 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
16f70 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72  containing the r
16f80 61 6e 67 65 2d 63 6f 6d 70 61 72 65 64 20 63 6f  ange-compared co
16f90 6c 75 6d 6e 3b 20 22 78 22 20 2a 2f 0a 20 20 69  lumn; "x" */.  i
16fa0 6e 74 20 6e 45 71 2c 20 20 20 20 20 20 20 20 20  nt nEq,         
16fb0 20 20 20 20 2f 2a 20 69 6e 64 65 78 20 69 6e 74      /* index int
16fc0 6f 20 70 2d 3e 61 43 6f 6c 5b 5d 20 6f 66 20 74  o p->aCol[] of t
16fd0 68 65 20 72 61 6e 67 65 2d 63 6f 6d 70 61 72 65  he range-compare
16fe0 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68  d column */.  Wh
16ff0 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c  ereTerm *pLower,
17000 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e     /* Lower boun
17010 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20  d on the range. 
17020 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68  ex: "x>123" Migh
17030 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57  t be NULL */.  W
17040 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72  hereTerm *pUpper
17050 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75  ,   /* Upper bou
17060 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e  nd on the range.
17070 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67   ex: "x<455" Mig
17080 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
17090 64 6f 75 62 6c 65 20 2a 70 52 61 6e 67 65 44 69  double *pRangeDi
170a0 76 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 64 75  v   /* OUT: Redu
170b0 63 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20  ce search space 
170c0 62 79 20 74 68 69 73 20 64 69 76 69 73 6f 72 20  by this divisor 
170d0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
170e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66   SQLITE_OK;..#if
170f0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
17100 45 5f 53 54 41 54 33 0a 0a 20 20 69 66 28 20 6e  E_STAT3..  if( n
17110 45 71 3d 3d 30 20 26 26 20 70 2d 3e 6e 53 61 6d  Eq==0 && p->nSam
17120 70 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ple ){.    sqlit
17130 65 33 5f 76 61 6c 75 65 20 2a 70 52 61 6e 67 65  e3_value *pRange
17140 56 61 6c 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74  Val;.    tRowcnt
17150 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20   iLower = 0;.   
17160 20 74 52 6f 77 63 6e 74 20 69 55 70 70 65 72 20   tRowcnt iUpper 
17170 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d  = p->aiRowEst[0]
17180 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 61 5b  ;.    tRowcnt a[
17190 32 5d 3b 0a 20 20 20 20 75 38 20 61 66 66 20 3d  2];.    u8 aff =
171a0 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c   p->pTable->aCol
171b0 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 5d  [p->aiColumn[0]]
171c0 2e 61 66 66 69 6e 69 74 79 3b 0a 0a 20 20 20 20  .affinity;..    
171d0 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20  if( pLower ){.  
171e0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
171f0 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d  = pLower->pExpr-
17200 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 72  >pRight;.      r
17210 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78 70  c = valueFromExp
17220 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  r(pParse, pExpr,
17230 20 61 66 66 2c 20 26 70 52 61 6e 67 65 56 61 6c   aff, &pRangeVal
17240 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
17250 20 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74   pLower->eOperat
17260 6f 72 3d 3d 57 4f 5f 47 54 20 7c 7c 20 70 4c 6f  or==WO_GT || pLo
17270 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  wer->eOperator==
17280 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 69  WO_GE );.      i
17290 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
172a0 0a 20 20 20 20 20 20 20 26 26 20 77 68 65 72 65  .       && where
172b0 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
172c0 20 70 2c 20 70 52 61 6e 67 65 56 61 6c 2c 20 30   p, pRangeVal, 0
172d0 2c 20 61 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  , a)==SQLITE_OK.
172e0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
172f0 20 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d 3b 0a   iLower = a[0];.
17300 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 6f 77          if( pLow
17310 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  er->eOperator==W
17320 4f 5f 47 54 20 29 20 69 4c 6f 77 65 72 20 2b 3d  O_GT ) iLower +=
17330 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 20   a[1];.      }. 
17340 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
17350 65 46 72 65 65 28 70 52 61 6e 67 65 56 61 6c 29  eFree(pRangeVal)
17360 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17370 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
17380 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20   pUpper ){.     
17390 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
173a0 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Upper->pExpr->pR
173b0 69 67 68 74 3b 0a 20 20 20 20 20 20 72 63 20 3d  ight;.      rc =
173c0 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70   valueFromExpr(p
173d0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 61 66  Parse, pExpr, af
173e0 66 2c 20 26 70 52 61 6e 67 65 56 61 6c 29 3b 0a  f, &pRangeVal);.
173f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 55        assert( pU
17400 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  pper->eOperator=
17410 3d 57 4f 5f 4c 54 20 7c 7c 20 70 55 70 70 65 72  =WO_LT || pUpper
17420 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
17430 4c 45 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  LE );.      if( 
17440 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  rc==SQLITE_OK.  
17450 20 20 20 20 20 26 26 20 77 68 65 72 65 4b 65 79       && whereKey
17460 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c  Stats(pParse, p,
17470 20 70 52 61 6e 67 65 56 61 6c 2c 20 31 2c 20 61   pRangeVal, 1, a
17480 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  )==SQLITE_OK.   
17490 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 55     ){.        iU
174a0 70 70 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20  pper = a[0];.   
174b0 20 20 20 20 20 69 66 28 20 70 55 70 70 65 72 2d       if( pUpper-
174c0 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c  >eOperator==WO_L
174d0 45 20 29 20 69 55 70 70 65 72 20 2b 3d 20 61 5b  E ) iUpper += a[
174e0 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1];.      }.    
174f0 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
17500 65 65 28 70 52 61 6e 67 65 56 61 6c 29 3b 0a 20  ee(pRangeVal);. 
17510 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
17520 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17530 20 20 20 20 69 66 28 20 69 55 70 70 65 72 3c 3d      if( iUpper<=
17540 69 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20  iLower ){.      
17550 20 20 2a 70 52 61 6e 67 65 44 69 76 20 3d 20 28    *pRangeDiv = (
17560 64 6f 75 62 6c 65 29 70 2d 3e 61 69 52 6f 77 45  double)p->aiRowE
17570 73 74 5b 30 5d 3b 0a 20 20 20 20 20 20 7d 65 6c  st[0];.      }el
17580 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 61  se{.        *pRa
17590 6e 67 65 44 69 76 20 3d 20 28 64 6f 75 62 6c 65  ngeDiv = (double
175a0 29 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 2f  )p->aiRowEst[0]/
175b0 28 64 6f 75 62 6c 65 29 28 69 55 70 70 65 72 20  (double)(iUpper 
175c0 2d 20 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20  - iLower);.     
175d0 20 7d 0a 20 20 20 20 20 20 57 48 45 52 45 54 52   }.      WHERETR
175e0 41 43 45 28 28 22 72 61 6e 67 65 20 73 63 61 6e  ACE(("range scan
175f0 20 72 65 67 69 6f 6e 73 3a 20 25 75 2e 2e 25 75   regions: %u..%u
17600 20 20 64 69 76 3d 25 67 5c 6e 22 2c 0a 20 20 20    div=%g\n",.   
17610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
17620 75 33 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32  u32)iLower, (u32
17630 29 69 55 70 70 65 72 2c 20 2a 70 52 61 6e 67 65  )iUpper, *pRange
17640 44 69 76 29 29 3b 0a 20 20 20 20 20 20 72 65 74  Div));.      ret
17650 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
17660 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20     }.  }.#else. 
17670 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
17680 52 28 70 50 61 72 73 65 29 3b 0a 20 20 55 4e 55  R(pParse);.  UNU
17690 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
176a0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
176b0 45 54 45 52 28 6e 45 71 29 3b 0a 23 65 6e 64 69  ETER(nEq);.#endi
176c0 66 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77  f.  assert( pLow
176d0 65 72 20 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a  er || pUpper );.
176e0 20 20 2a 70 52 61 6e 67 65 44 69 76 20 3d 20 28    *pRangeDiv = (
176f0 64 6f 75 62 6c 65 29 31 3b 0a 20 20 69 66 28 20  double)1;.  if( 
17700 70 4c 6f 77 65 72 20 26 26 20 28 70 4c 6f 77 65  pLower && (pLowe
17710 72 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  r->wtFlags & TER
17720 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 20 2a 70  M_VNULL)==0 ) *p
17730 52 61 6e 67 65 44 69 76 20 2a 3d 20 28 64 6f 75  RangeDiv *= (dou
17740 62 6c 65 29 34 3b 0a 20 20 69 66 28 20 70 55 70  ble)4;.  if( pUp
17750 70 65 72 20 29 20 2a 70 52 61 6e 67 65 44 69 76  per ) *pRangeDiv
17760 20 2a 3d 20 28 64 6f 75 62 6c 65 29 34 3b 0a 20   *= (double)4;. 
17770 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
17780 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
17790 42 4c 45 5f 53 54 41 54 33 0a 2f 2a 0a 2a 2a 20  BLE_STAT3./*.** 
177a0 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  Estimate the num
177b0 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
177c0 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
177d0 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e  d based on.** an
177e0 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
177f0 61 69 6e 74 20 78 3d 56 41 4c 55 45 20 61 6e 64  aint x=VALUE and
17800 20 77 68 65 72 65 20 74 68 61 74 20 56 41 4c 55   where that VALU
17810 45 20 6f 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74  E occurs in.** t
17820 68 65 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74  he histogram dat
17830 61 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f  a.  This only wo
17840 72 6b 73 20 77 68 65 6e 20 78 20 69 73 20 74 68  rks when x is th
17850 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63  e left-most.** c
17860 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65  olumn of an inde
17870 78 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61  x and sqlite_sta
17880 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74  t3 histogram dat
17890 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a  a is available.*
178a0 2a 20 66 6f 72 20 74 68 61 74 20 69 6e 64 65 78  * for that index
178b0 2e 20 20 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e  .  When pExpr==N
178c0 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ULL that means t
178d0 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  he constraint is
178e0 0a 2a 2a 20 22 78 20 49 53 20 4e 55 4c 4c 22 20  .** "x IS NULL" 
178f0 69 6e 73 74 65 61 64 20 6f 66 20 22 78 3d 56 41  instead of "x=VA
17900 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74  LUE"..**.** Writ
17910 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  e the estimated 
17920 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a  row count into *
17930 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e  pnRow and return
17940 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20   SQLITE_OK. .** 
17950 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b  If unable to mak
17960 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c  e an estimate, l
17970 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68  eave *pnRow unch
17980 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e  anged and return
17990 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a  .** non-zero..**
179a0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
179b0 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20   can fail if it 
179c0 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61  is unable to loa
179d0 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  d a collating se
179e0 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72  quence.** requir
179f0 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f  ed for string co
17a00 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20  mparison, or if 
17a10 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
17a20 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  te memory.** for
17a30 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f   a UTF conversio
17a40 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63  n required for c
17a50 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20  omparison.  The 
17a60 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a  error is stored.
17a70 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  ** in the pParse
17a80 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
17a90 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 45  tatic int whereE
17aa0 71 75 61 6c 53 63 61 6e 45 73 74 28 0a 20 20 50  qualScanEst(.  P
17ab0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
17ac0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26      /* Parsing &
17ad0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
17ae0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e   context */.  In
17af0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
17b00 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
17b10 77 68 6f 73 65 20 6c 65 66 74 2d 6d 6f 73 74 20  whose left-most 
17b20 63 6f 6c 75 6d 6e 20 69 73 20 70 54 65 72 6d 20  column is pTerm 
17b30 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
17b40 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70  ,         /* Exp
17b50 72 65 73 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55  ression for VALU
17b60 45 20 69 6e 20 74 68 65 20 78 3d 56 41 4c 55 45  E in the x=VALUE
17b70 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
17b80 20 64 6f 75 62 6c 65 20 2a 70 6e 52 6f 77 20 20   double *pnRow  
17b90 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
17ba0 68 65 20 72 65 76 69 73 65 64 20 72 6f 77 20 65  he revised row e
17bb0 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a  stimate here */.
17bc0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  ){.  sqlite3_val
17bd0 75 65 20 2a 70 52 68 73 20 3d 20 30 3b 20 20 2f  ue *pRhs = 0;  /
17be0 2a 20 56 41 4c 55 45 20 6f 6e 20 72 69 67 68 74  * VALUE on right
17bf0 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 70 54  -hand side of pT
17c00 65 72 6d 20 2a 2f 0a 20 20 75 38 20 61 66 66 3b  erm */.  u8 aff;
17c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66     /* Column aff
17c30 69 6e 69 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72  inity */.  int r
17c40 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
17c50 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74       /* Subfunct
17c60 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ion return code 
17c70 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b 32  */.  tRowcnt a[2
17c80 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
17c90 2a 20 53 74 61 74 69 73 74 69 63 73 20 2a 2f 0a  * Statistics */.
17ca0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53  .  assert( p->aS
17cb0 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73  ample!=0 );.  as
17cc0 73 65 72 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65  sert( p->nSample
17cd0 3e 30 20 29 3b 0a 20 20 61 66 66 20 3d 20 70 2d  >0 );.  aff = p-
17ce0 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d  >pTable->aCol[p-
17cf0 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66  >aiColumn[0]].af
17d00 66 69 6e 69 74 79 3b 0a 20 20 69 66 28 20 70 45  finity;.  if( pE
17d10 78 70 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  xpr ){.    rc = 
17d20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50  valueFromExpr(pP
17d30 61 72 73 65 2c 20 70 45 78 70 72 2c 20 61 66 66  arse, pExpr, aff
17d40 2c 20 26 70 52 68 73 29 3b 0a 20 20 20 20 69 66  , &pRhs);.    if
17d50 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72  ( rc ) goto wher
17d60 65 45 71 75 61 6c 53 63 61 6e 45 73 74 5f 63 61  eEqualScanEst_ca
17d70 6e 63 65 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ncel;.  }else{. 
17d80 20 20 20 70 52 68 73 20 3d 20 73 71 6c 69 74 65     pRhs = sqlite
17d90 33 56 61 6c 75 65 4e 65 77 28 70 50 61 72 73 65  3ValueNew(pParse
17da0 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ->db);.  }.  if(
17db0 20 70 52 68 73 3d 3d 30 20 29 20 72 65 74 75 72   pRhs==0 ) retur
17dc0 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
17dd0 44 3b 0a 20 20 72 63 20 3d 20 77 68 65 72 65 4b  D;.  rc = whereK
17de0 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
17df0 70 2c 20 70 52 68 73 2c 20 30 2c 20 61 29 3b 0a  p, pRhs, 0, a);.
17e00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17e10 5f 4f 4b 20 29 7b 0a 20 20 20 20 57 48 45 52 45  _OK ){.    WHERE
17e20 54 52 41 43 45 28 28 22 65 71 75 61 6c 69 74 79  TRACE(("equality
17e30 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25   scan regions: %
17e40 64 5c 6e 22 2c 20 28 69 6e 74 29 61 5b 31 5d 29  d\n", (int)a[1])
17e50 29 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20  );.    *pnRow = 
17e60 61 5b 31 5d 3b 0a 20 20 7d 0a 77 68 65 72 65 45  a[1];.  }.whereE
17e70 71 75 61 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63  qualScanEst_canc
17e80 65 6c 3a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  el:.  sqlite3Val
17e90 75 65 46 72 65 65 28 70 52 68 73 29 3b 0a 20 20  ueFree(pRhs);.  
17ea0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
17eb0 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
17ec0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
17ed0 54 33 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  T3) */..#ifdef S
17ee0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
17ef0 54 33 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  T3./*.** Estimat
17f00 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
17f10 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62  rows that will b
17f20 65 20 72 65 74 75 72 6e 65 64 20 62 61 73 65 64  e returned based
17f30 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e   on.** an IN con
17f40 73 74 72 61 69 6e 74 20 77 68 65 72 65 20 74 68  straint where th
17f50 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
17f60 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  e of the IN oper
17f70 61 74 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73  ator.** is a lis
17f80 74 20 6f 66 20 76 61 6c 75 65 73 2e 20 20 45 78  t of values.  Ex
17f90 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
17fa0 20 20 20 20 57 48 45 52 45 20 78 20 49 4e 20 28      WHERE x IN (
17fb0 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57  1,2,3,4).**.** W
17fc0 72 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74  rite the estimat
17fd0 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74  ed row count int
17fe0 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74  o *pnRow and ret
17ff0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a  urn SQLITE_OK. .
18000 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20  ** If unable to 
18010 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65  make an estimate
18020 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75  , leave *pnRow u
18030 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74  nchanged and ret
18040 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e  urn.** non-zero.
18050 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
18060 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20  ine can fail if 
18070 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20  it is unable to 
18080 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67  load a collating
18090 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71   sequence.** req
180a0 75 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67  uired for string
180b0 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20   comparison, or 
180c0 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c  if unable to all
180d0 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20  ocate memory.** 
180e0 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72  for a UTF conver
180f0 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f  sion required fo
18100 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54  r comparison.  T
18110 68 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72  he error is stor
18120 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61  ed.** in the pPa
18130 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
18140 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
18150 72 65 49 6e 53 63 61 6e 45 73 74 28 0a 20 20 50  reInScanEst(.  P
18160 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
18170 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26      /* Parsing &
18180 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
18190 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e   context */.  In
181a0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
181b0 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
181c0 77 68 6f 73 65 20 6c 65 66 74 2d 6d 6f 73 74 20  whose left-most 
181d0 63 6f 6c 75 6d 6e 20 69 73 20 70 54 65 72 6d 20  column is pTerm 
181e0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
181f0 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54 68 65  List,     /* The
18200 20 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74   value list on t
18210 68 65 20 52 48 53 20 6f 66 20 22 78 20 49 4e 20  he RHS of "x IN 
18220 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20  (v1,v2,v3,...)" 
18230 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 2a 70 6e 52  */.  double *pnR
18240 6f 77 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  ow        /* Wri
18250 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72  te the revised r
18260 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65  ow estimate here
18270 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
18280 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
18290 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74       /* Subfunct
182a0 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ion return code 
182b0 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e 45 73 74  */.  double nEst
182c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
182d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f   /* Number of ro
182e0 77 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ws for a single 
182f0 74 65 72 6d 20 2a 2f 0a 20 20 64 6f 75 62 6c 65  term */.  double
18300 20 6e 52 6f 77 45 73 74 20 3d 20 28 64 6f 75 62   nRowEst = (doub
18310 6c 65 29 30 3b 20 2f 2a 20 4e 65 77 20 65 73 74  le)0; /* New est
18320 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
18330 62 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20  ber of rows */. 
18340 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
18350 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18360 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
18370 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53  .  assert( p->aS
18380 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f  ample!=0 );.  fo
18390 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
183a0 45 5f 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d  E_OK && i<pList-
183b0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
183c0 20 20 6e 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f    nEst = p->aiRo
183d0 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 72 63 20  wEst[0];.    rc 
183e0 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e  = whereEqualScan
183f0 45 73 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70  Est(pParse, p, p
18400 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
18410 2c 20 26 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52  , &nEst);.    nR
18420 6f 77 45 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20  owEst += nEst;. 
18430 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
18440 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
18450 28 20 6e 52 6f 77 45 73 74 20 3e 20 70 2d 3e 61  ( nRowEst > p->a
18460 69 52 6f 77 45 73 74 5b 30 5d 20 29 20 6e 52 6f  iRowEst[0] ) nRo
18470 77 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45  wEst = p->aiRowE
18480 73 74 5b 30 5d 3b 0a 20 20 20 20 2a 70 6e 52 6f  st[0];.    *pnRo
18490 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20  w = nRowEst;.   
184a0 20 57 48 45 52 45 54 52 41 43 45 28 28 22 49 4e   WHERETRACE(("IN
184b0 20 72 6f 77 20 65 73 74 69 6d 61 74 65 3a 20 65   row estimate: e
184c0 73 74 3d 25 67 5c 6e 22 2c 20 6e 52 6f 77 45 73  st=%g\n", nRowEs
184d0 74 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  t));.  }.  retur
184e0 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
184f0 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  * defined(SQLITE
18500 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 29 20 2a  _ENABLE_STAT3) *
18510 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  /../*.** Check t
18520 6f 20 73 65 65 20 69 66 20 63 6f 6c 75 6d 6e 20  o see if column 
18530 69 43 6f 6c 20 6f 66 20 74 68 65 20 74 61 62 6c  iCol of the tabl
18540 65 20 77 69 74 68 20 63 75 72 73 6f 72 20 69 54  e with cursor iT
18550 61 62 20 77 69 6c 6c 20 61 70 70 65 61 72 0a 2a  ab will appear.*
18560 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  * in sorted orde
18570 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  r according to t
18580 68 65 20 63 75 72 72 65 6e 74 20 71 75 65 72 79  he current query
18590 20 70 6c 61 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74   plan..**.** Ret
185a0 75 72 6e 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a  urn values:.**.*
185b0 2a 20 20 20 20 30 20 20 20 69 43 6f 6c 20 69 73  *    0   iCol is
185c0 20 6e 6f 74 20 6f 72 64 65 72 65 64 0a 2a 2a 20   not ordered.** 
185d0 20 20 20 31 20 20 20 69 43 6f 6c 20 68 61 73 20     1   iCol has 
185e0 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 76 61  only a single va
185f0 6c 75 65 0a 2a 2a 20 20 20 20 32 20 20 20 69 43  lue.**    2   iC
18600 6f 6c 20 69 73 20 69 6e 20 41 53 43 20 6f 72 64  ol is in ASC ord
18610 65 72 0a 2a 2a 20 20 20 20 33 20 20 20 69 43 6f  er.**    3   iCo
18620 6c 20 69 73 20 69 6e 20 44 45 53 43 20 6f 72 64  l is in DESC ord
18630 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  er.*/.static int
18640 20 69 73 4f 72 64 65 72 65 64 43 6f 6c 75 6d 6e   isOrderedColumn
18650 28 0a 20 20 57 68 65 72 65 42 65 73 74 49 64 78  (.  WhereBestIdx
18660 20 2a 70 2c 0a 20 20 69 6e 74 20 69 54 61 62 2c   *p,.  int iTab,
18670 0a 20 20 69 6e 74 20 69 43 6f 6c 0a 29 7b 0a 20  .  int iCol.){. 
18680 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 57 68 65   int i, j;.  Whe
18690 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20  reLevel *pLevel 
186a0 3d 20 26 70 2d 3e 61 4c 65 76 65 6c 5b 70 2d 3e  = &p->aLevel[p->
186b0 69 2d 31 5d 3b 0a 20 20 49 6e 64 65 78 20 2a 70  i-1];.  Index *p
186c0 49 64 78 3b 0a 20 20 75 38 20 73 6f 72 74 4f 72  Idx;.  u8 sortOr
186d0 64 65 72 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e  der;.  for(i=p->
186e0 69 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  i-1; i>=0; i--, 
186f0 70 4c 65 76 65 6c 2d 2d 29 7b 0a 20 20 20 20 69  pLevel--){.    i
18700 66 28 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  f( pLevel->iTabC
18710 75 72 21 3d 69 54 61 62 20 29 20 63 6f 6e 74 69  ur!=iTab ) conti
18720 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 4c  nue;.    if( (pL
18730 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
18740 67 73 20 26 20 57 48 45 52 45 5f 41 4c 4c 5f 55  gs & WHERE_ALL_U
18750 4e 49 51 55 45 29 21 3d 30 20 29 7b 0a 20 20 20  NIQUE)!=0 ){.   
18760 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
18770 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28   }.    assert( (
18780 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
18790 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44  lags & WHERE_ORD
187a0 45 52 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20  ERED)!=0 );.    
187b0 69 66 28 20 28 70 49 64 78 20 3d 20 70 4c 65 76  if( (pIdx = pLev
187c0 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 29  el->plan.u.pIdx)
187d0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
187e0 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
187f0 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 30     sortOrder = 0
18800 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
18810 73 65 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  se( (pLevel->pla
18820 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
18830 45 5f 52 45 56 45 52 53 45 29 21 3d 30 20 29 3b  E_REVERSE)!=0 );
18840 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
18850 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 49        int n = pI
18860 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  dx->nColumn;.   
18870 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
18880 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
18890 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 49 64     if( iCol==pId
188a0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29  x->aiColumn[j] )
188b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
188c0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3e  }.        if( j>
188d0 3d 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =n ) return 0;. 
188e0 20 20 20 20 20 20 20 73 6f 72 74 4f 72 64 65 72         sortOrder
188f0 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72   = pIdx->aSortOr
18900 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  der[j];.        
18910 74 65 73 74 63 61 73 65 28 20 28 70 4c 65 76 65  testcase( (pLeve
18920 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
18930 26 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 29  & WHERE_REVERSE)
18940 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  !=0 );.      }. 
18950 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18960 69 66 28 20 69 43 6f 6c 21 3d 28 2d 31 29 20 29  if( iCol!=(-1) )
18970 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
18980 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a   sortOrder = 0;.
18990 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
189a0 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
189b0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 45  Flags & WHERE_RE
189c0 56 45 52 53 45 29 21 3d 30 20 29 3b 0a 20 20 20  VERSE)!=0 );.   
189d0 20 7d 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76   }.    if( (pLev
189e0 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
189f0 20 26 20 57 48 45 52 45 5f 52 45 56 45 52 53 45   & WHERE_REVERSE
18a00 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  )!=0 ){.      as
18a10 73 65 72 74 28 20 73 6f 72 74 4f 72 64 65 72 3d  sert( sortOrder=
18a20 3d 30 20 7c 7c 20 73 6f 72 74 4f 72 64 65 72 3d  =0 || sortOrder=
18a30 3d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =1 );.      test
18a40 63 61 73 65 28 20 73 6f 72 74 4f 72 64 65 72 3d  case( sortOrder=
18a50 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 6f 72 74  =1 );.      sort
18a60 4f 72 64 65 72 20 3d 20 31 20 2d 20 73 6f 72 74  Order = 1 - sort
18a70 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Order;.    }.   
18a80 20 72 65 74 75 72 6e 20 73 6f 72 74 4f 72 64 65   return sortOrde
18a90 72 2b 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  r+2;.  }.  retur
18aa0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
18ab0 69 73 20 72 6f 75 74 69 6e 65 20 64 65 63 69 64  is routine decid
18ac0 65 73 20 69 66 20 70 49 64 78 20 63 61 6e 20 62  es if pIdx can b
18ad0 65 20 75 73 65 64 20 74 6f 20 73 61 74 69 73 66  e used to satisf
18ae0 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a  y the ORDER BY.*
18af0 2a 20 63 6c 61 75 73 65 2c 20 65 69 74 68 65 72  * clause, either
18b00 20 69 6e 20 77 68 6f 6c 65 20 6f 72 20 69 6e 20   in whole or in 
18b10 70 61 72 74 2e 20 20 54 68 65 20 72 65 74 75 72  part.  The retur
18b20 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 0a  n value is the .
18b30 2a 2a 20 63 75 6d 75 6c 61 74 69 76 65 20 6e 75  ** cumulative nu
18b40 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e  mber of terms in
18b50 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
18b60 61 75 73 65 20 74 68 61 74 20 61 72 65 20 73 61  ause that are sa
18b70 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 74 68  tisfied.** by th
18b80 65 20 69 6e 64 65 78 20 70 49 64 78 20 61 6e 64  e index pIdx and
18b90 20 6f 74 68 65 72 20 69 6e 64 69 63 65 73 20 69   other indices i
18ba0 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 2e 0a 2a  n outer loops..*
18bb0 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 62  *.** The table b
18bc0 65 69 6e 67 20 71 75 65 72 69 65 64 20 68 61 73  eing queried has
18bd0 20 61 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72   a cursor number
18be0 20 6f 66 20 22 62 61 73 65 22 2e 20 20 70 49 64   of "base".  pId
18bf0 78 20 69 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65  x is the.** inde
18c00 78 20 74 68 61 74 20 69 73 20 70 6f 73 74 75 6c  x that is postul
18c10 61 74 65 64 20 66 6f 72 20 75 73 65 20 74 6f 20  ated for use to 
18c20 61 63 63 65 73 73 20 74 68 65 20 74 61 62 6c 65  access the table
18c30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 2a 70 62 52  ..**.** The *pbR
18c40 65 76 20 76 61 6c 75 65 20 69 73 20 73 65 74 20  ev value is set 
18c50 74 6f 20 30 20 6f 72 64 65 72 20 31 20 64 65 70  to 0 order 1 dep
18c60 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
18c70 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 70 49 64 78  r or not.** pIdx
18c80 20 73 68 6f 75 6c 64 20 62 65 20 72 75 6e 20 69   should be run i
18c90 6e 20 74 68 65 20 66 6f 72 77 61 72 64 20 6f 72  n the forward or
18ca0 64 65 72 20 6f 72 20 69 6e 20 72 65 76 65 72 73  der or in revers
18cb0 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  e order..*/.stat
18cc0 69 63 20 69 6e 74 20 69 73 53 6f 72 74 69 6e 67  ic int isSorting
18cd0 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65 42 65  Index(.  WhereBe
18ce0 73 74 49 64 78 20 2a 70 2c 20 20 20 20 2f 2a 20  stIdx *p,    /* 
18cf0 42 65 73 74 20 69 6e 64 65 78 20 73 65 61 72 63  Best index searc
18d00 68 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49  h context */.  I
18d10 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
18d20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
18d30 77 65 20 61 72 65 20 74 65 73 74 69 6e 67 20 2a  we are testing *
18d40 2f 0a 20 20 69 6e 74 20 62 61 73 65 2c 20 20 20  /.  int base,   
18d50 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
18d60 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
18d70 20 74 61 62 6c 65 20 74 6f 20 62 65 20 73 6f 72   table to be sor
18d80 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62  ted */.  int *pb
18d90 52 65 76 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Rev          /* 
18da0 53 65 74 20 74 6f 20 31 20 66 6f 72 20 72 65 76  Set to 1 for rev
18db0 65 72 73 65 2d 6f 72 64 65 72 20 73 63 61 6e 20  erse-order scan 
18dc0 6f 66 20 70 49 64 78 20 2a 2f 0a 29 7b 0a 20 20  of pIdx */.){.  
18dd0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
18de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18df0 20 4e 75 6d 62 65 72 20 6f 66 20 70 49 64 78 20   Number of pIdx 
18e00 74 65 72 6d 73 20 75 73 65 64 20 2a 2f 0a 20 20  terms used */.  
18e10 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
18e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18e30 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52   Number of ORDER
18e40 20 42 59 20 74 65 72 6d 73 20 73 61 74 69 73 66   BY terms satisf
18e50 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ied */.  int sor
18e60 74 4f 72 64 65 72 20 3d 20 32 3b 20 20 20 20 20  tOrder = 2;     
18e70 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 66 6f 72         /* 0: for
18e80 77 61 72 64 2e 20 20 31 3a 20 62 61 63 6b 77 61  ward.  1: backwa
18e90 72 64 2e 20 20 32 3a 20 75 6e 6b 6e 6f 77 6e 20  rd.  2: unknown 
18ea0 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20  */.  int nTerm; 
18eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ec0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
18ed0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a  ORDER BY terms *
18ee0 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  /.  struct ExprL
18ef0 69 73 74 5f 69 74 65 6d 20 2a 70 4f 42 49 74 65  ist_item *pOBIte
18f00 6d 3b 2f 2a 20 41 20 74 65 72 6d 20 6f 66 20 74  m;/* A term of t
18f10 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
18f20 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  se */.  Table *p
18f30 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  Tab = pIdx->pTab
18f40 6c 65 3b 20 20 20 2f 2a 20 54 61 62 6c 65 20 74  le;   /* Table t
18f50 68 61 74 20 6f 77 6e 73 20 69 6e 64 65 78 20 70  hat owns index p
18f60 49 64 78 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  Idx */.  ExprLis
18f70 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20  t *pOrderBy;    
18f80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52         /* The OR
18f90 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
18fa0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
18fb0 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 20 20 20   = p->pParse;   
18fc0 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
18fd0 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  xt */.  sqlite3 
18fe0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
18ff0 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  ;     /* Databas
19000 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
19010 20 20 69 6e 74 20 6e 50 72 69 6f 72 53 61 74 3b    int nPriorSat;
19020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19030 2f 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  /* ORDER BY term
19040 73 20 73 61 74 69 73 66 69 65 64 20 62 79 20 6f  s satisfied by o
19050 75 74 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20  uter loops */.  
19060 69 6e 74 20 73 65 65 6e 52 6f 77 69 64 20 3d 20  int seenRowid = 
19070 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
19080 20 54 72 75 65 20 69 66 20 61 6e 20 4f 52 44 45   True if an ORDE
19090 52 20 42 59 20 72 6f 77 69 64 20 74 65 72 6d 20  R BY rowid term 
190a0 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74  is seen */.  int
190b0 20 75 6e 69 71 75 65 4e 6f 74 4e 75 6c 6c 3b 20   uniqueNotNull; 
190c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 49             /* pI
190d0 64 78 20 69 73 20 55 4e 49 51 55 45 20 77 69 74  dx is UNIQUE wit
190e0 68 20 61 6c 6c 20 74 65 72 6d 73 20 61 72 65 20  h all terms are 
190f0 4e 4f 54 20 4e 55 4c 4c 20 2a 2f 0a 0a 20 20 69  NOT NULL */..  i
19100 66 28 20 70 2d 3e 69 3d 3d 30 20 29 7b 0a 20 20  f( p->i==0 ){.  
19110 20 20 6e 50 72 69 6f 72 53 61 74 20 3d 20 30 3b    nPriorSat = 0;
19120 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50  .  }else{.    nP
19130 72 69 6f 72 53 61 74 20 3d 20 70 2d 3e 61 4c 65  riorSat = p->aLe
19140 76 65 6c 5b 70 2d 3e 69 2d 31 5d 2e 70 6c 61 6e  vel[p->i-1].plan
19150 2e 6e 4f 42 53 61 74 3b 0a 20 20 20 20 69 66 28  .nOBSat;.    if(
19160 20 28 70 2d 3e 61 4c 65 76 65 6c 5b 70 2d 3e 69   (p->aLevel[p->i
19170 2d 31 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  -1].plan.wsFlags
19180 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 45 44   & WHERE_ORDERED
19190 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )==0 ){.      /*
191a0 20 54 68 69 73 20 6c 6f 6f 70 20 63 61 6e 6e 6f   This loop canno
191b0 74 20 62 65 20 6f 72 64 65 72 65 64 20 75 6e 6c  t be ordered unl
191c0 65 73 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74  ess the next out
191d0 65 72 20 6c 6f 6f 70 20 69 73 0a 20 20 20 20 20  er loop is.     
191e0 20 2a 2a 20 61 6c 73 6f 20 6f 72 64 65 72 65 64   ** also ordered
191f0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
19200 20 6e 50 72 69 6f 72 53 61 74 3b 0a 20 20 20 20   nPriorSat;.    
19210 7d 0a 20 20 20 20 69 66 28 20 4f 70 74 69 6d 69  }.    if( Optimi
19220 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64  zationDisabled(d
19230 62 2c 20 53 51 4c 49 54 45 5f 4f 72 64 65 72 42  b, SQLITE_OrderB
19240 79 49 64 78 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  yIdxJoin) ){.   
19250 20 20 20 2f 2a 20 4f 6e 6c 79 20 6c 6f 6f 6b 20     /* Only look 
19260 61 74 20 74 68 65 20 6f 75 74 65 72 2d 6d 6f 73  at the outer-mos
19270 74 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4f 72  t loop if the Or
19280 64 65 72 42 79 49 64 78 4a 6f 69 6e 0a 20 20 20  derByIdxJoin.   
19290 20 20 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69     ** optimizati
192a0 6f 6e 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  on is disabled *
192b0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e  /.      return n
192c0 50 72 69 6f 72 53 61 74 3b 0a 20 20 20 20 7d 0a  PriorSat;.    }.
192d0 20 20 7d 0a 20 20 70 4f 72 64 65 72 42 79 20 3d    }.  pOrderBy =
192e0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
192f0 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
19300 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 49 64  !=0 );.  if( pId
19310 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 7b  x->bUnordered ){
19320 0a 20 20 20 20 2f 2a 20 48 61 73 68 20 69 6e 64  .    /* Hash ind
19330 69 63 65 73 20 28 69 6e 64 69 63 61 74 65 64 20  ices (indicated 
19340 62 79 20 74 68 65 20 22 75 6e 6f 72 64 65 72 65  by the "unordere
19350 64 22 20 74 61 67 20 6f 6e 20 73 71 6c 69 74 65  d" tag on sqlite
19360 5f 73 74 61 74 31 29 20 63 61 6e 6e 6f 74 0a 20  _stat1) cannot. 
19370 20 20 20 2a 2a 20 62 65 20 75 73 65 64 20 66 6f     ** be used fo
19380 72 20 73 6f 72 74 69 6e 67 20 2a 2f 0a 20 20 20  r sorting */.   
19390 20 72 65 74 75 72 6e 20 6e 50 72 69 6f 72 53 61   return nPriorSa
193a0 74 3b 0a 20 20 7d 0a 20 20 6e 54 65 72 6d 20 3d  t;.  }.  nTerm =
193b0 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
193c0 3b 0a 20 20 75 6e 69 71 75 65 4e 6f 74 4e 75 6c  ;.  uniqueNotNul
193d0 6c 20 3d 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  l = pIdx->onErro
193e0 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 61 73  r!=OE_None;.  as
193f0 73 65 72 74 28 20 6e 54 65 72 6d 3e 30 20 29 3b  sert( nTerm>0 );
19400 0a 0a 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20  ..  /* Argument 
19410 70 49 64 78 20 6d 75 73 74 20 65 69 74 68 65 72  pIdx must either
19420 20 70 6f 69 6e 74 20 74 6f 20 61 20 27 72 65 61   point to a 'rea
19430 6c 27 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 73  l' named index s
19440 74 72 75 63 74 75 72 65 2c 20 0a 20 20 2a 2a 20  tructure, .  ** 
19450 6f 72 20 61 6e 20 69 6e 64 65 78 20 73 74 72 75  or an index stru
19460 63 74 75 72 65 20 61 6c 6c 6f 63 61 74 65 64 20  cture allocated 
19470 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 62 79 20  on the stack by 
19480 62 65 73 74 42 74 72 65 65 49 6e 64 65 78 28 29  bestBtreeIndex()
19490 20 74 6f 0a 20 20 2a 2a 20 72 65 70 72 65 73 65   to.  ** represe
194a0 6e 74 20 74 68 65 20 72 6f 77 69 64 20 69 6e 64  nt the rowid ind
194b0 65 78 20 74 68 61 74 20 69 73 20 70 61 72 74 20  ex that is part 
194c0 6f 66 20 65 76 65 72 79 20 74 61 62 6c 65 2e 20  of every table. 
194d0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 49   */.  assert( pI
194e0 64 78 2d 3e 7a 4e 61 6d 65 20 7c 7c 20 28 70 49  dx->zName || (pI
194f0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26  dx->nColumn==1 &
19500 26 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  & pIdx->aiColumn
19510 5b 30 5d 3d 3d 2d 31 29 20 29 3b 0a 0a 20 20 2f  [0]==-1) );..  /
19520 2a 20 4d 61 74 63 68 20 74 65 72 6d 73 20 6f 66  * Match terms of
19530 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
19540 61 75 73 65 20 61 67 61 69 6e 73 74 20 63 6f 6c  ause against col
19550 75 6d 6e 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65  umns of.  ** the
19560 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a   index..  **.  *
19570 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 6e 64 69  * Note that indi
19580 63 65 73 20 68 61 76 65 20 70 49 64 78 2d 3e 6e  ces have pIdx->n
19590 43 6f 6c 75 6d 6e 20 72 65 67 75 6c 61 72 20 63  Column regular c
195a0 6f 6c 75 6d 6e 73 20 70 6c 75 73 0a 20 20 2a 2a  olumns plus.  **
195b0 20 6f 6e 65 20 61 64 64 69 74 69 6f 6e 61 6c 20   one additional 
195c0 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 69 6e  column containin
195d0 67 20 74 68 65 20 72 6f 77 69 64 2e 20 20 54 68  g the rowid.  Th
195e0 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 0a 20  e rowid column. 
195f0 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78   ** of the index
19600 20 69 73 20 61 6c 73 6f 20 61 6c 6c 6f 77 65 64   is also allowed
19610 20 74 6f 20 6d 61 74 63 68 20 61 67 61 69 6e 73   to match agains
19620 74 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20  t the ORDER BY. 
19630 20 2a 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f   ** clause..  */
19640 0a 20 20 6a 20 3d 20 6e 50 72 69 6f 72 53 61 74  .  j = nPriorSat
19650 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 70 4f 42 49  ;.  for(i=0,pOBI
19660 74 65 6d 3d 26 70 4f 72 64 65 72 42 79 2d 3e 61  tem=&pOrderBy->a
19670 5b 6a 5d 3b 20 6a 3c 6e 54 65 72 6d 20 26 26 20  [j]; j<nTerm && 
19680 69 3c 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  i<=pIdx->nColumn
19690 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
196a0 20 2a 70 4f 42 45 78 70 72 3b 20 20 20 20 20 20   *pOBExpr;      
196b0 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
196c0 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 4f 52 44  ssion of the ORD
196d0 45 52 20 42 59 20 70 4f 42 49 74 65 6d 20 2a 2f  ER BY pOBItem */
196e0 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
196f0 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  oll;         /* 
19700 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  The collating se
19710 71 75 65 6e 63 65 20 6f 66 20 70 4f 42 45 78 70  quence of pOBExp
19720 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 72  r */.    int ter
19730 6d 53 6f 72 74 4f 72 64 65 72 3b 20 20 20 20 20  mSortOrder;     
19740 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 66   /* Sort order f
19750 6f 72 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a  or this term */.
19760 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b      int iColumn;
19770 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19780 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  he i-th column o
19790 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 2d 31  f the index.  -1
197a0 20 66 6f 72 20 72 6f 77 69 64 20 2a 2f 0a 20 20   for rowid */.  
197b0 20 20 69 6e 74 20 69 53 6f 72 74 4f 72 64 65 72    int iSortOrder
197c0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 66  ;         /* 1 f
197d0 6f 72 20 44 45 53 43 2c 20 30 20 66 6f 72 20 41  or DESC, 0 for A
197e0 53 43 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 69  SC on the i-th i
197f0 6e 64 65 78 20 74 65 72 6d 20 2a 2f 0a 20 20 20  ndex term */.   
19800 20 69 6e 74 20 69 73 45 71 3b 20 20 20 20 20 20   int isEq;      
19810 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 6a           /* Subj
19820 65 63 74 20 74 6f 20 61 6e 20 3d 3d 20 6f 72 20  ect to an == or 
19830 49 53 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69  IS NULL constrai
19840 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73  nt */.    int is
19850 4d 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20  Match;          
19860 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 74 65    /* ORDER BY te
19870 72 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 69  rm matches the i
19880 6e 64 65 78 20 74 65 72 6d 20 2a 2f 0a 20 20 20  ndex term */.   
19890 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
198a0 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ll;      /* Name
198b0 20 6f 66 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65   of collating se
198c0 71 75 65 6e 63 65 20 66 6f 72 20 69 2d 74 68 20  quence for i-th 
198d0 69 6e 64 65 78 20 74 65 72 6d 20 2a 2f 0a 20 20  index term */.  
198e0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 43 6f    WhereTerm *pCo
198f0 6e 73 74 72 61 69 6e 74 3b 20 2f 2a 20 41 20 63  nstraint; /* A c
19900 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20 74 68 65  onstraint in the
19910 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
19920 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
19930 6e 65 78 74 20 74 65 72 6d 20 6f 66 20 74 68 65  next term of the
19940 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
19950 20 72 65 66 65 72 73 20 74 6f 20 61 6e 79 74 68   refers to anyth
19960 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 0a 20  ing other than. 
19970 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69     ** a column i
19980 6e 20 74 68 65 20 22 62 61 73 65 22 20 74 61 62  n the "base" tab
19990 6c 65 2c 20 74 68 65 6e 20 74 68 69 73 20 69 6e  le, then this in
199a0 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  dex will not be 
199b0 6f 66 20 61 6e 79 0a 20 20 20 20 2a 2a 20 66 75  of any.    ** fu
199c0 72 74 68 65 72 20 75 73 65 20 69 6e 20 68 61 6e  rther use in han
199d0 64 6c 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20  dling the ORDER 
199e0 42 59 2e 20 2a 2f 0a 20 20 20 20 70 4f 42 45 78  BY. */.    pOBEx
199f0 70 72 20 3d 20 70 4f 42 49 74 65 6d 2d 3e 70 45  pr = pOBItem->pE
19a00 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 4f 42  xpr;.    if( pOB
19a10 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
19a20 55 4d 4e 20 7c 7c 20 70 4f 42 45 78 70 72 2d 3e  UMN || pOBExpr->
19a30 69 54 61 62 6c 65 21 3d 62 61 73 65 20 29 7b 0a  iTable!=base ){.
19a40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19a50 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20   }..    /* Find 
19a60 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 61 6e  column number an
19a70 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
19a80 65 6e 63 65 20 66 6f 72 20 74 68 65 20 6e 65 78  ence for the nex
19a90 74 20 65 6e 74 72 79 0a 20 20 20 20 2a 2a 20 69  t entry.    ** i
19aa0 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  n the index */. 
19ab0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 7a 4e 61     if( pIdx->zNa
19ac0 6d 65 20 26 26 20 69 3c 70 49 64 78 2d 3e 6e 43  me && i<pIdx->nC
19ad0 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69  olumn ){.      i
19ae0 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 61  Column = pIdx->a
19af0 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20  iColumn[i];.    
19b00 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70    if( iColumn==p
19b10 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b  Idx->pTable->iPK
19b20 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43  ey ){.        iC
19b30 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
19b40 20 20 7d 0a 20 20 20 20 20 20 69 53 6f 72 74 4f    }.      iSortO
19b50 72 64 65 72 20 3d 20 70 49 64 78 2d 3e 61 53 6f  rder = pIdx->aSo
19b60 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20  rtOrder[i];.    
19b70 20 20 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e    zColl = pIdx->
19b80 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20  azColl[i];.     
19b90 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 21 3d   assert( zColl!=
19ba0 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  0 );.    }else{.
19bb0 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
19bc0 2d 31 3b 0a 20 20 20 20 20 20 69 53 6f 72 74 4f  -1;.      iSortO
19bd0 72 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rder = 0;.      
19be0 7a 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d  zColl = 0;.    }
19bf0 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
19c00 6f 20 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c  o see if the col
19c10 75 6d 6e 20 6e 75 6d 62 65 72 20 61 6e 64 20 63  umn number and c
19c20 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
19c30 65 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  e of the.    ** 
19c40 69 6e 64 65 78 20 6d 61 74 63 68 20 74 68 65 20  index match the 
19c50 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 61 6e  column number an
19c60 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
19c70 65 6e 63 65 20 6f 66 20 74 68 65 20 4f 52 44 45  ence of the ORDE
19c80 52 20 42 59 0a 20 20 20 20 2a 2a 20 63 6c 61 75  R BY.    ** clau
19c90 73 65 20 65 6e 74 72 79 2e 20 20 53 65 74 20 69  se entry.  Set i
19ca0 73 4d 61 74 63 68 20 74 6f 20 31 20 69 66 20 74  sMatch to 1 if t
19cb0 68 65 79 20 62 6f 74 68 20 6d 61 74 63 68 2e 20  hey both match. 
19cc0 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f 42 45 78  */.    if( pOBEx
19cd0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f  pr->iColumn==iCo
19ce0 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69 66  lumn ){.      if
19cf0 28 20 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( zColl ){.     
19d00 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
19d10 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
19d20 61 72 73 65 2c 20 70 4f 42 45 78 70 72 29 3b 0a  arse, pOBExpr);.
19d30 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f          if( !pCo
19d40 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  ll ) pColl = db-
19d50 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
19d60 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20 73 71      isMatch = sq
19d70 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
19d80 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c  ll->zName, zColl
19d90 29 3d 3d 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73  )==0;.      }els
19da0 65 7b 0a 20 20 20 20 20 20 20 20 69 73 4d 61 74  e{.        isMat
19db0 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ch = 1;.      }.
19dc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19dd0 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20   isMatch = 0;.  
19de0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 74 65 72 6d    }..    /* term
19df0 53 6f 72 74 4f 72 64 65 72 20 69 73 20 30 20 6f  SortOrder is 0 o
19e00 72 20 31 20 66 6f 72 20 77 68 65 74 68 65 72 20  r 1 for whether 
19e10 6f 72 20 6e 6f 74 20 74 68 65 20 61 63 63 65 73  or not the acces
19e20 73 20 6c 6f 6f 70 20 73 68 6f 75 6c 64 0a 20 20  s loop should.  
19e30 20 20 2a 2a 20 72 75 6e 20 66 6f 72 77 61 72 64    ** run forward
19e40 20 6f 72 20 62 61 63 6b 77 61 72 64 73 20 28 72   or backwards (r
19e50 65 73 70 65 63 74 69 76 65 6c 79 29 20 69 6e 20  espectively) in 
19e60 6f 72 64 65 72 20 74 6f 20 73 61 74 69 73 66 79  order to satisfy
19e70 20 74 68 69 73 20 0a 20 20 20 20 2a 2a 20 74 65   this .    ** te
19e80 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  rm of the ORDER 
19e90 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20  BY clause. */.  
19ea0 20 20 61 73 73 65 72 74 28 20 70 4f 42 49 74 65    assert( pOBIte
19eb0 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 30 20  m->sortOrder==0 
19ec0 7c 7c 20 70 4f 42 49 74 65 6d 2d 3e 73 6f 72 74  || pOBItem->sort
19ed0 4f 72 64 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20  Order==1 );.    
19ee0 61 73 73 65 72 74 28 20 69 53 6f 72 74 4f 72 64  assert( iSortOrd
19ef0 65 72 3d 3d 30 20 7c 7c 20 69 53 6f 72 74 4f 72  er==0 || iSortOr
19f00 64 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20 74 65  der==1 );.    te
19f10 72 6d 53 6f 72 74 4f 72 64 65 72 20 3d 20 69 53  rmSortOrder = iS
19f20 6f 72 74 4f 72 64 65 72 20 5e 20 70 4f 42 49 74  ortOrder ^ pOBIt
19f30 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 0a  em->sortOrder;..
19f40 20 20 20 20 2f 2a 20 49 66 20 58 20 69 73 20 74      /* If X is t
19f50 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  he column in the
19f60 20 69 6e 64 65 78 20 61 6e 64 20 4f 52 44 45 52   index and ORDER
19f70 20 42 59 20 63 6c 61 75 73 65 2c 20 63 68 65 63   BY clause, chec
19f80 6b 20 74 6f 20 73 65 65 0a 20 20 20 20 2a 2a 20  k to see.    ** 
19f90 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
19fa0 20 58 3d 20 6f 72 20 58 20 49 53 20 4e 55 4c 4c   X= or X IS NULL
19fb0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20   constraints in 
19fc0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
19fd0 2e 20 2a 2f 0a 20 20 20 20 70 43 6f 6e 73 74 72  . */.    pConstr
19fe0 61 69 6e 74 20 3d 20 66 69 6e 64 54 65 72 6d 28  aint = findTerm(
19ff0 70 2d 3e 70 57 43 2c 20 62 61 73 65 2c 20 69 43  p->pWC, base, iC
1a000 6f 6c 75 6d 6e 2c 20 70 2d 3e 6e 6f 74 52 65 61  olumn, p->notRea
1a010 64 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  dy,.            
1a020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
1a030 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57  O_EQ|WO_ISNULL|W
1a040 4f 5f 49 4e 2c 20 70 49 64 78 29 3b 0a 20 20 20  O_IN, pIdx);.   
1a050 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74   if( pConstraint
1a060 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 73 45  ==0 ){.      isE
1a070 71 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  q = 0;.    }else
1a080 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74   if( pConstraint
1a090 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
1a0a0 49 4e 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  IN ){.      /* C
1a0b0 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74 68  onstraints of th
1a0c0 65 20 66 6f 72 6d 3a 20 22 58 20 49 4e 20 2e 2e  e form: "X IN ..
1a0d0 2e 22 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  ." cannot be use
1a0e0 64 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20  d with an ORDER 
1a0f0 42 59 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 61  BY.      ** beca
1a100 75 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e  use we do not kn
1a110 6f 77 20 69 6e 20 77 68 61 74 20 6f 72 64 65 72  ow in what order
1a120 20 74 68 65 20 76 61 6c 75 65 73 20 6f 6e 20 74   the values on t
1a130 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
1a140 0a 20 20 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  .      ** operat
1a150 6f 72 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20 2a  or will occur. *
1a160 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
1a170 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f     }else if( pCo
1a180 6e 73 74 72 61 69 6e 74 2d 3e 65 4f 70 65 72 61  nstraint->eOpera
1a190 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29  tor==WO_ISNULL )
1a1a0 7b 0a 20 20 20 20 20 20 75 6e 69 71 75 65 4e 6f  {.      uniqueNo
1a1b0 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  tNull = 0;.     
1a1c0 20 69 73 45 71 20 3d 20 31 3b 20 20 2f 2a 20 22   isEq = 1;  /* "
1a1d0 58 20 49 53 20 4e 55 4c 4c 22 20 6d 65 61 6e 73  X IS NULL" means
1a1e0 20 58 20 68 61 73 20 6f 6e 6c 79 20 61 20 73 69   X has only a si
1a1f0 6e 67 6c 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20  ngle value */.  
1a200 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6e    }else if( pCon
1a210 73 74 72 61 69 6e 74 2d 3e 70 72 65 72 65 71 52  straint->prereqR
1a220 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ight==0 ){.     
1a230 20 69 73 45 71 20 3d 20 31 3b 20 20 2f 2a 20 43   isEq = 1;  /* C
1a240 6f 6e 73 74 72 61 69 6e 74 20 22 58 3d 63 6f 6e  onstraint "X=con
1a250 73 74 61 6e 74 22 20 6d 65 61 6e 73 20 58 20 68  stant" means X h
1a260 61 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  as only a single
1a270 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 7d 65   value */.    }e
1a280 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20  lse{.      Expr 
1a290 2a 70 52 69 67 68 74 20 3d 20 70 43 6f 6e 73 74  *pRight = pConst
1a2a0 72 61 69 6e 74 2d 3e 70 45 78 70 72 2d 3e 70 52  raint->pExpr->pR
1a2b0 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20  ight;.      if( 
1a2c0 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43  pRight->op==TK_C
1a2d0 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20  OLUMN ){.       
1a2e0 20 57 48 45 52 45 54 52 41 43 45 28 28 22 20 20   WHERETRACE(("  
1a2f0 20 20 20 20 20 2e 2e 20 69 73 4f 72 64 65 72 65       .. isOrdere
1a300 64 43 6f 6c 75 6d 6e 28 74 61 62 3d 25 64 2c 63  dColumn(tab=%d,c
1a310 6f 6c 3d 25 64 29 22 2c 0a 20 20 20 20 20 20 20  ol=%d)",.       
1a320 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69               pRi
1a330 67 68 74 2d 3e 69 54 61 62 6c 65 2c 20 70 52 69  ght->iTable, pRi
1a340 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 29 3b 0a  ght->iColumn));.
1a350 20 20 20 20 20 20 20 20 69 73 45 71 20 3d 20 69          isEq = i
1a360 73 4f 72 64 65 72 65 64 43 6f 6c 75 6d 6e 28 70  sOrderedColumn(p
1a370 2c 20 70 52 69 67 68 74 2d 3e 69 54 61 62 6c 65  , pRight->iTable
1a380 2c 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d  , pRight->iColum
1a390 6e 29 3b 0a 20 20 20 20 20 20 20 20 57 48 45 52  n);.        WHER
1a3a0 45 54 52 41 43 45 28 28 22 20 2d 3e 20 69 73 45  ETRACE((" -> isE
1a3b0 71 3d 25 64 5c 6e 22 2c 20 69 73 45 71 29 29 3b  q=%d\n", isEq));
1a3c0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ..        /* If 
1a3d0 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  the constraint i
1a3e0 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 3d  s of the form X=
1a3f0 59 20 77 68 65 72 65 20 59 20 69 73 20 61 6e 20  Y where Y is an 
1a400 6f 72 64 65 72 65 64 20 76 61 6c 75 65 0a 20 20  ordered value.  
1a410 20 20 20 20 20 20 2a 2a 20 69 6e 20 61 6e 20 6f        ** in an o
1a420 75 74 65 72 20 6c 6f 6f 70 2c 20 74 68 65 6e 20  uter loop, then 
1a430 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 6f  make sure the so
1a440 72 74 20 6f 72 64 65 72 20 6f 66 20 59 20 6d 61  rt order of Y ma
1a450 74 63 68 65 73 20 74 68 65 0a 20 20 20 20 20 20  tches the.      
1a460 20 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65 72 20    ** sort order 
1a470 72 65 71 75 69 72 65 64 20 66 6f 72 20 58 2e 20  required for X. 
1a480 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  */.        if( i
1a490 73 4d 61 74 63 68 20 26 26 20 69 73 45 71 3e 3d  sMatch && isEq>=
1a4a0 32 20 26 26 20 69 73 45 71 21 3d 70 4f 42 49 74  2 && isEq!=pOBIt
1a4b0 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 2b 32 20  em->sortOrder+2 
1a4c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  ){.          tes
1a4d0 74 63 61 73 65 28 20 69 73 45 71 3d 3d 32 20 29  tcase( isEq==2 )
1a4e0 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
1a4f0 63 61 73 65 28 20 69 73 45 71 3d 3d 33 20 29 3b  case( isEq==3 );
1a500 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1a510 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1a520 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1a530 20 69 73 45 71 20 3d 20 30 3b 20 20 2f 2a 20 22   isEq = 0;  /* "
1a540 58 3d 65 78 70 72 22 20 70 6c 61 63 65 73 20 6e  X=expr" places n
1a550 6f 20 6f 72 64 65 72 69 6e 67 20 63 6f 6e 73 74  o ordering const
1a560 72 61 69 6e 74 73 20 6f 6e 20 58 20 2a 2f 0a 20  raints on X */. 
1a570 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1a580 20 69 66 28 20 21 69 73 4d 61 74 63 68 20 29 7b   if( !isMatch ){
1a590 0a 20 20 20 20 20 20 69 66 28 20 69 73 45 71 3d  .      if( isEq=
1a5a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  =0 ){.        br
1a5b0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
1a5c0 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  {.        contin
1a5d0 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
1a5e0 7d 65 6c 73 65 20 69 66 28 20 69 73 45 71 21 3d  }else if( isEq!=
1a5f0 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  1 ){.      if( s
1a600 6f 72 74 4f 72 64 65 72 3d 3d 32 20 29 7b 0a 20  ortOrder==2 ){. 
1a610 20 20 20 20 20 20 20 73 6f 72 74 4f 72 64 65 72         sortOrder
1a620 20 3d 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72   = termSortOrder
1a630 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1a640 28 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 21  ( termSortOrder!
1a650 3d 73 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20  =sortOrder ){.  
1a660 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a670 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6a     }.    }.    j
1a680 2b 2b 3b 0a 20 20 20 20 70 4f 42 49 74 65 6d 2b  ++;.    pOBItem+
1a690 2b 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 75  +;.    if( iColu
1a6a0 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 65  mn<0 ){.      se
1a6b0 65 6e 52 6f 77 69 64 20 3d 20 31 3b 0a 20 20 20  enRowid = 1;.   
1a6c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65     break;.    }e
1a6d0 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e 61 43  lse if( pTab->aC
1a6e0 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e  ol[iColumn].notN
1a6f0 75 6c 6c 3d 3d 30 20 26 26 20 69 73 45 71 21 3d  ull==0 && isEq!=
1a700 31 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  1 ){.      testc
1a710 61 73 65 28 20 69 73 45 71 3d 3d 30 20 29 3b 0a  ase( isEq==0 );.
1a720 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1a730 69 73 45 71 3d 3d 32 20 29 3b 0a 20 20 20 20 20  isEq==2 );.     
1a740 20 74 65 73 74 63 61 73 65 28 20 69 73 45 71 3d   testcase( isEq=
1a750 3d 33 20 29 3b 0a 20 20 20 20 20 20 75 6e 69 71  =3 );.      uniq
1a760 75 65 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20  ueNotNull = 0;. 
1a770 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
1a780 66 20 77 65 20 68 61 76 65 20 6e 6f 74 20 66 6f  f we have not fo
1a790 75 6e 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  und at least one
1a7a0 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 74   ORDER BY term t
1a7b0 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 0a  hat matches the.
1a7c0 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e    ** index, then
1a7d0 20 73 68 6f 77 20 6e 6f 20 70 72 6f 67 72 65 73   show no progres
1a7e0 73 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4f 42 49  s. */.  if( pOBI
1a7f0 74 65 6d 3d 3d 26 70 4f 72 64 65 72 42 79 2d 3e  tem==&pOrderBy->
1a800 61 5b 6e 50 72 69 6f 72 53 61 74 5d 20 29 20 72  a[nPriorSat] ) r
1a810 65 74 75 72 6e 20 6e 50 72 69 6f 72 53 61 74 3b  eturn nPriorSat;
1a820 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68  ..  /* Return th
1a830 65 20 6e 65 63 65 73 73 61 72 79 20 73 63 61 6e  e necessary scan
1a840 20 6f 72 64 65 72 20 62 61 63 6b 20 74 6f 20 74   order back to t
1a850 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 2a  he caller */.  *
1a860 70 62 52 65 76 20 3d 20 73 6f 72 74 4f 72 64 65  pbRev = sortOrde
1a870 72 20 26 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20  r & 1;..  /* If 
1a880 74 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52  there was an "OR
1a890 44 45 52 20 42 59 20 72 6f 77 69 64 22 20 74 65  DER BY rowid" te
1a8a0 72 6d 20 74 68 61 74 20 6d 61 74 63 68 65 64 2c  rm that matched,
1a8b0 20 6f 72 20 69 74 20 69 73 20 6f 6e 6c 79 0a 20   or it is only. 
1a8c0 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   ** possible for
1a8d0 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 66 72   a single row fr
1a8e0 6f 6d 20 74 68 69 73 20 74 61 62 6c 65 20 74 6f  om this table to
1a8f0 20 6d 61 74 63 68 2c 20 74 68 65 6e 20 73 6b 69   match, then ski
1a900 70 20 6f 76 65 72 0a 20 20 2a 2a 20 61 6e 79 20  p over.  ** any 
1a910 61 64 64 69 74 69 6f 6e 61 6c 20 4f 52 44 45 52  additional ORDER
1a920 20 42 59 20 74 65 72 6d 73 20 64 65 61 6c 69 6e   BY terms dealin
1a930 67 20 77 69 74 68 20 74 68 69 73 20 74 61 62 6c  g with this tabl
1a940 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 65  e..  */.  if( se
1a950 65 6e 52 6f 77 69 64 20 7c 7c 20 28 75 6e 69 71  enRowid || (uniq
1a960 75 65 4e 6f 74 4e 75 6c 6c 20 26 26 20 69 3e 3d  ueNotNull && i>=
1a970 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29  pIdx->nColumn) )
1a980 7b 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65  {.    /* Advance
1a990 20 6a 20 6f 76 65 72 20 61 64 64 69 74 69 6f 6e   j over addition
1a9a0 61 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  al ORDER BY term
1a9b0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
1a9c0 68 20 62 61 73 65 20 2a 2f 0a 20 20 20 20 57 68  h base */.    Wh
1a9d0 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 53 20  ereMaskSet *pMS 
1a9e0 3d 20 70 2d 3e 70 57 43 2d 3e 70 4d 61 73 6b 53  = p->pWC->pMaskS
1a9f0 65 74 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20  et;.    Bitmask 
1aa00 6d 20 3d 20 7e 67 65 74 4d 61 73 6b 28 70 4d 53  m = ~getMask(pMS
1aa10 2c 20 62 61 73 65 29 3b 0a 20 20 20 20 77 68 69  , base);.    whi
1aa20 6c 65 28 20 6a 3c 6e 54 65 72 6d 20 26 26 20 28  le( j<nTerm && (
1aa30 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
1aa40 4d 53 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  MS, pOrderBy->a[
1aa50 6a 5d 2e 70 45 78 70 72 29 26 6d 29 3d 3d 30 20  j].pExpr)&m)==0 
1aa60 29 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  ){.      j++;.  
1aa70 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1aa80 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   j;.}../*.** Fin
1aa90 64 20 74 68 65 20 62 65 73 74 20 71 75 65 72 79  d the best query
1aaa0 20 70 6c 61 6e 20 66 6f 72 20 61 63 63 65 73 73   plan for access
1aab0 69 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61 72  ing a particular
1aac0 20 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20 74   table.  Write t
1aad0 68 65 0a 2a 2a 20 62 65 73 74 20 71 75 65 72 79  he.** best query
1aae0 20 70 6c 61 6e 20 61 6e 64 20 69 74 73 20 63 6f   plan and its co
1aaf0 73 74 20 69 6e 74 6f 20 74 68 65 20 70 2d 3e 63  st into the p->c
1ab00 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ost..**.** The l
1ab10 6f 77 65 73 74 20 63 6f 73 74 20 70 6c 61 6e 20  owest cost plan 
1ab20 77 69 6e 73 2e 20 20 54 68 65 20 63 6f 73 74 20  wins.  The cost 
1ab30 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f  is an estimate o
1ab40 66 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 0a  f the amount of.
1ab50 2a 2a 20 43 50 55 20 61 6e 64 20 64 69 73 6b 20  ** CPU and disk 
1ab60 49 2f 4f 20 6e 65 65 64 65 64 20 74 6f 20 70 72  I/O needed to pr
1ab70 6f 63 65 73 73 20 74 68 65 20 72 65 71 75 65 73  ocess the reques
1ab80 74 65 64 20 72 65 73 75 6c 74 2e 0a 2a 2a 20 46  ted result..** F
1ab90 61 63 74 6f 72 73 20 74 68 61 74 20 69 6e 66 6c  actors that infl
1aba0 75 65 6e 63 65 20 63 6f 73 74 20 69 6e 63 6c 75  uence cost inclu
1abb0 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20  de:.**.**    *  
1abc0 54 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75  The estimated nu
1abd0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
1abe0 74 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65  t will be retrie
1abf0 76 65 64 2e 20 20 28 54 68 65 0a 2a 2a 20 20 20  ved.  (The.**   
1ac00 20 20 20 20 66 65 77 65 72 20 74 68 65 20 62 65      fewer the be
1ac10 74 74 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20  tter.).**.**    
1ac20 2a 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  *  Whether or no
1ac30 74 20 73 6f 72 74 69 6e 67 20 6d 75 73 74 20 6f  t sorting must o
1ac40 63 63 75 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  ccur..**.**    *
1ac50 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74    Whether or not
1ac60 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 73   there must be s
1ac70 65 70 61 72 61 74 65 20 6c 6f 6f 6b 75 70 73 20  eparate lookups 
1ac80 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  in the.**       
1ac90 69 6e 64 65 78 20 61 6e 64 20 69 6e 20 74 68 65  index and in the
1aca0 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 0a   main table..**.
1acb0 2a 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  ** If there was 
1acc0 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  an INDEXED BY cl
1acd0 61 75 73 65 20 28 70 53 72 63 2d 3e 70 49 6e 64  ause (pSrc->pInd
1ace0 65 78 29 20 61 74 74 61 63 68 65 64 20 74 6f 20  ex) attached to 
1acf0 74 68 65 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20  the table in.** 
1ad00 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
1ad10 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  t, then this fun
1ad20 63 74 69 6f 6e 20 6f 6e 6c 79 20 63 6f 6e 73 69  ction only consi
1ad30 64 65 72 73 20 70 6c 61 6e 73 20 75 73 69 6e 67  ders plans using
1ad40 20 74 68 65 20 0a 2a 2a 20 6e 61 6d 65 64 20 69   the .** named i
1ad50 6e 64 65 78 2e 20 49 66 20 6e 6f 20 73 75 63 68  ndex. If no such
1ad60 20 70 6c 61 6e 20 69 73 20 66 6f 75 6e 64 2c 20   plan is found, 
1ad70 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 65  then the returne
1ad80 64 20 63 6f 73 74 20 69 73 0a 2a 2a 20 53 51 4c  d cost is.** SQL
1ad90 49 54 45 5f 42 49 47 5f 44 42 4c 2e 20 49 66 20  ITE_BIG_DBL. If 
1ada0 61 20 70 6c 61 6e 20 69 73 20 66 6f 75 6e 64 20  a plan is found 
1adb0 74 68 61 74 20 75 73 65 73 20 74 68 65 20 6e 61  that uses the na
1adc0 6d 65 64 20 69 6e 64 65 78 2c 20 0a 2a 2a 20 74  med index, .** t
1add0 68 65 6e 20 74 68 65 20 63 6f 73 74 20 69 73 20  hen the cost is 
1ade0 63 61 6c 63 75 6c 61 74 65 64 20 69 6e 20 74 68  calculated in th
1adf0 65 20 75 73 75 61 6c 20 77 61 79 2e 0a 2a 2a 0a  e usual way..**.
1ae00 2a 2a 20 49 66 20 61 20 4e 4f 54 20 49 4e 44 45  ** If a NOT INDE
1ae10 58 45 44 20 63 6c 61 75 73 65 20 77 61 73 20 61  XED clause was a
1ae20 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74  ttached to the t
1ae30 61 62 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20  able .** in the 
1ae40 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1ae50 2c 20 74 68 65 6e 20 6e 6f 20 69 6e 64 65 78 65  , then no indexe
1ae60 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
1ae70 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20 0a  . However, the .
1ae80 2a 2a 20 73 65 6c 65 63 74 65 64 20 70 6c 61 6e  ** selected plan
1ae90 20 6d 61 79 20 73 74 69 6c 6c 20 74 61 6b 65 20   may still take 
1aea0 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65  advantage of the
1aeb0 20 62 75 69 6c 74 2d 69 6e 20 72 6f 77 69 64 20   built-in rowid 
1aec0 70 72 69 6d 61 72 79 20 6b 65 79 0a 2a 2a 20 69  primary key.** i
1aed0 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
1aee0 76 6f 69 64 20 62 65 73 74 42 74 72 65 65 49 6e  void bestBtreeIn
1aef0 64 65 78 28 57 68 65 72 65 42 65 73 74 49 64 78  dex(WhereBestIdx
1af00 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *p){.  Parse *p
1af10 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73  Parse = p->pPars
1af20 65 3b 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69  e;  /* The parsi
1af30 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1af40 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
1af50 20 3d 20 70 2d 3e 70 57 43 3b 20 20 2f 2a 20 54   = p->pWC;  /* T
1af60 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1af70 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
1af80 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 20 3d  ist_item *pSrc =
1af90 20 70 2d 3e 70 53 72 63 3b 20 2f 2a 20 54 68 65   p->pSrc; /* The
1afa0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
1afb0 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  m to search */. 
1afc0 20 69 6e 74 20 69 43 75 72 20 3d 20 70 53 72 63   int iCur = pSrc
1afd0 2d 3e 69 43 75 72 73 6f 72 3b 20 20 20 2f 2a 20  ->iCursor;   /* 
1afe0 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68  The cursor of th
1aff0 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 61 63  e table to be ac
1b000 63 65 73 73 65 64 20 2a 2f 0a 20 20 49 6e 64 65  cessed */.  Inde
1b010 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20 20  x *pProbe;      
1b020 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
1b030 64 65 78 20 77 65 20 61 72 65 20 65 76 61 6c 75  dex we are evalu
1b040 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78  ating */.  Index
1b050 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
1b060 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f         /* Copy o
1b070 66 20 70 50 72 6f 62 65 2c 20 6f 72 20 7a 65 72  f pProbe, or zer
1b080 6f 20 66 6f 72 20 49 50 4b 20 69 6e 64 65 78 20  o for IPK index 
1b090 2a 2f 0a 20 20 69 6e 74 20 65 71 54 65 72 6d 4d  */.  int eqTermM
1b0a0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
1b0b0 20 2f 2a 20 43 75 72 72 65 6e 74 20 6d 61 73 6b   /* Current mask
1b0c0 20 6f 66 20 76 61 6c 69 64 20 65 71 75 61 6c 69   of valid equali
1b0d0 74 79 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  ty operators */.
1b0e0 20 20 69 6e 74 20 69 64 78 45 71 54 65 72 6d 4d    int idxEqTermM
1b0f0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ask;          /*
1b100 20 49 6e 64 65 78 20 6d 61 73 6b 20 6f 66 20 76   Index mask of v
1b110 61 6c 69 64 20 65 71 75 61 6c 69 74 79 20 6f 70  alid equality op
1b120 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 49 6e 64  erators */.  Ind
1b130 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20  ex sPk;         
1b140 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61           /* A fa
1b150 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20  ke index object 
1b160 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20  for the primary 
1b170 6b 65 79 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  key */.  tRowcnt
1b180 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20   aiRowEstPk[2]; 
1b190 20 20 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f       /* The aiRo
1b1a0 77 45 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72  wEst[] value for
1b1b0 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a   the sPk index *
1b1c0 2f 0a 20 20 69 6e 74 20 61 69 43 6f 6c 75 6d 6e  /.  int aiColumn
1b1d0 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  Pk = -1;        
1b1e0 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d  /* The aColumn[]
1b1f0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
1b200 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  Pk index */.  in
1b210 74 20 77 73 46 6c 61 67 4d 61 73 6b 3b 20 20 20  t wsFlagMask;   
1b220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
1b230 6f 77 65 64 20 66 6c 61 67 73 20 69 6e 20 70 2d  owed flags in p-
1b240 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61  >cost.plan.wsFla
1b250 67 20 2a 2f 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  g */..  /* Initi
1b260 61 6c 69 7a 65 20 74 68 65 20 63 6f 73 74 20 74  alize the cost t
1b270 6f 20 61 20 77 6f 72 73 74 2d 63 61 73 65 20 76  o a worst-case v
1b280 61 6c 75 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  alue */.  memset
1b290 28 26 70 2d 3e 63 6f 73 74 2c 20 30 2c 20 73 69  (&p->cost, 0, si
1b2a0 7a 65 6f 66 28 70 2d 3e 63 6f 73 74 29 29 3b 0a  zeof(p->cost));.
1b2b0 20 20 70 2d 3e 63 6f 73 74 2e 72 43 6f 73 74 20    p->cost.rCost 
1b2c0 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c  = SQLITE_BIG_DBL
1b2d0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
1b2e0 53 72 63 20 74 61 62 6c 65 20 69 73 20 74 68 65  Src table is the
1b2f0 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20   right table of 
1b300 61 20 4c 45 46 54 20 4a 4f 49 4e 20 74 68 65 6e  a LEFT JOIN then
1b310 20 77 65 20 6d 61 79 20 6e 6f 74 0a 20 20 2a 2a   we may not.  **
1b320 20 75 73 65 20 61 6e 20 69 6e 64 65 78 20 74 6f   use an index to
1b330 20 73 61 74 69 73 66 79 20 49 53 20 4e 55 4c 4c   satisfy IS NULL
1b340 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20   constraints on 
1b350 74 68 61 74 20 74 61 62 6c 65 2e 20 20 54 68 69  that table.  Thi
1b360 73 20 69 73 0a 20 20 2a 2a 20 62 65 63 61 75 73  s is.  ** becaus
1b370 65 20 63 6f 6c 75 6d 6e 73 20 6d 69 67 68 74 20  e columns might 
1b380 65 6e 64 20 75 70 20 62 65 69 6e 67 20 4e 55 4c  end up being NUL
1b390 4c 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 64  L if the table d
1b3a0 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 2d 0a  oes not match -.
1b3b0 20 20 2a 2a 20 61 20 63 69 72 63 75 6d 73 74 61    ** a circumsta
1b3c0 6e 63 65 20 77 68 69 63 68 20 74 68 65 20 69 6e  nce which the in
1b3d0 64 65 78 20 63 61 6e 6e 6f 74 20 68 65 6c 70 20  dex cannot help 
1b3e0 75 73 20 64 69 73 63 6f 76 65 72 2e 20 20 54 69  us discover.  Ti
1b3f0 63 6b 65 74 20 23 32 31 37 37 2e 0a 20 20 2a 2f  cket #2177..  */
1b400 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6a 6f 69  .  if( pSrc->joi
1b410 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 20  ntype & JT_LEFT 
1b420 29 7b 0a 20 20 20 20 69 64 78 45 71 54 65 72 6d  ){.    idxEqTerm
1b430 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f  Mask = WO_EQ|WO_
1b440 49 4e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  IN;.  }else{.   
1b450 20 69 64 78 45 71 54 65 72 6d 4d 61 73 6b 20 3d   idxEqTermMask =
1b460 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f   WO_EQ|WO_IN|WO_
1b470 49 53 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 20 20 69  ISNULL;.  }..  i
1b480 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20  f( pSrc->pIndex 
1b490 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49 4e 44  ){.    /* An IND
1b4a0 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 73  EXED BY clause s
1b4b0 70 65 63 69 66 69 65 73 20 61 20 70 61 72 74 69  pecifies a parti
1b4c0 63 75 6c 61 72 20 69 6e 64 65 78 20 74 6f 20 75  cular index to u
1b4d0 73 65 20 2a 2f 0a 20 20 20 20 70 49 64 78 20 3d  se */.    pIdx =
1b4e0 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e   pProbe = pSrc->
1b4f0 70 49 6e 64 65 78 3b 0a 20 20 20 20 77 73 46 6c  pIndex;.    wsFl
1b500 61 67 4d 61 73 6b 20 3d 20 7e 28 57 48 45 52 45  agMask = ~(WHERE
1b510 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f  _ROWID_EQ|WHERE_
1b520 52 4f 57 49 44 5f 52 41 4e 47 45 29 3b 0a 20 20  ROWID_RANGE);.  
1b530 20 20 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20 69    eqTermMask = i
1b540 64 78 45 71 54 65 72 6d 4d 61 73 6b 3b 0a 20 20  dxEqTermMask;.  
1b550 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
1b560 65 72 65 20 69 73 20 6e 6f 20 49 4e 44 45 58 45  ere is no INDEXE
1b570 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20 43 72  D BY clause.  Cr
1b580 65 61 74 65 20 61 20 66 61 6b 65 20 49 6e 64 65  eate a fake Inde
1b590 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63 61  x object in loca
1b5a0 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c  l.    ** variabl
1b5b0 65 20 73 50 6b 20 74 6f 20 72 65 70 72 65 73 65  e sPk to represe
1b5c0 6e 74 20 74 68 65 20 72 6f 77 69 64 20 70 72 69  nt the rowid pri
1b5d0 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2e 20  mary key index. 
1b5e0 20 4d 61 6b 65 20 74 68 69 73 0a 20 20 20 20 2a   Make this.    *
1b5f0 2a 20 66 61 6b 65 20 69 6e 64 65 78 20 74 68 65  * fake index the
1b600 20 66 69 72 73 74 20 69 6e 20 61 20 63 68 61 69   first in a chai
1b610 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65 63  n of Index objec
1b620 74 73 20 77 69 74 68 20 61 6c 6c 20 6f 66 20 74  ts with all of t
1b630 68 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20 69  he real.    ** i
1b640 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f 77  ndices to follow
1b650 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
1b660 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
1b670 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1b680 20 6f 66 20 72 65 61 6c 20 69 6e 64 69 63 65 73   of real indices
1b690 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   on the table */
1b6a0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50 6b  .    memset(&sPk
1b6b0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64 65  , 0, sizeof(Inde
1b6c0 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 43 6f  x));.    sPk.nCo
1b6d0 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 73 50  lumn = 1;.    sP
1b6e0 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d 20 26 61 69  k.aiColumn = &ai
1b6f0 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20 73 50  ColumnPk;.    sP
1b700 6b 2e 61 69 52 6f 77 45 73 74 20 3d 20 61 69 52  k.aiRowEst = aiR
1b710 6f 77 45 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b  owEstPk;.    sPk
1b720 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65  .onError = OE_Re
1b730 70 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70  place;.    sPk.p
1b740 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54  Table = pSrc->pT
1b750 61 62 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74  ab;.    aiRowEst
1b760 50 6b 5b 30 5d 20 3d 20 70 53 72 63 2d 3e 70 54  Pk[0] = pSrc->pT
1b770 61 62 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20 20  ab->nRowEst;.   
1b780 20 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20 3d   aiRowEstPk[1] =
1b790 20 31 3b 0a 20 20 20 20 70 46 69 72 73 74 20 3d   1;.    pFirst =
1b7a0 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e   pSrc->pTab->pIn
1b7b0 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 53 72  dex;.    if( pSr
1b7c0 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30  c->notIndexed==0
1b7d0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
1b7e0 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 66   real indices of
1b7f0 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 6f   the table are o
1b800 6e 6c 79 20 63 6f 6e 73 69 64 65 72 65 64 20 69  nly considered i
1b810 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4e  f the.      ** N
1b820 4f 54 20 49 4e 44 45 58 45 44 20 71 75 61 6c 69  OT INDEXED quali
1b830 66 69 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20  fier is omitted 
1b840 66 72 6f 6d 20 74 68 65 20 46 52 4f 4d 20 63 6c  from the FROM cl
1b850 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 73 50  ause */.      sP
1b860 6b 2e 70 4e 65 78 74 20 3d 20 70 46 69 72 73 74  k.pNext = pFirst
1b870 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 72 6f  ;.    }.    pPro
1b880 62 65 20 3d 20 26 73 50 6b 3b 0a 20 20 20 20 77  be = &sPk;.    w
1b890 73 46 6c 61 67 4d 61 73 6b 20 3d 20 7e 28 0a 20  sFlagMask = ~(. 
1b8a0 20 20 20 20 20 20 20 57 48 45 52 45 5f 43 4f 4c         WHERE_COL
1b8b0 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c  UMN_IN|WHERE_COL
1b8c0 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 43 4f 4c  UMN_EQ|WHERE_COL
1b8d0 55 4d 4e 5f 4e 55 4c 4c 7c 57 48 45 52 45 5f 43  UMN_NULL|WHERE_C
1b8e0 4f 4c 55 4d 4e 5f 52 41 4e 47 45 0a 20 20 20 20  OLUMN_RANGE.    
1b8f0 29 3b 0a 20 20 20 20 65 71 54 65 72 6d 4d 61 73  );.    eqTermMas
1b900 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b  k = WO_EQ|WO_IN;
1b910 0a 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20  .    pIdx = 0;. 
1b920 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76   }..  /* Loop ov
1b930 65 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c  er all indices l
1b940 6f 6f 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 62  ooking for the b
1b950 65 73 74 20 6f 6e 65 20 74 6f 20 75 73 65 0a 20  est one to use. 
1b960 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 70 50 72 6f   */.  for(; pPro
1b970 62 65 3b 20 70 49 64 78 3d 70 50 72 6f 62 65 3d  be; pIdx=pProbe=
1b980 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 29 7b 0a  pProbe->pNext){.
1b990 20 20 20 20 63 6f 6e 73 74 20 74 52 6f 77 63 6e      const tRowcn
1b9a0 74 20 2a 20 63 6f 6e 73 74 20 61 69 52 6f 77 45  t * const aiRowE
1b9b0 73 74 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52  st = pProbe->aiR
1b9c0 6f 77 45 73 74 3b 0a 20 20 20 20 57 68 65 72 65  owEst;.    Where
1b9d0 43 6f 73 74 20 70 63 3b 20 20 20 20 20 20 20 20  Cost pc;        
1b9e0 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f         /* Cost o
1b9f0 66 20 75 73 69 6e 67 20 70 50 72 6f 62 65 20 2a  f using pProbe *
1ba00 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 6c 6f 67  /.    double log
1ba10 31 30 4e 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b  10N = (double)1;
1ba20 20 20 2f 2a 20 62 61 73 65 2d 31 30 20 6c 6f 67    /* base-10 log
1ba30 61 72 69 74 68 6d 20 6f 66 20 6e 52 6f 77 20 28  arithm of nRow (
1ba40 69 6e 65 78 61 63 74 29 20 2a 2f 0a 0a 20 20 20  inexact) */..   
1ba50 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
1ba60 67 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  g variables are 
1ba70 70 6f 70 75 6c 61 74 65 64 20 62 61 73 65 64 20  populated based 
1ba80 6f 6e 20 74 68 65 20 70 72 6f 70 65 72 74 69 65  on the propertie
1ba90 73 20 6f 66 0a 20 20 20 20 2a 2a 20 69 6e 64 65  s of.    ** inde
1baa0 78 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65  x being evaluate
1bab0 64 2e 20 54 68 65 79 20 61 72 65 20 74 68 65 6e  d. They are then
1bac0 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
1bad0 6e 65 20 74 68 65 20 65 78 70 65 63 74 65 64 0a  ne the expected.
1bae0 20 20 20 20 2a 2a 20 63 6f 73 74 20 61 6e 64 20      ** cost and 
1baf0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 72  number of rows r
1bb00 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 2a 2a 0a  eturned..    **.
1bb10 20 20 20 20 2a 2a 20 20 70 63 2e 70 6c 61 6e 2e      **  pc.plan.
1bb20 6e 45 71 3a 20 0a 20 20 20 20 2a 2a 20 20 20 20  nEq: .    **    
1bb30 4e 75 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69  Number of equali
1bb40 74 79 20 74 65 72 6d 73 20 74 68 61 74 20 63 61  ty terms that ca
1bb50 6e 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64  n be implemented
1bb60 20 75 73 69 6e 67 20 74 68 65 20 69 6e 64 65 78   using the index
1bb70 2e 0a 20 20 20 20 2a 2a 20 20 20 20 49 6e 20 6f  ..    **    In o
1bb80 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
1bb90 6e 75 6d 62 65 72 20 6f 66 20 69 6e 69 74 69 61  number of initia
1bba0 6c 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  l fields in the 
1bbb0 69 6e 64 65 78 20 74 68 61 74 0a 20 20 20 20 2a  index that.    *
1bbc0 2a 20 20 20 20 61 72 65 20 75 73 65 64 20 69 6e  *    are used in
1bbd0 20 3d 3d 20 6f 72 20 49 4e 20 6f 72 20 4e 4f 54   == or IN or NOT
1bbe0 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
1bbf0 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
1bc00 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  lause..    **.  
1bc10 20 20 2a 2a 20 20 6e 49 6e 4d 75 6c 3a 20 20 0a    **  nInMul:  .
1bc20 20 20 20 20 2a 2a 20 20 20 20 54 68 65 20 22 69      **    The "i
1bc30 6e 2d 6d 75 6c 74 69 70 6c 69 65 72 22 2e 20 54  n-multiplier". T
1bc40 68 69 73 20 69 73 20 61 6e 20 65 73 74 69 6d 61  his is an estima
1bc50 74 65 20 6f 66 20 68 6f 77 20 6d 61 6e 79 20 73  te of how many s
1bc60 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20 0a  eek operations .
1bc70 20 20 20 20 2a 2a 20 20 20 20 53 51 4c 69 74 65      **    SQLite
1bc80 20 6d 75 73 74 20 70 65 72 66 6f 72 6d 20 6f 6e   must perform on
1bc90 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 71 75   the index in qu
1bca0 65 73 74 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d  estion. For exam
1bcb0 70 6c 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20  ple, if the .   
1bcc0 20 2a 2a 20 20 20 20 57 48 45 52 45 20 63 6c 61   **    WHERE cla
1bcd0 75 73 65 20 69 73 3a 0a 20 20 20 20 2a 2a 0a 20  use is:.    **. 
1bce0 20 20 20 2a 2a 20 20 20 20 20 20 57 48 45 52 45     **      WHERE
1bcf0 20 61 20 49 4e 20 28 31 2c 20 32 2c 20 33 29 20   a IN (1, 2, 3) 
1bd00 41 4e 44 20 62 20 49 4e 20 28 34 2c 20 35 2c 20  AND b IN (4, 5, 
1bd10 36 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  6).    **.    **
1bd20 20 20 20 20 53 51 4c 69 74 65 20 6d 75 73 74 20      SQLite must 
1bd30 70 65 72 66 6f 72 6d 20 39 20 6c 6f 6f 6b 75 70  perform 9 lookup
1bd40 73 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 6f 6e  s on an index on
1bd50 20 28 61 2c 20 62 29 2c 20 73 6f 20 6e 49 6e 4d   (a, b), so nInM
1bd60 75 6c 20 69 73 20 0a 20 20 20 20 2a 2a 20 20 20  ul is .    **   
1bd70 20 73 65 74 20 74 6f 20 39 2e 20 47 69 76 65 6e   set to 9. Given
1bd80 20 74 68 65 20 73 61 6d 65 20 73 63 68 65 6d 61   the same schema
1bd90 20 61 6e 64 20 65 69 74 68 65 72 20 6f 66 20 74   and either of t
1bda0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 57 48 45  he following WHE
1bdb0 52 45 20 0a 20 20 20 20 2a 2a 20 20 20 20 63 6c  RE .    **    cl
1bdc0 61 75 73 65 73 3a 0a 20 20 20 20 2a 2a 0a 20 20  auses:.    **.  
1bdd0 20 20 2a 2a 20 20 20 20 20 20 57 48 45 52 45 20    **      WHERE 
1bde0 61 20 3d 20 20 31 0a 20 20 20 20 2a 2a 20 20 20  a =  1.    **   
1bdf0 20 20 20 57 48 45 52 45 20 61 20 3e 3d 20 32 0a     WHERE a >= 2.
1be00 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1be10 20 6e 49 6e 4d 75 6c 20 69 73 20 73 65 74 20 74   nInMul is set t
1be20 6f 20 31 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  o 1..    **.    
1be30 2a 2a 20 20 20 20 49 66 20 74 68 65 72 65 20 65  **    If there e
1be40 78 69 73 74 73 20 61 20 57 48 45 52 45 20 74 65  xists a WHERE te
1be50 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rm of the form "
1be60 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  x IN (SELECT ...
1be70 29 22 2c 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a  )", then .    **
1be80 20 20 20 20 74 68 65 20 73 75 62 2d 73 65 6c 65      the sub-sele
1be90 63 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  ct is assumed to
1bea0 20 72 65 74 75 72 6e 20 32 35 20 72 6f 77 73 20   return 25 rows 
1beb0 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  for the purposes
1bec0 20 6f 66 20 0a 20 20 20 20 2a 2a 20 20 20 20 64   of .    **    d
1bed0 65 74 65 72 6d 69 6e 69 6e 67 20 6e 49 6e 4d 75  etermining nInMu
1bee0 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  l..    **.    **
1bef0 20 20 62 49 6e 45 73 74 3a 20 20 0a 20 20 20 20    bInEst:  .    
1bf00 2a 2a 20 20 20 20 53 65 74 20 74 6f 20 74 72 75  **    Set to tru
1bf10 65 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61  e if there was a
1bf20 74 20 6c 65 61 73 74 20 6f 6e 65 20 22 78 20 49  t least one "x I
1bf30 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
1bf40 74 65 72 6d 20 75 73 65 64 20 0a 20 20 20 20 2a  term used .    *
1bf50 2a 20 20 20 20 69 6e 20 64 65 74 65 72 6d 69 6e  *    in determin
1bf60 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ing the value of
1bf70 20 6e 49 6e 4d 75 6c 2e 20 20 4e 6f 74 65 20 74   nInMul.  Note t
1bf80 68 61 74 20 74 68 65 20 52 48 53 20 6f 66 20 74  hat the RHS of t
1bf90 68 65 0a 20 20 20 20 2a 2a 20 20 20 20 49 4e 20  he.    **    IN 
1bfa0 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 20 62 65  operator must be
1bfb0 20 61 20 53 45 4c 45 43 54 2c 20 6e 6f 74 20 61   a SELECT, not a
1bfc0 20 76 61 6c 75 65 20 6c 69 73 74 2c 20 66 6f 72   value list, for
1bfd0 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 0a 20   this variable. 
1bfe0 20 20 20 2a 2a 20 20 20 20 74 6f 20 62 65 20 74     **    to be t
1bff0 72 75 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  rue..    **.    
1c000 2a 2a 20 20 72 61 6e 67 65 44 69 76 3a 0a 20 20  **  rangeDiv:.  
1c010 20 20 2a 2a 20 20 20 20 41 6e 20 65 73 74 69 6d    **    An estim
1c020 61 74 65 20 6f 66 20 61 20 64 69 76 69 73 6f 72  ate of a divisor
1c030 20 62 79 20 77 68 69 63 68 20 74 6f 20 72 65 64   by which to red
1c040 75 63 65 20 74 68 65 20 73 65 61 72 63 68 20 73  uce the search s
1c050 70 61 63 65 20 64 75 65 0a 20 20 20 20 2a 2a 20  pace due.    ** 
1c060 20 20 20 74 6f 20 69 6e 65 71 75 61 6c 69 74 79     to inequality
1c070 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 49   constraints.  I
1c080 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66  n the absence of
1c090 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 41 4e   sqlite_stat3 AN
1c0a0 41 4c 59 5a 45 0a 20 20 20 20 2a 2a 20 20 20 20  ALYZE.    **    
1c0b0 64 61 74 61 2c 20 61 20 73 69 6e 67 6c 65 20 69  data, a single i
1c0c0 6e 65 71 75 61 6c 69 74 79 20 72 65 64 75 63 65  nequality reduce
1c0d0 73 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  s the search spa
1c0e0 63 65 20 74 6f 20 31 2f 34 72 64 20 69 74 73 0a  ce to 1/4rd its.
1c0f0 20 20 20 20 2a 2a 20 20 20 20 6f 72 69 67 69 6e      **    origin
1c100 61 6c 20 73 69 7a 65 20 28 72 61 6e 67 65 44 69  al size (rangeDi
1c110 76 3d 3d 34 29 2e 20 20 54 77 6f 20 69 6e 65 71  v==4).  Two ineq
1c120 75 61 6c 69 74 69 65 73 20 72 65 64 75 63 65 20  ualities reduce 
1c130 74 68 65 20 73 65 61 72 63 68 0a 20 20 20 20 2a  the search.    *
1c140 2a 20 20 20 20 73 70 61 63 65 20 74 6f 20 31 2f  *    space to 1/
1c150 31 36 74 68 20 6f 66 20 69 74 73 20 6f 72 69 67  16th of its orig
1c160 69 6e 61 6c 20 73 69 7a 65 20 28 72 61 6e 67 65  inal size (range
1c170 44 69 76 3d 3d 31 36 29 2e 0a 20 20 20 20 2a 2a  Div==16)..    **
1c180 0a 20 20 20 20 2a 2a 20 20 62 53 6f 72 74 3a 20  .    **  bSort: 
1c190 20 20 0a 20 20 20 20 2a 2a 20 20 20 20 42 6f 6f    .    **    Boo
1c1a0 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 74 68  lean. True if th
1c1b0 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
1c1c0 42 59 20 63 6c 61 75 73 65 20 74 68 61 74 20 77  BY clause that w
1c1d0 69 6c 6c 20 72 65 71 75 69 72 65 20 61 6e 20 0a  ill require an .
1c1e0 20 20 20 20 2a 2a 20 20 20 20 65 78 74 65 72 6e      **    extern
1c1f0 61 6c 20 73 6f 72 74 20 28 69 2e 65 2e 20 73 63  al sort (i.e. sc
1c200 61 6e 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78  anning the index
1c210 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64   being evaluated
1c220 20 77 69 6c 6c 20 6e 6f 74 20 0a 20 20 20 20 2a   will not .    *
1c230 2a 20 20 20 20 63 6f 72 72 65 63 74 6c 79 20 6f  *    correctly o
1c240 72 64 65 72 20 72 65 63 6f 72 64 73 29 2e 0a 20  rder records).. 
1c250 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 62 44     **.    **  bD
1c260 69 73 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20 42  ist:.    **    B
1c270 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20  oolean. True if 
1c280 74 68 65 72 65 20 69 73 20 61 20 44 49 53 54 49  there is a DISTI
1c290 4e 43 54 20 63 6c 61 75 73 65 20 74 68 61 74 20  NCT clause that 
1c2a0 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 6e 20  will require an 
1c2b0 0a 20 20 20 20 2a 2a 20 20 20 20 65 78 74 65 72  .    **    exter
1c2c0 6e 61 6c 20 62 74 72 65 65 2e 0a 20 20 20 20 2a  nal btree..    *
1c2d0 2a 0a 20 20 20 20 2a 2a 20 20 62 4c 6f 6f 6b 75  *.    **  bLooku
1c2e0 70 3a 20 0a 20 20 20 20 2a 2a 20 20 20 20 42 6f  p: .    **    Bo
1c2f0 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 61  olean. True if a
1c300 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 20 69 73   table lookup is
1c310 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61   required for ea
1c320 63 68 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 20  ch index entry. 
1c330 20 20 20 2a 2a 20 20 20 20 76 69 73 69 74 65 64     **    visited
1c340 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
1c350 73 2c 20 74 72 75 65 20 69 66 20 74 68 69 73 20  s, true if this 
1c360 69 73 20 6e 6f 74 20 61 20 63 6f 76 65 72 69 6e  is not a coverin
1c370 67 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 20  g index..    ** 
1c380 20 20 20 54 68 69 73 20 69 73 20 61 6c 77 61 79     This is alway
1c390 73 20 66 61 6c 73 65 20 66 6f 72 20 74 68 65 20  s false for the 
1c3a0 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65  rowid primary ke
1c3b0 79 20 69 6e 64 65 78 20 6f 66 20 61 20 74 61 62  y index of a tab
1c3c0 6c 65 2e 0a 20 20 20 20 2a 2a 20 20 20 20 46 6f  le..    **    Fo
1c3d0 72 20 6f 74 68 65 72 20 69 6e 64 65 78 65 73 2c  r other indexes,
1c3e0 20 69 74 20 69 73 20 74 72 75 65 20 75 6e 6c 65   it is true unle
1c3f0 73 73 20 61 6c 6c 20 74 68 65 20 63 6f 6c 75 6d  ss all the colum
1c400 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a  ns of the table.
1c410 20 20 20 20 2a 2a 20 20 20 20 75 73 65 64 20 62      **    used b
1c420 79 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  y the SELECT sta
1c430 74 65 6d 65 6e 74 20 61 72 65 20 70 72 65 73 65  tement are prese
1c440 6e 74 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  nt in the index 
1c450 28 73 75 63 68 20 61 6e 0a 20 20 20 20 2a 2a 20  (such an.    ** 
1c460 20 20 20 69 6e 64 65 78 20 69 73 20 73 6f 6d 65     index is some
1c470 74 69 6d 65 73 20 64 65 73 63 72 69 62 65 64 20  times described 
1c480 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  as a covering in
1c490 64 65 78 29 2e 0a 20 20 20 20 2a 2a 20 20 20 20  dex)..    **    
1c4a0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 67 69 76  For example, giv
1c4b0 65 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20  en the index on 
1c4c0 28 61 2c 20 62 29 2c 20 74 68 65 20 73 65 63 6f  (a, b), the seco
1c4d0 6e 64 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  nd of the follow
1c4e0 69 6e 67 20 0a 20 20 20 20 2a 2a 20 20 20 20 74  ing .    **    t
1c4f0 77 6f 20 71 75 65 72 69 65 73 20 72 65 71 75 69  wo queries requi
1c500 72 65 73 20 74 61 62 6c 65 20 62 2d 74 72 65 65  res table b-tree
1c510 20 6c 6f 6f 6b 75 70 73 20 69 6e 20 6f 72 64 65   lookups in orde
1c520 72 20 74 6f 20 66 69 6e 64 20 74 68 65 20 76 61  r to find the va
1c530 6c 75 65 0a 20 20 20 20 2a 2a 20 20 20 20 6f 66  lue.    **    of
1c540 20 63 6f 6c 75 6d 6e 20 63 2c 20 62 75 74 20 74   column c, but t
1c550 68 65 20 66 69 72 73 74 20 64 6f 65 73 20 6e 6f  he first does no
1c560 74 20 62 65 63 61 75 73 65 20 63 6f 6c 75 6d 6e  t because column
1c570 73 20 61 20 61 6e 64 20 62 20 61 72 65 0a 20 20  s a and b are.  
1c580 20 20 2a 2a 20 20 20 20 62 6f 74 68 20 61 76 61    **    both ava
1c590 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 20 69 6e  ilable in the in
1c5a0 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  dex..    **.    
1c5b0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 53  **             S
1c5c0 45 4c 45 43 54 20 61 2c 20 62 20 20 20 20 46 52  ELECT a, b    FR
1c5d0 4f 4d 20 74 62 6c 20 57 48 45 52 45 20 61 20 3d  OM tbl WHERE a =
1c5e0 20 31 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   1;.    **      
1c5f0 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c         SELECT a,
1c600 20 62 2c 20 63 20 46 52 4f 4d 20 74 62 6c 20 57   b, c FROM tbl W
1c610 48 45 52 45 20 61 20 3d 20 31 3b 0a 20 20 20 20  HERE a = 1;.    
1c620 2a 2f 0a 20 20 20 20 69 6e 74 20 62 49 6e 45 73  */.    int bInEs
1c630 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
1c640 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1c650 22 78 20 49 4e 20 28 53 45 4c 45 43 54 2e 2e 2e  "x IN (SELECT...
1c660 29 22 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 69  )" seen */.    i
1c670 6e 74 20 6e 49 6e 4d 75 6c 20 3d 20 31 3b 20 20  nt nInMul = 1;  
1c680 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c690 4e 75 6d 62 65 72 20 6f 66 20 64 69 73 74 69 6e  Number of distin
1c6a0 63 74 20 65 71 75 61 6c 69 74 69 65 73 20 74 6f  ct equalities to
1c6b0 20 6c 6f 6f 6b 75 70 20 2a 2f 0a 20 20 20 20 64   lookup */.    d
1c6c0 6f 75 62 6c 65 20 72 61 6e 67 65 44 69 76 20 3d  ouble rangeDiv =
1c6d0 20 28 64 6f 75 62 6c 65 29 31 3b 20 20 2f 2a 20   (double)1;  /* 
1c6e0 45 73 74 69 6d 61 74 65 64 20 72 65 64 75 63 74  Estimated reduct
1c6f0 69 6f 6e 20 69 6e 20 73 65 61 72 63 68 20 73 70  ion in search sp
1c700 61 63 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ace */.    int n
1c710 42 6f 75 6e 64 20 3d 20 30 3b 20 20 20 20 20 20  Bound = 0;      
1c720 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1c730 65 72 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73  er of range cons
1c740 74 72 61 69 6e 74 73 20 73 65 65 6e 20 2a 2f 0a  traints seen */.
1c750 20 20 20 20 69 6e 74 20 62 53 6f 72 74 3b 20 20      int bSort;  
1c760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c770 20 20 2f 2a 20 54 72 75 65 20 69 66 20 65 78 74    /* True if ext
1c780 65 72 6e 61 6c 20 73 6f 72 74 20 72 65 71 75 69  ernal sort requi
1c790 72 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  red */.    int b
1c7a0 44 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Dist;           
1c7b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1c7c0 20 69 66 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74   if index cannot
1c7d0 20 68 65 6c 70 20 77 69 74 68 20 44 49 53 54 49   help with DISTI
1c7e0 4e 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  NCT */.    int b
1c7f0 4c 6f 6f 6b 75 70 20 3d 20 30 3b 20 20 20 20 20  Lookup = 0;     
1c800 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1c810 20 69 66 20 6e 6f 74 20 61 20 63 6f 76 65 72 69   if not a coveri
1c820 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ng index */.    
1c830 69 6e 74 20 6e 50 72 69 6f 72 53 61 74 3b 20 20  int nPriorSat;  
1c840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c850 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
1c860 73 61 74 69 73 66 69 65 64 20 62 79 20 6f 75 74  satisfied by out
1c870 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20  er loops */.    
1c880 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20  int nOrderBy;   
1c890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c8a0 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52   Number of ORDER
1c8b0 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20   BY terms */.   
1c8c0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
1c8d0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;             /
1c8e0 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  * A single term 
1c8f0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
1c900 75 73 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  use */.#ifdef SQ
1c910 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
1c920 33 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  3.    WhereTerm 
1c930 2a 70 46 69 72 73 74 54 65 72 6d 20 3d 20 30 3b  *pFirstTerm = 0;
1c940 20 20 20 20 2f 2a 20 46 69 72 73 74 20 74 65 72      /* First ter
1c950 6d 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20 69  m matching the i
1c960 6e 64 65 78 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  ndex */.#endif..
1c970 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28      WHERETRACE((
1c980 0a 20 20 20 20 20 20 22 20 20 20 25 73 28 25 73  .      "   %s(%s
1c990 29 3a 5c 6e 22 2c 0a 20 20 20 20 20 20 70 53 72  ):\n",.      pSr
1c9a0 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  c->pTab->zName, 
1c9b0 28 70 49 64 78 20 3f 20 70 49 64 78 2d 3e 7a 4e  (pIdx ? pIdx->zN
1c9c0 61 6d 65 20 3a 20 22 69 70 6b 22 29 0a 20 20 20  ame : "ipk").   
1c9d0 20 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28   ));.    memset(
1c9e0 26 70 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  &pc, 0, sizeof(p
1c9f0 63 29 29 3b 0a 20 20 20 20 6e 4f 72 64 65 72 42  c));.    nOrderB
1ca00 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  y = p->pOrderBy 
1ca10 3f 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  ? p->pOrderBy->n
1ca20 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 69 66  Expr : 0;.    if
1ca30 28 20 70 2d 3e 69 20 29 7b 0a 20 20 20 20 20 20  ( p->i ){.      
1ca40 6e 50 72 69 6f 72 53 61 74 20 3d 20 70 63 2e 70  nPriorSat = pc.p
1ca50 6c 61 6e 2e 6e 4f 42 53 61 74 20 3d 20 70 2d 3e  lan.nOBSat = p->
1ca60 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d 2e 70  aLevel[p->i-1].p
1ca70 6c 61 6e 2e 6e 4f 42 53 61 74 3b 0a 20 20 20 20  lan.nOBSat;.    
1ca80 20 20 62 53 6f 72 74 20 3d 20 6e 50 72 69 6f 72    bSort = nPrior
1ca90 53 61 74 3c 6e 4f 72 64 65 72 42 79 3b 0a 20 20  Sat<nOrderBy;.  
1caa0 20 20 20 20 62 44 69 73 74 20 3d 20 30 3b 0a 20      bDist = 0;. 
1cab0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cac0 6e 50 72 69 6f 72 53 61 74 20 3d 20 70 63 2e 70  nPriorSat = pc.p
1cad0 6c 61 6e 2e 6e 4f 42 53 61 74 20 3d 20 30 3b 0a  lan.nOBSat = 0;.
1cae0 20 20 20 20 20 20 62 53 6f 72 74 20 3d 20 6e 4f        bSort = nO
1caf0 72 64 65 72 42 79 3e 30 3b 0a 20 20 20 20 20 20  rderBy>0;.      
1cb00 62 44 69 73 74 20 3d 20 70 2d 3e 70 44 69 73 74  bDist = p->pDist
1cb10 69 6e 63 74 21 3d 30 3b 0a 20 20 20 20 7d 0a 0a  inct!=0;.    }..
1cb20 20 20 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65      /* Determine
1cb30 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 70   the values of p
1cb40 63 2e 70 6c 61 6e 2e 6e 45 71 20 61 6e 64 20 6e  c.plan.nEq and n
1cb50 49 6e 4d 75 6c 20 2a 2f 0a 20 20 20 20 66 6f 72  InMul */.    for
1cb60 28 70 63 2e 70 6c 61 6e 2e 6e 45 71 3d 30 3b 20  (pc.plan.nEq=0; 
1cb70 70 63 2e 70 6c 61 6e 2e 6e 45 71 3c 70 50 72 6f  pc.plan.nEq<pPro
1cb80 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 70 63 2e  be->nColumn; pc.
1cb90 70 6c 61 6e 2e 6e 45 71 2b 2b 29 7b 0a 20 20 20  plan.nEq++){.   
1cba0 20 20 20 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62     int j = pProb
1cbb0 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 63 2e 70  e->aiColumn[pc.p
1cbc0 6c 61 6e 2e 6e 45 71 5d 3b 0a 20 20 20 20 20 20  lan.nEq];.      
1cbd0 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
1cbe0 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 70  (pWC, iCur, j, p
1cbf0 2d 3e 6e 6f 74 52 65 61 64 79 2c 20 65 71 54 65  ->notReady, eqTe
1cc00 72 6d 4d 61 73 6b 2c 20 70 49 64 78 29 3b 0a 20  rmMask, pIdx);. 
1cc10 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d       if( pTerm==
1cc20 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
1cc30 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73   pc.plan.wsFlags
1cc40 20 7c 3d 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d   |= (WHERE_COLUM
1cc50 4e 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44  N_EQ|WHERE_ROWID
1cc60 5f 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74  _EQ);.      test
1cc70 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 57 43  case( pTerm->pWC
1cc80 21 3d 70 57 43 20 29 3b 0a 20 20 20 20 20 20 69  !=pWC );.      i
1cc90 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
1cca0 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20  tor & WO_IN ){. 
1ccb0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
1ccc0 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
1ccd0 72 3b 0a 20 20 20 20 20 20 20 20 70 63 2e 70 6c  r;.        pc.pl
1cce0 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  an.wsFlags |= WH
1ccf0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20  ERE_COLUMN_IN;. 
1cd00 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48         if( ExprH
1cd10 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1cd20 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1cd30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1cd40 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  "x IN (SELECT ..
1cd50 2e 29 22 3a 20 20 41 73 73 75 6d 65 20 74 68 65  .)":  Assume the
1cd60 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20   SELECT returns 
1cd70 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20  25 rows */.     
1cd80 20 20 20 20 20 6e 49 6e 4d 75 6c 20 2a 3d 20 32       nInMul *= 2
1cd90 35 3b 0a 20 20 20 20 20 20 20 20 20 20 62 49 6e  5;.          bIn
1cda0 45 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Est = 1;.       
1cdb0 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
1cdc0 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  S(pExpr->x.pList
1cdd0 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69   && pExpr->x.pLi
1cde0 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20  st->nExpr) ){.  
1cdf0 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e          /* "x IN
1ce00 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20   (value, value, 
1ce10 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20 20 20  ...)" */.       
1ce20 20 20 20 6e 49 6e 4d 75 6c 20 2a 3d 20 70 45 78     nInMul *= pEx
1ce30 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
1ce40 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  pr;.        }.  
1ce50 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
1ce60 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1ce70 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20   WO_ISNULL ){.  
1ce80 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73        pc.plan.ws
1ce90 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
1cea0 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20  OLUMN_NULL;.    
1ceb0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
1cec0 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20  E_ENABLE_STAT3. 
1ced0 20 20 20 20 20 69 66 28 20 70 63 2e 70 6c 61 6e       if( pc.plan
1cee0 2e 6e 45 71 3d 3d 30 20 26 26 20 70 50 72 6f 62  .nEq==0 && pProb
1cef0 65 2d 3e 61 53 61 6d 70 6c 65 20 29 20 70 46 69  e->aSample ) pFi
1cf00 72 73 74 54 65 72 6d 20 3d 20 70 54 65 72 6d 3b  rstTerm = pTerm;
1cf10 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 70 63  .#endif.      pc
1cf20 2e 75 73 65 64 20 7c 3d 20 70 54 65 72 6d 2d 3e  .used |= pTerm->
1cf30 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20  prereqRight;.   
1cf40 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 49 66 20 74   }. .    /* If t
1cf50 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 63  he index being c
1cf60 6f 6e 73 69 64 65 72 65 64 20 69 73 20 55 4e 49  onsidered is UNI
1cf70 51 55 45 2c 20 61 6e 64 20 74 68 65 72 65 20 69  QUE, and there i
1cf80 73 20 61 6e 20 65 71 75 61 6c 69 74 79 20 0a 20  s an equality . 
1cf90 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74     ** constraint
1cfa0 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73   for all columns
1cfb0 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20 74   in the index, t
1cfc0 68 65 6e 20 74 68 69 73 20 73 65 61 72 63 68 20  hen this search 
1cfd0 77 69 6c 6c 20 66 69 6e 64 0a 20 20 20 20 2a 2a  will find.    **
1cfe0 20 61 74 20 6d 6f 73 74 20 61 20 73 69 6e 67 6c   at most a singl
1cff0 65 20 72 6f 77 2e 20 49 6e 20 74 68 69 73 20 63  e row. In this c
1d000 61 73 65 20 73 65 74 20 74 68 65 20 57 48 45 52  ase set the WHER
1d010 45 5f 55 4e 49 51 55 45 20 66 6c 61 67 20 74 6f  E_UNIQUE flag to
1d020 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 61 74   .    ** indicat
1d030 65 20 74 68 69 73 20 74 6f 20 74 68 65 20 63 61  e this to the ca
1d040 6c 6c 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ller..    **.   
1d050 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69   ** Otherwise, i
1d060 66 20 74 68 65 20 73 65 61 72 63 68 20 6d 61 79  f the search may
1d070 20 66 69 6e 64 20 6d 6f 72 65 20 74 68 61 6e 20   find more than 
1d080 6f 6e 65 20 72 6f 77 2c 20 74 65 73 74 20 74 6f  one row, test to
1d090 20 73 65 65 20 69 66 0a 20 20 20 20 2a 2a 20 74   see if.    ** t
1d0a0 68 65 72 65 20 69 73 20 61 20 72 61 6e 67 65 20  here is a range 
1d0b0 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 69 6e  constraint on in
1d0c0 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20 28 70 63  dexed column (pc
1d0d0 2e 70 6c 61 6e 2e 6e 45 71 2b 31 29 20 74 68 61  .plan.nEq+1) tha
1d0e0 74 20 63 61 6e 20 62 65 20 0a 20 20 20 20 2a 2a  t can be .    **
1d0f0 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67   optimized using
1d100 20 74 68 65 20 69 6e 64 65 78 2e 20 0a 20 20 20   the index. .   
1d110 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 2e 70   */.    if( pc.p
1d120 6c 61 6e 2e 6e 45 71 3d 3d 70 50 72 6f 62 65 2d  lan.nEq==pProbe-
1d130 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 70 50 72 6f  >nColumn && pPro
1d140 62 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  be->onError!=OE_
1d150 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 74 65  None ){.      te
1d160 73 74 63 61 73 65 28 20 70 63 2e 70 6c 61 6e 2e  stcase( pc.plan.
1d170 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1d180 43 4f 4c 55 4d 4e 5f 49 4e 20 29 3b 0a 20 20 20  COLUMN_IN );.   
1d190 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2e     testcase( pc.
1d1a0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
1d1b0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c  HERE_COLUMN_NULL
1d1c0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   );.      if( (p
1d1d0 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  c.plan.wsFlags &
1d1e0 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49   (WHERE_COLUMN_I
1d1f0 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e  N|WHERE_COLUMN_N
1d200 55 4c 4c 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ULL))==0 ){.    
1d210 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c      pc.plan.wsFl
1d220 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e 49  ags |= WHERE_UNI
1d230 51 55 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28  QUE;.        if(
1d240 20 70 2d 3e 69 3d 3d 30 20 7c 7c 20 28 70 2d 3e   p->i==0 || (p->
1d250 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d 2e 70  aLevel[p->i-1].p
1d260 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
1d270 45 52 45 5f 41 4c 4c 5f 55 4e 49 51 55 45 29 21  ERE_ALL_UNIQUE)!
1d280 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1d290 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  pc.plan.wsFlags 
1d2a0 7c 3d 20 57 48 45 52 45 5f 41 4c 4c 5f 55 4e 49  |= WHERE_ALL_UNI
1d2b0 51 55 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  QUE;.        }. 
1d2c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
1d2d0 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 55 6e   if( pProbe->bUn
1d2e0 6f 72 64 65 72 65 64 3d 3d 30 20 29 7b 0a 20 20  ordered==0 ){.  
1d2f0 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
1d300 20 6a 20 3d 20 28 70 63 2e 70 6c 61 6e 2e 6e 45   j = (pc.plan.nE
1d310 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75  q==pProbe->nColu
1d320 6d 6e 20 3f 20 2d 31 20 3a 20 70 50 72 6f 62 65  mn ? -1 : pProbe
1d330 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 63 2e 70 6c  ->aiColumn[pc.pl
1d340 61 6e 2e 6e 45 71 5d 29 3b 0a 20 20 20 20 20 20  an.nEq]);.      
1d350 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57 43  if( findTerm(pWC
1d360 2c 20 69 43 75 72 2c 20 6a 2c 20 70 2d 3e 6e 6f  , iCur, j, p->no
1d370 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f  tReady, WO_LT|WO
1d380 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c  _LE|WO_GT|WO_GE,
1d390 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20   pIdx) ){.      
1d3a0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 6f    WhereTerm *pTo
1d3b0 70 2c 20 2a 70 42 74 6d 3b 0a 20 20 20 20 20 20  p, *pBtm;.      
1d3c0 20 20 70 54 6f 70 20 3d 20 66 69 6e 64 54 65 72    pTop = findTer
1d3d0 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20  m(pWC, iCur, j, 
1d3e0 70 2d 3e 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  p->notReady, WO_
1d3f0 4c 54 7c 57 4f 5f 4c 45 2c 20 70 49 64 78 29 3b  LT|WO_LE, pIdx);
1d400 0a 20 20 20 20 20 20 20 20 70 42 74 6d 20 3d 20  .        pBtm = 
1d410 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
1d420 75 72 2c 20 6a 2c 20 70 2d 3e 6e 6f 74 52 65 61  ur, j, p->notRea
1d430 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c  dy, WO_GT|WO_GE,
1d440 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
1d450 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73  whereRangeScanEs
1d460 74 28 70 50 61 72 73 65 2c 20 70 50 72 6f 62 65  t(pParse, pProbe
1d470 2c 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 2c 20 70  , pc.plan.nEq, p
1d480 42 74 6d 2c 20 70 54 6f 70 2c 20 26 72 61 6e 67  Btm, pTop, &rang
1d490 65 44 69 76 29 3b 0a 20 20 20 20 20 20 20 20 69  eDiv);.        i
1d4a0 66 28 20 70 54 6f 70 20 29 7b 0a 20 20 20 20 20  f( pTop ){.     
1d4b0 20 20 20 20 20 6e 42 6f 75 6e 64 20 3d 20 31 3b       nBound = 1;
1d4c0 0a 20 20 20 20 20 20 20 20 20 20 70 63 2e 70 6c  .          pc.pl
1d4d0 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  an.wsFlags |= WH
1d4e0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20  ERE_TOP_LIMIT;. 
1d4f0 20 20 20 20 20 20 20 20 20 70 63 2e 75 73 65 64           pc.used
1d500 20 7c 3d 20 70 54 6f 70 2d 3e 70 72 65 72 65 71   |= pTop->prereq
1d510 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20  Right;.         
1d520 20 74 65 73 74 63 61 73 65 28 20 70 54 6f 70 2d   testcase( pTop-
1d530 3e 70 57 43 21 3d 70 57 43 20 29 3b 0a 20 20 20  >pWC!=pWC );.   
1d540 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1d550 66 28 20 70 42 74 6d 20 29 7b 0a 20 20 20 20 20  f( pBtm ){.     
1d560 20 20 20 20 20 6e 42 6f 75 6e 64 2b 2b 3b 0a 20       nBound++;. 
1d570 20 20 20 20 20 20 20 20 20 70 63 2e 70 6c 61 6e           pc.plan
1d580 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  .wsFlags |= WHER
1d590 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_BTM_LIMIT;.   
1d5a0 20 20 20 20 20 20 20 70 63 2e 75 73 65 64 20 7c         pc.used |
1d5b0 3d 20 70 42 74 6d 2d 3e 70 72 65 72 65 71 52 69  = pBtm->prereqRi
1d5c0 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 74  ght;.          t
1d5d0 65 73 74 63 61 73 65 28 20 70 42 74 6d 2d 3e 70  estcase( pBtm->p
1d5e0 57 43 21 3d 70 57 43 20 29 3b 0a 20 20 20 20 20  WC!=pWC );.     
1d5f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 63 2e     }.        pc.
1d600 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20  plan.wsFlags |= 
1d610 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41  (WHERE_COLUMN_RA
1d620 4e 47 45 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f  NGE|WHERE_ROWID_
1d630 52 41 4e 47 45 29 3b 0a 20 20 20 20 20 20 7d 0a  RANGE);.      }.
1d640 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1d650 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
1d660 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
1d670 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   the index being
1d680 20 63 6f 6e 73 69 64 65 72 65 64 20 77 69 6c 6c   considered will
1d690 0a 20 20 20 20 2a 2a 20 6e 61 74 75 72 61 6c 6c  .    ** naturall
1d6a0 79 20 73 63 61 6e 20 72 6f 77 73 20 69 6e 20 74  y scan rows in t
1d6b0 68 65 20 72 65 71 75 69 72 65 64 20 6f 72 64 65  he required orde
1d6c0 72 2c 20 73 65 74 20 74 68 65 20 61 70 70 72 6f  r, set the appro
1d6d0 70 72 69 61 74 65 20 66 6c 61 67 73 0a 20 20 20  priate flags.   
1d6e0 20 2a 2a 20 69 6e 20 70 63 2e 70 6c 61 6e 2e 77   ** in pc.plan.w
1d6f0 73 46 6c 61 67 73 2e 20 4f 74 68 65 72 77 69 73  sFlags. Otherwis
1d700 65 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 61  e, if there is a
1d710 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
1d720 65 20 62 75 74 0a 20 20 20 20 2a 2a 20 74 68 65  e but.    ** the
1d730 20 69 6e 64 65 78 20 77 69 6c 6c 20 73 63 61 6e   index will scan
1d740 20 72 6f 77 73 20 69 6e 20 61 20 64 69 66 66 65   rows in a diffe
1d750 72 65 6e 74 20 6f 72 64 65 72 2c 20 73 65 74 20  rent order, set 
1d760 74 68 65 20 62 53 6f 72 74 0a 20 20 20 20 2a 2a  the bSort.    **
1d770 20 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20   variable.  */. 
1d780 20 20 20 69 66 28 20 62 53 6f 72 74 20 26 26 20     if( bSort && 
1d790 28 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20  (pSrc->jointype 
1d7a0 26 20 4a 54 5f 4c 45 46 54 29 3d 3d 30 20 29 7b  & JT_LEFT)==0 ){
1d7b0 0a 20 20 20 20 20 20 69 6e 74 20 62 52 65 76 20  .      int bRev 
1d7c0 3d 20 32 3b 0a 20 20 20 20 20 20 57 48 45 52 45  = 2;.      WHERE
1d7d0 54 52 41 43 45 28 28 22 20 20 20 20 20 20 2d 2d  TRACE(("      --
1d7e0 3e 20 62 65 66 6f 72 65 20 69 73 53 6f 72 74 69  > before isSorti
1d7f0 6e 67 49 6e 64 65 78 3a 20 6e 50 72 69 6f 72 53  ngIndex: nPriorS
1d800 61 74 3d 25 64 5c 6e 22 2c 6e 50 72 69 6f 72 53  at=%d\n",nPriorS
1d810 61 74 29 29 3b 0a 20 20 20 20 20 20 70 63 2e 70  at));.      pc.p
1d820 6c 61 6e 2e 6e 4f 42 53 61 74 20 3d 20 69 73 53  lan.nOBSat = isS
1d830 6f 72 74 69 6e 67 49 6e 64 65 78 28 70 2c 20 70  ortingIndex(p, p
1d840 50 72 6f 62 65 2c 20 69 43 75 72 2c 20 26 62 52  Probe, iCur, &bR
1d850 65 76 29 3b 0a 20 20 20 20 20 20 57 48 45 52 45  ev);.      WHERE
1d860 54 52 41 43 45 28 28 22 20 20 20 20 20 20 2d 2d  TRACE(("      --
1d870 3e 20 61 66 74 65 72 20 20 69 73 53 6f 72 74 69  > after  isSorti
1d880 6e 67 49 6e 64 65 78 3a 20 62 52 65 76 3d 25 64  ngIndex: bRev=%d
1d890 20 6e 4f 42 53 61 74 3d 25 64 5c 6e 22 2c 0a 20   nOBSat=%d\n",. 
1d8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8b0 20 62 52 65 76 2c 20 70 63 2e 70 6c 61 6e 2e 6e   bRev, pc.plan.n
1d8c0 4f 42 53 61 74 29 29 3b 0a 20 20 20 20 20 20 69  OBSat));.      i
1d8d0 66 28 20 6e 50 72 69 6f 72 53 61 74 3c 70 63 2e  f( nPriorSat<pc.
1d8e0 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 7c 7c 20 28  plan.nOBSat || (
1d8f0 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  pc.plan.wsFlags 
1d900 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45 29 21  & WHERE_UNIQUE)!
1d910 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 63  =0 ){.        pc
1d920 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d  .plan.wsFlags |=
1d930 20 57 48 45 52 45 5f 4f 52 44 45 52 45 44 3b 0a   WHERE_ORDERED;.
1d940 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1d950 28 20 6e 4f 72 64 65 72 42 79 3d 3d 70 63 2e 70  ( nOrderBy==pc.p
1d960 6c 61 6e 2e 6e 4f 42 53 61 74 20 29 7b 0a 20 20  lan.nOBSat ){.  
1d970 20 20 20 20 20 20 62 53 6f 72 74 20 3d 20 30 3b        bSort = 0;
1d980 0a 20 20 20 20 20 20 20 20 70 63 2e 70 6c 61 6e  .        pc.plan
1d990 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  .wsFlags |= WHER
1d9a0 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 7c 57 48  E_ROWID_RANGE|WH
1d9b0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
1d9c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d9d0 69 66 28 20 62 52 65 76 20 26 20 31 20 29 20 70  if( bRev & 1 ) p
1d9e0 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c  c.plan.wsFlags |
1d9f0 3d 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 3b  = WHERE_REVERSE;
1da00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1da10 66 20 74 68 65 72 65 20 69 73 20 61 20 44 49 53  f there is a DIS
1da20 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20  TINCT qualifier 
1da30 61 6e 64 20 74 68 69 73 20 69 6e 64 65 78 20 77  and this index w
1da40 69 6c 6c 20 73 63 61 6e 20 72 6f 77 73 20 69 6e  ill scan rows in
1da50 0a 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 6f 66  .    ** order of
1da60 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 65 78   the DISTINCT ex
1da70 70 72 65 73 73 69 6f 6e 73 2c 20 63 6c 65 61 72  pressions, clear
1da80 20 62 44 69 73 74 20 61 6e 64 20 73 65 74 20 74   bDist and set t
1da90 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 20  he appropriate. 
1daa0 20 20 20 2a 2a 20 66 6c 61 67 73 20 69 6e 20 70     ** flags in p
1dab0 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 2e 20  c.plan.wsFlags. 
1dac0 2a 2f 0a 20 20 20 20 69 66 28 20 62 44 69 73 74  */.    if( bDist
1dad0 0a 20 20 20 20 20 26 26 20 69 73 44 69 73 74 69  .     && isDisti
1dae0 6e 63 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c  nctIndex(pParse,
1daf0 20 70 57 43 2c 20 70 50 72 6f 62 65 2c 20 69 43   pWC, pProbe, iC
1db00 75 72 2c 20 70 2d 3e 70 44 69 73 74 69 6e 63 74  ur, p->pDistinct
1db10 2c 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 29 0a 20  , pc.plan.nEq). 
1db20 20 20 20 20 26 26 20 28 70 63 2e 70 6c 61 6e 2e      && (pc.plan.
1db30 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1db40 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 0a 20 20  COLUMN_IN)==0.  
1db50 20 20 29 7b 0a 20 20 20 20 20 20 62 44 69 73 74    ){.      bDist
1db60 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 63 2e 70   = 0;.      pc.p
1db70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57  lan.wsFlags |= W
1db80 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
1db90 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41  |WHERE_COLUMN_RA
1dba0 4e 47 45 7c 57 48 45 52 45 5f 44 49 53 54 49 4e  NGE|WHERE_DISTIN
1dbb0 43 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  CT;.    }..    /
1dbc0 2a 20 49 66 20 63 75 72 72 65 6e 74 6c 79 20 63  * If currently c
1dbd0 61 6c 63 75 6c 61 74 69 6e 67 20 74 68 65 20 63  alculating the c
1dbe0 6f 73 74 20 6f 66 20 75 73 69 6e 67 20 61 6e 20  ost of using an 
1dbf0 69 6e 64 65 78 20 28 6e 6f 74 20 74 68 65 20 49  index (not the I
1dc00 50 4b 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 29  PK.    ** index)
1dc10 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61  , determine if a
1dc20 6c 6c 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75  ll required colu
1dc30 6d 6e 20 64 61 74 61 20 6d 61 79 20 62 65 20 6f  mn data may be o
1dc40 62 74 61 69 6e 65 64 20 77 69 74 68 6f 75 74 20  btained without 
1dc50 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  .    ** using th
1dc60 65 20 6d 61 69 6e 20 74 61 62 6c 65 20 28 69 2e  e main table (i.
1dc70 65 2e 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  e. if the index 
1dc80 69 73 20 61 20 63 6f 76 65 72 69 6e 67 0a 20 20  is a covering.  
1dc90 20 20 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74    ** index for t
1dca0 68 69 73 20 71 75 65 72 79 29 2e 20 49 66 20 69  his query). If i
1dcb0 74 20 69 73 2c 20 73 65 74 20 74 68 65 20 57 48  t is, set the WH
1dcc0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 66 6c 61  ERE_IDX_ONLY fla
1dcd0 67 20 69 6e 0a 20 20 20 20 2a 2a 20 70 63 2e 70  g in.    ** pc.p
1dce0 6c 61 6e 2e 77 73 46 6c 61 67 73 2e 20 4f 74 68  lan.wsFlags. Oth
1dcf0 65 72 77 69 73 65 2c 20 73 65 74 20 74 68 65 20  erwise, set the 
1dd00 62 4c 6f 6f 6b 75 70 20 76 61 72 69 61 62 6c 65  bLookup variable
1dd10 20 74 6f 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20   to true.  */.  
1dd20 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20    if( pIdx ){.  
1dd30 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20      Bitmask m = 
1dd40 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20  pSrc->colUsed;. 
1dd50 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
1dd60 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64    for(j=0; j<pId
1dd70 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29  x->nColumn; j++)
1dd80 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20  {.        int x 
1dd90 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
1dda0 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [j];.        if(
1ddb0 20 78 3c 42 4d 53 2d 31 20 29 7b 0a 20 20 20 20   x<BMS-1 ){.    
1ddc0 20 20 20 20 20 20 6d 20 26 3d 20 7e 28 28 28 42        m &= ~(((B
1ddd0 69 74 6d 61 73 6b 29 31 29 3c 3c 78 29 3b 0a 20  itmask)1)<<x);. 
1dde0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1ddf0 0a 20 20 20 20 20 20 69 66 28 20 6d 3d 3d 30 20  .      if( m==0 
1de00 29 7b 0a 20 20 20 20 20 20 20 20 70 63 2e 70 6c  ){.        pc.pl
1de10 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  an.wsFlags |= WH
1de20 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20  ERE_IDX_ONLY;.  
1de30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1de40 20 20 20 62 4c 6f 6f 6b 75 70 20 3d 20 31 3b 0a     bLookup = 1;.
1de50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1de60 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 45 73 74     /*.    ** Est
1de70 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
1de80 20 6f 66 20 72 6f 77 73 20 6f 66 20 6f 75 74 70   of rows of outp
1de90 75 74 2e 20 20 46 6f 72 20 61 6e 20 22 78 20 49  ut.  For an "x I
1dea0 4e 20 28 53 45 4c 45 43 54 2e 2e 2e 29 22 0a 20  N (SELECT...)". 
1deb0 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74     ** constraint
1dec0 2c 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65  , do not let the
1ded0 20 65 73 74 69 6d 61 74 65 20 65 78 63 65 65 64   estimate exceed
1dee0 20 68 61 6c 66 20 74 68 65 20 72 6f 77 73 20 69   half the rows i
1def0 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20  n the table..   
1df00 20 2a 2f 0a 20 20 20 20 70 63 2e 70 6c 61 6e 2e   */.    pc.plan.
1df10 6e 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29 28  nRow = (double)(
1df20 61 69 52 6f 77 45 73 74 5b 70 63 2e 70 6c 61 6e  aiRowEst[pc.plan
1df30 2e 6e 45 71 5d 20 2a 20 6e 49 6e 4d 75 6c 29 3b  .nEq] * nInMul);
1df40 0a 20 20 20 20 69 66 28 20 62 49 6e 45 73 74 20  .    if( bInEst 
1df50 26 26 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 2a  && pc.plan.nRow*
1df60 32 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20 29 7b  2>aiRowEst[0] ){
1df70 0a 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 6e  .      pc.plan.n
1df80 52 6f 77 20 3d 20 61 69 52 6f 77 45 73 74 5b 30  Row = aiRowEst[0
1df90 5d 2f 32 3b 0a 20 20 20 20 20 20 6e 49 6e 4d 75  ]/2;.      nInMu
1dfa0 6c 20 3d 20 28 69 6e 74 29 28 70 63 2e 70 6c 61  l = (int)(pc.pla
1dfb0 6e 2e 6e 52 6f 77 20 2f 20 61 69 52 6f 77 45 73  n.nRow / aiRowEs
1dfc0 74 5b 70 63 2e 70 6c 61 6e 2e 6e 45 71 5d 29 3b  t[pc.plan.nEq]);
1dfd0 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  .    }..#ifdef S
1dfe0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
1dff0 54 33 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  T3.    /* If the
1e000 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6f   constraint is o
1e010 66 20 74 68 65 20 66 6f 72 6d 20 78 3d 56 41 4c  f the form x=VAL
1e020 55 45 20 6f 72 20 78 20 49 4e 20 28 45 31 2c 45  UE or x IN (E1,E
1e030 32 2c 2e 2e 2e 29 0a 20 20 20 20 2a 2a 20 61 6e  2,...).    ** an
1e040 64 20 77 65 20 64 6f 20 6e 6f 74 20 74 68 69 6e  d we do not thin
1e050 6b 20 74 68 61 74 20 76 61 6c 75 65 73 20 6f 66  k that values of
1e060 20 78 20 61 72 65 20 75 6e 69 71 75 65 20 61 6e   x are unique an
1e070 64 20 69 66 20 68 69 73 74 6f 67 72 61 6d 0a 20  d if histogram. 
1e080 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 61 76     ** data is av
1e090 61 69 6c 61 62 6c 65 20 66 6f 72 20 63 6f 6c 75  ailable for colu
1e0a0 6d 6e 20 78 2c 20 74 68 65 6e 20 69 74 20 6d 69  mn x, then it mi
1e0b0 67 68 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a  ght be possible.
1e0c0 20 20 20 20 2a 2a 20 74 6f 20 67 65 74 20 61 20      ** to get a 
1e0d0 62 65 74 74 65 72 20 65 73 74 69 6d 61 74 65 20  better estimate 
1e0e0 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  on the number of
1e0f0 20 72 6f 77 73 20 62 61 73 65 64 20 6f 6e 0a 20   rows based on. 
1e100 20 20 20 2a 2a 20 56 41 4c 55 45 20 61 6e 64 20     ** VALUE and 
1e110 68 6f 77 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20  how common that 
1e120 76 61 6c 75 65 20 69 73 20 61 63 63 6f 72 64 69  value is accordi
1e130 6e 67 20 74 6f 20 74 68 65 20 68 69 73 74 6f 67  ng to the histog
1e140 72 61 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ram..    */.    
1e150 69 66 28 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77  if( pc.plan.nRow
1e160 3e 28 64 6f 75 62 6c 65 29 31 20 26 26 20 70 63  >(double)1 && pc
1e170 2e 70 6c 61 6e 2e 6e 45 71 3d 3d 31 0a 20 20 20  .plan.nEq==1.   
1e180 20 20 26 26 20 70 46 69 72 73 74 54 65 72 6d 21    && pFirstTerm!
1e190 3d 30 20 26 26 20 61 69 52 6f 77 45 73 74 5b 31  =0 && aiRowEst[1
1e1a0 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ]>1 ){.      ass
1e1b0 65 72 74 28 20 28 70 46 69 72 73 74 54 65 72 6d  ert( (pFirstTerm
1e1c0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
1e1d0 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57  O_EQ|WO_ISNULL|W
1e1e0 4f 5f 49 4e 29 29 21 3d 30 20 29 3b 0a 20 20 20  O_IN))!=0 );.   
1e1f0 20 20 20 69 66 28 20 70 46 69 72 73 74 54 65 72     if( pFirstTer
1e200 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
1e210 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29  WO_EQ|WO_ISNULL)
1e220 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
1e230 63 61 73 65 28 20 70 46 69 72 73 74 54 65 72 6d  case( pFirstTerm
1e240 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
1e250 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  EQ );.        te
1e260 73 74 63 61 73 65 28 20 70 46 69 72 73 74 54 65  stcase( pFirstTe
1e270 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
1e280 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
1e290 20 20 20 20 77 68 65 72 65 45 71 75 61 6c 53 63      whereEqualSc
1e2a0 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 50  anEst(pParse, pP
1e2b0 72 6f 62 65 2c 20 70 46 69 72 73 74 54 65 72 6d  robe, pFirstTerm
1e2c0 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  ->pExpr->pRight,
1e2d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e2e0 20 20 20 20 20 20 20 20 20 20 20 26 70 63 2e 70             &pc.p
1e2f0 6c 61 6e 2e 6e 52 6f 77 29 3b 0a 20 20 20 20 20  lan.nRow);.     
1e300 20 7d 65 6c 73 65 20 69 66 28 20 62 49 6e 45 73   }else if( bInEs
1e310 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
1e320 61 73 73 65 72 74 28 20 70 46 69 72 73 74 54 65  assert( pFirstTe
1e330 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
1e340 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  O_IN );.        
1e350 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 70  whereInScanEst(p
1e360 50 61 72 73 65 2c 20 70 50 72 6f 62 65 2c 20 70  Parse, pProbe, p
1e370 46 69 72 73 74 54 65 72 6d 2d 3e 70 45 78 70 72  FirstTerm->pExpr
1e380 2d 3e 78 2e 70 4c 69 73 74 2c 0a 20 20 20 20 20  ->x.pList,.     
1e390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3a0 20 20 26 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 29    &pc.plan.nRow)
1e3b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1e3c0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1e3d0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 20 2a 2f  _ENABLE_STAT3 */
1e3e0 0a 0a 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20  ..    /* Adjust 
1e3f0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  the number of ou
1e400 74 70 75 74 20 72 6f 77 73 20 61 6e 64 20 64 6f  tput rows and do
1e410 77 6e 77 61 72 64 20 74 6f 20 72 65 66 6c 65 63  wnward to reflec
1e420 74 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 74 68  t rows.    ** th
1e430 61 74 20 61 72 65 20 65 78 63 6c 75 64 65 64 20  at are excluded 
1e440 62 79 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  by range constra
1e450 69 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ints..    */.   
1e460 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20   pc.plan.nRow = 
1e470 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 2f 72 61 6e  pc.plan.nRow/ran
1e480 67 65 44 69 76 3b 0a 20 20 20 20 69 66 28 20 70  geDiv;.    if( p
1e490 63 2e 70 6c 61 6e 2e 6e 52 6f 77 3c 31 20 29 20  c.plan.nRow<1 ) 
1e4a0 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 31  pc.plan.nRow = 1
1e4b0 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 70 65 72 69  ;..    /* Experi
1e4c0 6d 65 6e 74 73 20 72 75 6e 20 6f 6e 20 72 65 61  ments run on rea
1e4d0 6c 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  l SQLite databas
1e4e0 65 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 65  es show that the
1e4f0 20 74 69 6d 65 20 6e 65 65 64 65 64 0a 20 20 20   time needed.   
1e500 20 2a 2a 20 74 6f 20 64 6f 20 61 20 62 69 6e 61   ** to do a bina
1e510 72 79 20 73 65 61 72 63 68 20 74 6f 20 6c 6f 63  ry search to loc
1e520 61 74 65 20 61 20 72 6f 77 20 69 6e 20 61 20 74  ate a row in a t
1e530 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 73  able or index is
1e540 20 72 6f 75 67 68 6c 79 0a 20 20 20 20 2a 2a 20   roughly.    ** 
1e550 6c 6f 67 31 30 28 4e 29 20 74 69 6d 65 73 20 74  log10(N) times t
1e560 68 65 20 74 69 6d 65 20 74 6f 20 6d 6f 76 65 20  he time to move 
1e570 66 72 6f 6d 20 6f 6e 65 20 72 6f 77 20 74 6f 20  from one row to 
1e580 74 68 65 20 6e 65 78 74 20 72 6f 77 20 77 69 74  the next row wit
1e590 68 69 6e 0a 20 20 20 20 2a 2a 20 61 20 74 61 62  hin.    ** a tab
1e5a0 6c 65 20 6f 72 20 69 6e 64 65 78 2e 20 20 54 68  le or index.  Th
1e5b0 65 20 61 63 74 75 61 6c 20 74 69 6d 65 73 20 63  e actual times c
1e5c0 61 6e 20 76 61 72 79 2c 20 77 69 74 68 20 74 68  an vary, with th
1e5d0 65 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a  e size of.    **
1e5e0 20 72 65 63 6f 72 64 73 20 62 65 69 6e 67 20 61   records being a
1e5f0 6e 20 69 6d 70 6f 72 74 61 6e 74 20 66 61 63 74  n important fact
1e600 6f 72 2e 20 20 42 6f 74 68 20 6d 6f 76 65 73 20  or.  Both moves 
1e610 61 6e 64 20 73 65 61 72 63 68 65 73 20 61 72 65  and searches are
1e620 0a 20 20 20 20 2a 2a 20 73 6c 6f 77 65 72 20 77  .    ** slower w
1e630 69 74 68 20 6c 61 72 67 65 72 20 72 65 63 6f 72  ith larger recor
1e640 64 73 2c 20 70 72 65 73 75 6d 61 62 6c 79 20 62  ds, presumably b
1e650 65 63 61 75 73 65 20 66 65 77 65 72 20 72 65 63  ecause fewer rec
1e660 6f 72 64 73 20 66 69 74 0a 20 20 20 20 2a 2a 20  ords fit.    ** 
1e670 6f 6e 20 6f 6e 65 20 70 61 67 65 20 61 6e 64 20  on one page and 
1e680 68 65 6e 63 65 20 6d 6f 72 65 20 70 61 67 65 73  hence more pages
1e690 20 68 61 76 65 20 74 6f 20 62 65 20 66 65 74 63   have to be fetc
1e6a0 68 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  hed..    **.    
1e6b0 2a 2a 20 54 68 65 20 41 4e 41 4c 59 5a 45 20 63  ** The ANALYZE c
1e6c0 6f 6d 6d 61 6e 64 20 61 6e 64 20 74 68 65 20 73  ommand and the s
1e6d0 71 6c 69 74 65 5f 73 74 61 74 31 20 61 6e 64 20  qlite_stat1 and 
1e6e0 73 71 6c 69 74 65 5f 73 74 61 74 33 20 74 61 62  sqlite_stat3 tab
1e6f0 6c 65 73 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f  les do.    ** no
1e700 74 20 67 69 76 65 20 75 73 20 64 61 74 61 20 6f  t give us data o
1e710 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 73  n the relative s
1e720 69 7a 65 73 20 6f 66 20 74 61 62 6c 65 20 61 6e  izes of table an
1e730 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e  d index records.
1e740 0a 20 20 20 20 2a 2a 20 53 6f 20 74 68 69 73 20  .    ** So this 
1e750 63 6f 6d 70 75 74 61 74 69 6f 6e 20 61 73 73 75  computation assu
1e760 6d 65 73 20 74 61 62 6c 65 20 72 65 63 6f 72 64  mes table record
1e770 73 20 61 72 65 20 61 62 6f 75 74 20 74 77 69 63  s are about twic
1e780 65 20 61 73 20 62 69 67 0a 20 20 20 20 2a 2a 20  e as big.    ** 
1e790 61 73 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  as index records
1e7a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1e7b0 28 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  (pc.plan.wsFlags
1e7c0 26 7e 28 57 48 45 52 45 5f 52 45 56 45 52 53 45  &~(WHERE_REVERSE
1e7d0 7c 57 48 45 52 45 5f 4f 52 44 45 52 45 44 29 29  |WHERE_ORDERED))
1e7e0 3d 3d 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  ==WHERE_IDX_ONLY
1e7f0 0a 20 20 20 20 20 26 26 20 28 70 57 43 2d 3e 77  .     && (pWC->w
1e800 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
1e810 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
1e820 44 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 73 71  D)==0.     && sq
1e830 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1e840 67 2e 62 55 73 65 43 69 73 0a 20 20 20 20 20 26  g.bUseCis.     &
1e850 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
1e860 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62  abled(pParse->db
1e870 2c 20 53 51 4c 49 54 45 5f 43 6f 76 65 72 49 64  , SQLITE_CoverId
1e880 78 53 63 61 6e 29 0a 20 20 20 20 29 7b 0a 20 20  xScan).    ){.  
1e890 20 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65      /* This inde
1e8a0 78 20 69 73 20 6e 6f 74 20 75 73 65 66 75 6c 20  x is not useful 
1e8b0 66 6f 72 20 69 6e 64 65 78 69 6e 67 2c 20 62 75  for indexing, bu
1e8c0 74 20 69 74 20 69 73 20 61 20 63 6f 76 65 72 69  t it is a coveri
1e8d0 6e 67 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  ng index..      
1e8e0 2a 2a 20 41 20 66 75 6c 6c 2d 73 63 61 6e 20 6f  ** A full-scan o
1e8f0 66 20 74 68 65 20 69 6e 64 65 78 20 6d 69 67 68  f the index migh
1e900 74 20 62 65 20 61 20 6c 69 74 74 6c 65 20 66 61  t be a little fa
1e910 73 74 65 72 20 74 68 61 6e 20 61 20 66 75 6c 6c  ster than a full
1e920 2d 73 63 61 6e 0a 20 20 20 20 20 20 2a 2a 20 6f  -scan.      ** o
1e930 66 20 74 68 65 20 74 61 62 6c 65 2c 20 73 6f 20  f the table, so 
1e940 67 69 76 65 20 74 68 69 73 20 63 61 73 65 20 61  give this case a
1e950 20 63 6f 73 74 20 73 6c 69 67 68 74 6c 79 20 6c   cost slightly l
1e960 65 73 73 20 74 68 61 6e 20 61 20 74 61 62 6c 65  ess than a table
1e970 0a 20 20 20 20 20 20 2a 2a 20 73 63 61 6e 2e 20  .      ** scan. 
1e980 2a 2f 0a 20 20 20 20 20 20 70 63 2e 72 43 6f 73  */.      pc.rCos
1e990 74 20 3d 20 61 69 52 6f 77 45 73 74 5b 30 5d 2a  t = aiRowEst[0]*
1e9a0 33 20 2b 20 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  3 + pProbe->nCol
1e9b0 75 6d 6e 3b 0a 20 20 20 20 20 20 70 63 2e 70 6c  umn;.      pc.pl
1e9c0 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  an.wsFlags |= WH
1e9d0 45 52 45 5f 43 4f 56 45 52 5f 53 43 41 4e 7c 57  ERE_COVER_SCAN|W
1e9e0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
1e9f0 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  E;.    }else if(
1ea00 20 28 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67   (pc.plan.wsFlag
1ea10 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55  s & WHERE_NOT_FU
1ea20 4c 4c 53 43 41 4e 29 3d 3d 30 20 29 7b 0a 20 20  LLSCAN)==0 ){.  
1ea30 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20      /* The cost 
1ea40 6f 66 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20  of a full table 
1ea50 73 63 61 6e 20 69 73 20 61 20 6e 75 6d 62 65 72  scan is a number
1ea60 20 6f 66 20 6d 6f 76 65 20 6f 70 65 72 61 74 69   of move operati
1ea70 6f 6e 73 20 65 71 75 61 6c 0a 20 20 20 20 20 20  ons equal.      
1ea80 2a 2a 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  ** to the number
1ea90 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
1eaa0 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  table..      **.
1eab0 20 20 20 20 20 20 2a 2a 20 57 65 20 61 64 64 20        ** We add 
1eac0 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 34 78  an additional 4x
1ead0 20 70 65 6e 61 6c 74 79 20 74 6f 20 66 75 6c 6c   penalty to full
1eae0 20 74 61 62 6c 65 20 73 63 61 6e 73 2e 20 20 54   table scans.  T
1eaf0 68 69 73 20 63 61 75 73 65 73 0a 20 20 20 20 20  his causes.     
1eb00 20 2a 2a 20 74 68 65 20 63 6f 73 74 20 66 75 6e   ** the cost fun
1eb10 63 74 69 6f 6e 20 74 6f 20 65 72 72 20 6f 6e 20  ction to err on 
1eb20 74 68 65 20 73 69 64 65 20 6f 66 20 63 68 6f 6f  the side of choo
1eb30 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 6f 76  sing an index ov
1eb40 65 72 0a 20 20 20 20 20 20 2a 2a 20 63 68 6f 6f  er.      ** choo
1eb50 73 69 6e 67 20 61 20 66 75 6c 6c 20 73 63 61 6e  sing a full scan
1eb60 2e 20 20 54 68 69 73 20 34 78 20 66 75 6c 6c 2d  .  This 4x full-
1eb70 73 63 61 6e 20 70 65 6e 61 6c 74 79 20 69 73 20  scan penalty is 
1eb80 61 6e 20 61 72 67 75 61 62 6c 65 0a 20 20 20 20  an arguable.    
1eb90 20 20 2a 2a 20 64 65 63 69 73 69 6f 6e 20 61 6e    ** decision an
1eba0 64 20 6f 6e 65 20 77 68 69 63 68 20 77 65 20 65  d one which we e
1ebb0 78 70 65 63 74 20 74 6f 20 72 65 76 69 73 69 74  xpect to revisit
1ebc0 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20   in the future. 
1ebd0 20 42 75 74 0a 20 20 20 20 20 20 2a 2a 20 69 74   But.      ** it
1ebe0 20 73 65 65 6d 73 20 74 6f 20 62 65 20 77 6f 72   seems to be wor
1ebf0 6b 69 6e 67 20 77 65 6c 6c 20 65 6e 6f 75 67 68  king well enough
1ec00 20 61 74 20 74 68 65 20 6d 6f 6d 65 6e 74 2e 0a   at the moment..
1ec10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
1ec20 63 2e 72 43 6f 73 74 20 3d 20 61 69 52 6f 77 45  c.rCost = aiRowE
1ec30 73 74 5b 30 5d 2a 34 3b 0a 20 20 20 20 20 20 70  st[0]*4;.      p
1ec40 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  c.plan.wsFlags &
1ec50 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  = ~WHERE_IDX_ONL
1ec60 59 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  Y;.      if( pId
1ec70 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 63 2e  x ){.        pc.
1ec80 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 3d 20  plan.wsFlags &= 
1ec90 7e 57 48 45 52 45 5f 4f 52 44 45 52 45 44 3b 0a  ~WHERE_ORDERED;.
1eca0 20 20 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e          pc.plan.
1ecb0 6e 4f 42 53 61 74 20 3d 20 6e 50 72 69 6f 72 53  nOBSat = nPriorS
1ecc0 61 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  at;.      }.    
1ecd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f 67  }else{.      log
1ece0 31 30 4e 20 3d 20 65 73 74 4c 6f 67 28 61 69 52  10N = estLog(aiR
1ecf0 6f 77 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 20  owEst[0]);.     
1ed00 20 70 63 2e 72 43 6f 73 74 20 3d 20 70 63 2e 70   pc.rCost = pc.p
1ed10 6c 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20  lan.nRow;.      
1ed20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20  if( pIdx ){.    
1ed30 20 20 20 20 69 66 28 20 62 4c 6f 6f 6b 75 70 20      if( bLookup 
1ed40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1ed50 46 6f 72 20 61 6e 20 69 6e 64 65 78 20 6c 6f 6f  For an index loo
1ed60 6b 75 70 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  kup followed by 
1ed70 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 3a 0a  a table lookup:.
1ed80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20            **    
1ed90 6e 49 6e 4d 75 6c 20 69 6e 64 65 78 20 73 65 61  nInMul index sea
1eda0 72 63 68 65 73 20 74 6f 20 66 69 6e 64 20 74 68  rches to find th
1edb0 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20  e start of each 
1edc0 69 6e 64 65 78 20 72 61 6e 67 65 0a 20 20 20 20  index range.    
1edd0 20 20 20 20 20 20 2a 2a 20 20 2b 20 6e 52 6f 77        **  + nRow
1ede0 20 73 74 65 70 73 20 74 68 72 6f 75 67 68 20 74   steps through t
1edf0 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20  he index.       
1ee00 20 20 20 2a 2a 20 20 2b 20 6e 52 6f 77 20 74 61     **  + nRow ta
1ee10 62 6c 65 20 73 65 61 72 63 68 65 73 20 74 6f 20  ble searches to 
1ee20 6c 6f 6f 6b 75 70 20 74 68 65 20 74 61 62 6c 65  lookup the table
1ee30 20 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65   entry using the
1ee40 20 72 6f 77 69 64 0a 20 20 20 20 20 20 20 20 20   rowid.         
1ee50 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 63   */.          pc
1ee60 2e 72 43 6f 73 74 20 2b 3d 20 28 6e 49 6e 4d 75  .rCost += (nInMu
1ee70 6c 20 2b 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77  l + pc.plan.nRow
1ee80 29 2a 6c 6f 67 31 30 4e 3b 0a 20 20 20 20 20 20  )*log10N;.      
1ee90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1eea0 20 20 20 2f 2a 20 46 6f 72 20 61 20 63 6f 76 65     /* For a cove
1eeb0 72 69 6e 67 20 69 6e 64 65 78 3a 0a 20 20 20 20  ring index:.    
1eec0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 6e 49 6e        **     nIn
1eed0 4d 75 6c 20 69 6e 64 65 78 20 73 65 61 72 63 68  Mul index search
1eee0 65 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20 69  es to find the i
1eef0 6e 69 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20  nitial entry .  
1ef00 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 6e          **   + n
1ef10 52 6f 77 20 73 74 65 70 73 20 74 68 72 6f 75 67  Row steps throug
1ef20 68 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20  h the index.    
1ef30 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1ef40 20 20 20 70 63 2e 72 43 6f 73 74 20 2b 3d 20 6e     pc.rCost += n
1ef50 49 6e 4d 75 6c 2a 6c 6f 67 31 30 4e 3b 0a 20 20  InMul*log10N;.  
1ef60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
1ef70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
1ef80 46 6f 72 20 61 20 72 6f 77 69 64 20 70 72 69 6d  For a rowid prim
1ef90 61 72 79 20 6b 65 79 20 6c 6f 6f 6b 75 70 3a 0a  ary key lookup:.
1efa0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 6e 49          **    nI
1efb0 6e 4d 75 6c 74 20 74 61 62 6c 65 20 73 65 61 72  nMult table sear
1efc0 63 68 65 73 20 74 6f 20 66 69 6e 64 20 74 68 65  ches to find the
1efd0 20 69 6e 69 74 69 61 6c 20 65 6e 74 72 79 20 66   initial entry f
1efe0 6f 72 20 65 61 63 68 20 72 61 6e 67 65 0a 20 20  or each range.  
1eff0 20 20 20 20 20 20 2a 2a 20 20 2b 20 6e 52 6f 77        **  + nRow
1f000 20 73 74 65 70 73 20 74 68 72 6f 75 67 68 20 74   steps through t
1f010 68 65 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20  he table.       
1f020 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 63 2e 72   */.        pc.r
1f030 43 6f 73 74 20 2b 3d 20 6e 49 6e 4d 75 6c 2a 6c  Cost += nInMul*l
1f040 6f 67 31 30 4e 3b 0a 20 20 20 20 20 20 7d 0a 20  og10N;.      }. 
1f050 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64     }..    /* Add
1f060 20 69 6e 20 74 68 65 20 65 73 74 69 6d 61 74 65   in the estimate
1f070 64 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e  d cost of sortin
1f080 67 20 74 68 65 20 72 65 73 75 6c 74 2e 20 20 41  g the result.  A
1f090 63 74 75 61 6c 20 65 78 70 65 72 69 6d 65 6e 74  ctual experiment
1f0a0 61 6c 0a 20 20 20 20 2a 2a 20 6d 65 61 73 75 72  al.    ** measur
1f0b0 65 6d 65 6e 74 73 20 6f 66 20 73 6f 72 74 69 6e  ements of sortin
1f0c0 67 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6e  g performance in
1f0d0 20 53 51 4c 69 74 65 20 73 68 6f 77 20 74 68 61   SQLite show tha
1f0e0 74 20 73 6f 72 74 69 6e 67 20 74 69 6d 65 0a 20  t sorting time. 
1f0f0 20 20 20 2a 2a 20 61 64 64 73 20 43 2a 4e 2a 6c     ** adds C*N*l
1f100 6f 67 31 30 28 4e 29 20 74 6f 20 74 68 65 20 63  og10(N) to the c
1f110 6f 73 74 2c 20 77 68 65 72 65 20 4e 20 69 73 20  ost, where N is 
1f120 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
1f130 77 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a  ws to be .    **
1f140 20 73 6f 72 74 65 64 20 61 6e 64 20 43 20 69 73   sorted and C is
1f150 20 61 20 66 61 63 74 6f 72 20 62 65 74 77 65 65   a factor betwee
1f160 6e 20 31 2e 39 35 20 61 6e 64 20 34 2e 33 2e 20  n 1.95 and 4.3. 
1f170 20 57 65 20 77 69 6c 6c 20 73 70 6c 69 74 20 74   We will split t
1f180 68 65 0a 20 20 20 20 2a 2a 20 64 69 66 66 65 72  he.    ** differ
1f190 65 6e 63 65 20 61 6e 64 20 73 65 6c 65 63 74 20  ence and select 
1f1a0 43 20 6f 66 20 33 2e 30 2e 0a 20 20 20 20 2a 2f  C of 3.0..    */
1f1b0 0a 20 20 20 20 69 66 28 20 62 53 6f 72 74 20 29  .    if( bSort )
1f1c0 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 6d  {.      double m
1f1d0 20 3d 20 65 73 74 4c 6f 67 28 70 63 2e 70 6c 61   = estLog(pc.pla
1f1e0 6e 2e 6e 52 6f 77 2a 28 6e 4f 72 64 65 72 42 79  n.nRow*(nOrderBy
1f1f0 20 2d 20 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61   - pc.plan.nOBSa
1f200 74 29 2f 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20  t)/nOrderBy);.  
1f210 20 20 20 20 6d 20 2a 3d 20 28 64 6f 75 62 6c 65      m *= (double
1f220 29 28 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74  )(pc.plan.nOBSat
1f230 20 3f 20 32 20 3a 20 33 29 3b 0a 20 20 20 20 20   ? 2 : 3);.     
1f240 20 70 63 2e 72 43 6f 73 74 20 2b 3d 20 70 63 2e   pc.rCost += pc.
1f250 70 6c 61 6e 2e 6e 52 6f 77 2a 6d 3b 0a 20 20 20  plan.nRow*m;.   
1f260 20 7d 0a 20 20 20 20 69 66 28 20 62 44 69 73 74   }.    if( bDist
1f270 20 29 7b 0a 20 20 20 20 20 20 70 63 2e 72 43 6f   ){.      pc.rCo
1f280 73 74 20 2b 3d 20 70 63 2e 70 6c 61 6e 2e 6e 52  st += pc.plan.nR
1f290 6f 77 2a 65 73 74 4c 6f 67 28 70 63 2e 70 6c 61  ow*estLog(pc.pla
1f2a0 6e 2e 6e 52 6f 77 29 2a 33 3b 0a 20 20 20 20 7d  n.nRow)*3;.    }
1f2b0 0a 0a 20 20 20 20 2f 2a 2a 2a 2a 20 43 6f 73 74  ..    /**** Cost
1f2c0 20 6f 66 20 75 73 69 6e 67 20 74 68 69 73 20 69   of using this i
1f2d0 6e 64 65 78 20 68 61 73 20 6e 6f 77 20 62 65 65  ndex has now bee
1f2e0 6e 20 63 6f 6d 70 75 74 65 64 20 2a 2a 2a 2a 2f  n computed ****/
1f2f0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
1f300 65 20 61 72 65 20 61 64 64 69 74 69 6f 6e 61 6c  e are additional
1f310 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20   constraints on 
1f320 74 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20  this table that 
1f330 63 61 6e 6e 6f 74 0a 20 20 20 20 2a 2a 20 62 65  cannot.    ** be
1f340 20 75 73 65 64 20 77 69 74 68 20 74 68 65 20 63   used with the c
1f350 75 72 72 65 6e 74 20 69 6e 64 65 78 2c 20 62 75  urrent index, bu
1f360 74 20 77 68 69 63 68 20 6d 69 67 68 74 20 6c 6f  t which might lo
1f370 77 65 72 20 74 68 65 20 6e 75 6d 62 65 72 0a 20  wer the number. 
1f380 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 20     ** of output 
1f390 72 6f 77 73 2c 20 61 64 6a 75 73 74 20 74 68 65  rows, adjust the
1f3a0 20 6e 52 6f 77 20 76 61 6c 75 65 20 61 63 63 6f   nRow value acco
1f3b0 72 64 69 6e 67 6c 79 2e 20 20 54 68 69 73 20 6f  rdingly.  This o
1f3c0 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 6d 61 74 74  nly .    ** matt
1f3d0 65 72 73 20 69 66 20 74 68 65 20 63 75 72 72 65  ers if the curre
1f3e0 6e 74 20 69 6e 64 65 78 20 69 73 20 74 68 65 20  nt index is the 
1f3f0 6c 65 61 73 74 20 63 6f 73 74 6c 79 2c 20 73 6f  least costly, so
1f400 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 0a 20   do not bother. 
1f410 20 20 20 2a 2a 20 77 69 74 68 20 74 68 69 73 20     ** with this 
1f420 73 74 65 70 20 69 66 20 77 65 20 61 6c 72 65 61  step if we alrea
1f430 64 79 20 6b 6e 6f 77 20 74 68 69 73 20 69 6e 64  dy know this ind
1f440 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  ex will not be c
1f450 68 6f 73 65 6e 2e 0a 20 20 20 20 2a 2a 20 41 6c  hosen..    ** Al
1f460 73 6f 2c 20 6e 65 76 65 72 20 72 65 64 75 63 65  so, never reduce
1f470 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f 77 20   the output row 
1f480 63 6f 75 6e 74 20 62 65 6c 6f 77 20 32 20 75 73  count below 2 us
1f490 69 6e 67 20 74 68 69 73 20 73 74 65 70 2e 0a 20  ing this step.. 
1f4a0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 74 20     **.    ** It 
1f4b0 69 73 20 63 72 69 74 69 63 61 6c 20 74 68 61 74  is critical that
1f4c0 20 74 68 65 20 6e 6f 74 56 61 6c 69 64 20 6d 61   the notValid ma
1f4d0 73 6b 20 62 65 20 75 73 65 64 20 68 65 72 65 20  sk be used here 
1f4e0 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a  instead of.    *
1f4f0 2a 20 74 68 65 20 6e 6f 74 52 65 61 64 79 20 6d  * the notReady m
1f500 61 73 6b 2e 20 20 57 68 65 6e 20 63 6f 6d 70 75  ask.  When compu
1f510 74 69 6e 67 20 61 6e 20 22 6f 70 74 69 6d 61 6c  ting an "optimal
1f520 22 20 69 6e 64 65 78 2c 20 74 68 65 20 6e 6f 74  " index, the not
1f530 52 65 61 64 79 0a 20 20 20 20 2a 2a 20 6d 61 73  Ready.    ** mas
1f540 6b 20 77 69 6c 6c 20 6f 6e 6c 79 20 68 61 76 65  k will only have
1f550 20 6f 6e 65 20 62 69 74 20 73 65 74 20 2d 20 74   one bit set - t
1f560 68 65 20 62 69 74 20 66 6f 72 20 74 68 65 20 63  he bit for the c
1f570 75 72 72 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20  urrent table..  
1f580 20 20 2a 2a 20 54 68 65 20 6e 6f 74 56 61 6c 69    ** The notVali
1f590 64 20 6d 61 73 6b 2c 20 6f 6e 20 74 68 65 20 6f  d mask, on the o
1f5a0 74 68 65 72 20 68 61 6e 64 2c 20 61 6c 77 61 79  ther hand, alway
1f5b0 73 20 68 61 73 20 61 6c 6c 20 62 69 74 73 20 73  s has all bits s
1f5c0 65 74 20 66 6f 72 0a 20 20 20 20 2a 2a 20 74 61  et for.    ** ta
1f5d0 62 6c 65 73 20 74 68 61 74 20 61 72 65 20 6e 6f  bles that are no
1f5e0 74 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73  t in outer loops
1f5f0 2e 20 20 49 66 20 6e 6f 74 52 65 61 64 79 20 69  .  If notReady i
1f600 73 20 75 73 65 64 20 68 65 72 65 20 69 6e 73 74  s used here inst
1f610 65 61 64 0a 20 20 20 20 2a 2a 20 6f 66 20 6e 6f  ead.    ** of no
1f620 74 56 61 6c 69 64 2c 20 74 68 65 6e 20 61 20 6f  tValid, then a o
1f630 70 74 69 6d 61 6c 20 69 6e 64 65 78 20 74 68 61  ptimal index tha
1f640 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 69 6e 6e  t depends on inn
1f650 65 72 20 6a 6f 69 6e 73 20 6c 6f 6f 70 73 0a 20  er joins loops. 
1f660 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 73     ** might be s
1f670 65 6c 65 63 74 65 64 20 65 76 65 6e 20 77 68 65  elected even whe
1f680 6e 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61  n there exists a
1f690 6e 20 6f 70 74 69 6d 61 6c 20 69 6e 64 65 78 20  n optimal index 
1f6a0 74 68 61 74 20 68 61 73 0a 20 20 20 20 2a 2a 20  that has.    ** 
1f6b0 6e 6f 20 73 75 63 68 20 64 65 70 65 6e 64 65 6e  no such dependen
1f6c0 63 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  cy..    */.    i
1f6d0 66 28 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 3e  f( pc.plan.nRow>
1f6e0 32 20 26 26 20 70 63 2e 72 43 6f 73 74 3c 3d 70  2 && pc.rCost<=p
1f6f0 2d 3e 63 6f 73 74 2e 72 43 6f 73 74 20 29 7b 0a  ->cost.rCost ){.
1f700 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20        int k;    
1f710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f720 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1f730 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  er */.      int 
1f740 6e 53 6b 69 70 45 71 20 3d 20 70 63 2e 70 6c 61  nSkipEq = pc.pla
1f750 6e 2e 6e 45 71 3b 20 20 20 2f 2a 20 4e 75 6d 62  n.nEq;   /* Numb
1f760 65 72 20 6f 66 20 3d 3d 20 63 6f 6e 73 74 72 61  er of == constra
1f770 69 6e 74 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a  ints to skip */.
1f780 20 20 20 20 20 20 69 6e 74 20 6e 53 6b 69 70 52        int nSkipR
1f790 61 6e 67 65 20 3d 20 6e 42 6f 75 6e 64 3b 20 20  ange = nBound;  
1f7a0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1f7b0 3c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f  < constraints to
1f7c0 20 73 6b 69 70 20 2a 2f 0a 20 20 20 20 20 20 42   skip */.      B
1f7d0 69 74 6d 61 73 6b 20 74 68 69 73 54 61 62 3b 20  itmask thisTab; 
1f7e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
1f7f0 69 74 6d 61 70 20 66 6f 72 20 70 53 72 63 20 2a  itmap for pSrc *
1f800 2f 0a 0a 20 20 20 20 20 20 74 68 69 73 54 61 62  /..      thisTab
1f810 20 3d 20 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e   = getMask(pWC->
1f820 70 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b  pMaskSet, iCur);
1f830 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d  .      for(pTerm
1f840 3d 70 57 43 2d 3e 61 2c 20 6b 3d 70 57 43 2d 3e  =pWC->a, k=pWC->
1f850 6e 54 65 72 6d 3b 20 70 63 2e 70 6c 61 6e 2e 6e  nTerm; pc.plan.n
1f860 52 6f 77 3e 32 20 26 26 20 6b 3b 20 6b 2d 2d 2c  Row>2 && k; k--,
1f870 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
1f880 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
1f890 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
1f8a0 54 55 41 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  TUAL ) continue;
1f8b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54  .        if( (pT
1f8c0 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
1f8d0 20 70 2d 3e 6e 6f 74 56 61 6c 69 64 29 21 3d 74   p->notValid)!=t
1f8e0 68 69 73 54 61 62 20 29 20 63 6f 6e 74 69 6e 75  hisTab ) continu
1f8f0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
1f900 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1f910 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57  & (WO_EQ|WO_IN|W
1f920 4f 5f 49 53 4e 55 4c 4c 29 20 29 7b 0a 20 20 20  O_ISNULL) ){.   
1f930 20 20 20 20 20 20 20 69 66 28 20 6e 53 6b 69 70         if( nSkip
1f940 45 71 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Eq ){.          
1f950 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20    /* Ignore the 
1f960 66 69 72 73 74 20 70 63 2e 70 6c 61 6e 2e 6e 45  first pc.plan.nE
1f970 71 20 65 71 75 61 6c 69 74 79 20 6d 61 74 63 68  q equality match
1f980 65 73 20 73 69 6e 63 65 20 74 68 65 20 69 6e 64  es since the ind
1f990 65 78 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ex.            *
1f9a0 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 61 63  * has already ac
1f9b0 63 6f 75 6e 74 65 64 20 66 6f 72 20 74 68 65 73  counted for thes
1f9c0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
1f9d0 20 6e 53 6b 69 70 45 71 2d 2d 3b 0a 20 20 20 20   nSkipEq--;.    
1f9e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f9f0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75           /* Assu
1fa00 6d 65 20 65 61 63 68 20 61 64 64 69 74 69 6f 6e  me each addition
1fa10 61 6c 20 65 71 75 61 6c 69 74 79 20 6d 61 74 63  al equality matc
1fa20 68 20 72 65 64 75 63 65 73 20 74 68 65 20 72 65  h reduces the re
1fa30 73 75 6c 74 0a 20 20 20 20 20 20 20 20 20 20 20  sult.           
1fa40 20 2a 2a 20 73 65 74 20 73 69 7a 65 20 62 79 20   ** set size by 
1fa50 61 20 66 61 63 74 6f 72 20 6f 66 20 31 30 20 2a  a factor of 10 *
1fa60 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 63  /.            pc
1fa70 2e 70 6c 61 6e 2e 6e 52 6f 77 20 2f 3d 20 31 30  .plan.nRow /= 10
1fa80 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1fa90 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1faa0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1fab0 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c   & (WO_LT|WO_LE|
1fac0 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b 0a  WO_GT|WO_GE) ){.
1fad0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 53            if( nS
1fae0 6b 69 70 52 61 6e 67 65 20 29 7b 0a 20 20 20 20  kipRange ){.    
1faf0 20 20 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72          /* Ignor
1fb00 65 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69  e the first nSki
1fb10 70 52 61 6e 67 65 20 72 61 6e 67 65 20 63 6f 6e  pRange range con
1fb20 73 74 72 61 69 6e 74 73 20 73 69 6e 63 65 20 74  straints since t
1fb30 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20  he index.       
1fb40 20 20 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65       ** has alre
1fb50 61 64 79 20 61 63 63 6f 75 6e 74 65 64 20 66 6f  ady accounted fo
1fb60 72 20 74 68 65 73 65 20 2a 2f 0a 20 20 20 20 20  r these */.     
1fb70 20 20 20 20 20 20 20 6e 53 6b 69 70 52 61 6e 67         nSkipRang
1fb80 65 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  e--;.          }
1fb90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1fba0 20 20 2f 2a 20 41 73 73 75 6d 65 20 65 61 63 68    /* Assume each
1fbb0 20 61 64 64 69 74 69 6f 6e 61 6c 20 72 61 6e 67   additional rang
1fbc0 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 65 64  e constraint red
1fbd0 75 63 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a  uces the result.
1fbe0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
1fbf0 65 74 20 73 69 7a 65 20 62 79 20 61 20 66 61 63  et size by a fac
1fc00 74 6f 72 20 6f 66 20 33 2e 20 20 49 6e 64 65 78  tor of 3.  Index
1fc10 65 64 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  ed range constra
1fc20 69 6e 74 73 20 72 65 64 75 63 65 0a 20 20 20 20  ints reduce.    
1fc30 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73          ** the s
1fc40 65 61 72 63 68 20 73 70 61 63 65 20 62 79 20 61  earch space by a
1fc50 20 6c 61 72 67 65 72 20 66 61 63 74 6f 72 3a 20   larger factor: 
1fc60 34 2e 20 20 57 65 20 6d 61 6b 65 20 69 6e 64 65  4.  We make inde
1fc70 78 65 64 20 72 61 6e 67 65 0a 20 20 20 20 20 20  xed range.      
1fc80 20 20 20 20 20 20 2a 2a 20 6d 6f 72 65 20 73 65        ** more se
1fc90 6c 65 63 74 69 76 65 20 69 6e 74 65 6e 74 69 6f  lective intentio
1fca0 6e 61 6c 6c 79 20 62 65 63 61 75 73 65 20 6f 66  nally because of
1fcb0 20 74 68 65 20 73 75 62 6a 65 63 74 69 76 65 20   the subjective 
1fcc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1fcd0 6f 62 73 65 72 76 61 74 69 6f 6e 20 74 68 61 74  observation that
1fce0 20 69 6e 64 65 78 65 64 20 72 61 6e 67 65 20 63   indexed range c
1fcf0 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 61 6c 6c  onstraints reall
1fd00 79 20 61 72 65 20 6d 6f 72 65 0a 20 20 20 20 20  y are more.     
1fd10 20 20 20 20 20 20 20 2a 2a 20 73 65 6c 65 63 74         ** select
1fd20 69 76 65 20 69 6e 20 70 72 61 63 74 69 63 65 2c  ive in practice,
1fd30 20 6f 6e 20 61 76 65 72 61 67 65 2e 20 2a 2f 0a   on average. */.
1fd40 20 20 20 20 20 20 20 20 20 20 20 20 70 63 2e 70              pc.p
1fd50 6c 61 6e 2e 6e 52 6f 77 20 2f 3d 20 33 3b 0a 20  lan.nRow /= 3;. 
1fd60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1fd70 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65     }else if( pTe
1fd80 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57  rm->eOperator!=W
1fd90 4f 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20  O_NOOP ){.      
1fda0 20 20 20 20 2f 2a 20 41 6e 79 20 6f 74 68 65 72      /* Any other
1fdb0 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 77 65   expression lowe
1fdc0 72 73 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f  rs the output ro
1fdd0 77 20 63 6f 75 6e 74 20 62 79 20 68 61 6c 66 20  w count by half 
1fde0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 63 2e  */.          pc.
1fdf0 70 6c 61 6e 2e 6e 52 6f 77 20 2f 3d 20 32 3b 0a  plan.nRow /= 2;.
1fe00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1fe10 7d 0a 20 20 20 20 20 20 69 66 28 20 70 63 2e 70  }.      if( pc.p
1fe20 6c 61 6e 2e 6e 52 6f 77 3c 32 20 29 20 70 63 2e  lan.nRow<2 ) pc.
1fe30 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 32 3b 0a 20  plan.nRow = 2;. 
1fe40 20 20 20 7d 0a 0a 0a 20 20 20 20 57 48 45 52 45     }...    WHERE
1fe50 54 52 41 43 45 28 28 0a 20 20 20 20 20 20 22 20  TRACE((.      " 
1fe60 20 20 20 20 20 6e 45 71 3d 25 64 20 6e 49 6e 4d       nEq=%d nInM
1fe70 75 6c 3d 25 64 20 72 61 6e 67 65 44 69 76 3d 25  ul=%d rangeDiv=%
1fe80 64 20 62 53 6f 72 74 3d 25 64 20 62 4c 6f 6f 6b  d bSort=%d bLook
1fe90 75 70 3d 25 64 20 77 73 46 6c 61 67 73 3d 30 78  up=%d wsFlags=0x
1fea0 25 30 38 78 5c 6e 22 0a 20 20 20 20 20 20 22 20  %08x\n".      " 
1feb0 20 20 20 20 20 6e 6f 74 52 65 61 64 79 3d 30 78       notReady=0x
1fec0 25 6c 6c 78 20 6c 6f 67 31 30 4e 3d 25 2e 31 66  %llx log10N=%.1f
1fed0 20 6e 52 6f 77 3d 25 2e 31 66 20 63 6f 73 74 3d   nRow=%.1f cost=
1fee0 25 2e 31 66 5c 6e 22 0a 20 20 20 20 20 20 22 20  %.1f\n".      " 
1fef0 20 20 20 20 20 75 73 65 64 3d 30 78 25 6c 6c 78       used=0x%llx
1ff00 20 6e 4f 42 53 61 74 3d 25 64 5c 6e 22 2c 0a 20   nOBSat=%d\n",. 
1ff10 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 6e 45 71       pc.plan.nEq
1ff20 2c 20 6e 49 6e 4d 75 6c 2c 20 28 69 6e 74 29 72  , nInMul, (int)r
1ff30 61 6e 67 65 44 69 76 2c 20 62 53 6f 72 74 2c 20  angeDiv, bSort, 
1ff40 62 4c 6f 6f 6b 75 70 2c 20 70 63 2e 70 6c 61 6e  bLookup, pc.plan
1ff50 2e 77 73 46 6c 61 67 73 2c 0a 20 20 20 20 20 20  .wsFlags,.      
1ff60 70 2d 3e 6e 6f 74 52 65 61 64 79 2c 20 6c 6f 67  p->notReady, log
1ff70 31 30 4e 2c 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f  10N, pc.plan.nRo
1ff80 77 2c 20 70 63 2e 72 43 6f 73 74 2c 20 70 63 2e  w, pc.rCost, pc.
1ff90 75 73 65 64 2c 0a 20 20 20 20 20 20 70 63 2e 70  used,.      pc.p
1ffa0 6c 61 6e 2e 6e 4f 42 53 61 74 0a 20 20 20 20 29  lan.nOBSat.    )
1ffb0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
1ffc0 69 73 20 69 6e 64 65 78 20 69 73 20 74 68 65 20  is index is the 
1ffd0 62 65 73 74 20 77 65 20 68 61 76 65 20 73 65 65  best we have see
1ffe0 6e 20 73 6f 20 66 61 72 2c 20 74 68 65 6e 20 72  n so far, then r
1fff0 65 63 6f 72 64 20 74 68 69 73 0a 20 20 20 20 2a  ecord this.    *
20000 2a 20 69 6e 64 65 78 20 61 6e 64 20 69 74 73 20  * index and its 
20010 63 6f 73 74 20 69 6e 20 74 68 65 20 70 2d 3e 63  cost in the p->c
20020 6f 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a 20  ost structure.. 
20030 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21     */.    if( (!
20040 70 49 64 78 20 7c 7c 20 70 63 2e 70 6c 61 6e 2e  pIdx || pc.plan.
20050 77 73 46 6c 61 67 73 29 20 26 26 20 63 6f 6d 70  wsFlags) && comp
20060 61 72 65 43 6f 73 74 28 26 70 63 2c 20 26 70 2d  areCost(&pc, &p-
20070 3e 63 6f 73 74 29 20 29 7b 0a 20 20 20 20 20 20  >cost) ){.      
20080 70 2d 3e 63 6f 73 74 20 3d 20 70 63 3b 0a 20 20  p->cost = pc;.  
20090 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e      p->cost.plan
200a0 2e 77 73 46 6c 61 67 73 20 26 3d 20 77 73 46 6c  .wsFlags &= wsFl
200b0 61 67 4d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d  agMask;.      p-
200c0 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 49 64  >cost.plan.u.pId
200d0 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 7d 0a  x = pIdx;.    }.
200e0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
200f0 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20   was an INDEXED 
20100 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
20110 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20 69 6e  only that one in
20120 64 65 78 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f  dex is.    ** co
20130 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20 20  nsidered. */.   
20140 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65   if( pSrc->pInde
20150 78 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  x ) break;..    
20160 2f 2a 20 52 65 73 65 74 20 6d 61 73 6b 73 20 66  /* Reset masks f
20170 6f 72 20 74 68 65 20 6e 65 78 74 20 69 6e 64 65  or the next inde
20180 78 20 69 6e 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  x in the loop */
20190 0a 20 20 20 20 77 73 46 6c 61 67 4d 61 73 6b 20  .    wsFlagMask 
201a0 3d 20 7e 28 57 48 45 52 45 5f 52 4f 57 49 44 5f  = ~(WHERE_ROWID_
201b0 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52  EQ|WHERE_ROWID_R
201c0 41 4e 47 45 29 3b 0a 20 20 20 20 65 71 54 65 72  ANGE);.    eqTer
201d0 6d 4d 61 73 6b 20 3d 20 69 64 78 45 71 54 65 72  mMask = idxEqTer
201e0 6d 4d 61 73 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  mMask;.  }..  /*
201f0 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
20200 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
20210 61 6e 64 20 74 68 65 20 53 51 4c 49 54 45 5f 52  and the SQLITE_R
20220 65 76 65 72 73 65 4f 72 64 65 72 20 66 6c 61 67  everseOrder flag
20230 0a 20 20 2a 2a 20 69 73 20 73 65 74 2c 20 74 68  .  ** is set, th
20240 65 6e 20 72 65 76 65 72 73 65 20 74 68 65 20 6f  en reverse the o
20250 72 64 65 72 20 74 68 61 74 20 74 68 65 20 69 6e  rder that the in
20260 64 65 78 20 77 69 6c 6c 20 62 65 20 73 63 61 6e  dex will be scan
20270 6e 65 64 0a 20 20 2a 2a 20 69 6e 2e 20 54 68 69  ned.  ** in. Thi
20280 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 61 70  s is used for ap
20290 70 6c 69 63 61 74 69 6f 6e 20 74 65 73 74 69 6e  plication testin
202a0 67 2c 20 74 6f 20 68 65 6c 70 20 66 69 6e 64 20  g, to help find 
202b0 63 61 73 65 73 0a 20 20 2a 2a 20 77 68 65 72 65  cases.  ** where
202c0 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 62 65 68   application beh
202d0 61 76 69 6f 75 72 20 64 65 70 65 6e 64 73 20 6f  aviour depends o
202e0 6e 20 74 68 65 20 28 75 6e 64 65 66 69 6e 65 64  n the (undefined
202f0 29 20 6f 72 64 65 72 20 74 68 61 74 0a 20 20 2a  ) order that.  *
20300 2a 20 53 51 4c 69 74 65 20 6f 75 74 70 75 74 73  * SQLite outputs
20310 20 72 6f 77 73 20 69 6e 20 69 6e 20 74 68 65 20   rows in in the 
20320 61 62 73 65 6e 63 65 20 6f 66 20 61 6e 20 4f 52  absence of an OR
20330 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20  DER BY clause.  
20340 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 70 4f 72  */.  if( !p->pOr
20350 64 65 72 42 79 20 26 26 20 70 50 61 72 73 65 2d  derBy && pParse-
20360 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
20370 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72  ITE_ReverseOrder
20380 20 29 7b 0a 20 20 20 20 70 2d 3e 63 6f 73 74 2e   ){.    p->cost.
20390 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20  plan.wsFlags |= 
203a0 57 48 45 52 45 5f 52 45 56 45 52 53 45 3b 0a 20  WHERE_REVERSE;. 
203b0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d   }..  assert( p-
203c0 3e 70 4f 72 64 65 72 42 79 20 7c 7c 20 28 70 2d  >pOrderBy || (p-
203d0 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61  >cost.plan.wsFla
203e0 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 45 44  gs&WHERE_ORDERED
203f0 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
20400 28 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75  ( p->cost.plan.u
20410 2e 70 49 64 78 3d 3d 30 20 7c 7c 20 28 70 2d 3e  .pIdx==0 || (p->
20420 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  cost.plan.wsFlag
20430 73 26 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51  s&WHERE_ROWID_EQ
20440 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
20450 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3d 3d  ( pSrc->pIndex==
20460 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  0 .       || p->
20470 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 49 64 78  cost.plan.u.pIdx
20480 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  ==0 .       || p
20490 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 49  ->cost.plan.u.pI
204a0 64 78 3d 3d 70 53 72 63 2d 3e 70 49 6e 64 65 78  dx==pSrc->pIndex
204b0 20 0a 20 20 29 3b 0a 0a 20 20 57 48 45 52 45 54   .  );..  WHERET
204c0 52 41 43 45 28 28 22 20 20 20 62 65 73 74 20 69  RACE(("   best i
204d0 6e 64 65 78 20 69 73 3a 20 25 73 5c 6e 22 2c 0a  ndex is: %s\n",.
204e0 20 20 20 20 20 20 20 20 20 70 2d 3e 63 6f 73 74           p->cost
204f0 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 20 3f 20 70  .plan.u.pIdx ? p
20500 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 49  ->cost.plan.u.pI
20510 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 69 70 6b  dx->zName : "ipk
20520 22 29 29 3b 0a 20 20 0a 20 20 62 65 73 74 4f 72  "));.  .  bestOr
20530 43 6c 61 75 73 65 49 6e 64 65 78 28 70 29 3b 0a  ClauseIndex(p);.
20540 20 20 62 65 73 74 41 75 74 6f 6d 61 74 69 63 49    bestAutomaticI
20550 6e 64 65 78 28 70 29 3b 0a 20 20 70 2d 3e 63 6f  ndex(p);.  p->co
20560 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  st.plan.wsFlags 
20570 7c 3d 20 65 71 54 65 72 6d 4d 61 73 6b 3b 0a 7d  |= eqTermMask;.}
20580 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
20590 20 71 75 65 72 79 20 70 6c 61 6e 20 66 6f 72 20   query plan for 
205a0 61 63 63 65 73 73 69 6e 67 20 74 61 62 6c 65 20  accessing table 
205b0 70 53 72 63 2d 3e 70 54 61 62 2e 20 57 72 69 74  pSrc->pTab. Writ
205c0 65 20 74 68 65 0a 2a 2a 20 62 65 73 74 20 71 75  e the.** best qu
205d0 65 72 79 20 70 6c 61 6e 20 61 6e 64 20 69 74 73  ery plan and its
205e0 20 63 6f 73 74 20 69 6e 74 6f 20 74 68 65 20 57   cost into the W
205f0 68 65 72 65 43 6f 73 74 20 6f 62 6a 65 63 74 20  hereCost object 
20600 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 61 73 20  supplied .** as 
20610 74 68 65 20 6c 61 73 74 20 70 61 72 61 6d 65 74  the last paramet
20620 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
20630 6e 20 6d 61 79 20 63 61 6c 63 75 6c 61 74 65 20  n may calculate 
20640 74 68 65 20 63 6f 73 74 20 6f 66 0a 2a 2a 20 62  the cost of.** b
20650 6f 74 68 20 72 65 61 6c 20 61 6e 64 20 76 69 72  oth real and vir
20660 74 75 61 6c 20 74 61 62 6c 65 20 73 63 61 6e 73  tual table scans
20670 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
20680 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 74  ction does not t
20690 61 6b 65 20 4f 52 44 45 52 20 42 59 20 6f 72 20  ake ORDER BY or 
206a0 44 49 53 54 49 4e 43 54 20 69 6e 74 6f 20 61 63  DISTINCT into ac
206b0 63 6f 75 6e 74 2e 20 20 4e 6f 72 0a 2a 2a 20 64  count.  Nor.** d
206c0 6f 65 73 20 69 74 20 72 65 6d 65 6d 62 65 72 20  oes it remember 
206d0 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
206e0 65 20 71 75 65 72 79 20 70 6c 61 6e 2e 20 20 41  e query plan.  A
206f0 6c 6c 20 69 74 20 64 6f 65 73 20 69 73 20 63 6f  ll it does is co
20700 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 63 6f 73  mpute.** the cos
20710 74 20 77 68 69 6c 65 20 64 65 74 65 72 6d 69 6e  t while determin
20720 69 6e 67 20 69 66 20 61 6e 20 4f 52 20 6f 70 74  ing if an OR opt
20730 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61 70 70  imization is app
20740 6c 69 63 61 62 6c 65 2e 20 20 54 68 65 0a 2a 2a  licable.  The.**
20750 20 64 65 74 61 69 6c 73 20 77 69 6c 6c 20 62 65   details will be
20760 20 72 65 63 6f 6e 73 69 64 65 72 65 64 20 6c 61   reconsidered la
20770 74 65 72 20 69 66 20 74 68 65 20 6f 70 74 69 6d  ter if the optim
20780 69 7a 61 74 69 6f 6e 20 69 73 20 66 6f 75 6e 64  ization is found
20790 20 74 6f 20 62 65 0a 2a 2a 20 61 70 70 6c 69 63   to be.** applic
207a0 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
207b0 76 6f 69 64 20 62 65 73 74 49 6e 64 65 78 28 57  void bestIndex(W
207c0 68 65 72 65 42 65 73 74 49 64 78 20 2a 70 29 7b  hereBestIdx *p){
207d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
207e0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
207f0 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  E.  if( IsVirtua
20800 6c 28 70 2d 3e 70 53 72 63 2d 3e 70 54 61 62 29  l(p->pSrc->pTab)
20810 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
20820 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78  index_info *pIdx
20830 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d  Info = 0;.    p-
20840 3e 70 70 49 64 78 49 6e 66 6f 20 3d 20 26 70 49  >ppIdxInfo = &pI
20850 64 78 49 6e 66 6f 3b 0a 20 20 20 20 62 65 73 74  dxInfo;.    best
20860 56 69 72 74 75 61 6c 49 6e 64 65 78 28 70 29 3b  VirtualIndex(p);
20870 0a 20 20 20 20 69 66 28 20 70 49 64 78 49 6e 66  .    if( pIdxInf
20880 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
20890 53 74 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Str ){.      sql
208a0 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e  ite3_free(pIdxIn
208b0 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20  fo->idxStr);.   
208c0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
208d0 46 72 65 65 28 70 2d 3e 70 50 61 72 73 65 2d 3e  Free(p->pParse->
208e0 64 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20  db, pIdxInfo);. 
208f0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
20900 7b 0a 20 20 20 20 62 65 73 74 42 74 72 65 65 49  {.    bestBtreeI
20910 6e 64 65 78 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  ndex(p);.  }.}..
20920 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61 20  /*.** Disable a 
20930 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52  term in the WHER
20940 45 20 63 6c 61 75 73 65 2e 20 20 45 78 63 65 70  E clause.  Excep
20950 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61 62 6c  t, do not disabl
20960 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 69 66  e the term.** if
20970 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61 20 4c   it controls a L
20980 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 61  EFT OUTER JOIN a
20990 6e 64 20 69 74 20 64 69 64 20 6e 6f 74 20 6f 72  nd it did not or
209a0 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65 20 4f  iginate in the O
209b0 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20 63 6c  N.** or USING cl
209c0 61 75 73 65 20 6f 66 20 74 68 61 74 20 6a 6f 69  ause of that joi
209d0 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65  n..**.** Conside
209e0 72 20 74 68 65 20 74 65 72 6d 20 74 32 2e 7a 3d  r the term t2.z=
209f0 27 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f 6c 6c  'ok' in the foll
20a00 6f 77 69 6e 67 20 71 75 65 72 69 65 73 3a 0a 2a  owing queries:.*
20a10 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53 45 4c 45  *.**   (1)  SELE
20a20 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46  CT * FROM t1 LEF
20a30 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e  T JOIN t2 ON t1.
20a40 61 3d 74 32 2e 78 20 57 48 45 52 45 20 74 32 2e  a=t2.x WHERE t2.
20a50 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32 29 20  z='ok'.**   (2) 
20a60 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
20a70 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f  1 LEFT JOIN t2 O
20a80 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20  N t1.a=t2.x AND 
20a90 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28  t2.z='ok'.**   (
20aa0 33 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  3)  SELECT * FRO
20ab0 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45 20 74  M t1, t2 WHERE t
20ac0 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e  1.a=t2.x AND t2.
20ad0 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65  z='ok'.**.** The
20ae0 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20 64 69   t2.z='ok' is di
20af0 73 61 62 6c 65 64 20 69 6e 20 74 68 65 20 69 6e  sabled in the in
20b00 20 28 32 29 20 62 65 63 61 75 73 65 20 69 74 20   (2) because it 
20b10 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20 69 6e  originates.** in
20b20 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20   the ON clause. 
20b30 20 54 68 65 20 74 65 72 6d 20 69 73 20 64 69 73   The term is dis
20b40 61 62 6c 65 64 20 69 6e 20 28 33 29 20 62 65 63  abled in (3) bec
20b50 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70  ause it is not p
20b60 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54  art.** of a LEFT
20b70 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20 49 6e   OUTER JOIN.  In
20b80 20 28 31 29 2c 20 74 68 65 20 74 65 72 6d 20 69   (1), the term i
20b90 73 20 6e 6f 74 20 64 69 73 61 62 6c 65 64 2e 0a  s not disabled..
20ba0 2a 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  **.** IMPLEMENTA
20bb0 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 34 35 39 37  TION-OF: R-24597
20bc0 2d 35 38 36 35 35 20 4e 6f 20 74 65 73 74 73 20  -58655 No tests 
20bd0 61 72 65 20 64 6f 6e 65 20 66 6f 72 20 74 65 72  are done for ter
20be0 6d 73 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63  ms that are.** c
20bf0 6f 6d 70 6c 65 74 65 6c 79 20 73 61 74 69 73 66  ompletely satisf
20c00 69 65 64 20 62 79 20 69 6e 64 69 63 65 73 2e 0a  ied by indices..
20c10 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e 67 20  **.** Disabling 
20c20 61 20 74 65 72 6d 20 63 61 75 73 65 73 20 74 68  a term causes th
20c30 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74 20 62  at term to not b
20c40 65 20 74 65 73 74 65 64 20 69 6e 20 74 68 65 20  e tested in the 
20c50 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66  inner loop.** of
20c60 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69 73 61   the join.  Disa
20c70 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70 74 69  bling is an opti
20c80 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65 6e 20  mization.  When 
20c90 74 65 72 6d 73 20 61 72 65 20 73 61 74 69 73 66  terms are satisf
20ca0 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69 63 65  ied.** by indice
20cb0 73 2c 20 77 65 20 64 69 73 61 62 6c 65 20 74 68  s, we disable th
20cc0 65 6d 20 74 6f 20 70 72 65 76 65 6e 74 20 72 65  em to prevent re
20cd0 64 75 6e 64 61 6e 74 20 74 65 73 74 73 20 69 6e  dundant tests in
20ce0 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f   the inner.** lo
20cf0 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64 20 67 65  op.  We would ge
20d00 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 65  t the correct re
20d10 73 75 6c 74 73 20 69 66 20 6e 6f 74 68 69 6e 67  sults if nothing
20d20 20 77 65 72 65 20 65 76 65 72 20 64 69 73 61 62   were ever disab
20d30 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e  led,.** but join
20d40 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69  s might run a li
20d50 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 54 68  ttle slower.  Th
20d60 65 20 74 72 69 63 6b 20 69 73 20 74 6f 20 64 69  e trick is to di
20d70 73 61 62 6c 65 20 61 73 20 6d 75 63 68 0a 2a 2a  sable as much.**
20d80 20 61 73 20 77 65 20 63 61 6e 20 77 69 74 68 6f   as we can witho
20d90 75 74 20 64 69 73 61 62 6c 69 6e 67 20 74 6f 6f  ut disabling too
20da0 20 6d 75 63 68 2e 20 20 49 66 20 77 65 20 64 69   much.  If we di
20db0 73 61 62 6c 65 64 20 69 6e 20 28 31 29 2c 20 77  sabled in (1), w
20dc0 65 27 64 20 67 65 74 0a 2a 2a 20 74 68 65 20 77  e'd get.** the w
20dd0 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20 53 65  rong answer.  Se
20de0 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e 0a 2a  e ticket #813..*
20df0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69  /.static void di
20e00 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72 65 4c  sableTerm(WhereL
20e10 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 57 68  evel *pLevel, Wh
20e20 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b  ereTerm *pTerm){
20e30 0a 20 20 69 66 28 20 70 54 65 72 6d 0a 20 20 20  .  if( pTerm.   
20e40 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 77 74     && (pTerm->wt
20e50 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  Flags & TERM_COD
20e60 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20  ED)==0.      && 
20e70 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f  (pLevel->iLeftJo
20e80 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61 73  in==0 || ExprHas
20e90 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e  Property(pTerm->
20ea0 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
20eb0 69 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 70 54  in)).  ){.    pT
20ec0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
20ed0 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20  TERM_CODED;.    
20ee0 69 66 28 20 70 54 65 72 6d 2d 3e 69 50 61 72 65  if( pTerm->iPare
20ef0 6e 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 57  nt>=0 ){.      W
20f00 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72  hereTerm *pOther
20f10 20 3d 20 26 70 54 65 72 6d 2d 3e 70 57 43 2d 3e   = &pTerm->pWC->
20f20 61 5b 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  a[pTerm->iParent
20f30 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28 2d 2d  ];.      if( (--
20f40 70 4f 74 68 65 72 2d 3e 6e 43 68 69 6c 64 29 3d  pOther->nChild)=
20f50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69  =0 ){.        di
20f60 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
20f70 2c 20 70 4f 74 68 65 72 29 3b 0a 20 20 20 20 20  , pOther);.     
20f80 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
20f90 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50  /*.** Code an OP
20fa0 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65  _Affinity opcode
20fb0 20 74 6f 20 61 70 70 6c 79 20 74 68 65 20 63 6f   to apply the co
20fc0 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74  lumn affinity st
20fd0 72 69 6e 67 20 7a 41 66 66 0a 2a 2a 20 74 6f 20  ring zAff.** to 
20fe0 74 68 65 20 6e 20 72 65 67 69 73 74 65 72 73 20  the n registers 
20ff0 73 74 61 72 74 69 6e 67 20 61 74 20 62 61 73 65  starting at base
21000 2e 20 0a 2a 2a 0a 2a 2a 20 41 73 20 61 6e 20 6f  . .**.** As an o
21010 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 53 51 4c  ptimization, SQL
21020 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74  ITE_AFF_NONE ent
21030 72 69 65 73 20 28 77 68 69 63 68 20 61 72 65 20  ries (which are 
21040 6e 6f 2d 6f 70 73 29 20 61 74 20 74 68 65 0a 2a  no-ops) at the.*
21050 2a 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  * beginning and 
21060 65 6e 64 20 6f 66 20 7a 41 66 66 20 61 72 65 20  end of zAff are 
21070 69 67 6e 6f 72 65 64 2e 20 20 49 66 20 61 6c 6c  ignored.  If all
21080 20 65 6e 74 72 69 65 73 20 69 6e 20 7a 41 66 66   entries in zAff
21090 20 61 72 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 41   are.** SQLITE_A
210a0 46 46 5f 4e 4f 4e 45 2c 20 74 68 65 6e 20 6e 6f  FF_NONE, then no
210b0 20 63 6f 64 65 20 67 65 74 73 20 67 65 6e 65 72   code gets gener
210c0 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ated..**.** This
210d0 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 69   routine makes i
210e0 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 7a  ts own copy of z
210f0 41 66 66 20 73 6f 20 74 68 61 74 20 74 68 65 20  Aff so that the 
21100 63 61 6c 6c 65 72 20 69 73 20 66 72 65 65 0a 2a  caller is free.*
21110 2a 20 74 6f 20 6d 6f 64 69 66 79 20 7a 41 66 66  * to modify zAff
21120 20 61 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   after this rout
21130 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2f 0a  ine returns..*/.
21140 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
21150 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 50 61  ApplyAffinity(Pa
21160 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
21170 20 62 61 73 65 2c 20 69 6e 74 20 6e 2c 20 63 68   base, int n, ch
21180 61 72 20 2a 7a 41 66 66 29 7b 0a 20 20 56 64 62  ar *zAff){.  Vdb
21190 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
211a0 56 64 62 65 3b 0a 20 20 69 66 28 20 7a 41 66 66  Vdbe;.  if( zAff
211b0 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
211c0 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  t( pParse->db->m
211d0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
211e0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
211f0 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
21200 0a 0a 20 20 2f 2a 20 41 64 6a 75 73 74 20 62 61  ..  /* Adjust ba
21210 73 65 20 61 6e 64 20 6e 20 74 6f 20 73 6b 69 70  se and n to skip
21220 20 6f 76 65 72 20 53 51 4c 49 54 45 5f 41 46 46   over SQLITE_AFF
21230 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 61 74  _NONE entries at
21240 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20   the beginning. 
21250 20 2a 2a 20 61 6e 64 20 65 6e 64 20 6f 66 20 74   ** and end of t
21260 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  he affinity stri
21270 6e 67 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  ng..  */.  while
21280 28 20 6e 3e 30 20 26 26 20 7a 41 66 66 5b 30 5d  ( n>0 && zAff[0]
21290 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
212a0 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20  E ){.    n--;.  
212b0 20 20 62 61 73 65 2b 2b 3b 0a 20 20 20 20 7a 41    base++;.    zA
212c0 66 66 2b 2b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  ff++;.  }.  whil
212d0 65 28 20 6e 3e 31 20 26 26 20 7a 41 66 66 5b 6e  e( n>1 && zAff[n
212e0 2d 31 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  -1]==SQLITE_AFF_
212f0 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b  NONE ){.    n--;
21300 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 64 65 20  .  }..  /* Code 
21310 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20  the OP_Affinity 
21320 6f 70 63 6f 64 65 20 69 66 20 74 68 65 72 65 20  opcode if there 
21330 69 73 20 61 6e 79 74 68 69 6e 67 20 6c 65 66 74  is anything left
21340 20 74 6f 20 64 6f 2e 20 2a 2f 0a 20 20 69 66 28   to do. */.  if(
21350 20 6e 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69   n>0 ){.    sqli
21360 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
21370 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 62 61   OP_Affinity, ba
21380 73 65 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69  se, n);.    sqli
21390 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
213a0 76 2c 20 2d 31 2c 20 7a 41 66 66 2c 20 6e 29 3b  v, -1, zAff, n);
213b0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
213c0 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
213d0 6e 67 65 28 70 50 61 72 73 65 2c 20 62 61 73 65  nge(pParse, base
213e0 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  , n);.  }.}.../*
213f0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
21400 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 65  e for a single e
21410 71 75 61 6c 69 74 79 20 74 65 72 6d 20 6f 66 20  quality term of 
21420 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
21430 2e 20 20 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a  .  An equality.*
21440 2a 20 74 65 72 6d 20 63 61 6e 20 62 65 20 65 69  * term can be ei
21450 74 68 65 72 20 58 3d 65 78 70 72 20 6f 72 20 58  ther X=expr or X
21460 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65   IN (...).   pTe
21470 72 6d 20 69 73 20 74 68 65 20 74 65 72 6d 20 74  rm is the term t
21480 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a  o be .** coded..
21490 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72 65 6e  **.** The curren
214a0 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
214b0 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6c 65  constraint is le
214c0 66 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ft in register i
214d0 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  Reg..**.** For a
214e0 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 74   constraint of t
214f0 68 65 20 66 6f 72 6d 20 58 3d 65 78 70 72 2c 20  he form X=expr, 
21500 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
21510 73 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  s evaluated and 
21520 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73  its.** result is
21530 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73 74 61   left on the sta
21540 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73 74 72 61  ck.  For constra
21550 69 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ints of the form
21560 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74   X IN (...).** t
21570 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
21580 20 75 70 20 61 20 6c 6f 6f 70 20 74 68 61 74 20   up a loop that 
21590 77 69 6c 6c 20 69 74 65 72 61 74 65 20 6f 76 65  will iterate ove
215a0 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20  r all values of 
215b0 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  X..*/.static int
215c0 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
215d0 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  m(.  Parse *pPar
215e0 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  se,      /* The 
215f0 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
21600 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
21610 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20  pTerm,   /* The 
21620 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
21630 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 63  E clause to be c
21640 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c  oded */.  WhereL
21650 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f 2a  evel *pLevel, /*
21660 20 57 68 65 6e 20 6c 65 76 65 6c 20 6f 66 20 74   When level of t
21670 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77  he FROM clause w
21680 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e  e are working on
21690 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72 67 65   */.  int iTarge
216a0 74 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74  t         /* Att
216b0 65 6d 70 74 20 74 6f 20 6c 65 61 76 65 20 72 65  empt to leave re
216c0 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20 72 65  sults in this re
216d0 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45  gister */.){.  E
216e0 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
216f0 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65 20 2a  >pExpr;.  Vdbe *
21700 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
21710 65 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 20 20  e;.  int iReg;  
21720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21730 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
21740 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a  ing results */..
21750 20 20 61 73 73 65 72 74 28 20 69 54 61 72 67 65    assert( iTarge
21760 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 58 2d  t>0 );.  if( pX-
21770 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20  >op==TK_EQ ){.  
21780 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33    iReg = sqlite3
21790 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
217a0 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
217b0 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 7d  t, iTarget);.  }
217c0 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d  else if( pX->op=
217d0 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =TK_ISNULL ){.  
217e0 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74    iReg = iTarget
217f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
21800 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
21810 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23 69  ll, 0, iReg);.#i
21820 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
21830 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c  T_SUBQUERY.  }el
21840 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54 79 70  se{.    int eTyp
21850 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b  e;.    int iTab;
21860 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f  .    struct InLo
21870 6f 70 20 2a 70 49 6e 3b 0a 0a 20 20 20 20 61 73  op *pIn;..    as
21880 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  sert( pX->op==TK
21890 5f 49 4e 20 29 3b 0a 20 20 20 20 69 52 65 67 20  _IN );.    iReg 
218a0 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20 65  = iTarget;.    e
218b0 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69  Type = sqlite3Fi
218c0 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65  ndInIndex(pParse
218d0 2c 20 70 58 2c 20 30 29 3b 0a 20 20 20 20 69 54  , pX, 0);.    iT
218e0 61 62 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b  ab = pX->iTable;
218f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
21900 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
21910 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20  ind, iTab, 0);. 
21920 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65     assert( pLeve
21930 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
21940 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20  & WHERE_IN_ABLE 
21950 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  );.    if( pLeve
21960 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20 29  l->u.in.nIn==0 )
21970 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
21980 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65  addrNxt = sqlite
21990 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
219a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65  );.    }.    pLe
219b0 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b  vel->u.in.nIn++;
219c0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  .    pLevel->u.i
219d0 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20 20  n.aInLoop =.    
219e0 20 20 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c     sqlite3DbReal
219f0 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 72 73 65  locOrFree(pParse
21a00 2d 3e 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e  ->db, pLevel->u.
21a10 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20  in.aInLoop,.    
21a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a30 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
21a40 28 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49  (pLevel->u.in.aI
21a50 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76 65 6c  nLoop[0])*pLevel
21a60 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20 20  ->u.in.nIn);.   
21a70 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 75   pIn = pLevel->u
21a80 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20  .in.aInLoop;.   
21a90 20 69 66 28 20 70 49 6e 20 29 7b 0a 20 20 20 20   if( pIn ){.    
21aa0 20 20 70 49 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d    pIn += pLevel-
21ab0 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b 0a 20  >u.in.nIn - 1;. 
21ac0 20 20 20 20 20 70 49 6e 2d 3e 69 43 75 72 20 3d       pIn->iCur =
21ad0 20 69 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28   iTab;.      if(
21ae0 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
21af0 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20  _ROWID ){.      
21b00 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70    pIn->addrInTop
21b10 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
21b20 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
21b30 2c 20 69 54 61 62 2c 20 69 52 65 67 29 3b 0a 20  , iTab, iReg);. 
21b40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21b50 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54      pIn->addrInT
21b60 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
21b70 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
21b80 75 6d 6e 2c 20 69 54 61 62 2c 20 30 2c 20 69 52  umn, iTab, 0, iR
21b90 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eg);.      }.   
21ba0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21bb0 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp1(v, OP_IsNul
21bc0 6c 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 65  l, iReg);.    }e
21bd0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  lse{.      pLeve
21be0 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b  l->u.in.nIn = 0;
21bf0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
21c00 7d 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28  }.  disableTerm(
21c10 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a  pLevel, pTerm);.
21c20 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d    return iReg;.}
21c30 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
21c40 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
21c50 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20  evaluate all == 
21c60 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e  and IN constrain
21c70 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64  ts for an.** ind
21c80 65 78 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  ex..**.** For ex
21c90 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20  ample, consider 
21ca0 74 61 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64  table t1(a,b,c,d
21cb0 2c 65 2c 66 29 20 77 69 74 68 20 69 6e 64 65 78  ,e,f) with index
21cc0 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53   i1(a,b,c)..** S
21cd0 75 70 70 6f 73 65 20 74 68 65 20 57 48 45 52 45  uppose the WHERE
21ce0 20 63 6c 61 75 73 65 20 69 73 20 74 68 69 73 3a   clause is this:
21cf0 20 20 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20    a==5 AND b IN 
21d00 28 31 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35 20  (1,2,3) AND c>5 
21d10 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20  AND c<10.** The 
21d20 69 6e 64 65 78 20 68 61 73 20 61 73 20 6d 61 6e  index has as man
21d30 79 20 61 73 20 74 68 72 65 65 20 65 71 75 61 6c  y as three equal
21d40 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  ity constraints,
21d50 20 62 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20   but in this.** 
21d60 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 74 68 69  example, the thi
21d70 72 64 20 22 63 22 20 76 61 6c 75 65 20 69 73 20  rd "c" value is 
21d80 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20  an inequality.  
21d90 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20  So only two .** 
21da0 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20  constraints are 
21db0 63 6f 64 65 64 2e 20 20 54 68 69 73 20 72 6f 75  coded.  This rou
21dc0 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72 61  tine will genera
21dd0 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
21de0 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20  ate.** a==5 and 
21df0 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54  b IN (1,2,3).  T
21e00 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
21e10 73 20 66 6f 72 20 61 20 61 6e 64 20 62 20 77 69  s for a and b wi
21e20 6c 6c 20 62 65 20 73 74 6f 72 65 64 0a 2a 2a 20  ll be stored.** 
21e30 69 6e 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72  in consecutive r
21e40 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65  egisters and the
21e50 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69   index of the fi
21e60 72 73 74 20 72 65 67 69 73 74 65 72 20 69 73 20  rst register is 
21e70 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
21e80 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61  In the example a
21e90 62 6f 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75  bove nEq==2.  Bu
21ea0 74 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e  t this subroutin
21eb0 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20  e works for any 
21ec0 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20  value.** of nEq 
21ed0 69 6e 63 6c 75 64 69 6e 67 20 30 2e 20 20 49 66  including 0.  If
21ee0 20 6e 45 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f   nEq==0, this ro
21ef0 75 74 69 6e 65 20 69 73 20 6e 65 61 72 6c 79 20  utine is nearly 
21f00 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20  a no-op..** The 
21f10 6f 6e 6c 79 20 74 68 69 6e 67 20 69 74 20 64 6f  only thing it do
21f20 65 73 20 69 73 20 61 6c 6c 6f 63 61 74 65 20 74  es is allocate t
21f30 68 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20  he pLevel->iMem 
21f40 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 0a  memory cell and.
21f50 2a 2a 20 63 6f 6d 70 75 74 65 20 74 68 65 20 61  ** compute the a
21f60 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a  ffinity string..
21f70 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
21f80 6e 65 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61  ne always alloca
21f90 74 65 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  tes at least one
21fa0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
21fb0 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20   returns.** the 
21fc0 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 6d 65  index of that me
21fd0 6d 6f 72 79 20 63 65 6c 6c 2e 20 54 68 65 20 63  mory cell. The c
21fe0 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c  ode that.** call
21ff0 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
22000 69 6c 6c 20 75 73 65 20 74 68 61 74 20 6d 65 6d  ill use that mem
22010 6f 72 79 20 63 65 6c 6c 20 74 6f 20 73 74 6f 72  ory cell to stor
22020 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f  e the terminatio
22030 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f  n.** key value o
22040 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20  f the loop.  If 
22050 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f  one or more IN o
22060 70 65 72 61 74 6f 72 73 20 61 70 70 65 61 72 2c  perators appear,
22070 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f   then.** this ro
22080 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20  utine allocates 
22090 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45  an additional nE
220a0 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66  q memory cells f
220b0 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75  or internal.** u
220c0 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  se..**.** Before
220d0 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 41   returning, *pzA
220e0 66 66 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  ff is set to poi
220f0 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  nt to a buffer c
22100 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 63  ontaining a.** c
22110 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  opy of the colum
22120 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  n affinity strin
22130 67 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61  g of the index a
22140 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 0a 2a  llocated using.*
22150 2a 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  * sqlite3DbMallo
22160 63 28 29 2e 20 45 78 63 65 70 74 2c 20 65 6e 74  c(). Except, ent
22170 72 69 65 73 20 69 6e 20 74 68 65 20 63 6f 70 79  ries in the copy
22180 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 61   of the string a
22190 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
221a0 68 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  h equality const
221b0 72 61 69 6e 74 73 20 74 68 61 74 20 75 73 65 20  raints that use 
221c0 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 20 61 72  NONE affinity ar
221d0 65 20 73 65 74 20 74 6f 0a 2a 2a 20 53 51 4c 49  e set to.** SQLI
221e0 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54 68 69  TE_AFF_NONE. Thi
221f0 73 20 69 73 20 74 6f 20 64 65 61 6c 20 77 69 74  s is to deal wit
22200 68 20 53 51 4c 20 73 75 63 68 20 61 73 20 74 68  h SQL such as th
22210 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
22220 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
22230 45 20 74 31 28 61 20 54 45 58 54 20 50 52 49 4d  E t1(a TEXT PRIM
22240 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20  ARY KEY, b);.** 
22250 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f    SELECT ... FRO
22260 4d 20 74 31 20 41 53 20 74 32 2c 20 74 31 20 57  M t1 AS t2, t1 W
22270 48 45 52 45 20 74 31 2e 61 20 3d 20 74 32 2e 62  HERE t1.a = t2.b
22280 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65  ;.**.** In the e
22290 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68  xample above, th
222a0 65 20 69 6e 64 65 78 20 6f 6e 20 74 31 28 61 29  e index on t1(a)
222b0 20 68 61 73 20 54 45 58 54 20 61 66 66 69 6e 69   has TEXT affini
222c0 74 79 2e 20 42 75 74 20 73 69 6e 63 65 0a 2a 2a  ty. But since.**
222d0 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20   the right hand 
222e0 73 69 64 65 20 6f 66 20 74 68 65 20 65 71 75 61  side of the equa
222f0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
22300 28 74 32 2e 62 29 20 68 61 73 20 4e 4f 4e 45 20  (t2.b) has NONE 
22310 61 66 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20  affinity,.** no 
22320 63 6f 6e 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c  conversion shoul
22330 64 20 62 65 20 61 74 74 65 6d 70 74 65 64 20 62  d be attempted b
22340 65 66 6f 72 65 20 75 73 69 6e 67 20 61 20 74 32  efore using a t2
22350 2e 62 20 76 61 6c 75 65 20 61 73 20 70 61 72 74  .b value as part
22360 20 6f 66 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20   of.** a key to 
22370 73 65 61 72 63 68 20 74 68 65 20 69 6e 64 65 78  search the index
22380 2e 20 48 65 6e 63 65 20 74 68 65 20 66 69 72 73  . Hence the firs
22390 74 20 62 79 74 65 20 69 6e 20 74 68 65 20 72 65  t byte in the re
223a0 74 75 72 6e 65 64 20 61 66 66 69 6e 69 74 79 0a  turned affinity.
223b0 2a 2a 20 73 74 72 69 6e 67 20 69 6e 20 74 68 69  ** string in thi
223c0 73 20 65 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20  s example would 
223d0 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  be set to SQLITE
223e0 5f 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74  _AFF_NONE..*/.st
223f0 61 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c  atic int codeAll
22400 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20  EqualityTerms(. 
22410 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
22420 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
22430 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
22440 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
22450 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65  l,   /* Which ne
22460 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65  sted loop of the
22470 20 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64   FROM we are cod
22480 69 6e 67 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ing */.  WhereCl
22490 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f  ause *pWC,     /
224a0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
224b0 73 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  se */.  Bitmask 
224c0 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f 2a  notReady,     /*
224d0 20 57 68 69 63 68 20 70 61 72 74 73 20 6f 66 20   Which parts of 
224e0 46 52 4f 4d 20 68 61 76 65 20 6e 6f 74 20 79 65  FROM have not ye
224f0 74 20 62 65 65 6e 20 63 6f 64 65 64 20 2a 2f 0a  t been coded */.
22500 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67 2c    int nExtraReg,
22510 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
22520 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73  r of extra regis
22530 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ters to allocate
22540 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 41   */.  char **pzA
22550 66 66 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ff          /* O
22560 55 54 3a 20 53 65 74 20 74 6f 20 70 6f 69 6e 74  UT: Set to point
22570 20 74 6f 20 61 66 66 69 6e 69 74 79 20 73 74 72   to affinity str
22580 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ing */.){.  int 
22590 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c  nEq = pLevel->pl
225a0 61 6e 2e 6e 45 71 3b 20 20 20 2f 2a 20 54 68 65  an.nEq;   /* The
225b0 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72   number of == or
225c0 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IN constraints 
225d0 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 56 64 62  to code */.  Vdb
225e0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
225f0 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68  Vdbe;      /* Th
22600 65 20 76 6d 20 75 6e 64 65 72 20 63 6f 6e 73 74  e vm under const
22610 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64  ruction */.  Ind
22620 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
22630 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
22640 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 75 73  e index being us
22650 65 64 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70  ed for this loop
22660 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 20 3d   */.  int iCur =
22670 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
22680 3b 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f  ;   /* The curso
22690 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a  r of the table *
226a0 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
226b0 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
226c0 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f    /* A single co
226d0 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f  nstraint term */
226e0 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20  .  int j;       
226f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22700 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
22710 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73   */.  int regBas
22720 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
22730 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69      /* Base regi
22740 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ster */.  int nR
22750 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
22760 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
22770 72 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74  r of registers t
22780 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
22790 63 68 61 72 20 2a 7a 41 66 66 3b 20 20 20 20 20  char *zAff;     
227a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
227b0 20 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   Affinity string
227c0 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20   to return */.. 
227d0 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20   /* This module 
227e0 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f  is only called o
227f0 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20 74 68  n query plans th
22800 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2e  at use an index.
22810 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4c   */.  assert( pL
22820 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
22830 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
22840 45 44 20 29 3b 0a 20 20 70 49 64 78 20 3d 20 70  ED );.  pIdx = p
22850 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49  Level->plan.u.pI
22860 64 78 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65  dx;..  /* Figure
22870 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65   out how many me
22880 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20 77 69  mory cells we wi
22890 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c  ll need then all
228a0 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2f  ocate them..  */
228b0 0a 20 20 72 65 67 42 61 73 65 20 3d 20 70 50 61  .  regBase = pPa
228c0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
228d0 20 6e 52 65 67 20 3d 20 70 4c 65 76 65 6c 2d 3e   nReg = pLevel->
228e0 70 6c 61 6e 2e 6e 45 71 20 2b 20 6e 45 78 74 72  plan.nEq + nExtr
228f0 61 52 65 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  aReg;.  pParse->
22900 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20  nMem += nReg;.. 
22910 20 7a 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44   zAff = sqlite3D
22920 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e  bStrDup(pParse->
22930 64 62 2c 20 73 71 6c 69 74 65 33 49 6e 64 65 78  db, sqlite3Index
22940 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70  AffinityStr(v, p
22950 49 64 78 29 29 3b 0a 20 20 69 66 28 20 21 7a 41  Idx));.  if( !zA
22960 66 66 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  ff ){.    pParse
22970 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
22980 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  ed = 1;.  }..  /
22990 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65  * Evaluate the e
229a0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
229b0 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  nts.  */.  asser
229c0 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  t( pIdx->nColumn
229d0 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a  >=nEq );.  for(j
229e0 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b  =0; j<nEq; j++){
229f0 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20  .    int r1;.   
22a00 20 69 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61   int k = pIdx->a
22a10 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
22a20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
22a30 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e  (pWC, iCur, k, n
22a40 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 2d  otReady, pLevel-
22a50 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 2c 20 70  >plan.wsFlags, p
22a60 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20 70 54  Idx);.    if( pT
22a70 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  erm==0 ) break;.
22a80 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
22a90 77 69 6e 67 20 74 72 75 65 20 66 6f 72 20 69 6e  wing true for in
22aa0 64 69 63 65 73 20 77 69 74 68 20 72 65 64 75 6e  dices with redun
22ab0 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a 20  dant columns. . 
22ac0 20 20 20 2a 2a 20 45 78 3a 20 43 52 45 41 54 45     ** Ex: CREATE
22ad0 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
22ae0 61 2c 62 2c 61 29 3b 20 53 45 4c 45 43 54 20 2a  a,b,a); SELECT *
22af0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
22b00 3d 30 20 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a 20  =0 AND b=0; */. 
22b10 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 54     testcase( (pT
22b20 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
22b30 45 52 4d 5f 43 4f 44 45 44 29 21 3d 30 20 29 3b  ERM_CODED)!=0 );
22b40 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
22b50 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
22b60 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20  TERM_VIRTUAL ); 
22b70 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31  /* EV: R-30575-1
22b80 31 36 36 32 20 2a 2f 0a 20 20 20 20 72 31 20 3d  1662 */.    r1 =
22b90 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
22ba0 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  m(pParse, pTerm,
22bb0 20 70 4c 65 76 65 6c 2c 20 72 65 67 42 61 73 65   pLevel, regBase
22bc0 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20 72 31 21  +j);.    if( r1!
22bd0 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a 20 20  =regBase+j ){.  
22be0 20 20 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20      if( nReg==1 
22bf0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
22c00 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
22c10 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
22c20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 67 42 61  );.        regBa
22c30 73 65 20 3d 20 72 31 3b 0a 20 20 20 20 20 20 7d  se = r1;.      }
22c40 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
22c50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
22c60 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c  v, OP_SCopy, r1,
22c70 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20   regBase+j);.   
22c80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74     }.    }.    t
22c90 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
22ca0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
22cb0 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73  SNULL );.    tes
22cc0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
22cd0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
22ce0 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  );.    if( (pTer
22cf0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
22d00 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29  WO_ISNULL|WO_IN)
22d10 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  )==0 ){.      Ex
22d20 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65  pr *pRight = pTe
22d30 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
22d40 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
22d50 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75  ExprCodeIsNullJu
22d60 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65  mp(v, pRight, re
22d70 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d  gBase+j, pLevel-
22d80 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 20  >addrBrk);.     
22d90 20 69 66 28 20 7a 41 66 66 20 29 7b 0a 20 20 20   if( zAff ){.   
22da0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
22db0 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
22dc0 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29  pRight, zAff[j])
22dd0 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
22de0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  E ){.          z
22df0 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f  Aff[j] = SQLITE_
22e00 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
22e10 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
22e20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73  sqlite3ExprNeeds
22e30 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  NoAffinityChange
22e40 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d  (pRight, zAff[j]
22e50 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ) ){.          z
22e60 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f  Aff[j] = SQLITE_
22e70 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
22e80 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
22e90 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41 66 66 20 3d  }.  }.  *pzAff =
22ea0 20 7a 41 66 66 3b 0a 20 20 72 65 74 75 72 6e 20   zAff;.  return 
22eb0 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 23 69 66 6e  regBase;.}..#ifn
22ec0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22ed0 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 54 68  EXPLAIN./*.** Th
22ee0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
22ef0 68 65 6c 70 65 72 20 66 6f 72 20 65 78 70 6c 61  helper for expla
22f00 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 29 20 62  inIndexRange() b
22f10 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20 70 53 74 72 20  elow.**.** pStr 
22f20 68 6f 6c 64 73 20 74 68 65 20 74 65 78 74 20 6f  holds the text o
22f30 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
22f40 74 68 61 74 20 77 65 20 61 72 65 20 62 75 69 6c  that we are buil
22f50 64 69 6e 67 20 75 70 20 6f 6e 65 20 74 65 72 6d  ding up one term
22f60 0a 2a 2a 20 61 74 20 61 20 74 69 6d 65 2e 20 20  .** at a time.  
22f70 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64  This routine add
22f80 73 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20  s a new term to 
22f90 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 65  the end of the e
22fa0 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54 65  xpression..** Te
22fb0 72 6d 73 20 61 72 65 20 73 65 70 61 72 61 74 65  rms are separate
22fc0 64 20 62 79 20 41 4e 44 20 73 6f 20 61 64 64 20  d by AND so add 
22fd0 74 68 65 20 22 41 4e 44 22 20 74 65 78 74 20 66  the "AND" text f
22fe0 6f 72 20 73 65 63 6f 6e 64 20 61 6e 64 20 73 75  or second and su
22ff0 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 65 72 6d  bsequent.** term
23000 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  s only..*/.stati
23010 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 41 70  c void explainAp
23020 70 65 6e 64 54 65 72 6d 28 0a 20 20 53 74 72 41  pendTerm(.  StrA
23030 63 63 75 6d 20 2a 70 53 74 72 2c 20 20 20 20 20  ccum *pStr,     
23040 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
23050 65 78 74 20 65 78 70 72 65 73 73 69 6f 6e 20 62  ext expression b
23060 65 69 6e 67 20 62 75 69 6c 74 20 2a 2f 0a 20 20  eing built */.  
23070 69 6e 74 20 69 54 65 72 6d 2c 20 20 20 20 20 20  int iTerm,      
23080 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
23090 6e 64 65 78 20 6f 66 20 74 68 69 73 20 74 65 72  ndex of this ter
230a0 6d 2e 20 20 46 69 72 73 74 20 69 73 20 7a 65 72  m.  First is zer
230b0 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  o */.  const cha
230c0 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  r *zColumn,     
230d0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
230e0 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f  e column */.  co
230f0 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 20 20  nst char *zOp   
23100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
23110 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f  e of the operato
23120 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 54  r */.){.  if( iT
23130 65 72 6d 20 29 20 73 71 6c 69 74 65 33 53 74 72  erm ) sqlite3Str
23140 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72  AccumAppend(pStr
23150 2c 20 22 20 41 4e 44 20 22 2c 20 35 29 3b 0a 20  , " AND ", 5);. 
23160 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
23170 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a 43 6f  Append(pStr, zCo
23180 6c 75 6d 6e 2c 20 2d 31 29 3b 0a 20 20 73 71 6c  lumn, -1);.  sql
23190 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
231a0 6e 64 28 70 53 74 72 2c 20 7a 4f 70 2c 20 31 29  nd(pStr, zOp, 1)
231b0 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ;.  sqlite3StrAc
231c0 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20  cumAppend(pStr, 
231d0 22 3f 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  "?", 1);.}../*.*
231e0 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c 65 76 65  * Argument pLeve
231f0 6c 20 64 65 73 63 72 69 62 65 73 20 61 20 73 74  l describes a st
23200 72 61 74 65 67 79 20 66 6f 72 20 73 63 61 6e 6e  rategy for scann
23210 69 6e 67 20 74 61 62 6c 65 20 70 54 61 62 2e 20  ing table pTab. 
23220 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
23230 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  n returns a poin
23240 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20  ter to a string 
23250 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
23260 67 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 0a  g a description.
23270 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 73 65 74  ** of the subset
23280 20 6f 66 20 74 61 62 6c 65 20 72 6f 77 73 20 73   of table rows s
23290 63 61 6e 6e 65 64 20 62 79 20 74 68 65 20 73 74  canned by the st
232a0 72 61 74 65 67 79 20 69 6e 20 74 68 65 20 66 6f  rategy in the fo
232b0 72 6d 20 6f 66 20 61 6e 0a 2a 2a 20 53 51 4c 20  rm of an.** SQL 
232c0 65 78 70 72 65 73 73 69 6f 6e 2e 20 4f 72 2c 20  expression. Or, 
232d0 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20  if all rows are 
232e0 73 63 61 6e 6e 65 64 2c 20 4e 55 4c 4c 20 69 73  scanned, NULL is
232f0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
23300 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
23310 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a   the query:.**.*
23320 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
23330 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31 20 41  M t1 WHERE a=1 A
23340 4e 44 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20 69 73  ND b>2;.**.** is
23350 20 72 75 6e 20 61 6e 64 20 74 68 65 72 65 20 69   run and there i
23360 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28 61  s an index on (a
23370 2c 20 62 29 2c 20 74 68 65 6e 20 74 68 69 73 20  , b), then this 
23380 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
23390 20 61 0a 2a 2a 20 73 74 72 69 6e 67 20 73 69 6d   a.** string sim
233a0 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20  ilar to:.**.**  
233b0 20 22 61 3d 3f 20 41 4e 44 20 62 3e 3f 22 0a 2a   "a=? AND b>?".*
233c0 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
233d0 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  d pointer points
233e0 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   to memory obtai
233f0 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
23400 44 62 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49  DbMalloc()..** I
23410 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
23420 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
23430 61 6c 6c 65 72 20 74 6f 20 66 72 65 65 20 74 68  aller to free th
23440 65 20 62 75 66 66 65 72 20 77 68 65 6e 20 69 74  e buffer when it
23450 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72   is.** no longer
23460 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74   required..*/.st
23470 61 74 69 63 20 63 68 61 72 20 2a 65 78 70 6c 61  atic char *expla
23480 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 73 71 6c  inIndexRange(sql
23490 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
234a0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 54 61  evel *pLevel, Ta
234b0 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 57 68  ble *pTab){.  Wh
234c0 65 72 65 50 6c 61 6e 20 2a 70 50 6c 61 6e 20 3d  erePlan *pPlan =
234d0 20 26 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 3b 0a   &pLevel->plan;.
234e0 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20    Index *pIndex 
234f0 3d 20 70 50 6c 61 6e 2d 3e 75 2e 70 49 64 78 3b  = pPlan->u.pIdx;
23500 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 50 6c  .  int nEq = pPl
23510 61 6e 2d 3e 6e 45 71 3b 0a 20 20 69 6e 74 20 69  an->nEq;.  int i
23520 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61  , j;.  Column *a
23530 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
23540 3b 0a 20 20 69 6e 74 20 2a 61 69 43 6f 6c 75 6d  ;.  int *aiColum
23550 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  n = pIndex->aiCo
23560 6c 75 6d 6e 3b 0a 20 20 53 74 72 41 63 63 75 6d  lumn;.  StrAccum
23570 20 74 78 74 3b 0a 0a 20 20 69 66 28 20 6e 45 71   txt;..  if( nEq
23580 3d 3d 30 20 26 26 20 28 70 50 6c 61 6e 2d 3e 77  ==0 && (pPlan->w
23590 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
235a0 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f  BTM_LIMIT|WHERE_
235b0 54 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d 30 20 29  TOP_LIMIT))==0 )
235c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
235d0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72    }.  sqlite3Str
235e0 41 63 63 75 6d 49 6e 69 74 28 26 74 78 74 2c 20  AccumInit(&txt, 
235f0 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 4d 41 58  0, 0, SQLITE_MAX
23600 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 74 78 74 2e  _LENGTH);.  txt.
23610 64 62 20 3d 20 64 62 3b 0a 20 20 73 71 6c 69 74  db = db;.  sqlit
23620 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
23630 28 26 74 78 74 2c 20 22 20 28 22 2c 20 32 29 3b  (&txt, " (", 2);
23640 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45  .  for(i=0; i<nE
23650 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 65 78 70  q; i++){.    exp
23660 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26  lainAppendTerm(&
23670 74 78 74 2c 20 69 2c 20 61 43 6f 6c 5b 61 69 43  txt, i, aCol[aiC
23680 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65 2c  olumn[i]].zName,
23690 20 22 3d 22 29 3b 0a 20 20 7d 0a 0a 20 20 6a 20   "=");.  }..  j 
236a0 3d 20 69 3b 0a 20 20 69 66 28 20 70 50 6c 61 6e  = i;.  if( pPlan
236b0 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  ->wsFlags&WHERE_
236c0 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  BTM_LIMIT ){.   
236d0 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70   char *z = (j==p
236e0 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Index->nColumn )
236f0 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f   ? "rowid" : aCo
23700 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a  l[aiColumn[j]].z
23710 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69  Name;.    explai
23720 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74  nAppendTerm(&txt
23730 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e 22 29 3b 0a  , i++, z, ">");.
23740 20 20 7d 0a 20 20 69 66 28 20 70 50 6c 61 6e 2d    }.  if( pPlan-
23750 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 54  >wsFlags&WHERE_T
23760 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  OP_LIMIT ){.    
23770 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70 49  char *z = (j==pI
23780 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20  ndex->nColumn ) 
23790 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c  ? "rowid" : aCol
237a0 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e  [aiColumn[j]].zN
237b0 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e  ame;.    explain
237c0 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c  AppendTerm(&txt,
237d0 20 69 2c 20 7a 2c 20 22 3c 22 29 3b 0a 20 20 7d   i, z, "<");.  }
237e0 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
237f0 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22  umAppend(&txt, "
23800 29 22 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e  )", 1);.  return
23810 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
23820 46 69 6e 69 73 68 28 26 74 78 74 29 3b 0a 7d 0a  Finish(&txt);.}.
23830 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
23840 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
23850 75 6e 6c 65 73 73 20 63 75 72 72 65 6e 74 6c 79  unless currently
23860 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 20 45   processing an E
23870 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
23880 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 49 66  N.** command. If
23890 20 74 68 65 20 71 75 65 72 79 20 62 65 69 6e 67   the query being
238a0 20 63 6f 6d 70 69 6c 65 64 20 69 73 20 61 6e 20   compiled is an 
238b0 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
238c0 41 4e 2c 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20  AN, a single.** 
238d0 72 65 63 6f 72 64 20 69 73 20 61 64 64 65 64 20  record is added 
238e0 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 74 6f  to the output to
238f0 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74 61   describe the ta
23900 62 6c 65 20 73 63 61 6e 20 73 74 72 61 74 65 67  ble scan strateg
23910 79 20 69 6e 20 0a 2a 2a 20 70 4c 65 76 65 6c 2e  y in .** pLevel.
23920 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
23930 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a  explainOneScan(.
23940 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
23950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23960 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
23970 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
23980 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20  *pTabList,      
23990 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
239a0 20 6c 69 73 74 20 74 68 69 73 20 6c 6f 6f 70 20   list this loop 
239b0 72 65 66 65 72 73 20 74 6f 20 2a 2f 0a 20 20 57  refers to */.  W
239c0 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
239d0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l,             /
239e0 2a 20 53 63 61 6e 20 74 6f 20 77 72 69 74 65 20  * Scan to write 
239f0 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64  OP_Explain opcod
23a00 65 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  e for */.  int i
23a10 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
23a20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
23a30 6c 75 65 20 66 6f 72 20 22 6c 65 76 65 6c 22 20  lue for "level" 
23a40 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74  column of output
23a50 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c   */.  int iFrom,
23a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a70 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66        /* Value f
23a80 6f 72 20 22 66 72 6f 6d 22 20 63 6f 6c 75 6d 6e  or "from" column
23a90 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20   of output */.  
23aa0 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 20  u16 wctrlFlags  
23ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ac0 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
23ad0 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
23ae0 65 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 69  egin() */.){.  i
23af0 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
23b00 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 75 33 32  in==2 ){.    u32
23b10 20 66 6c 61 67 73 20 3d 20 70 4c 65 76 65 6c 2d   flags = pLevel-
23b20 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20  >plan.wsFlags;. 
23b30 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
23b40 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
23b50 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
23b60 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
23b70 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
23b80 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f  e->pVdbe;      /
23b90 2a 20 56 4d 20 62 65 69 6e 67 20 63 6f 6e 73 74  * VM being const
23ba0 72 75 63 74 65 64 20 2a 2f 0a 20 20 20 20 73 71  ructed */.    sq
23bb0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
23bc0 73 65 2d 3e 64 62 3b 20 20 20 20 20 2f 2a 20 44  se->db;     /* D
23bd0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
23be0 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67  /.    char *zMsg
23bf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23c00 20 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20 61      /* Text to a
23c10 64 64 20 74 6f 20 45 51 50 20 6f 75 74 70 75 74  dd to EQP output
23c20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
23c30 69 6e 74 36 34 20 6e 52 6f 77 3b 20 20 20 20 20  int64 nRow;     
23c40 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65        /* Expecte
23c50 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  d number of rows
23c60 20 76 69 73 69 74 65 64 20 62 79 20 73 63 61 6e   visited by scan
23c70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 20   */.    int iId 
23c80 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  = pParse->iSelec
23c90 74 49 64 3b 20 20 2f 2a 20 53 65 6c 65 63 74 20  tId;  /* Select 
23ca0 69 64 20 28 6c 65 66 74 2d 6d 6f 73 74 20 6f 75  id (left-most ou
23cb0 74 70 75 74 20 63 6f 6c 75 6d 6e 29 20 2a 2f 0a  tput column) */.
23cc0 20 20 20 20 69 6e 74 20 69 73 53 65 61 72 63 68      int isSearch
23cd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23ce0 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
23cf0 53 45 41 52 43 48 2e 20 46 61 6c 73 65 20 66 6f  SEARCH. False fo
23d00 72 20 53 43 41 4e 2e 20 2a 2f 0a 0a 20 20 20 20  r SCAN. */..    
23d10 69 66 28 20 28 66 6c 61 67 73 26 57 48 45 52 45  if( (flags&WHERE
23d20 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c 20 28 77  _MULTI_OR) || (w
23d30 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f  ctrlFlags&WHERE_
23d40 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 29  ONETABLE_ONLY) )
23d50 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 73   return;..    is
23d60 53 65 61 72 63 68 20 3d 20 28 70 4c 65 76 65 6c  Search = (pLevel
23d70 2d 3e 70 6c 61 6e 2e 6e 45 71 3e 30 29 0a 20 20  ->plan.nEq>0).  
23d80 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 66             || (f
23d90 6c 61 67 73 26 28 57 48 45 52 45 5f 42 54 4d 5f  lags&(WHERE_BTM_
23da0 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f  LIMIT|WHERE_TOP_
23db0 4c 49 4d 49 54 29 29 21 3d 30 0a 20 20 20 20 20  LIMIT))!=0.     
23dc0 20 20 20 20 20 20 20 20 7c 7c 20 28 77 63 74 72          || (wctr
23dd0 6c 46 6c 61 67 73 26 28 57 48 45 52 45 5f 4f 52  lFlags&(WHERE_OR
23de0 44 45 52 42 59 5f 4d 49 4e 7c 57 48 45 52 45 5f  DERBY_MIN|WHERE_
23df0 4f 52 44 45 52 42 59 5f 4d 41 58 29 29 3b 0a 0a  ORDERBY_MAX));..
23e00 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
23e10 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
23e20 73 22 2c 20 69 73 53 65 61 72 63 68 3f 22 53 45  s", isSearch?"SE
23e30 41 52 43 48 22 3a 22 53 43 41 4e 22 29 3b 0a 20  ARCH":"SCAN");. 
23e40 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
23e50 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a  elect ){.      z
23e60 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
23e70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
23e80 22 25 73 20 53 55 42 51 55 45 52 59 20 25 64 22  "%s SUBQUERY %d"
23e90 2c 20 7a 4d 73 67 2c 70 49 74 65 6d 2d 3e 69 53  , zMsg,pItem->iS
23ea0 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 7d 65  electId);.    }e
23eb0 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20  lse{.      zMsg 
23ec0 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
23ed0 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
23ee0 54 41 42 4c 45 20 25 73 22 2c 20 7a 4d 73 67 2c  TABLE %s", zMsg,
23ef0 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pItem->zName);.
23f00 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
23f10 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a  Item->zAlias ){.
23f20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
23f30 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
23f40 20 7a 4d 73 67 2c 20 22 25 73 20 41 53 20 25 73   zMsg, "%s AS %s
23f50 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e  ", zMsg, pItem->
23f60 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 7d 0a 20  zAlias);.    }. 
23f70 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20     if( (flags & 
23f80 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
23f90 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  0 ){.      char 
23fa0 2a 7a 57 68 65 72 65 20 3d 20 65 78 70 6c 61 69  *zWhere = explai
23fb0 6e 49 6e 64 65 78 52 61 6e 67 65 28 64 62 2c 20  nIndexRange(db, 
23fc0 70 4c 65 76 65 6c 2c 20 70 49 74 65 6d 2d 3e 70  pLevel, pItem->p
23fd0 54 61 62 29 3b 0a 20 20 20 20 20 20 7a 4d 73 67  Tab);.      zMsg
23fe0 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
23ff0 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
24000 20 55 53 49 4e 47 20 25 73 25 73 49 4e 44 45 58   USING %s%sINDEX
24010 25 73 25 73 25 73 22 2c 20 7a 4d 73 67 2c 20 0a  %s%s%s", zMsg, .
24020 20 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67            ((flag
24030 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49  s & WHERE_TEMP_I
24040 4e 44 45 58 29 3f 22 41 55 54 4f 4d 41 54 49 43  NDEX)?"AUTOMATIC
24050 20 22 3a 22 22 29 2c 0a 20 20 20 20 20 20 20 20   ":""),.        
24060 20 20 28 28 66 6c 61 67 73 20 26 20 57 48 45 52    ((flags & WHER
24070 45 5f 49 44 58 5f 4f 4e 4c 59 29 3f 22 43 4f 56  E_IDX_ONLY)?"COV
24080 45 52 49 4e 47 20 22 3a 22 22 29 2c 0a 20 20 20  ERING ":""),.   
24090 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 20 26         ((flags &
240a0 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45   WHERE_TEMP_INDE
240b0 58 29 3f 22 22 3a 22 20 22 29 2c 0a 20 20 20 20  X)?"":" "),.    
240c0 20 20 20 20 20 20 28 28 66 6c 61 67 73 20 26 20        ((flags & 
240d0 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58  WHERE_TEMP_INDEX
240e0 29 3f 22 22 3a 20 70 4c 65 76 65 6c 2d 3e 70 6c  )?"": pLevel->pl
240f0 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65  an.u.pIdx->zName
24100 29 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 57 68  ),.          zWh
24110 65 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ere.      );.   
24120 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
24130 28 64 62 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20  (db, zWhere);.  
24140 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
24150 73 20 26 20 28 57 48 45 52 45 5f 52 4f 57 49 44  s & (WHERE_ROWID
24160 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f  _EQ|WHERE_ROWID_
24170 52 41 4e 47 45 29 20 29 7b 0a 20 20 20 20 20 20  RANGE) ){.      
24180 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
24190 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
241a0 20 22 25 73 20 55 53 49 4e 47 20 49 4e 54 45 47   "%s USING INTEG
241b0 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 2c  ER PRIMARY KEY",
241c0 20 7a 4d 73 67 29 3b 0a 0a 20 20 20 20 20 20 69   zMsg);..      i
241d0 66 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f 52  f( flags&WHERE_R
241e0 4f 57 49 44 5f 45 51 20 29 7b 0a 20 20 20 20 20  OWID_EQ ){.     
241f0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
24200 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
24210 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3d 3f  sg, "%s (rowid=?
24220 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20  )", zMsg);.     
24230 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67   }else if( (flag
24240 73 26 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d  s&WHERE_BOTH_LIM
24250 49 54 29 3d 3d 57 48 45 52 45 5f 42 4f 54 48 5f  IT)==WHERE_BOTH_
24260 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20  LIMIT ){.       
24270 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
24280 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
24290 2c 20 22 25 73 20 28 72 6f 77 69 64 3e 3f 20 41  , "%s (rowid>? A
242a0 4e 44 20 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d  ND rowid<?)", zM
242b0 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  sg);.      }else
242c0 20 69 66 28 20 66 6c 61 67 73 26 57 48 45 52 45   if( flags&WHERE
242d0 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
242e0 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
242f0 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
24300 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69   zMsg, "%s (rowi
24310 64 3e 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20  d>?)", zMsg);.  
24320 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c      }else if( fl
24330 61 67 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49  ags&WHERE_TOP_LI
24340 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  MIT ){.        z
24350 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
24360 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
24370 22 25 73 20 28 72 6f 77 69 64 3c 3f 29 22 2c 20  "%s (rowid<?)", 
24380 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  zMsg);.      }. 
24390 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
243a0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
243b0 54 41 42 4c 45 0a 20 20 20 20 65 6c 73 65 20 69  TABLE.    else i
243c0 66 28 20 28 66 6c 61 67 73 20 26 20 57 48 45 52  f( (flags & WHER
243d0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
243e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
243f0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
24400 70 56 74 61 62 49 64 78 20 3d 20 70 4c 65 76 65  pVtabIdx = pLeve
24410 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62 49  l->plan.u.pVtabI
24420 64 78 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d  dx;.      zMsg =
24430 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
24440 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 56  (db, zMsg, "%s V
24450 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44  IRTUAL TABLE IND
24460 45 58 20 25 64 3a 25 73 22 2c 20 7a 4d 73 67 2c  EX %d:%s", zMsg,
24470 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24480 20 20 20 70 56 74 61 62 49 64 78 2d 3e 69 64 78     pVtabIdx->idx
24490 4e 75 6d 2c 20 70 56 74 61 62 49 64 78 2d 3e 69  Num, pVtabIdx->i
244a0 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 23 65  dxStr);.    }.#e
244b0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 77 63 74  ndif.    if( wct
244c0 72 6c 46 6c 61 67 73 26 28 57 48 45 52 45 5f 4f  rlFlags&(WHERE_O
244d0 52 44 45 52 42 59 5f 4d 49 4e 7c 57 48 45 52 45  RDERBY_MIN|WHERE
244e0 5f 4f 52 44 45 52 42 59 5f 4d 41 58 29 20 29 7b  _ORDERBY_MAX) ){
244f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
24500 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
24510 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20  ERE_ORDERBY_MIN 
24520 29 3b 0a 20 20 20 20 20 20 6e 52 6f 77 20 3d 20  );.      nRow = 
24530 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
24540 20 20 20 20 6e 52 6f 77 20 3d 20 28 73 71 6c 69      nRow = (sqli
24550 74 65 33 5f 69 6e 74 36 34 29 70 4c 65 76 65 6c  te3_int64)pLevel
24560 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20  ->plan.nRow;.   
24570 20 7d 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71   }.    zMsg = sq
24580 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
24590 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 7e 25 6c  , zMsg, "%s (~%l
245a0 6c 64 20 72 6f 77 73 29 22 2c 20 7a 4d 73 67 2c  ld rows)", zMsg,
245b0 20 6e 52 6f 77 29 3b 0a 20 20 20 20 73 71 6c 69   nRow);.    sqli
245c0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
245d0 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69 49 64   OP_Explain, iId
245e0 2c 20 69 4c 65 76 65 6c 2c 20 69 46 72 6f 6d 2c  , iLevel, iFrom,
245f0 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
24600 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  C);.  }.}.#else.
24610 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
24620 4f 6e 65 53 63 61 6e 28 75 2c 76 2c 77 2c 78 2c  OneScan(u,v,w,x,
24630 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  y,z).#endif /* S
24640 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
24650 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  IN */.../*.** Ge
24660 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
24670 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
24680 20 69 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20   iLevel-th loop 
24690 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
246a0 75 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  use.** implement
246b0 61 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ation described 
246c0 62 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74  by pWInfo..*/.st
246d0 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 64  atic Bitmask cod
246e0 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20  eOneLoopStart(. 
246f0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
24700 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74  fo,   /* Complet
24710 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  e information ab
24720 6f 75 74 20 74 68 65 20 57 48 45 52 45 20 63 6c  out the WHERE cl
24730 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ause */.  int iL
24740 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  evel,          /
24750 2a 20 57 68 69 63 68 20 6c 65 76 65 6c 20 6f 66  * Which level of
24760 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f   pWInfo->a[] sho
24770 75 6c 64 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a  uld be coded */.
24780 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
24790 2c 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66  ,      /* One of
247a0 20 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61   the WHERE_* fla
247b0 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71  gs defined in sq
247c0 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 42  liteInt.h */.  B
247d0 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20  itmask notReady 
247e0 20 20 20 20 2f 2a 20 57 68 69 63 68 20 74 61 62      /* Which tab
247f0 6c 65 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c  les are currentl
24800 79 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 29  y available */.)
24810 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20  {.  int j, k;   
24820 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
24830 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
24840 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
24850 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
24860 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74  cursor for the t
24870 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  able */.  int ad
24880 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20 20 2f  drNxt;         /
24890 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20  * Where to jump 
248a0 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
248b0 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61 73   the next IN cas
248c0 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 54  e */.  int omitT
248d0 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 54  able;       /* T
248e0 72 75 65 20 69 66 20 77 65 20 75 73 65 20 74 68  rue if we use th
248f0 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a  e index only */.
24900 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20    int bRev;     
24910 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
24920 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63 61  f we need to sca
24930 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  n in reverse ord
24940 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  er */.  WhereLev
24950 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a 20  el *pLevel;  /* 
24960 54 68 65 20 77 68 65 72 65 20 6c 65 76 65 6c 20  The where level 
24970 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
24980 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
24990 43 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f  C;    /* Decompo
249a0 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e  sition of the en
249b0 74 69 72 65 20 57 48 45 52 45 20 63 6c 61 75 73  tire WHERE claus
249c0 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
249d0 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
249e0 20 20 20 20 20 20 20 2f 2a 20 41 20 57 48 45 52         /* A WHER
249f0 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f  E clause term */
24a00 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
24a10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24a20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
24a30 6e 74 65 78 74 20 2a 2f 0a 20 20 56 64 62 65 20  ntext */.  Vdbe 
24a40 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
24a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
24a60 65 20 70 72 65 70 61 72 65 64 20 73 74 6d 74 20  e prepared stmt 
24a70 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
24a80 6f 6e 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ons */.  struct 
24a90 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
24aa0 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d  abItem;  /* FROM
24ab0 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69   clause term bei
24ac0 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  ng coded */.  in
24ad0 74 20 61 64 64 72 42 72 6b 3b 20 20 20 20 20 20  t addrBrk;      
24ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24af0 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72   Jump here to br
24b00 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  eak out of the l
24b10 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  oop */.  int add
24b20 72 43 6f 6e 74 3b 20 20 20 20 20 20 20 20 20 20  rCont;          
24b30 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
24b40 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75   here to continu
24b50 65 20 77 69 74 68 20 6e 65 78 74 20 63 79 63 6c  e with next cycl
24b60 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69  e */.  int iRowi
24b70 64 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20  dReg = 0;       
24b80 20 2f 2a 20 52 6f 77 69 64 20 69 73 20 73 74 6f   /* Rowid is sto
24b90 72 65 64 20 69 6e 20 74 68 69 73 20 72 65 67 69  red in this regi
24ba0 73 74 65 72 2c 20 69 66 20 6e 6f 74 20 7a 65 72  ster, if not zer
24bb0 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 6c 65  o */.  int iRele
24bc0 61 73 65 52 65 67 20 3d 20 30 3b 20 20 20 20 20  aseReg = 0;     
24bd0 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65   /* Temp registe
24be0 72 20 74 6f 20 66 72 65 65 20 62 65 66 6f 72 65  r to free before
24bf0 20 72 65 74 75 72 6e 69 6e 67 20 2a 2f 0a 0a 20   returning */.. 
24c00 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f   pParse = pWInfo
24c10 2d 3e 70 50 61 72 73 65 3b 0a 20 20 76 20 3d 20  ->pParse;.  v = 
24c20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
24c30 20 70 57 43 20 3d 20 70 57 49 6e 66 6f 2d 3e 70   pWC = pWInfo->p
24c40 57 43 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26  WC;.  pLevel = &
24c50 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c  pWInfo->a[iLevel
24c60 5d 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20  ];.  pTabItem = 
24c70 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  &pWInfo->pTabLis
24c80 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
24c90 6f 6d 5d 3b 0a 20 20 69 43 75 72 20 3d 20 70 54  om];.  iCur = pT
24ca0 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  abItem->iCursor;
24cb0 0a 20 20 62 52 65 76 20 3d 20 28 70 4c 65 76 65  .  bRev = (pLeve
24cc0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
24cd0 26 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 29  & WHERE_REVERSE)
24ce0 21 3d 30 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65  !=0;.  omitTable
24cf0 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e   = (pLevel->plan
24d00 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
24d10 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20  _IDX_ONLY)!=0 . 
24d20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 77 63            && (wc
24d30 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
24d40 5f 46 4f 52 43 45 5f 54 41 42 4c 45 29 3d 3d 30  _FORCE_TABLE)==0
24d50 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 6c  ;..  /* Create l
24d60 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20 22 62  abels for the "b
24d70 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69  reak" and "conti
24d80 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69 6f 6e  nue" instruction
24d90 73 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63  s.  ** for the c
24da0 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75  urrent loop.  Ju
24db0 6d 70 20 74 6f 20 61 64 64 72 42 72 6b 20 74 6f  mp to addrBrk to
24dc0 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 61 20   break out of a 
24dd0 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20  loop..  ** Jump 
24de0 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d  to cont to go im
24df0 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74 68 65  mediately to the
24e00 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
24e10 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70  of the.  ** loop
24e20 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
24e30 20 74 68 65 72 65 20 69 73 20 61 6e 20 49 4e 20   there is an IN 
24e40 6f 70 65 72 61 74 6f 72 2c 20 77 65 20 61 6c 73  operator, we als
24e50 6f 20 68 61 76 65 20 61 20 22 61 64 64 72 4e 78  o have a "addrNx
24e60 74 22 20 6c 61 62 65 6c 20 74 68 61 74 0a 20 20  t" label that.  
24e70 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74  ** means to cont
24e80 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65  inue with the ne
24e90 78 74 20 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62  xt IN value comb
24ea0 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20  ination.  When. 
24eb0 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f   ** there are no
24ec0 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 69 6e   IN operators in
24ed0 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73   the constraints
24ee0 2c 20 74 68 65 20 22 61 64 64 72 4e 78 74 22 20  , the "addrNxt" 
24ef0 6c 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20 74 68  label.  ** is th
24f00 65 20 73 61 6d 65 20 61 73 20 22 61 64 64 72 42  e same as "addrB
24f10 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72  rk"..  */.  addr
24f20 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  Brk = pLevel->ad
24f30 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e  drBrk = pLevel->
24f40 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65  addrNxt = sqlite
24f50 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
24f60 29 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20  );.  addrCont = 
24f70 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74  pLevel->addrCont
24f80 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
24f90 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f  keLabel(v);..  /
24fa0 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
24fb0 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20   right table of 
24fc0 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
24fd0 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a  N, allocate and.
24fe0 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20    ** initialize 
24ff0 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68  a memory cell th
25000 61 74 20 72 65 63 6f 72 64 73 20 69 66 20 74 68  at records if th
25010 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68 65 73  is table matches
25020 20 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66   any.  ** row of
25030 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20   the left table 
25040 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a  of the join..  *
25050 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  /.  if( pLevel->
25060 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 54 61 62  iFrom>0 && (pTab
25070 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65  Item[0].jointype
25080 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29   & JT_LEFT)!=0 )
25090 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c  {.    pLevel->iL
250a0 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72  eftJoin = ++pPar
250b0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71  se->nMem;.    sq
250c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
250d0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
250e0 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  , pLevel->iLeftJ
250f0 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  oin);.    VdbeCo
25100 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69 74 20  mment((v, "init 
25110 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74  LEFT JOIN no-mat
25120 63 68 20 66 6c 61 67 22 29 29 3b 0a 20 20 7d 0a  ch flag"));.  }.
25130 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
25140 73 65 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61  se of a FROM cla
25150 75 73 65 20 73 75 62 71 75 65 72 79 20 69 6d 70  use subquery imp
25160 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f  lemented as a co
25170 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 66  -routine */.  if
25180 28 20 70 54 61 62 49 74 65 6d 2d 3e 76 69 61 43  ( pTabItem->viaC
25190 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
251a0 69 6e 74 20 72 65 67 59 69 65 6c 64 20 3d 20 70  int regYield = p
251b0 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  TabItem->regRetu
251c0 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  rn;.    sqlite3V
251d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
251e0 49 6e 74 65 67 65 72 2c 20 70 54 61 62 49 74 65  Integer, pTabIte
251f0 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 2d 31  m->addrFillSub-1
25200 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20  , regYield);.   
25210 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 20 73   pLevel->p2 =  s
25220 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
25230 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
25240 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 56 64 62  gYield);.    Vdb
25250 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65  eComment((v, "ne
25260 78 74 20 72 6f 77 20 6f 66 20 63 6f 2d 72 6f 75  xt row of co-rou
25270 74 69 6e 65 20 25 73 22 2c 20 70 54 61 62 49 74  tine %s", pTabIt
25280 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
25290 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
252a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
252b0 66 2c 20 72 65 67 59 69 65 6c 64 2b 31 2c 20 61  f, regYield+1, a
252c0 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 70 4c 65  ddrBrk);.    pLe
252d0 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 47 6f 74  vel->op = OP_Got
252e0 6f 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e  o;.  }else..#ifn
252f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
25300 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
25310 66 28 20 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  f(  (pLevel->pla
25320 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
25330 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
25340 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  =0 ){.    /* Cas
25350 65 20 30 3a 20 20 54 68 65 20 74 61 62 6c 65 20  e 0:  The table 
25360 69 73 20 61 20 76 69 72 74 75 61 6c 2d 74 61 62  is a virtual-tab
25370 6c 65 2e 20 20 55 73 65 20 74 68 65 20 56 46 69  le.  Use the VFi
25380 6c 74 65 72 20 61 6e 64 20 56 4e 65 78 74 0a 20  lter and VNext. 
25390 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 74     **          t
253a0 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
253b0 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  a..    */.    in
253c0 74 20 69 52 65 67 3b 20 20 20 2f 2a 20 50 33 20  t iReg;   /* P3 
253d0 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46 69  Value for OP_VFi
253e0 6c 74 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69  lter */.    sqli
253f0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
25400 70 56 74 61 62 49 64 78 20 3d 20 70 4c 65 76 65  pVtabIdx = pLeve
25410 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62 49  l->plan.u.pVtabI
25420 64 78 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e  dx;.    int nCon
25430 73 74 72 61 69 6e 74 20 3d 20 70 56 74 61 62 49  straint = pVtabI
25440 64 78 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  dx->nConstraint;
25450 0a 20 20 20 20 73 74 72 75 63 74 20 73 71 6c 69  .    struct sqli
25460 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
25470 61 69 6e 74 5f 75 73 61 67 65 20 2a 61 55 73 61  aint_usage *aUsa
25480 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  ge =.           
25490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254b0 20 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e 61       pVtabIdx->a
254c0 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b  ConstraintUsage;
254d0 0a 20 20 20 20 63 6f 6e 73 74 20 73 74 72 75 63  .    const struc
254e0 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
254f0 63 6f 6e 73 74 72 61 69 6e 74 20 2a 61 43 6f 6e  constraint *aCon
25500 73 74 72 61 69 6e 74 20 3d 0a 20 20 20 20 20 20  straint =.      
25510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25530 20 20 20 20 20 20 20 20 20 20 70 56 74 61 62 49            pVtabI
25540 64 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b  dx->aConstraint;
25550 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ..    sqlite3Exp
25560 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
25570 65 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 73  e);.    iReg = s
25580 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
25590 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73  ge(pParse, nCons
255a0 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 66  traint+2);.    f
255b0 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 6e 43 6f 6e 73  or(j=1; j<=nCons
255c0 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20  traint; j++){.  
255d0 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e      for(k=0; k<n
255e0 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6b 2b 2b 29  Constraint; k++)
255f0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 55  {.        if( aU
25600 73 61 67 65 5b 6b 5d 2e 61 72 67 76 49 6e 64 65  sage[k].argvInde
25610 78 3d 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  x==j ){.        
25620 20 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 61 43    int iTerm = aC
25630 6f 6e 73 74 72 61 69 6e 74 5b 6b 5d 2e 69 54 65  onstraint[k].iTe
25640 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  rmOffset;.      
25650 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
25660 6f 64 65 28 70 50 61 72 73 65 2c 20 70 57 43 2d  ode(pParse, pWC-
25670 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 2d  >a[iTerm].pExpr-
25680 3e 70 52 69 67 68 74 2c 20 69 52 65 67 2b 6a 2b  >pRight, iReg+j+
25690 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  1);.          br
256a0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
256b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
256c0 20 6b 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20   k==nConstraint 
256d0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
256e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
256f0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
25700 65 72 2c 20 70 56 74 61 62 49 64 78 2d 3e 69 64  er, pVtabIdx->id
25710 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20 20 20  xNum, iReg);.   
25720 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
25730 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
25740 2c 20 6a 2d 31 2c 20 69 52 65 67 2b 31 29 3b 0a  , j-1, iReg+1);.
25750 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
25760 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c  ddOp4(v, OP_VFil
25770 74 65 72 2c 20 69 43 75 72 2c 20 61 64 64 72 42  ter, iCur, addrB
25780 72 6b 2c 20 69 52 65 67 2c 20 70 56 74 61 62 49  rk, iReg, pVtabI
25790 64 78 2d 3e 69 64 78 53 74 72 2c 0a 20 20 20 20  dx->idxStr,.    
257a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257b0 20 20 70 56 74 61 62 49 64 78 2d 3e 6e 65 65 64    pVtabIdx->need
257c0 54 6f 46 72 65 65 49 64 78 53 74 72 20 3f 20 50  ToFreeIdxStr ? P
257d0 34 5f 4d 50 52 49 4e 54 46 20 3a 20 50 34 5f 53  4_MPRINTF : P4_S
257e0 54 41 54 49 43 29 3b 0a 20 20 20 20 70 56 74 61  TATIC);.    pVta
257f0 62 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65  bIdx->needToFree
25800 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  IdxStr = 0;.    
25810 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73  for(j=0; j<nCons
25820 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20  traint; j++){.  
25830 20 20 20 20 69 66 28 20 61 55 73 61 67 65 5b 6a      if( aUsage[j
25840 5d 2e 6f 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  ].omit ){.      
25850 20 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 61 43    int iTerm = aC
25860 6f 6e 73 74 72 61 69 6e 74 5b 6a 5d 2e 69 54 65  onstraint[j].iTe
25870 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  rmOffset;.      
25880 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
25890 65 76 65 6c 2c 20 26 70 57 43 2d 3e 61 5b 69 54  evel, &pWC->a[iT
258a0 65 72 6d 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  erm]);.      }. 
258b0 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d     }.    pLevel-
258c0 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a  >op = OP_VNext;.
258d0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
258e0 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65   iCur;.    pLeve
258f0 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56  l->p2 = sqlite3V
25900 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
25910 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
25920 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
25930 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f  Parse, iReg, nCo
25940 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20  nstraint+2);.   
25950 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
25960 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b  ePop(pParse, 1);
25970 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20  .  }else.#endif 
25980 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
25990 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
259a0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c    if( pLevel->pl
259b0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
259c0 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 7b 0a 20  RE_ROWID_EQ ){. 
259d0 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 57     /* Case 1:  W
259e0 65 20 63 61 6e 20 64 69 72 65 63 74 6c 79 20 72  e can directly r
259f0 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e 67 6c  eference a singl
25a00 65 20 72 6f 77 20 75 73 69 6e 67 20 61 6e 0a 20  e row using an. 
25a10 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 65     **          e
25a20 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73  quality comparis
25a30 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52  on against the R
25a40 4f 57 49 44 20 66 69 65 6c 64 2e 20 20 4f 72 0a  OWID field.  Or.
25a50 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
25a60 77 65 20 72 65 66 65 72 65 6e 63 65 20 6d 75 6c  we reference mul
25a70 74 69 70 6c 65 20 72 6f 77 73 20 75 73 69 6e 67  tiple rows using
25a80 20 61 20 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e   a "rowid IN (..
25a90 2e 29 22 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  .)".    **      
25aa0 20 20 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a 20      construct.. 
25ab0 20 20 20 2a 2f 0a 20 20 20 20 69 52 65 6c 65 61     */.    iRelea
25ac0 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47  seReg = sqlite3G
25ad0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
25ae0 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66  );.    pTerm = f
25af0 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
25b00 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c  r, -1, notReady,
25b10 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29   WO_EQ|WO_IN, 0)
25b20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
25b30 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  erm!=0 );.    as
25b40 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78  sert( pTerm->pEx
25b50 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  pr!=0 );.    ass
25b60 65 72 74 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74  ert( pTerm->left
25b70 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a  Cursor==iCur );.
25b80 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74      assert( omit
25b90 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Table==0 );.    
25ba0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
25bb0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
25bc0 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56  VIRTUAL ); /* EV
25bd0 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20  : R-30575-11662 
25be0 2a 2f 0a 20 20 20 20 69 52 6f 77 69 64 52 65 67  */.    iRowidReg
25bf0 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54   = codeEqualityT
25c00 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72  erm(pParse, pTer
25c10 6d 2c 20 70 4c 65 76 65 6c 2c 20 69 52 65 6c 65  m, pLevel, iRele
25c20 61 73 65 52 65 67 29 3b 0a 20 20 20 20 61 64 64  aseReg);.    add
25c30 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  rNxt = pLevel->a
25c40 64 64 72 4e 78 74 3b 0a 20 20 20 20 73 71 6c 69  ddrNxt;.    sqli
25c50 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
25c60 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69   OP_MustBeInt, i
25c70 52 6f 77 69 64 52 65 67 2c 20 61 64 64 72 4e 78  RowidReg, addrNx
25c80 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
25c90 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
25ca0 4e 6f 74 45 78 69 73 74 73 2c 20 69 43 75 72 2c  NotExists, iCur,
25cb0 20 61 64 64 72 4e 78 74 2c 20 69 52 6f 77 69 64   addrNxt, iRowid
25cc0 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Reg);.    sqlite
25cd0 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28  3ExprCacheStore(
25ce0 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31  pParse, iCur, -1
25cf0 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
25d00 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
25d10 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 70 4c  , "pk"));.    pL
25d20 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f  evel->op = OP_No
25d30 6f 70 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  op;.  }else if( 
25d40 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
25d50 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57  lags & WHERE_ROW
25d60 49 44 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20  ID_RANGE ){.    
25d70 2f 2a 20 43 61 73 65 20 32 3a 20 20 57 65 20 68  /* Case 2:  We h
25d80 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74  ave an inequalit
25d90 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61  y comparison aga
25da0 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66  inst the ROWID f
25db0 69 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ield..    */.   
25dc0 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f 50   int testOp = OP
25dd0 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 73  _Noop;.    int s
25de0 74 61 72 74 3b 0a 20 20 20 20 69 6e 74 20 6d 65  tart;.    int me
25df0 6d 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b 0a 20  mEndValue = 0;. 
25e00 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 53     WhereTerm *pS
25e10 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20  tart, *pEnd;..  
25e20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61    assert( omitTa
25e30 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 53  ble==0 );.    pS
25e40 74 61 72 74 20 3d 20 66 69 6e 64 54 65 72 6d 28  tart = findTerm(
25e50 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e  pWC, iCur, -1, n
25e60 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57  otReady, WO_GT|W
25e70 4f 5f 47 45 2c 20 30 29 3b 0a 20 20 20 20 70 45  O_GE, 0);.    pE
25e80 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  nd = findTerm(pW
25e90 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74  C, iCur, -1, not
25ea0 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f  Ready, WO_LT|WO_
25eb0 4c 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  LE, 0);.    if( 
25ec0 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70 54  bRev ){.      pT
25ed0 65 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a 20 20  erm = pStart;.  
25ee0 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e      pStart = pEn
25ef0 64 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20  d;.      pEnd = 
25f00 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  pTerm;.    }.   
25f10 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20   if( pStart ){. 
25f20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20       Expr *pX;  
25f30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
25f40 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
25f50 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 73 74  t defines the st
25f60 61 72 74 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20  art bound */.   
25f70 20 20 20 69 6e 74 20 72 31 2c 20 72 54 65 6d 70     int r1, rTemp
25f80 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69  ;        /* Regi
25f90 73 74 65 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e  sters for holdin
25fa0 67 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e  g the start boun
25fb0 64 61 72 79 20 2a 2f 0a 0a 20 20 20 20 20 20 2f  dary */..      /
25fc0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
25fd0 63 6f 6e 73 74 61 6e 74 20 6d 61 70 73 20 54 4b  constant maps TK
25fe0 5f 78 78 20 63 6f 64 65 73 20 69 6e 74 6f 20 63  _xx codes into c
25ff0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a 20 20  orresponding .  
26000 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 70 63 6f      ** seek opco
26010 64 65 73 2e 20 20 49 74 20 64 65 70 65 6e 64 73  des.  It depends
26020 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   on a particular
26030 20 6f 72 64 65 72 69 6e 67 20 6f 66 20 54 4b 5f   ordering of TK_
26040 78 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  xx.      */.    
26050 20 20 63 6f 6e 73 74 20 75 38 20 61 4d 6f 76 65    const u8 aMove
26060 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  Op[] = {.       
26070 20 20 20 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20      /* TK_GT */ 
26080 20 4f 50 5f 53 65 65 6b 47 74 2c 0a 20 20 20 20   OP_SeekGt,.    
26090 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 45 20         /* TK_LE 
260a0 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 65 2c 0a 20  */  OP_SeekLe,. 
260b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
260c0 4c 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 74  LT */  OP_SeekLt
260d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,.           /* 
260e0 54 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f 53 65 65  TK_GE */  OP_See
260f0 6b 47 65 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  kGe.      };.   
26100 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45     assert( TK_LE
26110 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b 20 20 20 20  ==TK_GT+1 );    
26120 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
26130 68 65 20 6f 72 64 65 72 69 6e 67 2e 2e 20 2a 2f  he ordering.. */
26140 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
26150 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b  K_LT==TK_GT+2 );
26160 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66        /*  ... of
26170 20 74 68 65 20 54 4b 5f 78 78 20 76 61 6c 75 65   the TK_xx value
26180 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  s... */.      as
26190 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f  sert( TK_GE==TK_
261a0 47 54 2b 33 20 29 3b 20 20 20 20 20 20 2f 2a 20  GT+3 );      /* 
261b0 20 2e 2e 2e 20 69 73 20 63 6f 72 72 65 63 63 74   ... is correcct
261c0 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73 74  . */..      test
261d0 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e 77 74  case( pStart->wt
261e0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
261f0 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52  TUAL ); /* EV: R
26200 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a  -30575-11662 */.
26210 20 20 20 20 20 20 70 58 20 3d 20 70 53 74 61 72        pX = pStar
26220 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  t->pExpr;.      
26230 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b  assert( pX!=0 );
26240 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
26250 53 74 61 72 74 2d 3e 6c 65 66 74 43 75 72 73 6f  Start->leftCurso
26260 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20  r==iCur );.     
26270 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
26280 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
26290 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 26 72  , pX->pRight, &r
262a0 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Temp);.      sql
262b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
262c0 2c 20 61 4d 6f 76 65 4f 70 5b 70 58 2d 3e 6f 70  , aMoveOp[pX->op
262d0 2d 54 4b 5f 47 54 5d 2c 20 69 43 75 72 2c 20 61  -TK_GT], iCur, a
262e0 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20  ddrBrk, r1);.   
262f0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
26300 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 20  v, "pk"));.     
26310 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
26320 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
26330 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29 3b 0a  pParse, r1, 1);.
26340 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
26350 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
26360 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20 20 20  se, rTemp);.    
26370 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
26380 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b 0a 20  evel, pStart);. 
26390 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
263a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
263b0 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c  2(v, bRev ? OP_L
263c0 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c  ast : OP_Rewind,
263d0 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29 3b   iCur, addrBrk);
263e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
263f0 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70  End ){.      Exp
26400 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 70 58 20  r *pX;.      pX 
26410 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a 20  = pEnd->pExpr;. 
26420 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21       assert( pX!
26430 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
26440 72 74 28 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75  rt( pEnd->leftCu
26450 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20  rsor==iCur );.  
26460 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
26470 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  nd->wtFlags & TE
26480 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a  RM_VIRTUAL ); /*
26490 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36   EV: R-30575-116
264a0 36 32 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 45  62 */.      memE
264b0 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72  ndValue = ++pPar
264c0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
264d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
264e0 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
264f0 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 29  ht, memEndValue)
26500 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e  ;.      if( pX->
26510 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d  op==TK_LT || pX-
26520 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20  >op==TK_GT ){.  
26530 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62        testOp = b
26540 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50  Rev ? OP_Le : OP
26550 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _Ge;.      }else
26560 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70  {.        testOp
26570 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20   = bRev ? OP_Lt 
26580 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d  : OP_Gt;.      }
26590 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65  .      disableTe
265a0 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29  rm(pLevel, pEnd)
265b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 72  ;.    }.    star
265c0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
265d0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
265e0 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
265f0 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a  bRev ? OP_Prev :
26600 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c   OP_Next;.    pL
26610 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b  evel->p1 = iCur;
26620 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
26630 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 69 66 28  = start;.    if(
26640 20 70 53 74 61 72 74 3d 3d 30 20 26 26 20 70 45   pStart==0 && pE
26650 6e 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  nd==0 ){.      p
26660 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49  Level->p5 = SQLI
26670 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55  TE_STMTSTATUS_FU
26680 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20  LLSCAN_STEP;.   
26690 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
266a0 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35  sert( pLevel->p5
266b0 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ==0 );.    }.   
266c0 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f   if( testOp!=OP_
266d0 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 69 52  Noop ){.      iR
266e0 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c 65 61  owidReg = iRelea
266f0 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47  seReg = sqlite3G
26700 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
26710 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
26720 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
26730 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 69 52  _Rowid, iCur, iR
26740 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
26750 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
26760 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43  Store(pParse, iC
26770 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65  ur, -1, iRowidRe
26780 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
26790 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 74  3VdbeAddOp3(v, t
267a0 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56 61 6c  estOp, memEndVal
267b0 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 69 52 6f  ue, addrBrk, iRo
267c0 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73  widReg);.      s
267d0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
267e0 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41 46 46  P5(v, SQLITE_AFF
267f0 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c 49 54  _NUMERIC | SQLIT
26800 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
26810 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
26820 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
26830 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43  Flags & (WHERE_C
26840 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52  OLUMN_RANGE|WHER
26850 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 20 29 7b 0a  E_COLUMN_EQ) ){.
26860 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20 41      /* Case 3: A
26870 20 73 63 61 6e 20 75 73 69 6e 67 20 61 6e 20 69   scan using an i
26880 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ndex..    **.   
26890 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65 20   **         The 
268a0 57 48 45 52 45 20 63 6c 61 75 73 65 20 6d 61 79  WHERE clause may
268b0 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 6f 72   contain zero or
268c0 20 6d 6f 72 65 20 65 71 75 61 6c 69 74 79 20 0a   more equality .
268d0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74      **         t
268e0 65 72 6d 73 20 28 22 3d 3d 22 20 6f 72 20 22 49  erms ("==" or "I
268f0 4e 22 20 6f 70 65 72 61 74 6f 72 73 29 20 74 68  N" operators) th
26900 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  at refer to the 
26910 4e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  N.    **        
26920 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
26930 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  ns of the index.
26940 20 49 74 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e   It may also con
26950 74 61 69 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20  tain.    **     
26960 20 20 20 20 69 6e 65 71 75 61 6c 69 74 79 20 63      inequality c
26970 6f 6e 73 74 72 61 69 6e 74 73 20 28 3e 2c 20 3c  onstraints (>, <
26980 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e 20 74  , >= or <=) on t
26990 68 65 20 69 6e 64 65 78 65 64 0a 20 20 20 20 2a  he indexed.    *
269a0 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  *         column
269b0 20 74 68 61 74 20 69 6d 6d 65 64 69 61 74 65 6c   that immediatel
269c0 79 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 4e 20  y follows the N 
269d0 65 71 75 61 6c 69 74 69 65 73 2e 20 4f 6e 6c 79  equalities. Only
269e0 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20   .    **        
269f0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
26a00 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e  column can be an
26a10 20 69 6e 65 71 75 61 6c 69 74 79 20 2d 20 74 68   inequality - th
26a20 65 20 72 65 73 74 20 6d 75 73 74 0a 20 20 20 20  e rest must.    
26a30 2a 2a 20 20 20 20 20 20 20 20 20 75 73 65 20 74  **         use t
26a40 68 65 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22  he "==" and "IN"
26a50 20 6f 70 65 72 61 74 6f 72 73 2e 20 46 6f 72 20   operators. For 
26a60 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
26a70 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
26a80 69 6e 64 65 78 20 69 73 20 6f 6e 20 28 78 2c 79  index is on (x,y
26a90 2c 7a 29 2c 20 74 68 65 6e 20 74 68 65 20 66 6f  ,z), then the fo
26aa0 6c 6c 6f 77 69 6e 67 20 63 6c 61 75 73 65 73 20  llowing clauses 
26ab0 61 72 65 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20  are all .    ** 
26ac0 20 20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 65          optimize
26ad0 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d:.    **.    **
26ae0 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 0a              x=5.
26af0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
26b00 20 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 0a 20    x=5 AND y=10. 
26b10 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
26b20 20 78 3d 35 20 41 4e 44 20 79 3c 31 30 0a 20 20   x=5 AND y<10.  
26b30 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
26b40 78 3d 35 20 41 4e 44 20 79 3e 35 20 41 4e 44 20  x=5 AND y>5 AND 
26b50 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20  y<10.    **     
26b60 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
26b70 3d 35 20 41 4e 44 20 7a 3c 3d 31 30 0a 20 20 20  =5 AND z<=10.   
26b80 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
26b90 20 20 20 54 68 65 20 7a 3c 31 30 20 74 65 72 6d     The z<10 term
26ba0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
26bb0 67 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  g cannot be used
26bc0 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20  , only.    **   
26bd0 20 20 20 20 20 20 74 68 65 20 78 3d 35 20 74 65        the x=5 te
26be0 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  rm:.    **.    *
26bf0 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
26c00 20 41 4e 44 20 7a 3c 31 30 0a 20 20 20 20 2a 2a   AND z<10.    **
26c10 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
26c20 4e 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 69 66  N may be zero if
26c30 20 74 68 65 72 65 20 61 72 65 20 69 6e 65 71 75   there are inequ
26c40 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
26c50 73 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  s..    **       
26c60 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e    If there are n
26c70 6f 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  o inequality con
26c80 73 74 72 61 69 6e 74 73 2c 20 74 68 65 6e 20 4e  straints, then N
26c90 20 69 73 20 61 74 0a 20 20 20 20 2a 2a 20 20 20   is at.    **   
26ca0 20 20 20 20 20 20 6c 65 61 73 74 20 6f 6e 65 2e        least one.
26cb0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
26cc0 20 20 20 20 20 20 20 54 68 69 73 20 63 61 73 65         This case
26cd0 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68   is also used wh
26ce0 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  en there are no 
26cf0 57 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20  WHERE clause.   
26d00 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73   **         cons
26d10 74 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69  traints but an i
26d20 6e 64 65 78 20 69 73 20 73 65 6c 65 63 74 65 64  ndex is selected
26d30 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65   anyway, in orde
26d40 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  r.    **        
26d50 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f 75   to force the ou
26d60 74 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63 6f  tput order to co
26d70 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45  nform to an ORDE
26d80 52 20 42 59 2e 0a 20 20 20 20 2a 2f 20 20 0a 20  R BY..    */  . 
26d90 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
26da0 75 38 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d 20  u8 aStartOp[] = 
26db0 7b 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20  {.      0,.     
26dc0 20 30 2c 0a 20 20 20 20 20 20 4f 50 5f 52 65 77   0,.      OP_Rew
26dd0 69 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ind,           /
26de0 2a 20 32 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e  * 2: (!start_con
26df0 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61 72  straints && star
26e00 74 45 71 20 26 26 20 20 21 62 52 65 76 29 20 2a  tEq &&  !bRev) *
26e10 2f 0a 20 20 20 20 20 20 4f 50 5f 4c 61 73 74 2c  /.      OP_Last,
26e20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26e30 33 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74  3: (!start_const
26e40 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74 45  raints && startE
26e50 71 20 26 26 20 20 20 62 52 65 76 29 20 2a 2f 0a  q &&   bRev) */.
26e60 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 74 2c        OP_SeekGt,
26e70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 3a             /* 4:
26e80 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69   (start_constrai
26e90 6e 74 73 20 20 26 26 20 21 73 74 61 72 74 45 71  nts  && !startEq
26ea0 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20   && !bRev) */.  
26eb0 20 20 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 20 20      OP_SeekLt,  
26ec0 20 20 20 20 20 20 20 20 20 2f 2a 20 35 3a 20 28           /* 5: (
26ed0 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
26ee0 73 20 20 26 26 20 21 73 74 61 72 74 45 71 20 26  s  && !startEq &
26ef0 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  &  bRev) */.    
26f00 20 20 4f 50 5f 53 65 65 6b 47 65 2c 20 20 20 20    OP_SeekGe,    
26f10 20 20 20 20 20 20 20 2f 2a 20 36 3a 20 28 73 74         /* 6: (st
26f20 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
26f30 20 26 26 20 20 73 74 61 72 74 45 71 20 26 26 20   &&  startEq && 
26f40 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
26f50 4f 50 5f 53 65 65 6b 4c 65 20 20 20 20 20 20 20  OP_SeekLe       
26f60 20 20 20 20 20 2f 2a 20 37 3a 20 28 73 74 61 72       /* 7: (star
26f70 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
26f80 26 20 20 73 74 61 72 74 45 71 20 26 26 20 20 62  &  startEq &&  b
26f90 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20  Rev) */.    };. 
26fa0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
26fb0 75 38 20 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a  u8 aEndOp[] = {.
26fc0 20 20 20 20 20 20 4f 50 5f 4e 6f 6f 70 2c 20 20        OP_Noop,  
26fd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a             /* 0:
26fe0 20 28 21 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e   (!end_constrain
26ff0 74 73 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ts) */.      OP_
27000 49 64 78 47 45 2c 20 20 20 20 20 20 20 20 20 20  IdxGE,          
27010 20 20 2f 2a 20 31 3a 20 28 65 6e 64 5f 63 6f 6e    /* 1: (end_con
27020 73 74 72 61 69 6e 74 73 20 26 26 20 21 62 52 65  straints && !bRe
27030 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49  v) */.      OP_I
27040 64 78 4c 54 20 20 20 20 20 20 20 20 20 20 20 20  dxLT            
27050 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73   /* 2: (end_cons
27060 74 72 61 69 6e 74 73 20 26 26 20 62 52 65 76 29  traints && bRev)
27070 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69   */.    };.    i
27080 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d  nt nEq = pLevel-
27090 3e 70 6c 61 6e 2e 6e 45 71 3b 20 20 2f 2a 20 4e  >plan.nEq;  /* N
270a0 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49  umber of == or I
270b0 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69  N terms */.    i
270c0 6e 74 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20  nt isMinQuery = 
270d0 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  0;          /* I
270e0 66 20 74 68 69 73 20 69 73 20 61 6e 20 6f 70 74  f this is an opt
270f0 69 6d 69 7a 65 64 20 53 45 4c 45 43 54 20 6d 69  imized SELECT mi
27100 6e 28 78 29 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e  n(x).. */.    in
27110 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20  t regBase;      
27120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61             /* Ba
27130 73 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  se register hold
27140 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  ing constraint v
27150 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74  alues */.    int
27160 20 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   r1;            
27170 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
27180 70 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  p register */.  
27190 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61    WhereTerm *pRa
271a0 6e 67 65 53 74 61 72 74 20 3d 20 30 3b 20 20 2f  ngeStart = 0;  /
271b0 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  * Inequality con
271c0 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65  straint at range
271d0 20 73 74 61 72 74 20 2a 2f 0a 20 20 20 20 57 68   start */.    Wh
271e0 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 45  ereTerm *pRangeE
271f0 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6e  nd = 0;    /* In
27200 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
27210 69 6e 74 20 61 74 20 72 61 6e 67 65 20 65 6e 64  int at range end
27220 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72   */.    int star
27230 74 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  tEq;            
27240 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
27250 72 61 6e 67 65 20 73 74 61 72 74 20 75 73 65 73  range start uses
27260 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f   ==, >= or <= */
27270 0a 20 20 20 20 69 6e 74 20 65 6e 64 45 71 3b 20  .    int endEq; 
27280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27290 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e    /* True if ran
272a0 67 65 20 65 6e 64 20 75 73 65 73 20 3d 3d 2c 20  ge end uses ==, 
272b0 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20  >= or <= */.    
272c0 69 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73 74 72  int start_constr
272d0 61 69 6e 74 73 3b 20 20 20 20 20 20 20 2f 2a 20  aints;       /* 
272e0 53 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20 69  Start of range i
272f0 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 2a 2f  s constrained */
27300 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72  .    int nConstr
27310 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  aint;           
27320 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
27330 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20  onstraint terms 
27340 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
27350 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
27360 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
27370 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e   we will be usin
27380 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64  g */.    int iId
27390 78 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20  xCur;           
273a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
273b0 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
273c0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e   index */.    in
273d0 74 20 6e 45 78 74 72 61 52 65 67 20 3d 20 30 3b  t nExtraReg = 0;
273e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
273f0 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65  mber of extra re
27400 67 69 73 74 65 72 73 20 6e 65 65 64 65 64 20 2a  gisters needed *
27410 2f 0a 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20  /.    int op;   
27420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27430 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f     /* Instructio
27440 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  n opcode */.    
27450 63 68 61 72 20 2a 7a 53 74 61 72 74 41 66 66 3b  char *zStartAff;
27460 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27470 41 66 66 69 6e 69 74 79 20 66 6f 72 20 73 74 61  Affinity for sta
27480 72 74 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73  rt of range cons
27490 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 63 68  traint */.    ch
274a0 61 72 20 2a 7a 45 6e 64 41 66 66 3b 20 20 20 20  ar *zEndAff;    
274b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
274c0 66 69 6e 69 74 79 20 66 6f 72 20 65 6e 64 20 6f  finity for end o
274d0 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  f range constrai
274e0 6e 74 20 2a 2f 0a 0a 20 20 20 20 70 49 64 78 20  nt */..    pIdx 
274f0 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75  = pLevel->plan.u
27500 2e 70 49 64 78 3b 0a 20 20 20 20 69 49 64 78 43  .pIdx;.    iIdxC
27510 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ur = pLevel->iId
27520 78 43 75 72 3b 0a 20 20 20 20 6b 20 3d 20 28 6e  xCur;.    k = (n
27530 45 71 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  Eq==pIdx->nColum
27540 6e 20 3f 20 2d 31 20 3a 20 70 49 64 78 2d 3e 61  n ? -1 : pIdx->a
27550 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 29 3b 0a 0a  iColumn[nEq]);..
27560 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6c      /* If this l
27570 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20 61 20  oop satisfies a 
27580 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f 72 64  sort order (pOrd
27590 65 72 42 79 29 20 72 65 71 75 65 73 74 20 74 68  erBy) request th
275a0 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73 20 70  at .    ** was p
275b0 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
275c0 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d  nction to implem
275d0 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20 6d 69  ent a "SELECT mi
275e0 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20 2a  n(x) ..." .    *
275f0 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20 74 68  * query, then th
27600 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e  e caller will on
27610 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f  ly allow the loo
27620 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20 20 20  p to run for.   
27630 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69 74 65   ** a single ite
27640 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61  ration. This mea
27650 6e 73 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ns that the firs
27660 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 20  t row returned. 
27670 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74     ** should not
27680 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76 61 6c   have a NULL val
27690 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27 78 27  ue stored in 'x'
276a0 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78 27 20  . If column 'x' 
276b0 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  is.    ** the fi
276c0 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20 74 68  rst one after th
276d0 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79 20 63  e nEq equality c
276e0 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68  onstraints in th
276f0 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a 20  e index,.    ** 
27700 74 68 69 73 20 72 65 71 75 69 72 65 73 20 73 6f  this requires so
27710 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c  me special handl
27720 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ing..    */.    
27730 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 26  if( (wctrlFlags&
27740 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
27750 4e 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70  N)!=0.     && (p
27760 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
27770 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 45  ags&WHERE_ORDERE
27780 44 29 0a 20 20 20 20 20 26 26 20 28 70 49 64 78  D).     && (pIdx
27790 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 71 29 0a 20  ->nColumn>nEq). 
277a0 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61     ){.      /* a
277b0 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d  ssert( pOrderBy-
277c0 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 20 2a 2f 0a  >nExpr==1 ); */.
277d0 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
277e0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e   pOrderBy->a[0].
277f0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  pExpr->iColumn==
27800 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
27810 45 71 5d 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20  Eq] ); */.      
27820 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 31 3b 0a  isMinQuery = 1;.
27830 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20        nExtraReg 
27840 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
27850 2f 2a 20 46 69 6e 64 20 61 6e 79 20 69 6e 65 71  /* Find any ineq
27860 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
27870 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68 65 20  t terms for the 
27880 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 0a 20  start and end . 
27890 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 72 61 6e     ** of the ran
278a0 67 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ge. .    */.    
278b0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
278c0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
278d0 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _TOP_LIMIT ){.  
278e0 20 20 20 20 70 52 61 6e 67 65 45 6e 64 20 3d 20      pRangeEnd = 
278f0 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
27900 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c  ur, k, notReady,
27910 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 2c 20   (WO_LT|WO_LE), 
27920 70 49 64 78 29 3b 0a 20 20 20 20 20 20 6e 45 78  pIdx);.      nEx
27930 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20  traReg = 1;.    
27940 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  }.    if( pLevel
27950 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
27960 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
27970 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65   ){.      pRange
27980 53 74 61 72 74 20 3d 20 66 69 6e 64 54 65 72 6d  Start = findTerm
27990 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e  (pWC, iCur, k, n
279a0 6f 74 52 65 61 64 79 2c 20 28 57 4f 5f 47 54 7c  otReady, (WO_GT|
279b0 57 4f 5f 47 45 29 2c 20 70 49 64 78 29 3b 0a 20  WO_GE), pIdx);. 
279c0 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d       nExtraReg =
279d0 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   1;.    }..    /
279e0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
279f0 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20  to evaluate all 
27a00 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73  constraint terms
27a10 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a   using == or IN.
27a20 20 20 20 20 2a 2a 20 61 6e 64 20 73 74 6f 72 65      ** and store
27a30 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74   the values of t
27a40 68 6f 73 65 20 74 65 72 6d 73 20 69 6e 20 61 6e  hose terms in an
27a50 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
27a60 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  ers.    ** start
27a70 69 6e 67 20 61 74 20 72 65 67 42 61 73 65 2e 0a  ing at regBase..
27a80 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 42 61      */.    regBa
27a90 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45 71 75 61  se = codeAllEqua
27aa0 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 20 20 20  lityTerms(.     
27ab0 20 20 20 70 50 61 72 73 65 2c 20 70 4c 65 76 65     pParse, pLeve
27ac0 6c 2c 20 70 57 43 2c 20 6e 6f 74 52 65 61 64 79  l, pWC, notReady
27ad0 2c 20 6e 45 78 74 72 61 52 65 67 2c 20 26 7a 53  , nExtraReg, &zS
27ae0 74 61 72 74 41 66 66 0a 20 20 20 20 29 3b 0a 20  tartAff.    );. 
27af0 20 20 20 7a 45 6e 64 41 66 66 20 3d 20 73 71 6c     zEndAff = sql
27b00 69 74 65 33 44 62 53 74 72 44 75 70 28 70 50 61  ite3DbStrDup(pPa
27b10 72 73 65 2d 3e 64 62 2c 20 7a 53 74 61 72 74 41  rse->db, zStartA
27b20 66 66 29 3b 0a 20 20 20 20 61 64 64 72 4e 78 74  ff);.    addrNxt
27b30 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e   = pLevel->addrN
27b40 78 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77  xt;..    /* If w
27b50 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 72 65  e are doing a re
27b60 76 65 72 73 65 20 6f 72 64 65 72 20 73 63 61 6e  verse order scan
27b70 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67   on an ascending
27b80 20 69 6e 64 65 78 2c 20 6f 72 0a 20 20 20 20 2a   index, or.    *
27b90 2a 20 61 20 66 6f 72 77 61 72 64 20 6f 72 64 65  * a forward orde
27ba0 72 20 73 63 61 6e 20 6f 6e 20 61 20 64 65 73 63  r scan on a desc
27bb0 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 69 6e  ending index, in
27bc0 74 65 72 63 68 61 6e 67 65 20 74 68 65 20 0a 20  terchange the . 
27bd0 20 20 20 2a 2a 20 73 74 61 72 74 20 61 6e 64 20     ** start and 
27be0 65 6e 64 20 74 65 72 6d 73 20 28 70 52 61 6e 67  end terms (pRang
27bf0 65 53 74 61 72 74 20 61 6e 64 20 70 52 61 6e 67  eStart and pRang
27c00 65 45 6e 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  eEnd)..    */.  
27c10 20 20 69 66 28 20 28 6e 45 71 3c 70 49 64 78 2d    if( (nEq<pIdx-
27c20 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 62 52 65 76  >nColumn && bRev
27c30 3d 3d 28 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  ==(pIdx->aSortOr
27c40 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45  der[nEq]==SQLITE
27c50 5f 53 4f 5f 41 53 43 29 29 0a 20 20 20 20 20 7c  _SO_ASC)).     |
27c60 7c 20 28 62 52 65 76 20 26 26 20 70 49 64 78 2d  | (bRev && pIdx-
27c70 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6e 45 71 29 0a 20  >nColumn==nEq). 
27c80 20 20 20 29 7b 0a 20 20 20 20 20 20 53 57 41 50     ){.      SWAP
27c90 28 57 68 65 72 65 54 65 72 6d 20 2a 2c 20 70 52  (WhereTerm *, pR
27ca0 61 6e 67 65 45 6e 64 2c 20 70 52 61 6e 67 65 53  angeEnd, pRangeS
27cb0 74 61 72 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  tart);.    }..  
27cc0 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
27cd0 67 65 53 74 61 72 74 20 26 26 20 70 52 61 6e 67  geStart && pRang
27ce0 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f  eStart->eOperato
27cf0 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20  r & WO_LE );.   
27d00 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
27d10 65 53 74 61 72 74 20 26 26 20 70 52 61 6e 67 65  eStart && pRange
27d20 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72  Start->eOperator
27d30 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20   & WO_GE );.    
27d40 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65  testcase( pRange
27d50 45 6e 64 20 26 26 20 70 52 61 6e 67 65 45 6e 64  End && pRangeEnd
27d60 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
27d70 5f 4c 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _LE );.    testc
27d80 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26  ase( pRangeEnd &
27d90 26 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70  & pRangeEnd->eOp
27da0 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 20 29  erator & WO_GE )
27db0 3b 0a 20 20 20 20 73 74 61 72 74 45 71 20 3d 20  ;.    startEq = 
27dc0 21 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20  !pRangeStart || 
27dd0 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70  pRangeStart->eOp
27de0 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c  erator & (WO_LE|
27df0 57 4f 5f 47 45 29 3b 0a 20 20 20 20 65 6e 64 45  WO_GE);.    endE
27e00 71 20 3d 20 20 20 21 70 52 61 6e 67 65 45 6e 64  q =   !pRangeEnd
27e10 20 7c 7c 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65   || pRangeEnd->e
27e20 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c  Operator & (WO_L
27e30 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 73 74  E|WO_GE);.    st
27e40 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
27e50 3d 20 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c  = pRangeStart ||
27e60 20 6e 45 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20   nEq>0;..    /* 
27e70 53 65 65 6b 20 74 68 65 20 69 6e 64 65 78 20 63  Seek the index c
27e80 75 72 73 6f 72 20 74 6f 20 74 68 65 20 73 74 61  ursor to the sta
27e90 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e  rt of the range.
27ea0 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61   */.    nConstra
27eb0 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69  int = nEq;.    i
27ec0 66 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 29  f( pRangeStart )
27ed0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  {.      Expr *pR
27ee0 69 67 68 74 20 3d 20 70 52 61 6e 67 65 53 74 61  ight = pRangeSta
27ef0 72 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rt->pExpr->pRigh
27f00 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
27f10 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
27f20 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65   pRight, regBase
27f30 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66 28  +nEq);.      if(
27f40 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77   (pRangeStart->w
27f50 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
27f60 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ULL)==0 ){.     
27f70 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
27f80 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20  deIsNullJump(v, 
27f90 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b  pRight, regBase+
27fa0 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20  nEq, addrNxt);. 
27fb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
27fc0 20 7a 53 74 61 72 74 41 66 66 20 29 7b 0a 20 20   zStartAff ){.  
27fd0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
27fe0 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
27ff0 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41  (pRight, zStartA
28000 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45  ff[nEq])==SQLITE
28010 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20  _AFF_NONE){.    
28020 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20 74        /* Since t
28030 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  he comparison is
28040 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64   to be performed
28050 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73   with no convers
28060 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ions.          *
28070 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65  * applied to the
28080 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74 20 74   operands, set t
28090 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 61  he affinity to a
280a0 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74 20 74  pply to pRight t
280b0 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  o .          ** 
280c0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e  SQLITE_AFF_NONE.
280d0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a    */.          z
280e0 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20  StartAff[nEq] = 
280f0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
28100 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28110 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
28120 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
28130 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20  yChange(pRight, 
28140 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29 20  zStartAff[nEq]) 
28150 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74  ){.          zSt
28160 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51  artAff[nEq] = SQ
28170 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
28180 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
28190 20 20 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72    .      nConstr
281a0 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65  aint++;.      te
281b0 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74  stcase( pRangeSt
281c0 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  art->wtFlags & T
281d0 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f  ERM_VIRTUAL ); /
281e0 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31  * EV: R-30575-11
281f0 36 36 32 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  662 */.    }else
28200 20 69 66 28 20 69 73 4d 69 6e 51 75 65 72 79 20   if( isMinQuery 
28210 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
28220 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
28230 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73  _Null, 0, regBas
28240 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 6e 43  e+nEq);.      nC
28250 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20  onstraint++;.   
28260 20 20 20 73 74 61 72 74 45 71 20 3d 20 30 3b 0a     startEq = 0;.
28270 20 20 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73        start_cons
28280 74 72 61 69 6e 74 73 20 3d 20 31 3b 0a 20 20 20  traints = 1;.   
28290 20 7d 0a 20 20 20 20 63 6f 64 65 41 70 70 6c 79   }.    codeApply
282a0 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c  Affinity(pParse,
282b0 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74   regBase, nConst
282c0 72 61 69 6e 74 2c 20 7a 53 74 61 72 74 41 66 66  raint, zStartAff
282d0 29 3b 0a 20 20 20 20 6f 70 20 3d 20 61 53 74 61  );.    op = aSta
282e0 72 74 4f 70 5b 28 73 74 61 72 74 5f 63 6f 6e 73  rtOp[(start_cons
282f0 74 72 61 69 6e 74 73 3c 3c 32 29 20 2b 20 28 73  traints<<2) + (s
28300 74 61 72 74 45 71 3c 3c 31 29 20 2b 20 62 52 65  tartEq<<1) + bRe
28310 76 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  v];.    assert( 
28320 6f 70 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  op!=0 );.    tes
28330 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 52 65  tcase( op==OP_Re
28340 77 69 6e 64 20 29 3b 0a 20 20 20 20 74 65 73 74  wind );.    test
28350 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73  case( op==OP_Las
28360 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  t );.    testcas
28370 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 74  e( op==OP_SeekGt
28380 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
28390 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 65 20  ( op==OP_SeekGe 
283a0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
283b0 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 65 20 29   op==OP_SeekLe )
283c0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
283d0 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 74 20 29 3b  op==OP_SeekLt );
283e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
283f0 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c  AddOp4Int(v, op,
28400 20 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78   iIdxCur, addrNx
28410 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e  t, regBase, nCon
28420 73 74 72 61 69 6e 74 29 3b 0a 0a 20 20 20 20 2f  straint);..    /
28430 2a 20 4c 6f 61 64 20 74 68 65 20 76 61 6c 75 65  * Load the value
28440 20 66 6f 72 20 74 68 65 20 69 6e 65 71 75 61 6c   for the inequal
28450 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  ity constraint a
28460 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
28470 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 28 69  .    ** range (i
28480 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20  f any)..    */. 
28490 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d     nConstraint =
284a0 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52   nEq;.    if( pR
284b0 61 6e 67 65 45 6e 64 20 29 7b 0a 20 20 20 20 20  angeEnd ){.     
284c0 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
284d0 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45 78 70 72  pRangeEnd->pExpr
284e0 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
284f0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
28500 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 72  Remove(pParse, r
28510 65 67 42 61 73 65 2b 6e 45 71 2c 20 31 29 3b 0a  egBase+nEq, 1);.
28520 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
28530 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
28540 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45  ight, regBase+nE
28550 71 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  q);.      if( (p
28560 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67  RangeEnd->wtFlag
28570 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
28580 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
28590 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e  lite3ExprCodeIsN
285a0 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68  ullJump(v, pRigh
285b0 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20  t, regBase+nEq, 
285c0 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20  addrNxt);.      
285d0 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 45 6e 64  }.      if( zEnd
285e0 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Aff ){.        i
285f0 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  f( sqlite3Compar
28600 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74  eAffinity(pRight
28610 2c 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 29 3d  , zEndAff[nEq])=
28620 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
28630 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
28640 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70 61 72  Since the compar
28650 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20 70 65  ison is to be pe
28660 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f 20  rformed with no 
28670 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20 20  conversions.    
28680 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69 65 64        ** applied
28690 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e 64 73   to the operands
286a0 2c 20 73 65 74 20 74 68 65 20 61 66 66 69 6e 69  , set the affini
286b0 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70  ty to apply to p
286c0 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20 20 20  Right to .      
286d0 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46      ** SQLITE_AF
286e0 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20  F_NONE.  */.    
286f0 20 20 20 20 20 20 7a 45 6e 64 41 66 66 5b 6e 45        zEndAff[nE
28700 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  q] = SQLITE_AFF_
28710 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
28720 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
28730 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66  te3ExprNeedsNoAf
28740 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69  finityChange(pRi
28750 67 68 74 2c 20 7a 45 6e 64 41 66 66 5b 6e 45 71  ght, zEndAff[nEq
28760 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
28770 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 20 3d 20 53  zEndAff[nEq] = S
28780 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
28790 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
287a0 7d 20 20 0a 20 20 20 20 20 20 63 6f 64 65 41 70  }  .      codeAp
287b0 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61 72  plyAffinity(pPar
287c0 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 71  se, regBase, nEq
287d0 2b 31 2c 20 7a 45 6e 64 41 66 66 29 3b 0a 20 20  +1, zEndAff);.  
287e0 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b      nConstraint+
287f0 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  +;.      testcas
28800 65 28 20 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74  e( pRangeEnd->wt
28810 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
28820 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52  TUAL ); /* EV: R
28830 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a  -30575-11662 */.
28840 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
28850 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e  3DbFree(pParse->
28860 64 62 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a  db, zStartAff);.
28870 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
28880 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 45  e(pParse->db, zE
28890 6e 64 41 66 66 29 3b 0a 0a 20 20 20 20 2f 2a 20  ndAff);..    /* 
288a0 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  Top of the loop 
288b0 62 6f 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65 76  body */.    pLev
288c0 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33  el->p2 = sqlite3
288d0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
288e0 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  v);..    /* Chec
288f0 6b 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 63  k if the index c
28900 75 72 73 6f 72 20 69 73 20 70 61 73 74 20 74 68  ursor is past th
28910 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e  e end of the ran
28920 67 65 2e 20 2a 2f 0a 20 20 20 20 6f 70 20 3d 20  ge. */.    op = 
28930 61 45 6e 64 4f 70 5b 28 70 52 61 6e 67 65 45 6e  aEndOp[(pRangeEn
28940 64 20 7c 7c 20 6e 45 71 29 20 2a 20 28 31 20 2b  d || nEq) * (1 +
28950 20 62 52 65 76 29 5d 3b 0a 20 20 20 20 74 65 73   bRev)];.    tes
28960 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4e 6f  tcase( op==OP_No
28970 6f 70 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  op );.    testca
28980 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45  se( op==OP_IdxGE
28990 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
289a0 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29  ( op==OP_IdxLT )
289b0 3b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 4f 50  ;.    if( op!=OP
289c0 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73  _Noop ){.      s
289d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
289e0 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43  Int(v, op, iIdxC
289f0 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67  ur, addrNxt, reg
28a00 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  Base, nConstrain
28a10 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
28a20 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
28a30 20 65 6e 64 45 71 21 3d 62 52 65 76 20 3f 31 3a   endEq!=bRev ?1:
28a40 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  0);.    }..    /
28a50 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 69  * If there are i
28a60 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
28a70 61 69 6e 74 73 2c 20 63 68 65 63 6b 20 74 68 61  aints, check tha
28a80 74 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20  t the value.    
28a90 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
28aa0 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20  column that the 
28ab0 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 74 72  inequality contr
28ac0 61 69 6e 73 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ains is not NULL
28ad0 2e 0a 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69  ..    ** If it i
28ae0 73 2c 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e  s, jump to the n
28af0 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
28b00 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a   the loop..    *
28b10 2f 0a 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74  /.    r1 = sqlit
28b20 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
28b30 72 73 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61  rse);.    testca
28b40 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  se( pLevel->plan
28b50 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
28b60 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 3b 0a 20 20  _BTM_LIMIT );.  
28b70 20 20 74 65 73 74 63 61 73 65 28 20 70 4c 65 76    testcase( pLev
28b80 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
28b90 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
28ba0 49 54 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  IT );.    if( (p
28bb0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
28bc0 61 67 73 20 26 20 28 57 48 45 52 45 5f 42 54 4d  ags & (WHERE_BTM
28bd0 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50  _LIMIT|WHERE_TOP
28be0 5f 4c 49 4d 49 54 29 29 21 3d 30 20 29 7b 0a 20  _LIMIT))!=0 ){. 
28bf0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
28c00 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
28c10 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6e 45  umn, iIdxCur, nE
28c20 71 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  q, r1);.      sq
28c30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
28c40 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31  v, OP_IsNull, r1
28c50 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20  , addrCont);.   
28c60 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65   }.    sqlite3Re
28c70 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
28c80 72 73 65 2c 20 72 31 29 3b 0a 0a 20 20 20 20 2f  rse, r1);..    /
28c90 2a 20 53 65 65 6b 20 74 68 65 20 74 61 62 6c 65  * Seek the table
28ca0 20 63 75 72 73 6f 72 2c 20 69 66 20 72 65 71 75   cursor, if requ
28cb0 69 72 65 64 20 2a 2f 0a 20 20 20 20 64 69 73 61  ired */.    disa
28cc0 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
28cd0 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20  pRangeStart);.  
28ce0 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
28cf0 65 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29  evel, pRangeEnd)
28d00 3b 0a 20 20 20 20 69 66 28 20 21 6f 6d 69 74 54  ;.    if( !omitT
28d10 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 52  able ){.      iR
28d20 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c 65 61  owidReg = iRelea
28d30 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47  seReg = sqlite3G
28d40 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
28d50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
28d60 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
28d70 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78 43  _IdxRowid, iIdxC
28d80 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  ur, iRowidReg);.
28d90 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
28da0 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72  rCacheStore(pPar
28db0 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52  se, iCur, -1, iR
28dc0 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
28dd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
28de0 32 28 76 2c 20 4f 50 5f 53 65 65 6b 2c 20 69 43  2(v, OP_Seek, iC
28df0 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 20  ur, iRowidReg); 
28e00 20 2f 2a 20 44 65 66 65 72 72 65 64 20 73 65 65   /* Deferred see
28e10 6b 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20  k */.    }..    
28e20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69 6e  /* Record the in
28e30 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20 74  struction used t
28e40 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
28e50 6c 6f 6f 70 2e 20 44 69 73 61 62 6c 65 20 0a 20  loop. Disable . 
28e60 20 20 20 2a 2a 20 57 48 45 52 45 20 63 6c 61 75     ** WHERE clau
28e70 73 65 20 74 65 72 6d 73 20 6d 61 64 65 20 72 65  se terms made re
28e80 64 75 6e 64 61 6e 74 20 62 79 20 74 68 65 20 69  dundant by the i
28e90 6e 64 65 78 20 72 61 6e 67 65 20 73 63 61 6e 2e  ndex range scan.
28ea0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
28eb0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
28ec0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55 4e 49  lags & WHERE_UNI
28ed0 51 55 45 20 29 7b 0a 20 20 20 20 20 20 70 4c 65  QUE ){.      pLe
28ee0 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f  vel->op = OP_Noo
28ef0 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  p;.    }else if(
28f00 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70   bRev ){.      p
28f10 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50  Level->op = OP_P
28f20 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rev;.    }else{.
28f30 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
28f40 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   = OP_Next;.    
28f50 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  }.    pLevel->p1
28f60 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20   = iIdxCur;.    
28f70 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
28f80 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
28f90 5f 43 4f 56 45 52 5f 53 43 41 4e 20 29 7b 0a 20  _COVER_SCAN ){. 
28fa0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20       pLevel->p5 
28fb0 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  = SQLITE_STMTSTA
28fc0 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
28fd0 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  P;.    }else{.  
28fe0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76      assert( pLev
28ff0 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20  el->p5==0 );.   
29000 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e   }.  }else..#ifn
29010 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
29020 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  OR_OPTIMIZATION.
29030 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c    if( pLevel->pl
29040 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
29050 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20  RE_MULTI_OR ){. 
29060 20 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 20 54     /* Case 4:  T
29070 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72  wo or more separ
29080 61 74 65 6c 79 20 69 6e 64 65 78 65 64 20 74 65  ately indexed te
29090 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  rms connected by
290a0 20 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   OR.    **.    *
290b0 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
290c0 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  *.    **   CREAT
290d0 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63  E TABLE t1(a,b,c
290e0 2c 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52  ,d);.    **   CR
290f0 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
29100 20 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20   t1(a);.    **  
29110 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 32   CREATE INDEX i2
29120 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 2a   ON t1(b);.    *
29130 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
29140 20 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20   i3 ON t1(c);.  
29150 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45    **.    **   SE
29160 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
29170 48 45 52 45 20 61 3d 35 20 4f 52 20 62 3d 37 20  HERE a=5 OR b=7 
29180 4f 52 20 28 63 3d 31 31 20 41 4e 44 20 64 3d 31  OR (c=11 AND d=1
29190 33 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  3).    **.    **
291a0 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 2c   In the example,
291b0 20 74 68 65 72 65 20 61 72 65 20 74 68 72 65 65   there are three
291c0 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63   indexed terms c
291d0 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 2e 0a  onnected by OR..
291e0 20 20 20 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f      ** The top o
291f0 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73  f the loop looks
29200 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20   like this:.    
29210 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
29220 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20     Null       1 
29230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
29240 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74   Zero the rowset
29250 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a   in reg 1.    **
29260 0a 20 20 20 20 2a 2a 20 54 68 65 6e 2c 20 66 6f  .    ** Then, fo
29270 72 20 65 61 63 68 20 69 6e 64 65 78 65 64 20 74  r each indexed t
29280 65 72 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  erm, the followi
29290 6e 67 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74  ng. The argument
292a0 73 20 74 6f 0a 20 20 20 20 2a 2a 20 52 6f 77 53  s to.    ** RowS
292b0 65 74 54 65 73 74 20 61 72 65 20 73 75 63 68 20  etTest are such 
292c0 74 68 61 74 20 74 68 65 20 72 6f 77 69 64 20 6f  that the rowid o
292d0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
292e0 77 20 69 73 20 69 6e 73 65 72 74 65 64 0a 20 20  w is inserted.  
292f0 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 52 6f    ** into the Ro
29300 77 53 65 74 2e 20 49 66 20 69 74 20 69 73 20 61  wSet. If it is a
29310 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 2c 20  lready present, 
29320 63 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20 74 68  control skips th
29330 65 0a 20 20 20 20 2a 2a 20 47 6f 73 75 62 20 6f  e.    ** Gosub o
29340 70 63 6f 64 65 20 61 6e 64 20 6a 75 6d 70 73 20  pcode and jumps 
29350 73 74 72 61 69 67 68 74 20 74 6f 20 74 68 65 20  straight to the 
29360 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
29370 79 20 57 68 65 72 65 45 6e 64 28 29 2e 0a 20 20  y WhereEnd()..  
29380 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
29390 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42     sqlite3WhereB
293a0 65 67 69 6e 28 3c 74 65 72 6d 3e 29 0a 20 20 20  egin(<term>).   
293b0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 6f 77   **          Row
293c0 53 65 74 54 65 73 74 20 20 20 20 20 20 20 20 20  SetTest         
293d0 20 20 20 20 20 20 20 20 20 23 20 49 6e 73 65 72           # Inser
293e0 74 20 72 6f 77 69 64 20 69 6e 74 6f 20 72 6f 77  t rowid into row
293f0 73 65 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  set.    **      
29400 20 20 20 20 47 6f 73 75 62 20 20 20 20 20 20 32      Gosub      2
29410 20 41 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   A.    **       
29420 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
29430 28 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ().    **.    **
29440 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 61   Following the a
29450 62 6f 76 65 2c 20 63 6f 64 65 20 74 6f 20 74 65  bove, code to te
29460 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
29470 2e 20 4c 61 62 65 6c 20 41 2c 20 74 68 65 20 74  . Label A, the t
29480 61 72 67 65 74 0a 20 20 20 20 2a 2a 20 6f 66 20  arget.    ** of 
29490 74 68 65 20 47 6f 73 75 62 20 61 62 6f 76 65 2c  the Gosub above,
294a0 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 69 6e   jumps to the in
294b0 73 74 72 75 63 74 69 6f 6e 20 72 69 67 68 74 20  struction right 
294c0 61 66 74 65 72 20 74 68 65 20 47 6f 74 6f 2e 0a  after the Goto..
294d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
294e0 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20         Null     
294f0 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
29500 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f     # Zero the ro
29510 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20  wset in reg 1.  
29520 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f    **          Go
29530 74 6f 20 20 20 20 20 20 20 42 20 20 20 20 20 20  to       B      
29540 20 20 20 20 20 20 20 20 20 20 23 20 54 68 65 20            # The 
29550 6c 6f 6f 70 20 69 73 20 66 69 6e 69 73 68 65 64  loop is finished
29560 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
29570 20 20 20 20 20 20 41 3a 20 3c 6c 6f 6f 70 20 62        A: <loop b
29580 6f 64 79 3e 20 20 20 20 20 20 20 20 20 20 20 20  ody>            
29590 20 20 20 20 20 23 20 52 65 74 75 72 6e 20 64 61       # Return da
295a0 74 61 2c 20 77 68 61 74 65 76 65 72 2e 0a 20 20  ta, whatever..  
295b0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
295c0 20 20 20 20 20 52 65 74 75 72 6e 20 20 20 20 20       Return     
295d0 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
295e0 20 23 20 4a 75 6d 70 20 62 61 63 6b 20 74 6f 20   # Jump back to 
295f0 74 68 65 20 47 6f 73 75 62 0a 20 20 20 20 2a 2a  the Gosub.    **
29600 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 42 3a  .    **       B:
29610 20 3c 61 66 74 65 72 20 74 68 65 20 6c 6f 6f 70   <after the loop
29620 3e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a  >.    **.    */.
29630 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
29640 2a 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20 54 68  *pOrWc;    /* Th
29650 65 20 4f 52 2d 63 6c 61 75 73 65 20 62 72 6f 6b  e OR-clause brok
29660 65 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75 62 74  en out into subt
29670 65 72 6d 73 20 2a 2f 0a 20 20 20 20 53 72 63 4c  erms */.    SrcL
29680 69 73 74 20 2a 70 4f 72 54 61 62 3b 20 20 20 20  ist *pOrTab;    
29690 20 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65 64 20     /* Shortened 
296a0 74 61 62 6c 65 20 6c 69 73 74 20 6f 72 20 4f 52  table list or OR
296b0 2d 63 6c 61 75 73 65 20 67 65 6e 65 72 61 74 69  -clause generati
296c0 6f 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20  on */.    Index 
296d0 2a 70 43 6f 76 20 3d 20 30 3b 20 20 20 20 20 20  *pCov = 0;      
296e0 20 20 20 20 20 20 20 2f 2a 20 50 6f 74 65 6e 74         /* Potent
296f0 69 61 6c 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  ial covering ind
29700 65 78 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  ex (or NULL) */.
29710 20 20 20 20 69 6e 74 20 69 43 6f 76 43 75 72 20      int iCovCur 
29720 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
29730 3b 20 20 2f 2a 20 43 75 72 73 6f 72 20 75 73 65  ;  /* Cursor use
29740 64 20 66 6f 72 20 69 6e 64 65 78 20 73 63 61 6e  d for index scan
29750 73 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 0a 20  s (if any) */.. 
29760 20 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e     int regReturn
29770 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
29780 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
29790 52 65 67 69 73 74 65 72 20 75 73 65 64 20 77 69  Register used wi
297a0 74 68 20 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a 20  th OP_Gosub */. 
297b0 20 20 20 69 6e 74 20 72 65 67 52 6f 77 73 65 74     int regRowset
297c0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
297d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
297e0 52 65 67 69 73 74 65 72 20 66 6f 72 20 52 6f 77  Register for Row
297f0 53 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  Set object */.  
29800 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 20 3d    int regRowid =
29810 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
29820 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
29830 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
29840 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74  rowid */.    int
29850 20 69 4c 6f 6f 70 42 6f 64 79 20 3d 20 73 71 6c   iLoopBody = sql
29860 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
29870 6c 28 76 29 3b 20 20 2f 2a 20 53 74 61 72 74 20  l(v);  /* Start 
29880 6f 66 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a  of loop body */.
29890 20 20 20 20 69 6e 74 20 69 52 65 74 49 6e 69 74      int iRetInit
298a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
298b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
298c0 20 41 64 64 72 65 73 73 20 6f 66 20 72 65 67 52   Address of regR
298d0 65 74 75 72 6e 20 69 6e 69 74 20 2a 2f 0a 20 20  eturn init */.  
298e0 20 20 69 6e 74 20 75 6e 74 65 73 74 65 64 54 65    int untestedTe
298f0 72 6d 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  rms = 0;        
29900 20 20 20 20 20 2f 2a 20 53 6f 6d 65 20 74 65 72       /* Some ter
29910 6d 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c  ms not completel
29920 79 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 20 20  y tested */.    
29930 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
29940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29950 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
29960 65 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a  er */.    Expr *
29970 70 41 6e 64 45 78 70 72 20 3d 20 30 3b 20 20 20  pAndExpr = 0;   
29980 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29990 41 6e 20 22 2e 2e 20 41 4e 44 20 28 2e 2e 2e 29  An ".. AND (...)
299a0 22 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  " expression */.
299b0 20 20 20 0a 20 20 20 20 70 54 65 72 6d 20 3d 20     .    pTerm = 
299c0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70  pLevel->plan.u.p
299d0 54 65 72 6d 3b 0a 20 20 20 20 61 73 73 65 72 74  Term;.    assert
299e0 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20  ( pTerm!=0 );.  
299f0 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
29a00 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f  >eOperator==WO_O
29a10 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  R );.    assert(
29a20 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
29a30 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 21   & TERM_ORINFO)!
29a40 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72 57 63 20  =0 );.    pOrWc 
29a50 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49  = &pTerm->u.pOrI
29a60 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 70 4c 65  nfo->wc;.    pLe
29a70 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65 74  vel->op = OP_Ret
29a80 75 72 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  urn;.    pLevel-
29a90 3e 70 31 20 3d 20 72 65 67 52 65 74 75 72 6e 3b  >p1 = regReturn;
29aa0 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 70 20  ..    /* Set up 
29ab0 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 6e  a new SrcList in
29ac0 20 70 4f 72 54 61 62 20 63 6f 6e 74 61 69 6e 69   pOrTab containi
29ad0 6e 67 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ng the table bei
29ae0 6e 67 20 73 63 61 6e 6e 65 64 0a 20 20 20 20 2a  ng scanned.    *
29af0 2a 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 20 69  * by this loop i
29b00 6e 20 74 68 65 20 61 5b 30 5d 20 73 6c 6f 74 20  n the a[0] slot 
29b10 61 6e 64 20 61 6c 6c 20 6e 6f 74 52 65 61 64 79  and all notReady
29b20 20 74 61 62 6c 65 73 20 69 6e 20 61 5b 31 2e 2e   tables in a[1..
29b30 5d 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20  ] slots..    ** 
29b40 54 68 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65  This becomes the
29b50 20 53 72 63 4c 69 73 74 20 69 6e 20 74 68 65 20   SrcList in the 
29b60 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 20 74  recursive call t
29b70 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
29b80 67 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  gin()..    */.  
29b90 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c    if( pWInfo->nL
29ba0 65 76 65 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20  evel>1 ){.      
29bb0 69 6e 74 20 6e 4e 6f 74 52 65 61 64 79 3b 20 20  int nNotReady;  
29bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29bd0 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
29be0 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73 20  notReady tables 
29bf0 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
29c00 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 6f 72  SrcList_item *or
29c10 69 67 53 72 63 3b 20 20 20 20 20 2f 2a 20 4f 72  igSrc;     /* Or
29c20 69 67 69 6e 61 6c 20 6c 69 73 74 20 6f 66 20 74  iginal list of t
29c30 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e  ables */.      n
29c40 4e 6f 74 52 65 61 64 79 20 3d 20 70 57 49 6e 66  NotReady = pWInf
29c50 6f 2d 3e 6e 4c 65 76 65 6c 20 2d 20 69 4c 65 76  o->nLevel - iLev
29c60 65 6c 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 4f  el - 1;.      pO
29c70 72 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 74  rTab = sqlite3St
29c80 61 63 6b 41 6c 6c 6f 63 52 61 77 28 70 50 61 72  ackAllocRaw(pPar
29c90 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  se->db,.        
29ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29cb0 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4f 72 54      sizeof(*pOrT
29cc0 61 62 29 2b 20 6e 4e 6f 74 52 65 61 64 79 2a 73  ab)+ nNotReady*s
29cd0 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b  izeof(pOrTab->a[
29ce0 30 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  0]));.      if( 
29cf0 70 4f 72 54 61 62 3d 3d 30 20 29 20 72 65 74 75  pOrTab==0 ) retu
29d00 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 20 20 20  rn notReady;.   
29d10 20 20 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f     pOrTab->nAllo
29d20 63 20 3d 20 28 69 31 36 29 28 6e 4e 6f 74 52 65  c = (i16)(nNotRe
29d30 61 64 79 20 2b 20 31 29 3b 0a 20 20 20 20 20 20  ady + 1);.      
29d40 70 4f 72 54 61 62 2d 3e 6e 53 72 63 20 3d 20 70  pOrTab->nSrc = p
29d50 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20  OrTab->nAlloc;. 
29d60 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 72 54       memcpy(pOrT
29d70 61 62 2d 3e 61 2c 20 70 54 61 62 49 74 65 6d 2c  ab->a, pTabItem,
29d80 20 73 69 7a 65 6f 66 28 2a 70 54 61 62 49 74 65   sizeof(*pTabIte
29d90 6d 29 29 3b 0a 20 20 20 20 20 20 6f 72 69 67 53  m));.      origS
29da0 72 63 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  rc = pWInfo->pTa
29db0 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  bList->a;.      
29dc0 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74  for(k=1; k<=nNot
29dd0 52 65 61 64 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20  Ready; k++){.   
29de0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4f 72       memcpy(&pOr
29df0 54 61 62 2d 3e 61 5b 6b 5d 2c 20 26 6f 72 69 67  Tab->a[k], &orig
29e00 53 72 63 5b 70 4c 65 76 65 6c 5b 6b 5d 2e 69 46  Src[pLevel[k].iF
29e10 72 6f 6d 5d 2c 20 73 69 7a 65 6f 66 28 70 4f 72  rom], sizeof(pOr
29e20 54 61 62 2d 3e 61 5b 6b 5d 29 29 3b 0a 20 20 20  Tab->a[k]));.   
29e30 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
29e40 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20 70        pOrTab = p
29e50 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b  WInfo->pTabList;
29e60 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
29e70 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 72 6f  nitialize the ro
29e80 77 73 65 74 20 72 65 67 69 73 74 65 72 20 74 6f  wset register to
29e90 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 2e 20 41   contain NULL. A
29ea0 6e 20 53 51 4c 20 4e 55 4c 4c 20 69 73 20 0a 20  n SQL NULL is . 
29eb0 20 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74     ** equivalent
29ec0 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 72 6f 77   to an empty row
29ed0 73 65 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  set..    **.    
29ee0 2a 2a 20 41 6c 73 6f 20 69 6e 69 74 69 61 6c 69  ** Also initiali
29ef0 7a 65 20 72 65 67 52 65 74 75 72 6e 20 74 6f 20  ze regReturn to 
29f00 63 6f 6e 74 61 69 6e 20 74 68 65 20 61 64 64 72  contain the addr
29f10 65 73 73 20 6f 66 20 74 68 65 20 69 6e 73 74 72  ess of the instr
29f20 75 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 69  uction .    ** i
29f30 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
29f40 77 69 6e 67 20 74 68 65 20 4f 50 5f 52 65 74 75  wing the OP_Retu
29f50 72 6e 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  rn at the bottom
29f60 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 54 68   of the loop. Th
29f70 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 72 65 71  is.    ** is req
29f80 75 69 72 65 64 20 69 6e 20 61 20 66 65 77 20 6f  uired in a few o
29f90 62 73 63 75 72 65 20 4c 45 46 54 20 4a 4f 49 4e  bscure LEFT JOIN
29fa0 20 63 61 73 65 73 20 77 68 65 72 65 20 63 6f 6e   cases where con
29fb0 74 72 6f 6c 20 6a 75 6d 70 73 0a 20 20 20 20 2a  trol jumps.    *
29fc0 2a 20 6f 76 65 72 20 74 68 65 20 74 6f 70 20 6f  * over the top o
29fd0 66 20 74 68 65 20 6c 6f 6f 70 20 69 6e 74 6f 20  f the loop into 
29fe0 74 68 65 20 62 6f 64 79 20 6f 66 20 69 74 2e 20  the body of it. 
29ff0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
2a000 20 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74   .    ** correct
2a010 20 72 65 73 70 6f 6e 73 65 20 66 6f 72 20 74 68   response for th
2a020 65 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63 6f  e end-of-loop co
2a030 64 65 20 28 74 68 65 20 4f 50 5f 52 65 74 75 72  de (the OP_Retur
2a040 6e 29 20 69 73 20 74 6f 20 0a 20 20 20 20 2a 2a  n) is to .    **
2a050 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   fall through to
2a060 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
2a070 63 74 69 6f 6e 2c 20 6a 75 73 74 20 61 73 20 61  ction, just as a
2a080 6e 20 4f 50 5f 4e 65 78 74 20 64 6f 65 73 20 69  n OP_Next does i
2a090 66 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 20  f.    ** called 
2a0a0 6f 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69  on an uninitiali
2a0b0 7a 65 64 20 63 75 72 73 6f 72 2e 0a 20 20 20 20  zed cursor..    
2a0c0 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 63 74 72  */.    if( (wctr
2a0d0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44  lFlags & WHERE_D
2a0e0 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30  UPLICATES_OK)==0
2a0f0 20 29 7b 0a 20 20 20 20 20 20 72 65 67 52 6f 77   ){.      regRow
2a100 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  set = ++pParse->
2a110 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 52  nMem;.      regR
2a120 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  owid = ++pParse-
2a130 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
2a140 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2a150 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65  , OP_Null, 0, re
2a160 67 52 6f 77 73 65 74 29 3b 0a 20 20 20 20 7d 0a  gRowset);.    }.
2a170 20 20 20 20 69 52 65 74 49 6e 69 74 20 3d 20 73      iRetInit = s
2a180 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2a190 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
2a1a0 30 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a  0, regReturn);..
2a1b0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 72      /* If the or
2a1c0 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c 61  iginal WHERE cla
2a1d0 75 73 65 20 69 73 20 7a 20 6f 66 20 74 68 65 20  use is z of the 
2a1e0 66 6f 72 6d 3a 20 20 28 78 31 20 4f 52 20 78 32  form:  (x1 OR x2
2a1f0 20 4f 52 20 2e 2e 2e 29 20 41 4e 44 20 79 0a 20   OR ...) AND y. 
2a200 20 20 20 2a 2a 20 54 68 65 6e 20 66 6f 72 20 65     ** Then for e
2a210 76 65 72 79 20 74 65 72 6d 20 78 4e 2c 20 65 76  very term xN, ev
2a220 61 6c 75 61 74 65 20 61 73 20 74 68 65 20 73 75  aluate as the su
2a230 62 65 78 70 72 65 73 73 69 6f 6e 3a 20 78 4e 20  bexpression: xN 
2a240 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 20 54 68 61  AND z.    ** Tha
2a250 74 20 77 61 79 2c 20 74 65 72 6d 73 20 69 6e 20  t way, terms in 
2a260 79 20 74 68 61 74 20 61 72 65 20 66 61 63 74 6f  y that are facto
2a270 72 65 64 20 69 6e 74 6f 20 74 68 65 20 64 69 73  red into the dis
2a280 6a 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 0a 20 20  junction will.  
2a290 20 20 2a 2a 20 62 65 20 70 69 63 6b 65 64 20 75    ** be picked u
2a2a0 70 20 62 79 20 74 68 65 20 72 65 63 75 72 73 69  p by the recursi
2a2b0 76 65 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ve calls to sqli
2a2c0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
2a2d0 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20  below..    **.  
2a2e0 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 65    ** Actually, e
2a2f0 61 63 68 20 73 75 62 65 78 70 72 65 73 73 69 6f  ach subexpressio
2a300 6e 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 74  n is converted t
2a310 6f 20 22 78 4e 20 41 4e 44 20 77 22 20 77 68 65  o "xN AND w" whe
2a320 72 65 20 77 20 69 73 0a 20 20 20 20 2a 2a 20 74  re w is.    ** t
2a330 68 65 20 22 69 6e 74 65 72 65 73 74 69 6e 67 22  he "interesting"
2a340 20 74 65 72 6d 73 20 6f 66 20 7a 20 2d 20 74 65   terms of z - te
2a350 72 6d 73 20 74 68 61 74 20 64 69 64 20 6e 6f 74  rms that did not
2a360 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68   originate in th
2a370 65 0a 20 20 20 20 2a 2a 20 4f 4e 20 6f 72 20 55  e.    ** ON or U
2a380 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61  SING clause of a
2a390 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61 6e 64 20   LEFT JOIN, and 
2a3a0 74 65 72 6d 73 20 74 68 61 74 20 61 72 65 20 75  terms that are u
2a3b0 73 61 62 6c 65 20 61 73 20 0a 20 20 20 20 2a 2a  sable as .    **
2a3c0 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f   indices..    */
2a3d0 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e 6e 54  .    if( pWC->nT
2a3e0 65 72 6d 3e 31 20 29 7b 0a 20 20 20 20 20 20 69  erm>1 ){.      i
2a3f0 6e 74 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20  nt iTerm;.      
2a400 66 6f 72 28 69 54 65 72 6d 3d 30 3b 20 69 54 65  for(iTerm=0; iTe
2a410 72 6d 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69  rm<pWC->nTerm; i
2a420 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
2a430 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
2a440 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78  WC->a[iTerm].pEx
2a450 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pr;.        if( 
2a460 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2a470 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
2a480 69 6e 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  in) ) continue;.
2a490 20 20 20 20 20 20 20 20 69 66 28 20 70 57 43 2d          if( pWC-
2a4a0 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67  >a[iTerm].wtFlag
2a4b0 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41  s & (TERM_VIRTUA
2a4c0 4c 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 20 29  L|TERM_ORINFO) )
2a4d0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2a4e0 20 20 20 69 66 28 20 28 70 57 43 2d 3e 61 5b 69     if( (pWC->a[i
2a4f0 54 65 72 6d 5d 2e 65 4f 70 65 72 61 74 6f 72 20  Term].eOperator 
2a500 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30 20 29 20 63  & WO_ALL)==0 ) c
2a510 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2a520 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
2a530 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e  ExprDup(pParse->
2a540 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  db, pExpr, 0);. 
2a550 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 20         pAndExpr 
2a560 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
2a570 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 6e  (pParse->db, pAn
2a580 64 45 78 70 72 2c 20 70 45 78 70 72 29 3b 0a 20  dExpr, pExpr);. 
2a590 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2a5a0 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20   pAndExpr ){.   
2a5b0 20 20 20 20 20 70 41 6e 64 45 78 70 72 20 3d 20       pAndExpr = 
2a5c0 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
2a5d0 72 73 65 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20  rse, TK_AND, 0, 
2a5e0 70 41 6e 64 45 78 70 72 2c 20 30 29 3b 0a 20 20  pAndExpr, 0);.  
2a5f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
2a600 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f   for(ii=0; ii<pO
2a610 72 57 63 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b  rWc->nTerm; ii++
2a620 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
2a630 72 6d 20 2a 70 4f 72 54 65 72 6d 20 3d 20 26 70  rm *pOrTerm = &p
2a640 4f 72 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20  OrWc->a[ii];.   
2a650 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
2a660 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
2a670 20 7c 7c 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70   || pOrTerm->eOp
2a680 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 29  erator==WO_AND )
2a690 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 49  {.        WhereI
2a6a0 6e 66 6f 20 2a 70 53 75 62 57 49 6e 66 6f 3b 20  nfo *pSubWInfo; 
2a6b0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f           /* Info
2a6c0 20 66 6f 72 20 73 69 6e 67 6c 65 20 4f 52 2d 74   for single OR-t
2a6d0 65 72 6d 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20  erm scan */.    
2a6e0 20 20 20 20 45 78 70 72 20 2a 70 4f 72 45 78 70      Expr *pOrExp
2a6f0 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  r = pOrTerm->pEx
2a700 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pr;.        if( 
2a710 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20 20  pAndExpr ){.    
2a720 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 2d 3e        pAndExpr->
2a730 70 4c 65 66 74 20 3d 20 70 4f 72 45 78 70 72 3b  pLeft = pOrExpr;
2a740 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72 45 78  .          pOrEx
2a750 70 72 20 3d 20 70 41 6e 64 45 78 70 72 3b 0a 20  pr = pAndExpr;. 
2a760 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a770 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
2a780 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74   table entries t
2a790 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20 70  hat match term p
2a7a0 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20  OrTerm. */.     
2a7b0 20 20 20 70 53 75 62 57 49 6e 66 6f 20 3d 20 73     pSubWInfo = s
2a7c0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2a7d0 28 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c  (pParse, pOrTab,
2a7e0 20 70 4f 72 45 78 70 72 2c 20 30 2c 20 30 2c 0a   pOrExpr, 0, 0,.
2a7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a800 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 4f 4d          WHERE_OM
2a810 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 20 7c 20  IT_OPEN_CLOSE | 
2a820 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20 7c  WHERE_AND_ONLY |
2a830 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a840 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 46           WHERE_F
2a850 4f 52 43 45 5f 54 41 42 4c 45 20 7c 20 57 48 45  ORCE_TABLE | WHE
2a860 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
2a870 2c 20 69 43 6f 76 43 75 72 29 3b 0a 20 20 20 20  , iCovCur);.    
2a880 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
2a890 57 49 6e 66 6f 20 7c 7c 20 70 50 61 72 73 65 2d  WInfo || pParse-
2a8a0 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d  >nErr || pParse-
2a8b0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
2a8c0 64 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  d );.        if(
2a8d0 20 70 53 75 62 57 49 6e 66 6f 20 29 7b 0a 20 20   pSubWInfo ){.  
2a8e0 20 20 20 20 20 20 20 20 57 68 65 72 65 4c 65 76          WhereLev
2a8f0 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 20 20 20 20  el *pLvl;.      
2a900 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63      explainOneSc
2a910 61 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  an(.            
2a920 20 20 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62    pParse, pOrTab
2a930 2c 20 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b  , &pSubWInfo->a[
2a940 30 5d 2c 20 69 4c 65 76 65 6c 2c 20 70 4c 65 76  0], iLevel, pLev
2a950 65 6c 2d 3e 69 46 72 6f 6d 2c 20 30 0a 20 20 20  el->iFrom, 0.   
2a960 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
2a970 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c      if( (wctrlFl
2a980 61 67 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c  ags & WHERE_DUPL
2a990 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b  ICATES_OK)==0 ){
2a9a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
2a9b0 20 69 53 65 74 20 3d 20 28 28 69 69 3d 3d 70 4f   iSet = ((ii==pO
2a9c0 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31  rWc->nTerm-1)?-1
2a9d0 3a 69 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  :ii);.          
2a9e0 20 20 69 6e 74 20 72 3b 0a 20 20 20 20 20 20 20    int r;.       
2a9f0 20 20 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33       r = sqlite3
2aa00 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
2aa10 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 49 74  n(pParse, pTabIt
2aa20 65 6d 2d 3e 70 54 61 62 2c 20 2d 31 2c 20 69 43  em->pTab, -1, iC
2aa30 75 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ur, .           
2aa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
2aa60 67 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20 20  gRowid, 0);.    
2aa70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2aa80 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
2aa90 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 2c 20 72  OP_RowSetTest, r
2aaa0 65 67 52 6f 77 73 65 74 2c 0a 20 20 20 20 20 20  egRowset,.      
2aab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aac0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2aad0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2aae0 72 28 76 29 2b 32 2c 20 72 2c 20 69 53 65 74 29  r(v)+2, r, iSet)
2aaf0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2ab00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2ab10 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2ab20 47 6f 73 75 62 2c 20 72 65 67 52 65 74 75 72 6e  Gosub, regReturn
2ab30 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20  , iLoopBody);.. 
2ab40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2ab50 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  pSubWInfo->untes
2ab60 74 65 64 54 65 72 6d 73 20 66 6c 61 67 20 6d 65  tedTerms flag me
2ab70 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 4f 52  ans that this OR
2ab80 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20   term.          
2ab90 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 6f 6e 65  ** contained one
2aba0 20 6f 72 20 6d 6f 72 65 20 41 4e 44 20 74 65 72   or more AND ter
2abb0 6d 20 66 72 6f 6d 20 61 20 6e 6f 74 52 65 61 64  m from a notRead
2abc0 79 20 74 61 62 6c 65 2e 20 20 54 68 65 0a 20 20  y table.  The.  
2abd0 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73          ** terms
2abe0 20 66 72 6f 6d 20 74 68 65 20 6e 6f 74 52 65 61   from the notRea
2abf0 64 79 20 74 61 62 6c 65 20 63 6f 75 6c 64 20 6e  dy table could n
2ac00 6f 74 20 62 65 20 74 65 73 74 65 64 20 61 6e 64  ot be tested and
2ac10 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20   will.          
2ac20 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 74 65  ** need to be te
2ac30 73 74 65 64 20 6c 61 74 65 72 2e 0a 20 20 20 20  sted later..    
2ac40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2ac50 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f     if( pSubWInfo
2ac60 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ->untestedTerms 
2ac70 29 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ) untestedTerms 
2ac80 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  = 1;..          
2ac90 2f 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65  /* If all of the
2aca0 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65   OR-connected te
2acb0 72 6d 73 20 61 72 65 20 6f 70 74 69 6d 69 7a 65  rms are optimize
2acc0 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  d using the same
2acd0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  .          ** in
2ace0 64 65 78 2c 20 61 6e 64 20 74 68 65 20 69 6e 64  dex, and the ind
2acf0 65 78 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69  ex is opened usi
2ad00 6e 67 20 74 68 65 20 73 61 6d 65 20 63 75 72 73  ng the same curs
2ad10 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20  or number.      
2ad20 20 20 20 20 2a 2a 20 62 79 20 65 61 63 68 20 63      ** by each c
2ad30 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68  all to sqlite3Wh
2ad40 65 72 65 42 65 67 69 6e 28 29 20 6d 61 64 65 20  ereBegin() made 
2ad50 62 79 20 74 68 69 73 20 6c 6f 6f 70 2c 20 69 74  by this loop, it
2ad60 20 6d 61 79 0a 20 20 20 20 20 20 20 20 20 20 2a   may.          *
2ad70 2a 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  * be possible to
2ad80 20 75 73 65 20 74 68 61 74 20 69 6e 64 65 78 20   use that index 
2ad90 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  as a covering in
2ada0 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  dex..          *
2adb0 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  *.          ** I
2adc0 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  f the call to sq
2add0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2ade0 29 20 61 62 6f 76 65 20 72 65 73 75 6c 74 65 64  ) above resulted
2adf0 20 69 6e 20 61 20 73 63 61 6e 20 74 68 61 74 0a   in a scan that.
2ae00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
2ae10 73 20 61 6e 20 69 6e 64 65 78 2c 20 61 6e 64 20  s an index, and 
2ae20 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20 74  this is either t
2ae30 68 65 20 66 69 72 73 74 20 4f 52 2d 63 6f 6e 6e  he first OR-conn
2ae40 65 63 74 65 64 20 74 65 72 6d 0a 20 20 20 20 20  ected term.     
2ae50 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
2ae60 64 20 6f 72 20 74 68 65 20 69 6e 64 65 78 20 69  d or the index i
2ae70 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
2ae80 61 74 20 75 73 65 64 20 62 79 20 61 6c 6c 20 70  at used by all p
2ae90 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20  revious.        
2aea0 20 20 2a 2a 20 74 65 72 6d 73 2c 20 73 65 74 20    ** terms, set 
2aeb0 70 43 6f 76 20 74 6f 20 74 68 65 20 63 61 6e 64  pCov to the cand
2aec0 69 64 61 74 65 20 63 6f 76 65 72 69 6e 67 20 69  idate covering i
2aed0 6e 64 65 78 2e 20 4f 74 68 65 72 77 69 73 65 2c  ndex. Otherwise,
2aee0 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 20 20   set .          
2aef0 2a 2a 20 70 43 6f 76 20 74 6f 20 4e 55 4c 4c 20  ** pCov to NULL 
2af00 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
2af10 20 6e 6f 20 63 61 6e 64 69 64 61 74 65 20 63 6f   no candidate co
2af20 76 65 72 69 6e 67 20 69 6e 64 65 78 20 77 69 6c  vering index wil
2af30 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  l .          ** 
2af40 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 20 20  be available..  
2af50 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2af60 20 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 53 75       pLvl = &pSu
2af70 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 3b 0a 20 20  bWInfo->a[0];.  
2af80 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4c 76          if( (pLv
2af90 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
2afa0 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
2afb0 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  !=0.           &
2afc0 26 20 28 70 4c 76 6c 2d 3e 70 6c 61 6e 2e 77 73  & (pLvl->plan.ws
2afd0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 45  Flags & WHERE_TE
2afe0 4d 50 5f 49 4e 44 45 58 29 3d 3d 30 0a 20 20 20  MP_INDEX)==0.   
2aff0 20 20 20 20 20 20 20 20 26 26 20 28 69 69 3d 3d          && (ii==
2b000 30 20 7c 7c 20 70 4c 76 6c 2d 3e 70 6c 61 6e 2e  0 || pLvl->plan.
2b010 75 2e 70 49 64 78 3d 3d 70 43 6f 76 29 0a 20 20  u.pIdx==pCov).  
2b020 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2b030 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2b040 4c 76 6c 2d 3e 69 49 64 78 43 75 72 3d 3d 69 43  Lvl->iIdxCur==iC
2b050 6f 76 43 75 72 20 29 3b 0a 20 20 20 20 20 20 20  ovCur );.       
2b060 20 20 20 20 20 70 43 6f 76 20 3d 20 70 4c 76 6c       pCov = pLvl
2b070 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20  ->plan.u.pIdx;. 
2b080 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2b090 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 76              pCov
2b0a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2b0b0 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  }..          /* 
2b0c0 46 69 6e 69 73 68 20 74 68 65 20 6c 6f 6f 70 20  Finish the loop 
2b0d0 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e  through table en
2b0e0 74 72 69 65 73 20 74 68 61 74 20 6d 61 74 63 68  tries that match
2b0f0 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a   term pOrTerm. *
2b100 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  /.          sqli
2b110 74 65 33 57 68 65 72 65 45 6e 64 28 70 53 75 62  te3WhereEnd(pSub
2b120 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
2b130 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2b140 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43      pLevel->u.pC
2b150 6f 76 69 64 78 20 3d 20 70 43 6f 76 3b 0a 20 20  ovidx = pCov;.  
2b160 20 20 69 66 28 20 70 43 6f 76 20 29 20 70 4c 65    if( pCov ) pLe
2b170 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69  vel->iIdxCur = i
2b180 43 6f 76 43 75 72 3b 0a 20 20 20 20 69 66 28 20  CovCur;.    if( 
2b190 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20 20  pAndExpr ){.    
2b1a0 20 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66    pAndExpr->pLef
2b1b0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  t = 0;.      sql
2b1c0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
2b1d0 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 6e 64 45  Parse->db, pAndE
2b1e0 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  xpr);.    }.    
2b1f0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2b200 65 50 31 28 76 2c 20 69 52 65 74 49 6e 69 74 2c  eP1(v, iRetInit,
2b210 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2b220 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20  entAddr(v));.   
2b230 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2b240 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
2b250 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  , pLevel->addrBr
2b260 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  k);.    sqlite3V
2b270 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
2b280 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a  v, iLoopBody);..
2b290 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
2b2a0 6e 4c 65 76 65 6c 3e 31 20 29 20 73 71 6c 69 74  nLevel>1 ) sqlit
2b2b0 65 33 53 74 61 63 6b 46 72 65 65 28 70 50 61 72  e3StackFree(pPar
2b2c0 73 65 2d 3e 64 62 2c 20 70 4f 72 54 61 62 29 3b  se->db, pOrTab);
2b2d0 0a 20 20 20 20 69 66 28 20 21 75 6e 74 65 73 74  .    if( !untest
2b2e0 65 64 54 65 72 6d 73 20 29 20 64 69 73 61 62 6c  edTerms ) disabl
2b2f0 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54  eTerm(pLevel, pT
2b300 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  erm);.  }else.#e
2b310 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
2b320 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
2b330 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20  ION */..  {.    
2b340 2f 2a 20 43 61 73 65 20 35 3a 20 20 54 68 65 72  /* Case 5:  Ther
2b350 65 20 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69  e is no usable i
2b360 6e 64 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64  ndex.  We must d
2b370 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20  o a complete.   
2b380 20 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 61   **          sca
2b390 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  n of the entire 
2b3a0 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
2b3b0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
2b3c0 38 20 61 53 74 65 70 5b 5d 20 3d 20 7b 20 4f 50  8 aStep[] = { OP
2b3d0 5f 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76 20 7d  _Next, OP_Prev }
2b3e0 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
2b3f0 73 74 20 75 38 20 61 53 74 61 72 74 5b 5d 20 3d  st u8 aStart[] =
2b400 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 4f 50   { OP_Rewind, OP
2b410 5f 4c 61 73 74 20 7d 3b 0a 20 20 20 20 61 73 73  _Last };.    ass
2b420 65 72 74 28 20 62 52 65 76 3d 3d 30 20 7c 7c 20  ert( bRev==0 || 
2b430 62 52 65 76 3d 3d 31 20 29 3b 0a 20 20 20 20 61  bRev==1 );.    a
2b440 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65  ssert( omitTable
2b450 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 65 76 65  ==0 );.    pLeve
2b460 6c 2d 3e 6f 70 20 3d 20 61 53 74 65 70 5b 62 52  l->op = aStep[bR
2b470 65 76 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ev];.    pLevel-
2b480 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20  >p1 = iCur;.    
2b490 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b  pLevel->p2 = 1 +
2b4a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2b4b0 70 32 28 76 2c 20 61 53 74 61 72 74 5b 62 52 65  p2(v, aStart[bRe
2b4c0 76 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72  v], iCur, addrBr
2b4d0 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  k);.    pLevel->
2b4e0 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54  p5 = SQLITE_STMT
2b4f0 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f  STATUS_FULLSCAN_
2b500 53 54 45 50 3b 0a 20 20 7d 0a 20 20 6e 6f 74 52  STEP;.  }.  notR
2b510 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b  eady &= ~getMask
2b520 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20  (pWC->pMaskSet, 
2b530 69 43 75 72 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73  iCur);..  /* Ins
2b540 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74  ert code to test
2b550 20 65 76 65 72 79 20 73 75 62 65 78 70 72 65 73   every subexpres
2b560 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65  sion that can be
2b570 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a   completely.  **
2b580 20 63 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20   computed using 
2b590 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 20  the current set 
2b5a0 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  of tables..  **.
2b5b0 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54    ** IMPLEMENTAT
2b5c0 49 4f 4e 2d 4f 46 3a 20 52 2d 34 39 35 32 35 2d  ION-OF: R-49525-
2b5d0 35 30 39 33 35 20 54 65 72 6d 73 20 74 68 61 74  50935 Terms that
2b5e0 20 63 61 6e 6e 6f 74 20 62 65 20 73 61 74 69 73   cannot be satis
2b5f0 66 69 65 64 20 74 68 72 6f 75 67 68 0a 20 20 2a  fied through.  *
2b600 2a 20 74 68 65 20 75 73 65 20 6f 66 20 69 6e 64  * the use of ind
2b610 69 63 65 73 20 62 65 63 6f 6d 65 20 74 65 73 74  ices become test
2b620 73 20 74 68 61 74 20 61 72 65 20 65 76 61 6c 75  s that are evalu
2b630 61 74 65 64 20 61 67 61 69 6e 73 74 20 65 61 63  ated against eac
2b640 68 20 72 6f 77 20 6f 66 0a 20 20 2a 2a 20 74 68  h row of.  ** th
2b650 65 20 72 65 6c 65 76 61 6e 74 20 69 6e 70 75 74  e relevant input
2b660 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
2b670 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
2b680 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  , j=pWC->nTerm; 
2b690 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b  j>0; j--, pTerm+
2b6a0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
2b6b0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
2b6c0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
2b6d0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
2b6e0 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 30 35 37 35   /* IMP: R-30575
2b6f0 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 74 65  -11662 */.    te
2b700 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
2b710 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  tFlags & TERM_CO
2b720 44 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  DED );.    if( p
2b730 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
2b740 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45  (TERM_VIRTUAL|TE
2b750 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74  RM_CODED) ) cont
2b760 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70  inue;.    if( (p
2b770 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
2b780 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  & notReady)!=0 )
2b790 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
2b7a0 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74  ( pWInfo->untest
2b7b0 65 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20  edTerms==0.     
2b7c0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57            && (pW
2b7d0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
2b7e0 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c   & WHERE_ONETABL
2b7f0 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20  E_ONLY)!=0 );.  
2b800 20 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65      pWInfo->unte
2b810 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20  stedTerms = 1;. 
2b820 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2b830 20 20 20 7d 0a 20 20 20 20 70 45 20 3d 20 70 54     }.    pE = pT
2b840 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
2b850 61 73 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b  assert( pE!=0 );
2b860 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
2b870 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45  >iLeftJoin && !E
2b880 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2b890 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  E, EP_FromJoin) 
2b8a0 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  ){.      continu
2b8b0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  e;.    }.    sql
2b8c0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
2b8d0 70 50 61 72 73 65 2c 20 70 45 2c 20 61 64 64 72  pParse, pE, addr
2b8e0 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  Cont, SQLITE_JUM
2b8f0 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 54  PIFNULL);.    pT
2b900 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
2b910 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a  TERM_CODED;.  }.
2b920 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54  .  /* For a LEFT
2b930 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e   OUTER JOIN, gen
2b940 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
2b950 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20  will record the 
2b960 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20 61  fact that.  ** a
2b970 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77 20  t least one row 
2b980 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62  of the right tab
2b990 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64 20 74  le has matched t
2b9a0 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20 20  he left table.  
2b9b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76  .  */.  if( pLev
2b9c0 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b  el->iLeftJoin ){
2b9d0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64  .    pLevel->add
2b9e0 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33  rFirst = sqlite3
2b9f0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2ba00 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
2ba10 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2ba20 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65 76  Integer, 1, pLev
2ba30 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a  el->iLeftJoin);.
2ba40 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2ba50 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46 54  (v, "record LEFT
2ba60 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20   JOIN hit"));.  
2ba70 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
2ba80 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
2ba90 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  .    for(pTerm=p
2baa0 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57  WC->a, j=0; j<pW
2bab0 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70  C->nTerm; j++, p
2bac0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 74  Term++){.      t
2bad0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
2bae0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
2baf0 49 52 54 55 41 4c 20 29 3b 20 20 2f 2a 20 49 4d  IRTUAL );  /* IM
2bb00 50 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32  P: R-30575-11662
2bb10 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
2bb20 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  se( pTerm->wtFla
2bb30 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20  gs & TERM_CODED 
2bb40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  );.      if( pTe
2bb50 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
2bb60 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
2bb70 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
2bb80 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  ue;.      if( (p
2bb90 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
2bba0 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  & notReady)!=0 )
2bbb0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
2bbc0 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74  ( pWInfo->untest
2bbd0 65 64 54 65 72 6d 73 20 29 3b 0a 20 20 20 20 20  edTerms );.     
2bbe0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
2bbf0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
2bc00 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20  t( pTerm->pExpr 
2bc10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2bc20 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
2bc30 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se, pTerm->pExpr
2bc40 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49  , addrCont, SQLI
2bc50 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
2bc60 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
2bc70 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
2bc80 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ED;.    }.  }.  
2bc90 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
2bca0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 69 52  mpReg(pParse, iR
2bcb0 65 6c 65 61 73 65 52 65 67 29 3b 0a 0a 20 20 72  eleaseReg);..  r
2bcc0 65 74 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a  eturn notReady;.
2bcd0 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
2bce0 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  QLITE_TEST)./*.*
2bcf0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2bd00 76 61 72 69 61 62 6c 65 20 68 6f 6c 64 73 20 61  variable holds a
2bd10 20 74 65 78 74 20 64 65 73 63 72 69 70 74 69 6f   text descriptio
2bd20 6e 20 6f 66 20 71 75 65 72 79 20 70 6c 61 6e 20  n of query plan 
2bd30 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 62 79 20  generated.** by 
2bd40 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
2bd50 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57  call to sqlite3W
2bd60 68 65 72 65 42 65 67 69 6e 28 29 2e 20 20 45 61  hereBegin().  Ea
2bd70 63 68 20 63 61 6c 6c 20 74 6f 20 57 68 65 72 65  ch call to Where
2bd80 42 65 67 69 6e 0a 2a 2a 20 6f 76 65 72 77 72 69  Begin.** overwri
2bd90 74 65 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  tes the previous
2bda0 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
2bdb0 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 20  ion is used for 
2bdc0 74 65 73 74 69 6e 67 20 61 6e 64 0a 2a 2a 20 61  testing and.** a
2bdd0 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f  nalysis only..*/
2bde0 0a 63 68 61 72 20 73 71 6c 69 74 65 33 5f 71 75  .char sqlite3_qu
2bdf0 65 72 79 5f 70 6c 61 6e 5b 42 4d 53 2a 32 2a 34  ery_plan[BMS*2*4
2be00 30 5d 3b 20 20 2f 2a 20 54 65 78 74 20 6f 66 20  0];  /* Text of 
2be10 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 73 74 61 74  the join */.stat
2be20 69 63 20 69 6e 74 20 6e 51 50 6c 61 6e 20 3d 20  ic int nQPlan = 
2be30 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2be40 2f 2a 20 4e 65 78 74 20 66 72 65 65 20 73 6c 6f  /* Next free slo
2be50 77 20 69 6e 20 5f 71 75 65 72 79 5f 70 6c 61 6e  w in _query_plan
2be60 5b 5d 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a  [] */..#endif /*
2be70 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a   SQLITE_TEST */.
2be80 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57  ../*.** Free a W
2be90 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
2bea0 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  re.*/.static voi
2beb0 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28  d whereInfoFree(
2bec0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
2bed0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
2bee0 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 57  .  if( ALWAYS(pW
2bef0 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 69 6e 74  Info) ){.    int
2bf00 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
2bf10 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65   i<pWInfo->nLeve
2bf20 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  l; i++){.      s
2bf30 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
2bf40 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 57 49 6e 66  o *pInfo = pWInf
2bf50 6f 2d 3e 61 5b 69 5d 2e 70 49 64 78 49 6e 66 6f  o->a[i].pIdxInfo
2bf60 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66  ;.      if( pInf
2bf70 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  o ){.        /* 
2bf80 61 73 73 65 72 74 28 20 70 49 6e 66 6f 2d 3e 6e  assert( pInfo->n
2bf90 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 3d  eedToFreeIdxStr=
2bfa0 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
2bfb0 46 61 69 6c 65 64 20 29 3b 20 2a 2f 0a 20 20 20  Failed ); */.   
2bfc0 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e       if( pInfo->
2bfd0 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
2bfe0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2bff0 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e 66 6f  lite3_free(pInfo
2c000 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20  ->idxStr);.     
2c010 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
2c020 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
2c030 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Info);.      }. 
2c040 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d       if( pWInfo-
2c050 3e 61 5b 69 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61  >a[i].plan.wsFla
2c060 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f  gs & WHERE_TEMP_
2c070 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 20 20 20  INDEX ){.       
2c080 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 70   Index *pIdx = p
2c090 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 6c 61 6e  WInfo->a[i].plan
2c0a0 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20 20 20 20  .u.pIdx;.       
2c0b0 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20   if( pIdx ){.   
2c0c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
2c0d0 46 72 65 65 28 64 62 2c 20 70 49 64 78 2d 3e 7a  Free(db, pIdx->z
2c0e0 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20 20 20  ColAff);.       
2c0f0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2c100 28 64 62 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  (db, pIdx);.    
2c110 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2c120 20 20 7d 0a 20 20 20 20 77 68 65 72 65 43 6c 61    }.    whereCla
2c130 75 73 65 43 6c 65 61 72 28 70 57 49 6e 66 6f 2d  useClear(pWInfo-
2c140 3e 70 57 43 29 3b 0a 20 20 20 20 73 71 6c 69 74  >pWC);.    sqlit
2c150 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 49  e3DbFree(db, pWI
2c160 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  nfo);.  }.}.../*
2c170 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65  .** Generate the
2c180 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
2c190 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20  e loop used for 
2c1a0 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
2c1b0 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20  cessing..** The 
2c1c0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
2c1d0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
2c1e0 6f 70 61 71 75 65 20 73 74 72 75 63 74 75 72 65  opaque structure
2c1f0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a   that contains.*
2c200 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65  * information ne
2c210 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74  eded to terminat
2c220 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74  e the loop.  Lat
2c230 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  er, the calling 
2c240 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c  routine.** shoul
2c250 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  d invoke sqlite3
2c260 57 68 65 72 65 45 6e 64 28 29 20 77 69 74 68 20  WhereEnd() with 
2c270 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
2c280 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
2c290 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  n.** in order to
2c2a0 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48   complete the WH
2c2b0 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
2c2c0 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssing..**.** If 
2c2d0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
2c2e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
2c2f0 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  turns NULL..**.*
2c300 2a 20 54 68 65 20 62 61 73 69 63 20 69 64 65 61  * The basic idea
2c310 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74   is to do a nest
2c320 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f  ed loop, one loo
2c330 70 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65  p for each table
2c340 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20   in.** the FROM 
2c350 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65  clause of a sele
2c360 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64  ct.  (INSERT and
2c370 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
2c380 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61  ts are the.** sa
2c390 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54 20 77  me as a SELECT w
2c3a0 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  ith only a singl
2c3b0 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  e table in the F
2c3c0 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f  ROM clause.)  Fo
2c3d0 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66  r.** example, if
2c3e0 20 74 68 65 20 53 51 4c 20 69 73 20 74 68 69 73   the SQL is this
2c3f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45  :.**.**       SE
2c400 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20  LECT * FROM t1, 
2c410 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e  t2, t3 WHERE ...
2c420 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65  ;.**.** Then the
2c430 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
2c440 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20  is conceptually 
2c450 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69  like the followi
2c460 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66  ng:.**.**      f
2c470 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74  oreach row1 in t
2c480 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20  1 do       \    
2c490 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  Code generated.*
2c4a0 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  *        foreach
2c4b0 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20   row2 in t2 do  
2c4c0 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74      |-- by sqlit
2c4d0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a  e3WhereBegin().*
2c4e0 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  *          forea
2c4f0 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f  ch row3 in t3 do
2c500 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20     /.**         
2c510 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20     ....**       
2c520 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
2c530 20 20 20 20 20 20 20 20 20 20 20 5c 20 20 20 20             \    
2c540 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  Code generated.*
2c550 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20  *        end    
2c560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c570 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74      |-- by sqlit
2c580 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20  e3WhereEnd().** 
2c590 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
2c5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c5b0 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68   /.**.** Note th
2c5c0 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67  at the loops mig
2c5d0 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64  ht not be nested
2c5e0 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e   in the order in
2c5f0 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61   which they.** a
2c600 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f  ppear in the FRO
2c610 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20 64 69  M clause if a di
2c620 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73  fferent order is
2c630 20 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20   better able to 
2c640 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69  make.** use of i
2c650 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c  ndices.  Note al
2c660 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65  so that when the
2c670 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70   IN operator app
2c680 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57  ears in.** the W
2c690 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20  HERE clause, it 
2c6a0 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20  might result in 
2c6b0 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65  additional neste
2c6c0 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73  d loops for.** s
2c6d0 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20  canning through 
2c6e0 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68  all values on th
2c6f0 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
2c700 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a  e of the IN..**.
2c710 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42 74 72  ** There are Btr
2c720 65 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63  ee cursors assoc
2c730 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20  iated with each 
2c740 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20  table.  t1 uses 
2c750 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72  cursor.** number
2c760 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
2c770 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65  iCursor.  t2 use
2c780 73 20 74 68 65 20 63 75 72 73 6f 72 20 70 54 61  s the cursor pTa
2c790 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72  bList->a[1].iCur
2c7a0 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66  sor..** And so f
2c7b0 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74  orth.  This rout
2c7c0 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ine generates co
2c7d0 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65  de to open those
2c7e0 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a   VDBE cursors.**
2c7f0 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72   and sqlite3Wher
2c800 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73  eEnd() generates
2c810 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f   the code to clo
2c820 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54  se them..**.** T
2c830 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c  he code that sql
2c840 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
2c850 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65   generates leave
2c860 73 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61  s the cursors na
2c870 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69  med.** in pTabLi
2c880 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  st pointing at t
2c890 68 65 69 72 20 61 70 70 72 6f 70 72 69 61 74 65  heir appropriate
2c8a0 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b   entries.  The [
2c8b0 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e  ...] code.** can
2c8c0 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61   use OP_Column a
2c8d0 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f  nd OP_Rowid opco
2c8e0 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72  des on these cur
2c8f0 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a  sors to extract.
2c900 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
2c910 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20   various tables 
2c920 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a  of the loop..**.
2c930 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 20  ** If the WHERE 
2c940 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c  clause is empty,
2c950 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f   the foreach loo
2c960 70 73 20 6d 75 73 74 20 65 61 63 68 20 73 63 61  ps must each sca
2c970 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72  n their.** entir
2c980 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20  e tables.  Thus 
2c990 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e  a three-way join
2c9a0 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70   is an O(N^3) op
2c9b0 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66  eration.  But if
2c9c0 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68  .** the tables h
2c9d0 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20  ave indices and 
2c9e0 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20  there are terms 
2c9f0 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
2ca00 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65  use that.** refe
2ca10 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63  r to those indic
2ca20 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74  es, a complete t
2ca30 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65  able scan can be
2ca40 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65   avoided and the
2ca50 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75  .** code will ru
2ca60 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20  n much faster.  
2ca70 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b  Most of the work
2ca80 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
2ca90 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20   is checking.** 
2caa0 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
2cab0 61 72 65 20 69 6e 64 69 63 65 73 20 74 68 61 74  are indices that
2cac0 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
2cad0 73 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f  speed up the loo
2cae0 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f  p..**.** Terms o
2caf0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
2cb00 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64  se are also used
2cb10 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20   to limit which 
2cb20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a  rows actually.**
2cb30 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20   make it to the 
2cb40 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64  "..." in the mid
2cb50 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  dle of the loop.
2cb60 20 20 41 66 74 65 72 20 65 61 63 68 20 22 66 6f    After each "fo
2cb70 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73  reach",.** terms
2cb80 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2cb90 61 75 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e  ause that use on
2cba0 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74  ly terms in that
2cbb0 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a   loop and outer.
2cbc0 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61  ** loops are eva
2cbd0 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20 66 61  luated and if fa
2cbe0 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  lse a jump is ma
2cbf0 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75  de around all su
2cc00 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65  bsequent.** inne
2cc10 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75  r loops (or arou
2cc20 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20  nd the "..." if 
2cc30 74 68 65 20 74 65 73 74 20 6f 63 63 75 72 73 20  the test occurs 
2cc40 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72  within the inner
2cc50 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a  -.** most loop).
2cc60 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e  **.** OUTER JOIN
2cc70 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72  S.**.** An outer
2cc80 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20   join of tables 
2cc90 74 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e  t1 and t2 is con
2cca0 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61  ceptally coded a
2ccb0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
2ccc0 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31      foreach row1
2ccd0 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20   in t1 do.**    
2cce0 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20    flag = 0.**   
2ccf0 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20     foreach row2 
2cd00 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20  in t2 do.**     
2cd10 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20     start:.**    
2cd20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20        ....**    
2cd30 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a        flag = 1.*
2cd40 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20  *      end.**   
2cd50 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68     if flag==0 th
2cd60 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76  en.**        mov
2cd70 65 20 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f  e the row2 curso
2cd80 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a  r to a null row.
2cd90 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  **        goto s
2cda0 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a  tart.**      fi.
2cdb0 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20  **    end.**.** 
2cdc0 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53 45 20  ORDER BY CLAUSE 
2cdd0 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a  PROCESSING.**.**
2cde0 20 70 4f 72 64 65 72 42 79 20 69 73 20 61 20 70   pOrderBy is a p
2cdf0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52  ointer to the OR
2ce00 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 66  DER BY clause of
2ce10 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
2ce20 65 6e 74 2c 0a 2a 2a 20 69 66 20 74 68 65 72 65  ent,.** if there
2ce30 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65   is one.  If the
2ce40 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
2ce50 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74  Y clause or if t
2ce60 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
2ce70 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e  s called from an
2ce80 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
2ce90 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  E statement, the
2cea0 6e 20 70 4f 72 64 65 72 42 79 20 69 73 20 4e 55  n pOrderBy is NU
2ceb0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  LL..**.** If an 
2cec0 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65  index can be use
2ced0 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 61  d so that the na
2cee0 74 75 72 61 6c 20 6f 75 74 70 75 74 20 6f 72 64  tural output ord
2cef0 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a  er of the table.
2cf00 2a 2a 20 73 63 61 6e 20 69 73 20 63 6f 72 72 65  ** scan is corre
2cf10 63 74 20 66 6f 72 20 74 68 65 20 4f 52 44 45 52  ct for the ORDER
2cf20 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
2cf30 20 74 68 61 74 20 69 6e 64 65 78 20 69 73 20 75   that index is u
2cf40 73 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72  sed and.** the r
2cf50 65 74 75 72 6e 65 64 20 57 68 65 72 65 49 6e 66  eturned WhereInf
2cf60 6f 2e 6e 4f 42 53 61 74 20 66 69 65 6c 64 20 69  o.nOBSat field i
2cf70 73 20 73 65 74 20 74 6f 20 70 4f 72 64 65 72 42  s set to pOrderB
2cf80 79 2d 3e 6e 45 78 70 72 2e 20 20 54 68 69 73 0a  y->nExpr.  This.
2cf90 2a 2a 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ** is an optimiz
2cfa0 61 74 69 6f 6e 20 74 68 61 74 20 70 72 65 76 65  ation that preve
2cfb0 6e 74 73 20 61 6e 20 75 6e 6e 65 63 65 73 73 61  nts an unnecessa
2cfc0 72 79 20 73 6f 72 74 20 6f 66 20 74 68 65 20 72  ry sort of the r
2cfd0 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 69 66 20  esult set.** if 
2cfe0 61 6e 20 69 6e 64 65 78 20 61 70 70 72 6f 70 72  an index appropr
2cff0 69 61 74 65 20 66 6f 72 20 74 68 65 20 4f 52 44  iate for the ORD
2d000 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6c 72  ER BY clause alr
2d010 65 61 64 79 20 65 78 69 73 74 73 2e 0a 2a 2a 0a  eady exists..**.
2d020 2a 2a 20 49 66 20 74 68 65 20 77 68 65 72 65 20  ** If the where 
2d030 63 6c 61 75 73 65 20 6c 6f 6f 70 73 20 63 61 6e  clause loops can
2d040 6e 6f 74 20 62 65 20 61 72 72 61 6e 67 65 64 20  not be arranged 
2d050 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20 63  to provide the c
2d060 6f 72 72 65 63 74 0a 2a 2a 20 6f 75 74 70 75 74  orrect.** output
2d070 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 57 68 65   order, then Whe
2d080 72 65 49 6e 66 6f 2e 6e 4f 42 53 61 74 20 69 73  reInfo.nOBSat is
2d090 20 30 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f   0..*/.WhereInfo
2d0a0 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42 65   *sqlite3WhereBe
2d0b0 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  gin(.  Parse *pP
2d0c0 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
2d0d0 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
2d0e0 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
2d0f0 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a  *pTabList,    /*
2d100 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74   A list of all t
2d110 61 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e  ables to be scan
2d120 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ned */.  Expr *p
2d130 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
2d140 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
2d150 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
2d160 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a   *pOrderBy,   /*
2d170 20 41 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   An ORDER BY cla
2d180 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  use, or NULL */.
2d190 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73    ExprList *pDis
2d1a0 74 69 6e 63 74 2c 20 20 2f 2a 20 54 68 65 20 73  tinct,  /* The s
2d1b0 65 6c 65 63 74 2d 6c 69 73 74 20 66 6f 72 20 44  elect-list for D
2d1c0 49 53 54 49 4e 43 54 20 71 75 65 72 69 65 73 20  ISTINCT queries 
2d1d0 2d 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 75  - or NULL */.  u
2d1e0 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20  16 wctrlFlags,  
2d1f0 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
2d200 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73  he WHERE_* flags
2d210 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69   defined in sqli
2d220 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74  teInt.h */.  int
2d230 20 69 49 64 78 43 75 72 20 20 20 20 20 20 20 20   iIdxCur        
2d240 20 20 20 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f     /* If WHERE_O
2d250 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20  NETABLE_ONLY is 
2d260 73 65 74 2c 20 69 6e 64 65 78 20 63 75 72 73 6f  set, index curso
2d270 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20  r number */.){. 
2d280 20 69 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b   int nByteWInfo;
2d290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2d2a0 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  um. bytes alloca
2d2b0 74 65 64 20 66 6f 72 20 57 68 65 72 65 49 6e 66  ted for WhereInf
2d2c0 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e  o struct */.  in
2d2d0 74 20 6e 54 61 62 4c 69 73 74 3b 20 20 20 20 20  t nTabList;     
2d2e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2d2f0 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
2d300 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20  n pTabList */.  
2d310 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
2d320 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69  o;         /* Wi
2d330 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65  ll become the re
2d340 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
2d350 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
2d360 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
2d370 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54  e->pVdbe;   /* T
2d380 68 65 20 76 69 72 74 75 61 6c 20 64 61 74 61 62  he virtual datab
2d390 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20  ase engine */.  
2d3a0 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
2d3b0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  ;          /* Cu
2d3c0 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
2d3d0 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65  ot yet positione
2d3e0 64 20 2a 2f 0a 20 20 57 68 65 72 65 42 65 73 74  d */.  WhereBest
2d3f0 49 64 78 20 73 57 42 49 3b 20 20 20 20 20 20 20  Idx sWBI;       
2d400 20 20 2f 2a 20 42 65 73 74 20 69 6e 64 65 78 20    /* Best index 
2d410 73 65 61 72 63 68 20 63 6f 6e 74 65 78 74 20 2a  search context *
2d420 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74  /.  WhereMaskSet
2d430 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f   *pMaskSet;    /
2d440 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
2d450 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57   mask set */.  W
2d460 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
2d470 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73  l;        /* A s
2d480 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20 70  ingle level in p
2d490 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20  WInfo->a[] */.  
2d4a0 69 6e 74 20 69 46 72 6f 6d 3b 20 20 20 20 20 20  int iFrom;      
2d4b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2d4c0 72 73 74 20 75 6e 75 73 65 64 20 46 52 4f 4d 20  rst unused FROM 
2d4d0 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 2a  clause element *
2d4e0 2f 0a 20 20 69 6e 74 20 61 6e 64 46 6c 61 67 73  /.  int andFlags
2d4f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2d500 2a 20 41 4e 44 2d 65 64 20 63 6f 6d 62 69 6e 61  * AND-ed combina
2d510 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 70 57 43 2d  tion of all pWC-
2d520 3e 61 5b 5d 2e 77 74 46 6c 61 67 73 20 2a 2f 0a  >a[].wtFlags */.
2d530 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
2d540 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d550 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
2d560 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
2d570 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d580 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
2d590 69 6f 6e 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 56 61  ion */...  /* Va
2d5a0 72 69 61 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a  riable initializ
2d5b0 61 74 69 6f 6e 20 2a 2f 0a 20 20 6d 65 6d 73 65  ation */.  memse
2d5c0 74 28 26 73 57 42 49 2c 20 30 2c 20 73 69 7a 65  t(&sWBI, 0, size
2d5d0 6f 66 28 73 57 42 49 29 29 3b 0a 20 20 73 57 42  of(sWBI));.  sWB
2d5e0 49 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  I.pParse = pPars
2d5f0 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d  e;..  /* The num
2d600 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ber of tables in
2d610 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2d620 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74   is limited by t
2d630 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a  he number of.  *
2d640 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d  * bits in a Bitm
2d650 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74  ask .  */.  test
2d660 63 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d 3e  case( pTabList->
2d670 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69  nSrc==BMS );.  i
2d680 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  f( pTabList->nSr
2d690 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c  c>BMS ){.    sql
2d6a0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2d6b0 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64  rse, "at most %d
2d6c0 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69   tables in a joi
2d6d0 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65  n", BMS);.    re
2d6e0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
2d6f0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2d700 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74  normally generat
2d710 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70  es a nested loop
2d720 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
2d730 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73  in .  ** pTabLis
2d740 74 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 57  t.  But if the W
2d750 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
2d760 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  LY flag is set, 
2d770 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20  then we should. 
2d780 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74   ** only generat
2d790 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66  e code for the f
2d7a0 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54  irst table in pT
2d7b0 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d  abList and assum
2d7c0 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20  e that.  ** any 
2d7d0 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74  cursors associat
2d7e0 65 64 20 77 69 74 68 20 73 75 62 73 65 71 75 65  ed with subseque
2d7f0 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e  nt tables are un
2d800 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
2d810 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28  /.  nTabList = (
2d820 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2d830 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
2d840 29 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74  ) ? 1 : pTabList
2d850 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c  ->nSrc;..  /* Al
2d860 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
2d870 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49  alize the WhereI
2d880 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
2d890 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
2d8a0 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76  he.  ** return v
2d8b0 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61  alue. A single a
2d8c0 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65  llocation is use
2d8d0 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57  d to store the W
2d8e0 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74  hereInfo.  ** st
2d8f0 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e  ruct, the conten
2d900 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e  ts of WhereInfo.
2d910 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c  a[], the WhereCl
2d920 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 20  ause structure. 
2d930 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72   ** and the Wher
2d940 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75  eMaskSet structu
2d950 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43  re. Since WhereC
2d960 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61  lause contains a
2d970 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69  n 8-byte.  ** fi
2d980 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61 73  eld (type Bitmas
2d990 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c  k) it must be al
2d9a0 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79  igned on an 8-by
2d9b0 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20  te boundary on. 
2d9c0 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65   ** some archite
2d9d0 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68  ctures. Hence th
2d9e0 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77  e ROUND8() below
2d9f0 2e 0a 20 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50  ..  */.  db = pP
2da00 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 42 79 74  arse->db;.  nByt
2da10 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28  eWInfo = ROUND8(
2da20 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f  sizeof(WhereInfo
2da30 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73  )+(nTabList-1)*s
2da40 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c  izeof(WhereLevel
2da50 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73  ));.  pWInfo = s
2da60 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
2da70 72 6f 28 64 62 2c 20 0a 20 20 20 20 20 20 6e 42  ro(db, .      nB
2da80 79 74 65 57 49 6e 66 6f 20 2b 20 0a 20 20 20 20  yteWInfo + .    
2da90 20 20 73 69 7a 65 6f 66 28 57 68 65 72 65 43 6c    sizeof(WhereCl
2daa0 61 75 73 65 29 20 2b 0a 20 20 20 20 20 20 73 69  ause) +.      si
2dab0 7a 65 6f 66 28 57 68 65 72 65 4d 61 73 6b 53 65  zeof(WhereMaskSe
2dac0 74 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 64 62  t).  );.  if( db
2dad0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2dae0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
2daf0 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
2db00 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b  .    pWInfo = 0;
2db10 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42  .    goto whereB
2db20 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20  eginError;.  }. 
2db30 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20   pWInfo->nLevel 
2db40 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70 57  = nTabList;.  pW
2db50 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70  Info->pParse = p
2db60 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d  Parse;.  pWInfo-
2db70 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62  >pTabList = pTab
2db80 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  List;.  pWInfo->
2db90 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
2dba0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
2dbb0 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 57 43 20  ;.  pWInfo->pWC 
2dbc0 3d 20 73 57 42 49 2e 70 57 43 20 3d 20 28 57 68  = sWBI.pWC = (Wh
2dbd0 65 72 65 43 6c 61 75 73 65 20 2a 29 26 28 28 75  ereClause *)&((u
2dbe0 38 20 2a 29 70 57 49 6e 66 6f 29 5b 6e 42 79 74  8 *)pWInfo)[nByt
2dbf0 65 57 49 6e 66 6f 5d 3b 0a 20 20 70 57 49 6e 66  eWInfo];.  pWInf
2dc00 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20  o->wctrlFlags = 
2dc10 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57  wctrlFlags;.  pW
2dc20 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72  Info->savedNQuer
2dc30 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e  yLoop = pParse->
2dc40 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 70 4d  nQueryLoop;.  pM
2dc50 61 73 6b 53 65 74 20 3d 20 28 57 68 65 72 65 4d  askSet = (WhereM
2dc60 61 73 6b 53 65 74 2a 29 26 73 57 42 49 2e 70 57  askSet*)&sWBI.pW
2dc70 43 5b 31 5d 3b 0a 20 20 73 57 42 49 2e 61 4c 65  C[1];.  sWBI.aLe
2dc80 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 3b  vel = pWInfo->a;
2dc90 0a 0a 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 74  ..  /* Disable t
2dca0 68 65 20 44 49 53 54 49 4e 43 54 20 6f 70 74 69  he DISTINCT opti
2dcb0 6d 69 7a 61 74 69 6f 6e 20 69 66 20 53 51 4c 49  mization if SQLI
2dcc0 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 20 69  TE_DistinctOpt i
2dcd0 73 20 73 65 74 20 76 69 61 0a 20 20 2a 2a 20 73  s set via.  ** s
2dce0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 74 72 6c  qlite3_test_ctrl
2dcf0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
2dd00 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e  _OPTIMIZATIONS,.
2dd10 2e 2e 29 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74  ..) */.  if( Opt
2dd20 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65  imizationDisable
2dd30 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 69 73  d(db, SQLITE_Dis
2dd40 74 69 6e 63 74 4f 70 74 29 20 29 20 70 44 69 73  tinctOpt) ) pDis
2dd50 74 69 6e 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  tinct = 0;..  /*
2dd60 20 53 70 6c 69 74 20 74 68 65 20 57 48 45 52 45   Split the WHERE
2dd70 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70   clause into sep
2dd80 61 72 61 74 65 20 73 75 62 65 78 70 72 65 73 73  arate subexpress
2dd90 69 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a  ions where each.
2dda0 20 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69    ** subexpressi
2ddb0 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20  on is separated 
2ddc0 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74  by an AND operat
2ddd0 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d  or..  */.  initM
2dde0 61 73 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29  askSet(pMaskSet)
2ddf0 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 49  ;.  whereClauseI
2de00 6e 69 74 28 73 57 42 49 2e 70 57 43 2c 20 70 50  nit(sWBI.pWC, pP
2de10 61 72 73 65 2c 20 70 4d 61 73 6b 53 65 74 2c 20  arse, pMaskSet, 
2de20 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 73  wctrlFlags);.  s
2de30 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f  qlite3ExprCodeCo
2de40 6e 73 74 61 6e 74 73 28 70 50 61 72 73 65 2c 20  nstants(pParse, 
2de50 70 57 68 65 72 65 29 3b 0a 20 20 77 68 65 72 65  pWhere);.  where
2de60 53 70 6c 69 74 28 73 57 42 49 2e 70 57 43 2c 20  Split(sWBI.pWC, 
2de70 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b  pWhere, TK_AND);
2de80 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 31 35 38     /* IMP: R-158
2de90 34 32 2d 35 33 32 39 36 20 2a 2f 0a 20 20 20 20  42-53296 */.    
2dea0 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
2deb0 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61 75  se: a WHERE clau
2dec0 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74  se that is const
2ded0 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20 74  ant.  Evaluate t
2dee0 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69  he.  ** expressi
2def0 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a 75  on and either ju
2df00 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74  mp over all of t
2df10 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20  he code or fall 
2df20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  thru..  */.  if(
2df30 20 70 57 68 65 72 65 20 26 26 20 28 6e 54 61 62   pWhere && (nTab
2df40 4c 69 73 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  List==0 || sqlit
2df50 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
2df60 4e 6f 74 4a 6f 69 6e 28 70 57 68 65 72 65 29 29  NotJoin(pWhere))
2df70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
2df80 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
2df90 65 2c 20 70 57 68 65 72 65 2c 20 70 57 49 6e 66  e, pWhere, pWInf
2dfa0 6f 2d 3e 69 42 72 65 61 6b 2c 20 53 51 4c 49 54  o->iBreak, SQLIT
2dfb0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
2dfc0 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20     pWhere = 0;. 
2dfd0 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20   }..  /* Assign 
2dfe0 61 20 62 69 74 20 66 72 6f 6d 20 74 68 65 20 62  a bit from the b
2dff0 69 74 6d 61 73 6b 20 74 6f 20 65 76 65 72 79 20  itmask to every 
2e000 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d  term in the FROM
2e010 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20   clause..  **.  
2e020 2a 2a 20 57 68 65 6e 20 61 73 73 69 67 6e 69 6e  ** When assignin
2e030 67 20 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73  g bitmask values
2e040 20 74 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   to FROM clause 
2e050 63 75 72 73 6f 72 73 2c 20 69 74 20 6d 75 73 74  cursors, it must
2e060 20 62 65 0a 20 20 2a 2a 20 74 68 65 20 63 61 73   be.  ** the cas
2e070 65 20 74 68 61 74 20 69 66 20 58 20 69 73 20 74  e that if X is t
2e080 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74  he bitmask for t
2e090 68 65 20 4e 2d 74 68 20 46 52 4f 4d 20 63 6c 61  he N-th FROM cla
2e0a0 75 73 65 20 74 65 72 6d 20 74 68 65 6e 0a 20 20  use term then.  
2e0b0 2a 2a 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66  ** the bitmask f
2e0c0 6f 72 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75  or all FROM clau
2e0d0 73 65 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  se terms to the 
2e0e0 6c 65 66 74 20 6f 66 20 74 68 65 20 4e 2d 74 68  left of the N-th
2e0f0 20 74 65 72 6d 0a 20 20 2a 2a 20 69 73 20 28 58   term.  ** is (X
2e100 2d 31 29 2e 20 20 20 41 6e 20 65 78 70 72 65 73  -1).   An expres
2e110 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 4e  sion from the ON
2e120 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46   clause of a LEF
2e130 54 20 4a 4f 49 4e 20 63 61 6e 20 75 73 65 0a 20  T JOIN can use. 
2e140 20 2a 2a 20 69 74 73 20 45 78 70 72 2e 69 52 69   ** its Expr.iRi
2e150 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 76 61 6c  ghtJoinTable val
2e160 75 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 62  ue to find the b
2e170 69 74 6d 61 73 6b 20 6f 66 20 74 68 65 20 72 69  itmask of the ri
2e180 67 68 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f  ght table.  ** o
2e190 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 53 75 62  f the join.  Sub
2e1a0 74 72 61 63 74 69 6e 67 20 6f 6e 65 20 66 72 6f  tracting one fro
2e1b0 6d 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  m the right tabl
2e1c0 65 20 62 69 74 6d 61 73 6b 20 67 69 76 65 73 20  e bitmask gives 
2e1d0 61 0a 20 20 2a 2a 20 62 69 74 6d 61 73 6b 20 66  a.  ** bitmask f
2e1e0 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f  or all tables to
2e1f0 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65   the left of the
2e200 20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20   join.  Knowing 
2e210 74 68 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a  the bitmask.  **
2e220 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
2e230 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 61  to the left of a
2e240 20 6c 65 66 74 20 6a 6f 69 6e 20 69 73 20 69 6d   left join is im
2e250 70 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b 65 74  portant.  Ticket
2e260 20 23 33 30 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a   #3015..  **.  *
2e270 2a 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20  * Configure the 
2e280 57 68 65 72 65 43 6c 61 75 73 65 2e 76 6d 61 73  WhereClause.vmas
2e290 6b 20 76 61 72 69 61 62 6c 65 20 73 6f 20 74 68  k variable so th
2e2a0 61 74 20 62 69 74 73 20 74 68 61 74 20 63 6f 72  at bits that cor
2e2b0 72 65 73 70 6f 6e 64 0a 20 20 2a 2a 20 74 6f 20  respond.  ** to 
2e2c0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75  virtual table cu
2e2d0 72 73 6f 72 73 20 61 72 65 20 73 65 74 2e 20 54  rsors are set. T
2e2e0 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 73  his is used to s
2e2f0 65 6c 65 63 74 69 76 65 6c 79 20 64 69 73 61 62  electively disab
2e300 6c 65 20 0a 20 20 2a 2a 20 74 68 65 20 4f 52 2d  le .  ** the OR-
2e310 74 6f 2d 49 4e 20 74 72 61 6e 73 66 6f 72 6d 61  to-IN transforma
2e320 74 69 6f 6e 20 69 6e 20 65 78 70 72 41 6e 61 6c  tion in exprAnal
2e330 79 7a 65 4f 72 54 65 72 6d 28 29 2e 20 49 74 20  yzeOrTerm(). It 
2e340 69 73 20 6e 6f 74 20 68 65 6c 70 66 75 6c 20 0a  is not helpful .
2e350 20 20 2a 2a 20 77 69 74 68 20 76 69 72 74 75 61    ** with virtua
2e360 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  l tables..  **. 
2e370 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 69   ** Note that bi
2e380 74 6d 61 73 6b 73 20 61 72 65 20 63 72 65 61 74  tmasks are creat
2e390 65 64 20 66 6f 72 20 61 6c 6c 20 70 54 61 62 4c  ed for all pTabL
2e3a0 69 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65 73  ist->nSrc tables
2e3b0 20 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73   in.  ** pTabLis
2e3c0 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 65 20  t, not just the 
2e3d0 66 69 72 73 74 20 6e 54 61 62 4c 69 73 74 20 74  first nTabList t
2e3e0 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69 73 74  ables.  nTabList
2e3f0 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a   is normally.  *
2e400 2a 20 65 71 75 61 6c 20 74 6f 20 70 54 61 62 4c  * equal to pTabL
2e410 69 73 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d 69  ist->nSrc but mi
2e420 67 68 74 20 62 65 20 73 68 6f 72 74 65 6e 65 64  ght be shortened
2e430 20 74 6f 20 31 20 69 66 20 74 68 65 0a 20 20 2a   to 1 if the.  *
2e440 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  * WHERE_ONETABLE
2e450 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65  _ONLY flag is se
2e460 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
2e470 28 20 73 57 42 49 2e 70 57 43 2d 3e 76 6d 61 73  ( sWBI.pWC->vmas
2e480 6b 3d 3d 30 20 26 26 20 70 4d 61 73 6b 53 65 74  k==0 && pMaskSet
2e490 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28  ->n==0 );.  for(
2e4a0 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73  ii=0; ii<pTabLis
2e4b0 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a  t->nSrc; ii++){.
2e4c0 20 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28 70      createMask(p
2e4d0 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73  MaskSet, pTabLis
2e4e0 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72  t->a[ii].iCursor
2e4f0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
2e500 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2e510 42 4c 45 0a 20 20 20 20 69 66 28 20 41 4c 57 41  BLE.    if( ALWA
2e520 59 53 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  YS(pTabList->a[i
2e530 69 5d 2e 70 54 61 62 29 20 26 26 20 49 73 56 69  i].pTab) && IsVi
2e540 72 74 75 61 6c 28 70 54 61 62 4c 69 73 74 2d 3e  rtual(pTabList->
2e550 61 5b 69 69 5d 2e 70 54 61 62 29 20 29 7b 0a 20  a[ii].pTab) ){. 
2e560 20 20 20 20 20 73 57 42 49 2e 70 57 43 2d 3e 76       sWBI.pWC->v
2e570 6d 61 73 6b 20 7c 3d 20 28 28 42 69 74 6d 61 73  mask |= ((Bitmas
2e580 6b 29 31 20 3c 3c 20 69 69 29 3b 0a 20 20 20 20  k)1 << ii);.    
2e590 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66  }.#endif.  }.#if
2e5a0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a  ndef NDEBUG.  {.
2e5b0 20 20 20 20 42 69 74 6d 61 73 6b 20 74 6f 54 68      Bitmask toTh
2e5c0 65 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 66  eLeft = 0;.    f
2e5d0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62  or(ii=0; ii<pTab
2e5e0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b  List->nSrc; ii++
2e5f0 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  ){.      Bitmask
2e600 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61   m = getMask(pMa
2e610 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d  skSet, pTabList-
2e620 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b  >a[ii].iCursor);
2e630 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
2e640 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c 65 66 74 20  m-1)==toTheLeft 
2e650 29 3b 0a 20 20 20 20 20 20 74 6f 54 68 65 4c 65  );.      toTheLe
2e660 66 74 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20  ft |= m;.    }. 
2e670 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
2e680 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74  Analyze all of t
2e690 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
2e6a0 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 65 78  s.  Note that ex
2e6b0 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d 69 67 68  prAnalyze() migh
2e6c0 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65 77 20 76  t.  ** add new v
2e6d0 69 72 74 75 61 6c 20 74 65 72 6d 73 20 6f 6e 74  irtual terms ont
2e6e0 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
2e6f0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
2e700 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77  We do not.  ** w
2e710 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74  ant to analyze t
2e720 68 65 73 65 20 76 69 72 74 75 61 6c 20 74 65 72  hese virtual ter
2e730 6d 73 2c 20 73 6f 20 73 74 61 72 74 20 61 6e 61  ms, so start ana
2e740 6c 79 7a 69 6e 67 20 61 74 20 74 68 65 20 65 6e  lyzing at the en
2e750 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f 72 6b 20  d.  ** and work 
2e760 66 6f 72 77 61 72 64 20 73 6f 20 74 68 61 74 20  forward so that 
2e770 74 68 65 20 61 64 64 65 64 20 76 69 72 74 75 61  the added virtua
2e780 6c 20 74 65 72 6d 73 20 61 72 65 20 6e 65 76 65  l terms are neve
2e790 72 20 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a  r processed..  *
2e7a0 2f 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41  /.  exprAnalyzeA
2e7b0 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20 73 57 42  ll(pTabList, sWB
2e7c0 49 2e 70 57 43 29 3b 0a 20 20 69 66 28 20 64 62  I.pWC);.  if( db
2e7d0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2e7e0 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65  {.    goto where
2e7f0 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a  BeginError;.  }.
2e800 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74  .  /* Check if t
2e810 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c  he DISTINCT qual
2e820 69 66 69 65 72 2c 20 69 66 20 74 68 65 72 65 20  ifier, if there 
2e830 69 73 20 6f 6e 65 2c 20 69 73 20 72 65 64 75 6e  is one, is redun
2e840 64 61 6e 74 2e 20 0a 20 20 2a 2a 20 49 66 20 69  dant. .  ** If i
2e850 74 20 69 73 2c 20 74 68 65 6e 20 73 65 74 20 70  t is, then set p
2e860 44 69 73 74 69 6e 63 74 20 74 6f 20 4e 55 4c 4c  Distinct to NULL
2e870 20 61 6e 64 20 57 68 65 72 65 49 6e 66 6f 2e 65   and WhereInfo.e
2e880 44 69 73 74 69 6e 63 74 20 74 6f 0a 20 20 2a 2a  Distinct to.  **
2e890 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
2e8a0 55 4e 49 51 55 45 20 74 6f 20 74 65 6c 6c 20 74  UNIQUE to tell t
2e8b0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 67 6e  he caller to ign
2e8c0 6f 72 65 20 74 68 65 20 44 49 53 54 49 4e 43 54  ore the DISTINCT
2e8d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 69  ..  */.  if( pDi
2e8e0 73 74 69 6e 63 74 20 26 26 20 69 73 44 69 73 74  stinct && isDist
2e8f0 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 70 50  inctRedundant(pP
2e900 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
2e910 73 57 42 49 2e 70 57 43 2c 20 70 44 69 73 74 69  sWBI.pWC, pDisti
2e920 6e 63 74 29 20 29 7b 0a 20 20 20 20 70 44 69 73  nct) ){.    pDis
2e930 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 70  tinct = 0;.    p
2e940 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
2e950 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
2e960 54 5f 55 4e 49 51 55 45 3b 0a 20 20 7d 0a 0a 20  T_UNIQUE;.  }.. 
2e970 20 2f 2a 20 43 68 6f 73 65 20 74 68 65 20 62 65   /* Chose the be
2e980 73 74 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  st index to use 
2e990 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69  for each table i
2e9a0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2e9b0 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
2e9c0 73 20 6c 6f 6f 70 20 66 69 6c 6c 73 20 69 6e 20  s loop fills in 
2e9d0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  the following fi
2e9e0 65 6c 64 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  elds:.  **.  ** 
2e9f0 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 49    pWInfo->a[].pI
2ea00 64 78 20 20 20 20 20 20 54 68 65 20 69 6e 64 65  dx      The inde
2ea10 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69  x to use for thi
2ea20 73 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 6c  s level of the l
2ea30 6f 6f 70 2e 0a 20 20 2a 2a 20 20 20 70 57 49 6e  oop..  **   pWIn
2ea40 66 6f 2d 3e 61 5b 5d 2e 77 73 46 6c 61 67 73 20  fo->a[].wsFlags 
2ea50 20 20 57 48 45 52 45 5f 78 78 78 20 66 6c 61 67    WHERE_xxx flag
2ea60 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
2ea70 68 20 70 49 64 78 0a 20 20 2a 2a 20 20 20 70 57  h pIdx.  **   pW
2ea80 49 6e 66 6f 2d 3e 61 5b 5d 2e 6e 45 71 20 20 20  Info->a[].nEq   
2ea90 20 20 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f      The number o
2eaa0 66 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73  f == and IN cons
2eab0 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 20 20 70  traints.  **   p
2eac0 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 46 72 6f 6d  WInfo->a[].iFrom
2ead0 20 20 20 20 20 57 68 69 63 68 20 74 65 72 6d 20       Which term 
2eae0 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
2eaf0 73 65 20 69 73 20 62 65 69 6e 67 20 63 6f 64 65  se is being code
2eb00 64 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  d.  **   pWInfo-
2eb10 3e 61 5b 5d 2e 69 54 61 62 43 75 72 20 20 20 54  >a[].iTabCur   T
2eb20 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
2eb30 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
2eb40 74 61 62 6c 65 0a 20 20 2a 2a 20 20 20 70 57 49  table.  **   pWI
2eb50 6e 66 6f 2d 3e 61 5b 5d 2e 69 49 64 78 43 75 72  nfo->a[].iIdxCur
2eb60 20 20 20 54 68 65 20 56 44 42 45 20 63 75 72 73     The VDBE curs
2eb70 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  or for the index
2eb80 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
2eb90 61 5b 5d 2e 70 54 65 72 6d 20 20 20 20 20 57 68  a[].pTerm     Wh
2eba0 65 6e 20 77 73 46 6c 61 67 73 3d 3d 57 4f 5f 4f  en wsFlags==WO_O
2ebb0 52 2c 20 74 68 65 20 4f 52 2d 63 6c 61 75 73 65  R, the OR-clause
2ebc0 20 74 65 72 6d 0a 20 20 2a 2a 0a 20 20 2a 2a 20   term.  **.  ** 
2ebd0 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 66  This loop also f
2ebe0 69 67 75 72 65 73 20 6f 75 74 20 74 68 65 20 6e  igures out the n
2ebf0 65 73 74 69 6e 67 20 6f 72 64 65 72 20 6f 66 20  esting order of 
2ec00 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
2ec10 4f 4d 0a 20 20 2a 2a 20 63 6c 61 75 73 65 2e 0a  OM.  ** clause..
2ec20 20 20 2a 2f 0a 20 20 73 57 42 49 2e 6e 6f 74 56    */.  sWBI.notV
2ec30 61 6c 69 64 20 3d 20 7e 28 42 69 74 6d 61 73 6b  alid = ~(Bitmask
2ec40 29 30 3b 0a 20 20 73 57 42 49 2e 70 4f 72 64 65  )0;.  sWBI.pOrde
2ec50 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
2ec60 20 20 73 57 42 49 2e 6e 20 3d 20 6e 54 61 62 4c    sWBI.n = nTabL
2ec70 69 73 74 3b 0a 20 20 73 57 42 49 2e 70 44 69 73  ist;.  sWBI.pDis
2ec80 74 69 6e 63 74 20 3d 20 70 44 69 73 74 69 6e 63  tinct = pDistinc
2ec90 74 3b 0a 20 20 61 6e 64 46 6c 61 67 73 20 3d 20  t;.  andFlags = 
2eca0 7e 30 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45  ~0;.  WHERETRACE
2ecb0 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  (("*** Optimizer
2ecc0 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b   Start ***\n"));
2ecd0 0a 20 20 66 6f 72 28 73 57 42 49 2e 69 3d 69 46  .  for(sWBI.i=iF
2ece0 72 6f 6d 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57  rom=0, pLevel=pW
2ecf0 49 6e 66 6f 2d 3e 61 3b 20 73 57 42 49 2e 69 3c  Info->a; sWBI.i<
2ed00 6e 54 61 62 4c 69 73 74 3b 20 73 57 42 49 2e 69  nTabList; sWBI.i
2ed10 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20  ++, pLevel++){. 
2ed20 20 20 20 57 68 65 72 65 43 6f 73 74 20 62 65 73     WhereCost bes
2ed30 74 50 6c 61 6e 3b 20 20 20 20 20 20 20 20 20 2f  tPlan;         /
2ed40 2a 20 4d 6f 73 74 20 65 66 66 69 63 69 65 6e 74  * Most efficient
2ed50 20 70 6c 61 6e 20 73 65 65 6e 20 73 6f 20 66 61   plan seen so fa
2ed60 72 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  r */.    Index *
2ed70 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
2ed80 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f       /* Index fo
2ed90 72 20 46 52 4f 4d 20 74 61 62 6c 65 20 61 74 20  r FROM table at 
2eda0 70 54 61 62 49 74 65 6d 20 2a 2f 0a 20 20 20 20  pTabItem */.    
2edb0 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
2edc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2edd0 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
2ede0 46 52 4f 4d 20 74 61 62 6c 65 73 20 2a 2f 0a 20  FROM tables */. 
2edf0 20 20 20 69 6e 74 20 62 65 73 74 4a 20 3d 20 2d     int bestJ = -
2ee00 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1;             /
2ee10 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 6a  * The value of j
2ee20 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   */.    Bitmask 
2ee30 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
2ee40 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 76      /* Bitmask v
2ee50 61 6c 75 65 20 66 6f 72 20 6a 20 6f 72 20 62 65  alue for j or be
2ee60 73 74 4a 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  stJ */.    int i
2ee70 73 4f 70 74 69 6d 61 6c 3b 20 20 20 20 20 20 20  sOptimal;       
2ee80 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
2ee90 6f 72 20 66 6f 72 20 6f 70 74 69 6d 61 6c 2f 6e  or for optimal/n
2eea0 6f 6e 2d 6f 70 74 69 6d 61 6c 20 73 65 61 72 63  on-optimal searc
2eeb0 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 55 6e  h */.    int nUn
2eec0 63 6f 6e 73 74 72 61 69 6e 65 64 3b 20 20 20 20  constrained;    
2eed0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74       /* Number t
2eee0 61 62 6c 65 73 20 77 69 74 68 6f 75 74 20 49 4e  ables without IN
2eef0 44 45 58 45 44 20 42 59 20 2a 2f 0a 20 20 20 20  DEXED BY */.    
2ef00 42 69 74 6d 61 73 6b 20 6e 6f 74 49 6e 64 65 78  Bitmask notIndex
2ef10 65 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ed;         /* M
2ef20 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 74 68  ask of tables th
2ef30 61 74 20 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e  at cannot use an
2ef40 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 20 20 6d   index */..    m
2ef50 65 6d 73 65 74 28 26 62 65 73 74 50 6c 61 6e 2c  emset(&bestPlan,
2ef60 20 30 2c 20 73 69 7a 65 6f 66 28 62 65 73 74 50   0, sizeof(bestP
2ef70 6c 61 6e 29 29 3b 0a 20 20 20 20 62 65 73 74 50  lan));.    bestP
2ef80 6c 61 6e 2e 72 43 6f 73 74 20 3d 20 53 51 4c 49  lan.rCost = SQLI
2ef90 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 20 20 20 20  TE_BIG_DBL;.    
2efa0 57 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a  WHERETRACE(("***
2efb0 20 42 65 67 69 6e 20 73 65 61 72 63 68 20 66 6f   Begin search fo
2efc0 72 20 6c 6f 6f 70 20 25 64 20 2a 2a 2a 5c 6e 22  r loop %d ***\n"
2efd0 2c 20 73 57 42 49 2e 69 29 29 3b 0a 0a 20 20 20  , sWBI.i));..   
2efe0 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
2eff0 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 65   the remaining e
2f000 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 46 52  ntries in the FR
2f010 4f 4d 20 63 6c 61 75 73 65 20 74 6f 20 66 69 6e  OM clause to fin
2f020 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78  d the.    ** nex
2f030 74 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2e 20 54  t nested loop. T
2f040 68 65 20 6c 6f 6f 70 20 74 65 73 74 73 20 61 6c  he loop tests al
2f050 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e  l FROM clause en
2f060 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 65 69 74  tries.    ** eit
2f070 68 65 72 20 6f 6e 63 65 20 6f 72 20 74 77 69 63  her once or twic
2f080 65 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  e. .    **.    *
2f090 2a 20 54 68 65 20 66 69 72 73 74 20 74 65 73 74  * The first test
2f0a0 20 69 73 20 61 6c 77 61 79 73 20 70 65 72 66 6f   is always perfo
2f0b0 72 6d 65 64 20 69 66 20 74 68 65 72 65 20 61 72  rmed if there ar
2f0c0 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 65 6e  e two or more en
2f0d0 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 72 65 6d  tries.    ** rem
2f0e0 61 69 6e 69 6e 67 20 61 6e 64 20 6e 65 76 65 72  aining and never
2f0f0 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 74 68   performed if th
2f100 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20  ere is only one 
2f110 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74 72  FROM clause entr
2f120 79 0a 20 20 20 20 2a 2a 20 74 6f 20 63 68 6f 6f  y.    ** to choo
2f130 73 65 20 66 72 6f 6d 2e 20 20 54 68 65 20 66 69  se from.  The fi
2f140 72 73 74 20 74 65 73 74 20 6c 6f 6f 6b 73 20 66  rst test looks f
2f150 6f 72 20 61 6e 20 22 6f 70 74 69 6d 61 6c 22 20  or an "optimal" 
2f160 73 63 61 6e 2e 20 20 49 6e 0a 20 20 20 20 2a 2a  scan.  In.    **
2f170 20 74 68 69 73 20 63 6f 6e 74 65 78 74 20 61 6e   this context an
2f180 20 6f 70 74 69 6d 61 6c 20 73 63 61 6e 20 69 73   optimal scan is
2f190 20 6f 6e 65 20 74 68 61 74 20 75 73 65 73 20 74   one that uses t
2f1a0 68 65 20 73 61 6d 65 20 73 74 72 61 74 65 67 79  he same strategy
2f1b0 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  .    ** for the 
2f1c0 67 69 76 65 6e 20 46 52 4f 4d 20 63 6c 61 75 73  given FROM claus
2f1d0 65 20 65 6e 74 72 79 20 61 73 20 77 6f 75 6c 64  e entry as would
2f1e0 20 62 65 20 73 65 6c 65 63 74 65 64 20 69 66 20   be selected if 
2f1f0 74 68 65 20 65 6e 74 72 79 0a 20 20 20 20 2a 2a  the entry.    **
2f200 20 77 65 72 65 20 75 73 65 64 20 61 73 20 74 68   were used as th
2f210 65 20 69 6e 6e 65 72 6d 6f 73 74 20 6e 65 73 74  e innermost nest
2f220 65 64 20 6c 6f 6f 70 2e 20 20 49 6e 20 6f 74 68  ed loop.  In oth
2f230 65 72 20 77 6f 72 64 73 2c 20 61 20 74 61 62 6c  er words, a tabl
2f240 65 0a 20 20 20 20 2a 2a 20 69 73 20 63 68 6f 73  e.    ** is chos
2f250 65 6e 20 73 75 63 68 20 74 68 61 74 20 74 68 65  en such that the
2f260 20 63 6f 73 74 20 6f 66 20 72 75 6e 6e 69 6e 67   cost of running
2f270 20 74 68 61 74 20 74 61 62 6c 65 20 63 61 6e 6e   that table cann
2f280 6f 74 20 62 65 20 72 65 64 75 63 65 64 0a 20 20  ot be reduced.  
2f290 20 20 2a 2a 20 62 79 20 77 61 69 74 69 6e 67 20    ** by waiting 
2f2a0 66 6f 72 20 6f 74 68 65 72 20 74 61 62 6c 65 73  for other tables
2f2b0 20 74 6f 20 72 75 6e 20 66 69 72 73 74 2e 20 20   to run first.  
2f2c0 54 68 69 73 20 22 6f 70 74 69 6d 61 6c 22 20 74  This "optimal" t
2f2d0 65 73 74 20 77 6f 72 6b 73 0a 20 20 20 20 2a 2a  est works.    **
2f2e0 20 62 79 20 66 69 72 73 74 20 61 73 73 75 6d 69   by first assumi
2f2f0 6e 67 20 74 68 61 74 20 74 68 65 20 46 52 4f 4d  ng that the FROM
2f300 20 63 6c 61 75 73 65 20 69 73 20 6f 6e 20 74 68   clause is on th
2f310 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 61 6e 64  e inner loop and
2f320 20 66 69 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20   finding.    ** 
2f330 69 74 73 20 71 75 65 72 79 20 70 6c 61 6e 2c 20  its query plan, 
2f340 74 68 65 6e 20 63 68 65 63 6b 69 6e 67 20 74 6f  then checking to
2f350 20 73 65 65 20 69 66 20 74 68 61 74 20 71 75 65   see if that que
2f360 72 79 20 70 6c 61 6e 20 75 73 65 73 20 61 6e 79  ry plan uses any
2f370 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 46 52  .    ** other FR
2f380 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  OM clause terms 
2f390 74 68 61 74 20 61 72 65 20 73 57 42 49 2e 6e 6f  that are sWBI.no
2f3a0 74 56 61 6c 69 64 2e 20 20 49 66 20 6e 6f 20 6e  tValid.  If no n
2f3b0 6f 74 56 61 6c 69 64 20 74 65 72 6d 73 0a 20 20  otValid terms.  
2f3c0 20 20 2a 2a 20 61 72 65 20 75 73 65 64 20 74 68    ** are used th
2f3d0 65 6e 20 74 68 65 20 22 6f 70 74 69 6d 61 6c 22  en the "optimal"
2f3e0 20 71 75 65 72 79 20 70 6c 61 6e 20 77 6f 72 6b   query plan work
2f3f0 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s..    **.    **
2f400 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 57   Note that the W
2f410 68 65 72 65 43 6f 73 74 2e 6e 52 6f 77 20 70 61  hereCost.nRow pa
2f420 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f  rameter for an o
2f430 70 74 69 6d 61 6c 20 73 63 61 6e 20 6d 69 67 68  ptimal scan migh
2f440 74 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20  t.    ** not be 
2f450 61 73 20 73 6d 61 6c 6c 20 61 73 20 69 74 20 77  as small as it w
2f460 6f 75 6c 64 20 62 65 20 69 66 20 74 68 65 20 74  ould be if the t
2f470 61 62 6c 65 20 72 65 61 6c 6c 79 20 77 65 72 65  able really were
2f480 20 74 68 65 20 69 6e 6e 65 72 6d 6f 73 74 0a 20   the innermost. 
2f490 20 20 20 2a 2a 20 6a 6f 69 6e 2e 20 20 54 68 65     ** join.  The
2f4a0 20 6e 52 6f 77 20 76 61 6c 75 65 20 63 61 6e 20   nRow value can 
2f4b0 62 65 20 72 65 64 75 63 65 64 20 62 79 20 57 48  be reduced by WH
2f4c0 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
2f4d0 72 61 69 6e 74 73 0a 20 20 20 20 2a 2a 20 74 68  raints.    ** th
2f4e0 61 74 20 64 6f 20 6e 6f 74 20 75 73 65 20 69 6e  at do not use in
2f4f0 64 69 63 65 73 2e 20 20 42 75 74 20 74 68 69 73  dices.  But this
2f500 20 6e 52 6f 77 20 72 65 64 75 63 74 69 6f 6e 20   nRow reduction 
2f510 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20  only happens if 
2f520 74 68 65 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  the.    ** table
2f530 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 20 69   really is the i
2f540 6e 6e 65 72 6d 6f 73 74 20 6a 6f 69 6e 2e 20 20  nnermost join.  
2f550 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2f560 68 65 20 73 65 63 6f 6e 64 20 6c 6f 6f 70 20 69  he second loop i
2f570 74 65 72 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  teration is only
2f580 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 6e 6f   performed if no
2f590 20 6f 70 74 69 6d 61 6c 20 73 63 61 6e 0a 20 20   optimal scan.  
2f5a0 20 20 2a 2a 20 73 74 72 61 74 65 67 69 65 73 20    ** strategies 
2f5b0 77 65 72 65 20 66 6f 75 6e 64 20 62 79 20 74 68  were found by th
2f5c0 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  e first iteratio
2f5d0 6e 2e 20 54 68 69 73 20 73 65 63 6f 6e 64 20 69  n. This second i
2f5e0 74 65 72 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  teration.    ** 
2f5f0 69 73 20 75 73 65 64 20 74 6f 20 73 65 61 72 63  is used to searc
2f600 68 20 66 6f 72 20 74 68 65 20 6c 6f 77 65 73 74  h for the lowest
2f610 20 63 6f 73 74 20 73 63 61 6e 20 6f 76 65 72 61   cost scan overa
2f620 6c 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ll..    **.    *
2f630 2a 20 50 72 65 76 69 6f 75 73 20 76 65 72 73 69  * Previous versi
2f640 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 65  ons of SQLite pe
2f650 72 66 6f 72 6d 65 64 20 6f 6e 6c 79 20 74 68 65  rformed only the
2f660 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f   second iteratio
2f670 6e 20 2d 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e  n -.    ** the n
2f680 65 78 74 20 6f 75 74 65 72 6d 6f 73 74 20 6c 6f  ext outermost lo
2f690 6f 70 20 77 61 73 20 61 6c 77 61 79 73 20 74 68  op was always th
2f6a0 61 74 20 77 69 74 68 20 74 68 65 20 6c 6f 77 65  at with the lowe
2f6b0 73 74 20 6f 76 65 72 61 6c 6c 0a 20 20 20 20 2a  st overall.    *
2f6c0 2a 20 63 6f 73 74 2e 20 48 6f 77 65 76 65 72 2c  * cost. However,
2f6d0 20 74 68 69 73 20 6d 65 61 6e 74 20 74 68 61 74   this meant that
2f6e0 20 53 51 4c 69 74 65 20 63 6f 75 6c 64 20 73 65   SQLite could se
2f6f0 6c 65 63 74 20 74 68 65 20 77 72 6f 6e 67 20 70  lect the wrong p
2f700 6c 61 6e 0a 20 20 20 20 2a 2a 20 66 6f 72 20 73  lan.    ** for s
2f710 63 72 69 70 74 73 20 73 75 63 68 20 61 73 20 74  cripts such as t
2f720 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  he following:.  
2f730 20 20 2a 2a 20 20 20 0a 20 20 20 20 2a 2a 20 20    **   .    **  
2f740 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
2f750 28 61 2c 20 62 29 3b 20 0a 20 20 20 20 2a 2a 20  (a, b); .    ** 
2f760 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
2f770 32 28 63 2c 20 64 29 3b 0a 20 20 20 20 2a 2a 20  2(c, d);.    ** 
2f780 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2f790 74 32 2c 20 74 31 20 57 48 45 52 45 20 74 32 2e  t2, t1 WHERE t2.
2f7a0 72 6f 77 69 64 20 3d 20 74 31 2e 61 3b 0a 20 20  rowid = t1.a;.  
2f7b0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
2f7c0 62 65 73 74 20 73 74 72 61 74 65 67 79 20 69 73  best strategy is
2f7d0 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
2f7e0 75 67 68 20 74 61 62 6c 65 20 74 31 20 66 69 72  ugh table t1 fir
2f7f0 73 74 2e 20 48 6f 77 65 76 65 72 20 69 74 0a 20  st. However it. 
2f800 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73     ** is not pos
2f810 73 69 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69  sible to determi
2f820 6e 65 20 74 68 69 73 20 77 69 74 68 20 61 20 73  ne this with a s
2f830 69 6d 70 6c 65 20 67 72 65 65 64 79 20 61 6c 67  imple greedy alg
2f840 6f 72 69 74 68 6d 2e 0a 20 20 20 20 2a 2a 20 53  orithm..    ** S
2f850 69 6e 63 65 20 74 68 65 20 63 6f 73 74 20 6f 66  ince the cost of
2f860 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74   a linear scan t
2f870 68 72 6f 75 67 68 20 74 61 62 6c 65 20 74 32 20  hrough table t2 
2f880 69 73 20 74 68 65 20 73 61 6d 65 20 0a 20 20 20  is the same .   
2f890 20 2a 2a 20 61 73 20 74 68 65 20 63 6f 73 74 20   ** as the cost 
2f8a0 6f 66 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e  of a linear scan
2f8b0 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 74   through table t
2f8c0 31 2c 20 61 20 73 69 6d 70 6c 65 20 67 72 65 65  1, a simple gree
2f8d0 64 79 20 0a 20 20 20 20 2a 2a 20 61 6c 67 6f 72  dy .    ** algor
2f8e0 69 74 68 6d 20 6d 61 79 20 63 68 6f 6f 73 65 20  ithm may choose 
2f8f0 74 6f 20 75 73 65 20 74 32 20 66 6f 72 20 74 68  to use t2 for th
2f900 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2c 20 77 68  e outer loop, wh
2f910 69 63 68 20 69 73 20 61 20 6d 75 63 68 0a 20 20  ich is a much.  
2f920 20 20 2a 2a 20 63 6f 73 74 6c 69 65 72 20 61 70    ** costlier ap
2f930 70 72 6f 61 63 68 2e 0a 20 20 20 20 2a 2f 0a 20  proach..    */. 
2f940 20 20 20 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65     nUnconstraine
2f950 64 20 3d 20 30 3b 0a 20 20 20 20 6e 6f 74 49 6e  d = 0;.    notIn
2f960 64 65 78 65 64 20 3d 20 30 3b 0a 20 20 20 20 66  dexed = 0;.    f
2f970 6f 72 28 69 73 4f 70 74 69 6d 61 6c 3d 28 69 46  or(isOptimal=(iF
2f980 72 6f 6d 3c 6e 54 61 62 4c 69 73 74 2d 31 29 3b  rom<nTabList-1);
2f990 20 69 73 4f 70 74 69 6d 61 6c 3e 3d 30 20 26 26   isOptimal>=0 &&
2f9a0 20 62 65 73 74 4a 3c 30 3b 20 69 73 4f 70 74 69   bestJ<0; isOpti
2f9b0 6d 61 6c 2d 2d 29 7b 0a 20 20 20 20 20 20 66 6f  mal--){.      fo
2f9c0 72 28 6a 3d 69 46 72 6f 6d 2c 20 73 57 42 49 2e  r(j=iFrom, sWBI.
2f9d0 70 53 72 63 3d 26 70 54 61 62 4c 69 73 74 2d 3e  pSrc=&pTabList->
2f9e0 61 5b 6a 5d 3b 20 6a 3c 6e 54 61 62 4c 69 73 74  a[j]; j<nTabList
2f9f0 3b 20 6a 2b 2b 2c 20 73 57 42 49 2e 70 53 72 63  ; j++, sWBI.pSrc
2fa00 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
2fa10 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 3b 20 20   doNotReorder;  
2fa20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
2fa30 73 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 6e  s table should n
2fa40 6f 74 20 62 65 20 72 65 6f 72 64 65 72 65 64 20  ot be reordered 
2fa50 2a 2f 0a 20 20 0a 20 20 20 20 20 20 20 20 64 6f  */.  .        do
2fa60 4e 6f 74 52 65 6f 72 64 65 72 20 3d 20 20 28 73  NotReorder =  (s
2fa70 57 42 49 2e 70 53 72 63 2d 3e 6a 6f 69 6e 74 79  WBI.pSrc->jointy
2fa80 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54  pe & (JT_LEFT|JT
2fa90 5f 43 52 4f 53 53 29 29 21 3d 30 3b 0a 20 20 20  _CROSS))!=0;.   
2faa0 20 20 20 20 20 69 66 28 20 6a 21 3d 69 46 72 6f       if( j!=iFro
2fab0 6d 20 26 26 20 64 6f 4e 6f 74 52 65 6f 72 64 65  m && doNotReorde
2fac0 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  r ) break;.     
2fad0 20 20 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70     m = getMask(p
2fae0 4d 61 73 6b 53 65 74 2c 20 73 57 42 49 2e 70 53  MaskSet, sWBI.pS
2faf0 72 63 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  rc->iCursor);.  
2fb00 20 20 20 20 20 20 69 66 28 20 28 6d 20 26 20 73        if( (m & s
2fb10 57 42 49 2e 6e 6f 74 56 61 6c 69 64 29 3d 3d 30  WBI.notValid)==0
2fb20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
2fb30 28 20 6a 3d 3d 69 46 72 6f 6d 20 29 20 69 46 72  ( j==iFrom ) iFr
2fb40 6f 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  om++;.          
2fb50 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2fb60 20 20 7d 0a 20 20 20 20 20 20 20 20 73 57 42 49    }.        sWBI
2fb70 2e 6e 6f 74 52 65 61 64 79 20 3d 20 28 69 73 4f  .notReady = (isO
2fb80 70 74 69 6d 61 6c 20 3f 20 6d 20 3a 20 73 57 42  ptimal ? m : sWB
2fb90 49 2e 6e 6f 74 56 61 6c 69 64 29 3b 0a 20 20 20  I.notValid);.   
2fba0 20 20 20 20 20 69 66 28 20 73 57 42 49 2e 70 53       if( sWBI.pS
2fbb0 72 63 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 29 20  rc->pIndex==0 ) 
2fbc0 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65 64 2b 2b  nUnconstrained++
2fbd0 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 57 48 45  ;.  .        WHE
2fbe0 52 45 54 52 41 43 45 28 28 22 20 20 20 3d 3d 3d  RETRACE(("   ===
2fbf0 20 74 72 79 69 6e 67 20 74 61 62 6c 65 20 25 64   trying table %d
2fc00 20 28 25 73 29 20 77 69 74 68 20 69 73 4f 70 74   (%s) with isOpt
2fc10 69 6d 61 6c 3d 25 64 20 3d 3d 3d 5c 6e 22 2c 0a  imal=%d ===\n",.
2fc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc30 20 20 20 20 6a 2c 20 73 57 42 49 2e 70 53 72 63      j, sWBI.pSrc
2fc40 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 69  ->pTab->zName, i
2fc50 73 4f 70 74 69 6d 61 6c 29 29 3b 0a 20 20 20 20  sOptimal));.    
2fc60 20 20 20 20 61 73 73 65 72 74 28 20 73 57 42 49      assert( sWBI
2fc70 2e 70 53 72 63 2d 3e 70 54 61 62 20 29 3b 0a 23  .pSrc->pTab );.#
2fc80 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2fc90 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
2fca0 20 20 20 20 20 20 20 20 69 66 28 20 49 73 56 69          if( IsVi
2fcb0 72 74 75 61 6c 28 73 57 42 49 2e 70 53 72 63 2d  rtual(sWBI.pSrc-
2fcc0 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  >pTab) ){.      
2fcd0 20 20 20 20 73 57 42 49 2e 70 70 49 64 78 49 6e      sWBI.ppIdxIn
2fce0 66 6f 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  fo = &pWInfo->a[
2fcf0 6a 5d 2e 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20  j].pIdxInfo;.   
2fd00 20 20 20 20 20 20 20 62 65 73 74 56 69 72 74 75         bestVirtu
2fd10 61 6c 49 6e 64 65 78 28 26 73 57 42 49 29 3b 0a  alIndex(&sWBI);.
2fd20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 0a 23          }else .#
2fd30 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a  endif.        {.
2fd40 20 20 20 20 20 20 20 20 20 20 62 65 73 74 42 74            bestBt
2fd50 72 65 65 49 6e 64 65 78 28 26 73 57 42 49 29 3b  reeIndex(&sWBI);
2fd60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2fd70 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 74     assert( isOpt
2fd80 69 6d 61 6c 20 7c 7c 20 28 73 57 42 49 2e 63 6f  imal || (sWBI.co
2fd90 73 74 2e 75 73 65 64 26 73 57 42 49 2e 6e 6f 74  st.used&sWBI.not
2fda0 56 61 6c 69 64 29 3d 3d 30 20 29 3b 0a 0a 20 20  Valid)==0 );..  
2fdb0 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 49        /* If an I
2fdc0 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
2fdd0 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65   is present, the
2fde0 6e 20 74 68 65 20 70 6c 61 6e 20 6d 75 73 74 20  n the plan must 
2fdf0 75 73 65 20 74 68 61 74 0a 20 20 20 20 20 20 20  use that.       
2fe00 20 2a 2a 20 69 6e 64 65 78 20 69 66 20 69 74 20   ** index if it 
2fe10 75 73 65 73 20 61 6e 79 20 69 6e 64 65 78 20 61  uses any index a
2fe20 74 20 61 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20  t all */.       
2fe30 20 61 73 73 65 72 74 28 20 73 57 42 49 2e 70 53   assert( sWBI.pS
2fe40 72 63 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 0a 20  rc->pIndex==0 . 
2fe50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe60 20 7c 7c 20 28 73 57 42 49 2e 63 6f 73 74 2e 70   || (sWBI.cost.p
2fe70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
2fe80 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e  ERE_NOT_FULLSCAN
2fe90 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
2fea0 20 20 20 20 20 20 20 7c 7c 20 73 57 42 49 2e 63         || sWBI.c
2feb0 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d  ost.plan.u.pIdx=
2fec0 3d 73 57 42 49 2e 70 53 72 63 2d 3e 70 49 6e 64  =sWBI.pSrc->pInd
2fed0 65 78 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  ex );..        i
2fee0 66 28 20 69 73 4f 70 74 69 6d 61 6c 20 26 26 20  f( isOptimal && 
2fef0 28 73 57 42 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e  (sWBI.cost.plan.
2ff00 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2ff10 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d 30  NOT_FULLSCAN)==0
2ff20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f   ){.          no
2ff30 74 49 6e 64 65 78 65 64 20 7c 3d 20 6d 3b 0a 20  tIndexed |= m;. 
2ff40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ff50 20 69 66 28 20 69 73 4f 70 74 69 6d 61 6c 20 29   if( isOptimal )
2ff60 7b 0a 20 20 20 20 20 20 20 20 20 20 70 57 49 6e  {.          pWIn
2ff70 66 6f 2d 3e 61 5b 6a 5d 2e 72 4f 70 74 43 6f 73  fo->a[j].rOptCos
2ff80 74 20 3d 20 73 57 42 49 2e 63 6f 73 74 2e 72 43  t = sWBI.cost.rC
2ff90 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ost;.        }el
2ffa0 73 65 20 69 66 28 20 69 46 72 6f 6d 3c 6e 54 61  se if( iFrom<nTa
2ffb0 62 4c 69 73 74 2d 31 20 29 7b 0a 20 20 20 20 20  bList-1 ){.     
2ffc0 20 20 20 20 20 2f 2a 20 49 66 20 74 77 6f 20 6f       /* If two o
2ffd0 72 20 6d 6f 72 65 20 74 61 62 6c 65 73 20 68 61  r more tables ha
2ffe0 76 65 20 6e 65 61 72 6c 79 20 74 68 65 20 73 61  ve nearly the sa
2fff0 6d 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 63 6f  me outer loop co
30000 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  st,.          **
30010 20 76 65 72 79 20 64 69 66 66 65 72 65 6e 74 20   very different 
30020 69 6e 6e 65 72 20 6c 6f 6f 70 20 28 6f 70 74 69  inner loop (opti
30030 6d 61 6c 29 20 63 6f 73 74 2c 20 77 65 20 77 61  mal) cost, we wa
30040 6e 74 20 74 6f 20 63 68 6f 6f 73 65 0a 20 20 20  nt to choose.   
30050 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68         ** for th
30060 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 74 68 61  e outer loop tha
30070 74 20 74 61 62 6c 65 20 77 68 69 63 68 20 62 65  t table which be
30080 6e 65 66 69 74 73 20 74 68 65 20 6c 65 61 73 74  nefits the least
30090 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 20 20   from.          
300a0 2a 2a 20 62 65 69 6e 67 20 69 6e 20 74 68 65 20  ** being in the 
300b0 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 20 54 68 65  inner loop.  The
300c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20   following code 
300d0 73 63 61 6c 65 73 20 74 68 65 20 0a 20 20 20 20  scales the .    
300e0 20 20 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 6c        ** outer l
300f0 6f 6f 70 20 63 6f 73 74 20 65 73 74 69 6d 61 74  oop cost estimat
30100 65 20 74 6f 20 61 63 63 6f 6d 70 6c 69 73 68 20  e to accomplish 
30110 74 68 61 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  that. */.       
30120 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22     WHERETRACE(("
30130 20 20 20 73 63 61 6c 69 6e 67 20 63 6f 73 74 20     scaling cost 
30140 66 72 6f 6d 20 25 2e 31 66 20 74 6f 20 25 2e 31  from %.1f to %.1
30150 66 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  f\n",.          
30160 20 20 20 20 20 20 20 20 20 20 20 20 73 57 42 49              sWBI
30170 2e 63 6f 73 74 2e 72 43 6f 73 74 2c 0a 20 20 20  .cost.rCost,.   
30180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30190 20 20 20 73 57 42 49 2e 63 6f 73 74 2e 72 43 6f     sWBI.cost.rCo
301a0 73 74 2f 70 57 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e  st/pWInfo->a[j].
301b0 72 4f 70 74 43 6f 73 74 29 29 3b 0a 20 20 20 20  rOptCost));.    
301c0 20 20 20 20 20 20 73 57 42 49 2e 63 6f 73 74 2e        sWBI.cost.
301d0 72 43 6f 73 74 20 2f 3d 20 70 57 49 6e 66 6f 2d  rCost /= pWInfo-
301e0 3e 61 5b 6a 5d 2e 72 4f 70 74 43 6f 73 74 3b 0a  >a[j].rOptCost;.
301f0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
30200 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e 73     /* Conditions
30210 20 75 6e 64 65 72 20 77 68 69 63 68 20 74 68 69   under which thi
30220 73 20 74 61 62 6c 65 20 62 65 63 6f 6d 65 73 20  s table becomes 
30230 74 68 65 20 62 65 73 74 20 73 6f 20 66 61 72 3a  the best so far:
30240 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
30250 20 20 20 20 2a 2a 20 20 20 28 31 29 20 54 68 65      **   (1) The
30260 20 74 61 62 6c 65 20 6d 75 73 74 20 6e 6f 74 20   table must not 
30270 64 65 70 65 6e 64 20 6f 6e 20 6f 74 68 65 72 20  depend on other 
30280 74 61 62 6c 65 73 20 74 68 61 74 20 68 61 76 65  tables that have
30290 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   not.        ** 
302a0 20 20 20 20 20 20 79 65 74 20 72 75 6e 2e 20 20        yet run.  
302b0 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  (In other words,
302c0 20 69 74 20 6d 75 73 74 20 6e 6f 74 20 64 65 70   it must not dep
302d0 65 6e 64 20 6f 6e 20 74 61 62 6c 65 73 0a 20 20  end on tables.  
302e0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 69        **       i
302f0 6e 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 2e 29 0a  n inner loops.).
30300 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
30310 20 20 20 2a 2a 20 20 20 28 32 29 20 28 54 68 69     **   (2) (Thi
30320 73 20 72 75 6c 65 20 77 61 73 20 72 65 6d 6f 76  s rule was remov
30330 65 64 20 6f 6e 20 32 30 31 32 2d 31 31 2d 30 39  ed on 2012-11-09
30340 2e 20 20 54 68 65 20 73 63 61 6c 69 6e 67 20 6f  .  The scaling o
30350 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
30360 20 20 20 20 20 20 20 63 6f 73 74 20 75 73 69 6e         cost usin
30370 67 20 74 68 65 20 6f 70 74 69 6d 61 6c 20 73 63  g the optimal sc
30380 61 6e 20 63 6f 73 74 20 6d 61 64 65 20 74 68 69  an cost made thi
30390 73 20 72 75 6c 65 20 6f 62 73 6f 6c 65 74 65 2e  s rule obsolete.
303a0 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ).        **.   
303b0 20 20 20 20 20 2a 2a 20 20 20 28 33 29 20 41 6c       **   (3) Al
303c0 6c 20 74 61 62 6c 65 73 20 68 61 76 65 20 61 6e  l tables have an
303d0 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
303e0 73 65 20 6f 72 20 74 68 69 73 20 74 61 62 6c 65  se or this table
303f0 20 6c 61 63 6b 73 20 61 6e 0a 20 20 20 20 20 20   lacks an.      
30400 20 20 2a 2a 20 20 20 20 20 20 20 49 4e 44 45 58    **       INDEX
30410 45 44 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20  ED BY clause or 
30420 74 68 69 73 20 74 61 62 6c 65 20 75 73 65 73 20  this table uses 
30430 74 68 65 20 73 70 65 63 69 66 69 63 0a 20 20 20  the specific.   
30440 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 69 6e       **       in
30450 64 65 78 20 73 70 65 63 69 66 69 65 64 20 62 79  dex specified by
30460 20 69 74 73 20 49 4e 44 45 58 45 44 20 42 59 20   its INDEXED BY 
30470 63 6c 61 75 73 65 2e 20 20 54 68 69 73 20 72 75  clause.  This ru
30480 6c 65 20 65 6e 73 75 72 65 73 0a 20 20 20 20 20  le ensures.     
30490 20 20 20 2a 2a 20 20 20 20 20 20 20 74 68 61 74     **       that
304a0 20 61 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 69   a best-so-far i
304b0 73 20 61 6c 77 61 79 73 20 73 65 6c 65 63 74 65  s always selecte
304c0 64 20 65 76 65 6e 20 69 66 20 61 6e 20 69 6d 70  d even if an imp
304d0 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20  ossible.        
304e0 2a 2a 20 20 20 20 20 20 20 63 6f 6d 62 69 6e 61  **       combina
304f0 74 69 6f 6e 20 6f 66 20 49 4e 44 45 58 45 44 20  tion of INDEXED 
30500 42 59 20 63 6c 61 75 73 65 73 20 61 72 65 20 67  BY clauses are g
30510 69 76 65 6e 2e 20 20 54 68 65 20 65 72 72 6f 72  iven.  The error
30520 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
30530 20 20 77 69 6c 6c 20 62 65 20 64 65 74 65 63 74    will be detect
30540 65 64 20 61 6e 64 20 72 65 6c 61 79 65 64 20 62  ed and relayed b
30550 61 63 6b 20 74 6f 20 74 68 65 20 61 70 70 6c 69  ack to the appli
30560 63 61 74 69 6f 6e 20 6c 61 74 65 72 2e 0a 20 20  cation later..  
30570 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 54        **       T
30580 68 65 20 4e 45 56 45 52 28 29 20 63 6f 6d 65 73  he NEVER() comes
30590 20 61 62 6f 75 74 20 62 65 63 61 75 73 65 20 72   about because r
305a0 75 6c 65 20 28 32 29 20 61 62 6f 76 65 20 70 72  ule (2) above pr
305b0 65 76 65 6e 74 73 0a 20 20 20 20 20 20 20 20 2a  events.        *
305c0 2a 20 20 20 20 20 20 20 41 6e 20 69 6e 64 65 78  *       An index
305d0 61 62 6c 65 20 66 75 6c 6c 2d 74 61 62 6c 65 2d  able full-table-
305e0 73 63 61 6e 20 66 72 6f 6d 20 72 65 61 63 68 69  scan from reachi
305f0 6e 67 20 72 75 6c 65 20 28 33 29 2e 0a 20 20 20  ng rule (3)..   
30600 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
30610 2a 2a 20 20 20 28 34 29 20 54 68 65 20 70 6c 61  **   (4) The pla
30620 6e 20 63 6f 73 74 20 6d 75 73 74 20 62 65 20 6c  n cost must be l
30630 6f 77 65 72 20 74 68 61 6e 20 70 72 69 6f 72 20  ower than prior 
30640 70 6c 61 6e 73 2c 20 77 68 65 72 65 20 22 63 6f  plans, where "co
30650 73 74 22 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  st".        **  
30660 20 20 20 20 20 69 73 20 64 65 66 69 6e 65 64 20       is defined 
30670 62 79 20 74 68 65 20 63 6f 6d 70 61 72 65 43 6f  by the compareCo
30680 73 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 62  st() function ab
30690 6f 76 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f  ove. .        */
306a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 73 57  .        if( (sW
306b0 42 49 2e 63 6f 73 74 2e 75 73 65 64 26 73 57 42  BI.cost.used&sWB
306c0 49 2e 6e 6f 74 56 61 6c 69 64 29 3d 3d 30 20 20  I.notValid)==0  
306d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
306e0 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20    /* (1) */.    
306f0 20 20 20 20 20 20 20 20 26 26 20 28 6e 55 6e 63          && (nUnc
30700 6f 6e 73 74 72 61 69 6e 65 64 3d 3d 30 20 7c 7c  onstrained==0 ||
30710 20 73 57 42 49 2e 70 53 72 63 2d 3e 70 49 6e 64   sWBI.pSrc->pInd
30720 65 78 3d 3d 30 20 20 20 20 20 20 20 20 2f 2a 20  ex==0        /* 
30730 28 33 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (3) */.         
30740 20 20 20 20 20 20 20 7c 7c 20 4e 45 56 45 52 28         || NEVER(
30750 28 73 57 42 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e  (sWBI.cost.plan.
30760 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
30770 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 21 3d 30  NOT_FULLSCAN)!=0
30780 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  )).            &
30790 26 20 28 62 65 73 74 4a 3c 30 20 7c 7c 20 63 6f  & (bestJ<0 || co
307a0 6d 70 61 72 65 43 6f 73 74 28 26 73 57 42 49 2e  mpareCost(&sWBI.
307b0 63 6f 73 74 2c 20 26 62 65 73 74 50 6c 61 6e 29  cost, &bestPlan)
307c0 29 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20  )   /* (4) */.  
307d0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
307e0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22     WHERETRACE(("
307f0 20 20 20 3d 3d 3d 20 74 61 62 6c 65 20 25 64 20     === table %d 
30800 28 25 73 29 20 69 73 20 62 65 73 74 20 73 6f 20  (%s) is best so 
30810 66 61 72 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  far\n".         
30820 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
30830 20 20 20 20 20 63 6f 73 74 3d 25 2e 31 66 2c 20       cost=%.1f, 
30840 6e 52 6f 77 3d 25 2e 31 66 2c 20 6e 4f 42 53 61  nRow=%.1f, nOBSa
30850 74 3d 25 64 2c 20 77 73 46 6c 61 67 73 3d 25 30  t=%d, wsFlags=%0
30860 38 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  8x\n",.         
30870 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 2c 20               j, 
30880 73 57 42 49 2e 70 53 72 63 2d 3e 70 54 61 62 2d  sWBI.pSrc->pTab-
30890 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
308a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 57                sW
308b0 42 49 2e 63 6f 73 74 2e 72 43 6f 73 74 2c 20 73  BI.cost.rCost, s
308c0 57 42 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 52  WBI.cost.plan.nR
308d0 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow,.            
308e0 20 20 20 20 20 20 20 20 20 20 73 57 42 49 2e 63            sWBI.c
308f0 6f 73 74 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 2c  ost.plan.nOBSat,
30900 20 73 57 42 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e   sWBI.cost.plan.
30910 77 73 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 20  wsFlags));.     
30920 20 20 20 20 20 62 65 73 74 50 6c 61 6e 20 3d 20       bestPlan = 
30930 73 57 42 49 2e 63 6f 73 74 3b 0a 20 20 20 20 20  sWBI.cost;.     
30940 20 20 20 20 20 62 65 73 74 4a 20 3d 20 6a 3b 0a       bestJ = j;.
30950 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30960 20 20 69 66 28 20 64 6f 4e 6f 74 52 65 6f 72 64    if( doNotReord
30970 65 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  er ) break;.    
30980 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
30990 73 65 72 74 28 20 62 65 73 74 4a 3e 3d 30 20 29  sert( bestJ>=0 )
309a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 57  ;.    assert( sW
309b0 42 49 2e 6e 6f 74 56 61 6c 69 64 20 26 20 67 65  BI.notValid & ge
309c0 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
309d0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74  pTabList->a[best
309e0 4a 5d 2e 69 43 75 72 73 6f 72 29 20 29 3b 0a 20  J].iCursor) );. 
309f0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22     WHERETRACE(("
30a00 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 73 65  *** Optimizer se
30a10 6c 65 63 74 73 20 74 61 62 6c 65 20 25 64 20 28  lects table %d (
30a20 25 73 29 20 66 6f 72 20 6c 6f 6f 70 20 25 64 20  %s) for loop %d 
30a30 77 69 74 68 3a 5c 6e 22 0a 20 20 20 20 20 20 20  with:\n".       
30a40 20 20 20 20 20 20 20 20 20 22 20 20 20 20 63 6f           "    co
30a50 73 74 3d 25 2e 31 66 2c 20 6e 52 6f 77 3d 25 2e  st=%.1f, nRow=%.
30a60 31 66 2c 20 6e 4f 42 53 61 74 3d 25 64 2c 20 77  1f, nOBSat=%d, w
30a70 73 46 6c 61 67 73 3d 30 78 25 30 38 78 5c 6e 22  sFlags=0x%08x\n"
30a80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
30a90 20 20 62 65 73 74 4a 2c 20 70 54 61 62 4c 69 73    bestJ, pTabLis
30aa0 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 70 54 61 62  t->a[bestJ].pTab
30ab0 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
30ac0 20 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d           pLevel-
30ad0 70 57 49 6e 66 6f 2d 3e 61 2c 20 62 65 73 74 50  pWInfo->a, bestP
30ae0 6c 61 6e 2e 72 43 6f 73 74 2c 20 62 65 73 74 50  lan.rCost, bestP
30af0 6c 61 6e 2e 70 6c 61 6e 2e 6e 52 6f 77 2c 0a 20  lan.plan.nRow,. 
30b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
30b10 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 4f 42  estPlan.plan.nOB
30b20 53 61 74 2c 20 62 65 73 74 50 6c 61 6e 2e 70 6c  Sat, bestPlan.pl
30b30 61 6e 2e 77 73 46 6c 61 67 73 29 29 3b 0a 20 20  an.wsFlags));.  
30b40 20 20 69 66 28 20 28 62 65 73 74 50 6c 61 6e 2e    if( (bestPlan.
30b50 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
30b60 48 45 52 45 5f 44 49 53 54 49 4e 43 54 29 21 3d  HERE_DISTINCT)!=
30b70 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
30b80 74 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74  t( pWInfo->eDist
30b90 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  inct==0 );.     
30ba0 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
30bb0 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
30bc0 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20  NCT_ORDERED;.   
30bd0 20 7d 0a 20 20 20 20 61 6e 64 46 6c 61 67 73 20   }.    andFlags 
30be0 26 3d 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e  &= bestPlan.plan
30bf0 2e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c  .wsFlags;.    pL
30c00 65 76 65 6c 2d 3e 70 6c 61 6e 20 3d 20 62 65 73  evel->plan = bes
30c10 74 50 6c 61 6e 2e 70 6c 61 6e 3b 0a 20 20 20 20  tPlan.plan;.    
30c20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20  pLevel->iTabCur 
30c30 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65  = pTabList->a[be
30c40 73 74 4a 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  stJ].iCursor;.  
30c50 20 20 74 65 73 74 63 61 73 65 28 20 62 65 73 74    testcase( best
30c60 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  Plan.plan.wsFlag
30c70 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
30c80 44 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  D );.    testcas
30c90 65 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e  e( bestPlan.plan
30ca0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
30cb0 5f 54 45 4d 50 5f 49 4e 44 45 58 20 29 3b 0a 20  _TEMP_INDEX );. 
30cc0 20 20 20 69 66 28 20 62 65 73 74 50 6c 61 6e 2e     if( bestPlan.
30cd0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 28  plan.wsFlags & (
30ce0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 7c 57 48  WHERE_INDEXED|WH
30cf0 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 20  ERE_TEMP_INDEX) 
30d00 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 77 63  ){.      if( (wc
30d10 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
30d20 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20  _ONETABLE_ONLY) 
30d30 0a 20 20 20 20 20 20 20 26 26 20 28 62 65 73 74  .       && (best
30d40 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  Plan.plan.wsFlag
30d50 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49  s & WHERE_TEMP_I
30d60 4e 44 45 58 29 3d 3d 30 20 0a 20 20 20 20 20 20  NDEX)==0 .      
30d70 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65  ){.        pLeve
30d80 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 49 64  l->iIdxCur = iId
30d90 78 43 75 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73  xCur;.      }els
30da0 65 7b 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65  e{.        pLeve
30db0 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61  l->iIdxCur = pPa
30dc0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
30dd0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
30de0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49        pLevel->iI
30df0 64 78 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20  dxCur = -1;.    
30e00 7d 0a 20 20 20 20 73 57 42 49 2e 6e 6f 74 56 61  }.    sWBI.notVa
30e10 6c 69 64 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28  lid &= ~getMask(
30e20 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69  pMaskSet, pTabLi
30e30 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69 43 75  st->a[bestJ].iCu
30e40 72 73 6f 72 29 3b 0a 20 20 20 20 70 4c 65 76 65  rsor);.    pLeve
30e50 6c 2d 3e 69 46 72 6f 6d 20 3d 20 28 75 38 29 62  l->iFrom = (u8)b
30e60 65 73 74 4a 3b 0a 20 20 20 20 69 66 28 20 62 65  estJ;.    if( be
30e70 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 52 6f 77  stPlan.plan.nRow
30e80 3e 3d 28 64 6f 75 62 6c 65 29 31 20 29 7b 0a 20  >=(double)1 ){. 
30e90 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75       pParse->nQu
30ea0 65 72 79 4c 6f 6f 70 20 2a 3d 20 62 65 73 74 50  eryLoop *= bestP
30eb0 6c 61 6e 2e 70 6c 61 6e 2e 6e 52 6f 77 3b 0a 20  lan.plan.nRow;. 
30ec0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
30ed0 63 6b 20 74 68 61 74 20 69 66 20 74 68 65 20 74  ck that if the t
30ee0 61 62 6c 65 20 73 63 61 6e 6e 65 64 20 62 79 20  able scanned by 
30ef0 74 68 69 73 20 6c 6f 6f 70 20 69 74 65 72 61 74  this loop iterat
30f00 69 6f 6e 20 68 61 64 20 61 6e 0a 20 20 20 20 2a  ion had an.    *
30f10 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  * INDEXED BY cla
30f20 75 73 65 20 61 74 74 61 63 68 65 64 20 74 6f 20  use attached to 
30f30 69 74 2c 20 74 68 61 74 20 74 68 65 20 6e 61 6d  it, that the nam
30f40 65 64 20 69 6e 64 65 78 20 69 73 20 62 65 69 6e  ed index is bein
30f50 67 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 66 6f  g.    ** used fo
30f60 72 20 74 68 65 20 73 63 61 6e 2e 20 49 66 20 6e  r the scan. If n
30f70 6f 74 2c 20 74 68 65 6e 20 71 75 65 72 79 20 63  ot, then query c
30f80 6f 6d 70 69 6c 61 74 69 6f 6e 20 68 61 73 20 66  ompilation has f
30f90 61 69 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 52 65  ailed..    ** Re
30fa0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20  turn an error.. 
30fb0 20 20 20 2a 2f 0a 20 20 20 20 70 49 64 78 20 3d     */.    pIdx =
30fc0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73   pTabList->a[bes
30fd0 74 4a 5d 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  tJ].pIndex;.    
30fe0 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20  if( pIdx ){.    
30ff0 20 20 69 66 28 20 28 62 65 73 74 50 6c 61 6e 2e    if( (bestPlan.
31000 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
31010 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30  HERE_INDEXED)==0
31020 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
31030 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
31040 73 65 2c 20 22 63 61 6e 6e 6f 74 20 75 73 65 20  se, "cannot use 
31050 69 6e 64 65 78 3a 20 25 73 22 2c 20 70 49 64 78  index: %s", pIdx
31060 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
31070 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
31080 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 65  nError;.      }e
31090 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
310a0 49 66 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59  If an INDEXED BY
310b0 20 63 6c 61 75 73 65 20 69 73 20 75 73 65 64 2c   clause is used,
310c0 20 74 68 65 20 62 65 73 74 49 6e 64 65 78 28 29   the bestIndex()
310d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20 20   function is.   
310e0 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65       ** guarante
310f0 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20 69  ed to find the i
31100 6e 64 65 78 20 73 70 65 63 69 66 69 65 64 20 69  ndex specified i
31110 6e 20 74 68 65 20 49 4e 44 45 58 45 44 20 42 59  n the INDEXED BY
31120 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20   clause.        
31130 2a 2a 20 69 66 20 69 74 20 66 69 6e 64 20 61 6e  ** if it find an
31140 20 69 6e 64 65 78 20 61 74 20 61 6c 6c 2e 20 2a   index at all. *
31150 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
31160 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e  ( bestPlan.plan.
31170 75 2e 70 49 64 78 3d 3d 70 49 64 78 20 29 3b 0a  u.pIdx==pIdx );.
31180 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
31190 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28  }.  WHERETRACE((
311a0 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46  "*** Optimizer F
311b0 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29  inished ***\n"))
311c0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
311d0 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
311e0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
311f0 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
31200 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rror;.  }.  if( 
31210 6e 54 61 62 4c 69 73 74 20 29 7b 0a 20 20 20 20  nTabList ){.    
31220 70 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 70 57  pLevel--;.    pW
31230 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70  Info->nOBSat = p
31240 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 4f 42 53  Level->plan.nOBS
31250 61 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  at;.  }else{.   
31260 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20   pWInfo->nOBSat 
31270 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  = 0;.  }..  /* I
31280 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72  f the total quer
31290 79 20 6f 6e 6c 79 20 73 65 6c 65 63 74 73 20 61  y only selects a
312a0 20 73 69 6e 67 6c 65 20 72 6f 77 2c 20 74 68 65   single row, the
312b0 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20  n the ORDER BY. 
312c0 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 69 72   ** clause is ir
312d0 72 65 6c 65 76 61 6e 74 2e 0a 20 20 2a 2f 0a 20  relevant..  */. 
312e0 20 69 66 28 20 28 61 6e 64 46 6c 61 67 73 20 26   if( (andFlags &
312f0 20 57 48 45 52 45 5f 55 4e 49 51 55 45 29 21 3d   WHERE_UNIQUE)!=
31300 30 20 26 26 20 70 4f 72 64 65 72 42 79 20 29 7b  0 && pOrderBy ){
31310 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 54 61  .    assert( nTa
31320 62 4c 69 73 74 3d 3d 30 20 7c 7c 20 28 70 4c 65  bList==0 || (pLe
31330 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
31340 73 20 26 20 57 48 45 52 45 5f 41 4c 4c 5f 55 4e  s & WHERE_ALL_UN
31350 49 51 55 45 29 21 3d 30 20 29 3b 0a 20 20 20 20  IQUE)!=0 );.    
31360 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d  pWInfo->nOBSat =
31370 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
31380 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
31390 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20  he caller is an 
313a0 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
313b0 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
313c0 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20  is requesting.  
313d0 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d  ** to use a one-
313e0 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20  pass algorithm, 
313f0 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69  determine if thi
31400 73 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  s is appropriate
31410 2e 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d 70  ..  ** The one-p
31420 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e  ass algorithm on
31430 6c 79 20 77 6f 72 6b 73 20 69 66 20 74 68 65 20  ly works if the 
31440 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
31450 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 74 68  straints.  ** th
31460 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 75  e statement to u
31470 70 64 61 74 65 20 61 20 73 69 6e 67 6c 65 20 72  pdate a single r
31480 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ow..  */.  asser
31490 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  t( (wctrlFlags &
314a0 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
314b0 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57  ESIRED)==0 || pW
314c0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20  Info->nLevel==1 
314d0 29 3b 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46  );.  if( (wctrlF
314e0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
314f0 50 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30  PASS_DESIRED)!=0
31500 20 26 26 20 28 61 6e 64 46 6c 61 67 73 20 26 20   && (andFlags & 
31510 57 48 45 52 45 5f 55 4e 49 51 55 45 29 21 3d 30  WHERE_UNIQUE)!=0
31520 20 29 7b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e   ){.    pWInfo->
31530 6f 6b 4f 6e 65 50 61 73 73 20 3d 20 31 3b 0a 20  okOnePass = 1;. 
31540 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e     pWInfo->a[0].
31550 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 3d 20  plan.wsFlags &= 
31560 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b  ~WHERE_IDX_ONLY;
31570 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
31580 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  all tables in th
31590 65 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61  e pTabList and a
315a0 6e 79 20 69 6e 64 69 63 65 73 20 73 65 6c 65 63  ny indices selec
315b0 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61  ted for.  ** sea
315c0 72 63 68 69 6e 67 20 74 68 6f 73 65 20 74 61 62  rching those tab
315d0 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  les..  */.  sqli
315e0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
315f0 65 6d 61 28 70 50 61 72 73 65 2c 20 2d 31 29 3b  ema(pParse, -1);
31600 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 63   /* Insert the c
31610 6f 6f 6b 69 65 20 76 65 72 69 66 69 65 72 20 47  ookie verifier G
31620 6f 74 6f 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64  oto */.  notRead
31630 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  y = ~(Bitmask)0;
31640 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  .  pWInfo->nRowO
31650 75 74 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a  ut = (double)1;.
31660 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76    for(ii=0, pLev
31670 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69  el=pWInfo->a; ii
31680 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c  <nTabList; ii++,
31690 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
316a0 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
316b0 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65   /* Table to ope
316c0 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62  n */.    int iDb
316d0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ;         /* Ind
316e0 65 78 20 6f 66 20 64 61 74 61 62 61 73 65 20 63  ex of database c
316f0 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f  ontaining table/
31700 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73 74 72  index */.    str
31710 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
31720 20 2a 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20   *pTabItem;..   
31730 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61   pTabItem = &pTa
31740 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
31750 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61  >iFrom];.    pTa
31760 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  b = pTabItem->pT
31770 61 62 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ab;.    pWInfo->
31780 6e 52 6f 77 4f 75 74 20 2a 3d 20 70 4c 65 76 65  nRowOut *= pLeve
31790 6c 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 3b 0a 20 20  l->plan.nRow;.  
317a0 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
317b0 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
317c0 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
317d0 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e  .    if( (pTab->
317e0 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
317f0 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70  hemeral)!=0 || p
31800 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
31810 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68        /* Do noth
31820 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  ing */.    }else
31830 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
31840 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
31850 45 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65  E.    if( (pLeve
31860 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
31870 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
31880 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  ABLE)!=0 ){.    
31890 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 56    const char *pV
318a0 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Tab = (const cha
318b0 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74 56 54  r *)sqlite3GetVT
318c0 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a  able(db, pTab);.
318d0 20 20 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d        int iCur =
318e0 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
318f0 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  or;.      sqlite
31900 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
31910 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c 20 30  P_VOpen, iCur, 0
31920 2c 20 30 2c 20 70 56 54 61 62 2c 20 50 34 5f 56  , 0, pVTab, P4_V
31930 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  TAB);.    }else 
31940 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
31950 61 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ab) ){.      /* 
31960 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  noop */.    }els
31970 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  e.#endif.    if(
31980 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
31990 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
319a0 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20  DX_ONLY)==0.    
319b0 20 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c       && (wctrlFl
319c0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54  ags & WHERE_OMIT
319d0 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20  _OPEN_CLOSE)==0 
319e0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20  ){.      int op 
319f0 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50  = pWInfo->okOneP
31a00 61 73 73 20 3f 20 4f 50 5f 4f 70 65 6e 57 72 69  ass ? OP_OpenWri
31a10 74 65 20 3a 20 4f 50 5f 4f 70 65 6e 52 65 61 64  te : OP_OpenRead
31a20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
31a30 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
31a40 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
31a50 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 6f  or, iDb, pTab, o
31a60 70 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  p);.      testca
31a70 73 65 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d  se( pTab->nCol==
31a80 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74  BMS-1 );.      t
31a90 65 73 74 63 61 73 65 28 20 70 54 61 62 2d 3e 6e  estcase( pTab->n
31aa0 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20  Col==BMS );.    
31ab0 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f    if( !pWInfo->o
31ac0 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61 62  kOnePass && pTab
31ad0 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 29 7b 0a 20 20  ->nCol<BMS ){.  
31ae0 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20        Bitmask b 
31af0 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55  = pTabItem->colU
31b00 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  sed;.        int
31b10 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   n = 0;.        
31b20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c  for(; b; b=b>>1,
31b30 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20   n++){}.        
31b40 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
31b50 65 50 34 28 76 2c 20 73 71 6c 69 74 65 33 56 64  eP4(v, sqlite3Vd
31b60 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
31b70 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  -1, .           
31b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b90 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
31ba0 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29  TR(n), P4_INT32)
31bb0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
31bc0 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  ( n<=pTab->nCol 
31bd0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
31be0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
31bf0 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
31c00 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
31c10 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
31c20 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66  Name);.    }.#if
31c30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
31c40 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
31c50 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c  .    if( (pLevel
31c60 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
31c70 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45   WHERE_TEMP_INDE
31c80 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  X)!=0 ){.      c
31c90 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69  onstructAutomati
31ca0 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 73  cIndex(pParse, s
31cb0 57 42 49 2e 70 57 43 2c 20 70 54 61 62 49 74 65  WBI.pWC, pTabIte
31cc0 6d 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65  m, notReady, pLe
31cd0 76 65 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  vel);.    }else.
31ce0 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28  #endif.    if( (
31cf0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
31d00 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
31d10 45 58 45 44 29 21 3d 30 20 29 7b 0a 20 20 20 20  EXED)!=0 ){.    
31d20 20 20 49 6e 64 65 78 20 2a 70 49 78 20 3d 20 70    Index *pIx = p
31d30 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49  Level->plan.u.pI
31d40 64 78 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66  dx;.      KeyInf
31d50 6f 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  o *pKey = sqlite
31d60 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50  3IndexKeyinfo(pP
31d70 61 72 73 65 2c 20 70 49 78 29 3b 0a 20 20 20 20  arse, pIx);.    
31d80 20 20 69 6e 74 20 69 49 6e 64 65 78 43 75 72 20    int iIndexCur 
31d90 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  = pLevel->iIdxCu
31da0 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
31db0 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70   pIx->pSchema==p
31dc0 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  Tab->pSchema );.
31dd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 49        assert( iI
31de0 6e 64 65 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20  ndexCur>=0 );.  
31df0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
31e00 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
31e10 52 65 61 64 2c 20 69 49 6e 64 65 78 43 75 72 2c  Read, iIndexCur,
31e20 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c   pIx->tnum, iDb,
31e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31e40 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
31e50 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  pKey, P4_KEYINFO
31e60 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20  _HANDOFF);.     
31e70 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
31e80 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d   "%s", pIx->zNam
31e90 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  e));.    }.    s
31ea0 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
31eb0 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
31ec0 44 62 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64  Db);.    notRead
31ed0 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 73 57  y &= ~getMask(sW
31ee0 42 49 2e 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74  BI.pWC->pMaskSet
31ef0 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
31f00 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e  sor);.  }.  pWIn
31f10 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74  fo->iTop = sqlit
31f20 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
31f30 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  r(v);.  if( db->
31f40 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
31f50 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
31f60 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ror;..  /* Gener
31f70 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  ate the code to 
31f80 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20 20  do the search.  
31f90 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f  Each iteration o
31fa0 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c  f the for.  ** l
31fb0 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61  oop below genera
31fc0 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73  tes code for a s
31fd0 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f  ingle nested loo
31fe0 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a  p of the VM.  **
31ff0 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20   program..  */. 
32000 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69   notReady = ~(Bi
32010 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69  tmask)0;.  for(i
32020 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74  i=0; ii<nTabList
32030 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 65  ; ii++){.    pLe
32040 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
32050 5b 69 69 5d 3b 0a 20 20 20 20 65 78 70 6c 61 69  [ii];.    explai
32060 6e 4f 6e 65 53 63 61 6e 28 70 50 61 72 73 65 2c  nOneScan(pParse,
32070 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65   pTabList, pLeve
32080 6c 2c 20 69 69 2c 20 70 4c 65 76 65 6c 2d 3e 69  l, ii, pLevel->i
32090 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73  From, wctrlFlags
320a0 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20  );.    notReady 
320b0 3d 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61  = codeOneLoopSta
320c0 72 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c 20 77  rt(pWInfo, ii, w
320d0 63 74 72 6c 46 6c 61 67 73 2c 20 6e 6f 74 52 65  ctrlFlags, notRe
320e0 61 64 79 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f  ady);.    pWInfo
320f0 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70 4c  ->iContinue = pL
32100 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a  evel->addrCont;.
32110 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
32120 54 45 5f 54 45 53 54 20 20 2f 2a 20 46 6f 72 20  TE_TEST  /* For 
32130 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
32140 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a  gging use only *
32150 2f 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 69 6e  /.  /* Record in
32160 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20   the query plan 
32170 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
32180 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  t the current ta
32190 62 6c 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ble.  ** and the
321a0 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 61   index used to a
321b0 63 63 65 73 73 20 69 74 20 28 69 66 20 61 6e 79  ccess it (if any
321c0 29 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c 65  ).  If the table
321d0 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69 73 20   itself.  ** is 
321e0 6e 6f 74 20 75 73 65 64 2c 20 69 74 73 20 6e 61  not used, its na
321f0 6d 65 20 69 73 20 6a 75 73 74 20 27 7b 7d 27 2e  me is just '{}'.
32200 20 20 49 66 20 6e 6f 20 69 6e 64 65 78 20 69 73    If no index is
32210 20 75 73 65 64 0a 20 20 2a 2a 20 74 68 65 20 69   used.  ** the i
32220 6e 64 65 78 20 69 73 20 6c 69 73 74 65 64 20 61  ndex is listed a
32230 73 20 22 7b 7d 22 2e 20 20 49 66 20 74 68 65 20  s "{}".  If the 
32240 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75  primary key is u
32250 73 65 64 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64  sed the.  ** ind
32260 65 78 20 6e 61 6d 65 20 69 73 20 27 2a 27 2e 0a  ex name is '*'..
32270 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b    */.  for(ii=0;
32280 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69   ii<nTabList; ii
32290 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ++){.    char *z
322a0 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  ;.    int n;.   
322b0 20 69 6e 74 20 77 3b 0a 20 20 20 20 73 74 72 75   int w;.    stru
322c0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
322d0 2a 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20 20  *pTabItem;..    
322e0 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f  pLevel = &pWInfo
322f0 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 77 20 3d  ->a[ii];.    w =
32300 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
32310 46 6c 61 67 73 3b 0a 20 20 20 20 70 54 61 62 49  Flags;.    pTabI
32320 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
32330 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
32340 5d 3b 0a 20 20 20 20 7a 20 3d 20 70 54 61 62 49  ];.    z = pTabI
32350 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20  tem->zAlias;.   
32360 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20   if( z==0 ) z = 
32370 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  pTabItem->pTab->
32380 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 20 3d 20 73  zName;.    n = s
32390 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
323a0 29 3b 0a 20 20 20 20 69 66 28 20 6e 2b 6e 51 50  );.    if( n+nQP
323b0 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73 71 6c  lan < sizeof(sql
323c0 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 29  ite3_query_plan)
323d0 2d 31 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  -10 ){.      if(
323e0 20 28 77 20 26 20 57 48 45 52 45 5f 49 44 58 5f   (w & WHERE_IDX_
323f0 4f 4e 4c 59 29 21 3d 30 20 26 26 20 28 77 20 26  ONLY)!=0 && (w &
32400 20 57 48 45 52 45 5f 43 4f 56 45 52 5f 53 43 41   WHERE_COVER_SCA
32410 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  N)==0 ){.       
32420 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33   memcpy(&sqlite3
32430 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
32440 61 6e 5d 2c 20 22 7b 7d 22 2c 20 32 29 3b 0a 20  an], "{}", 2);. 
32450 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d         nQPlan +=
32460 20 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   2;.      }else{
32470 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
32480 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  &sqlite3_query_p
32490 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 7a 2c 20  lan[nQPlan], z, 
324a0 6e 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c  n);.        nQPl
324b0 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d  an += n;.      }
324c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71  .      sqlite3_q
324d0 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
324e0 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d  ++] = ' ';.    }
324f0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77  .    testcase( w
32500 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45   & WHERE_ROWID_E
32510 51 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  Q );.    testcas
32520 65 28 20 77 20 26 20 57 48 45 52 45 5f 52 4f 57  e( w & WHERE_ROW
32530 49 44 5f 52 41 4e 47 45 20 29 3b 0a 20 20 20 20  ID_RANGE );.    
32540 69 66 28 20 77 20 26 20 28 57 48 45 52 45 5f 52  if( w & (WHERE_R
32550 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f  OWID_EQ|WHERE_RO
32560 57 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20  WID_RANGE) ){.  
32570 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69      memcpy(&sqli
32580 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
32590 51 50 6c 61 6e 5d 2c 20 22 2a 20 22 2c 20 32 29  QPlan], "* ", 2)
325a0 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b  ;.      nQPlan +
325b0 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 2;.    }else i
325c0 66 28 20 28 77 20 26 20 57 48 45 52 45 5f 49 4e  f( (w & WHERE_IN
325d0 44 45 58 45 44 29 21 3d 30 20 26 26 20 28 77 20  DEXED)!=0 && (w 
325e0 26 20 57 48 45 52 45 5f 43 4f 56 45 52 5f 53 43  & WHERE_COVER_SC
325f0 41 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  AN)==0 ){.      
32600 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
32610 6e 33 30 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  n30(pLevel->plan
32620 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b  .u.pIdx->zName);
32630 0a 20 20 20 20 20 20 69 66 28 20 6e 2b 6e 51 50  .      if( n+nQP
32640 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73 71 6c  lan < sizeof(sql
32650 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 29  ite3_query_plan)
32660 2d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  -2 ){.        me
32670 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75  mcpy(&sqlite3_qu
32680 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d  ery_plan[nQPlan]
32690 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75  , pLevel->plan.u
326a0 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 6e 29  .pIdx->zName, n)
326b0 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e  ;.        nQPlan
326c0 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 73   += n;.        s
326d0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
326e0 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20  n[nQPlan++] = ' 
326f0 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ';.      }.    }
32700 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 63  else{.      memc
32710 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72  py(&sqlite3_quer
32720 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20  y_plan[nQPlan], 
32730 22 7b 7d 20 22 2c 20 33 29 3b 0a 20 20 20 20 20  "{} ", 3);.     
32740 20 6e 51 50 6c 61 6e 20 2b 3d 20 33 3b 0a 20 20   nQPlan += 3;.  
32750 20 20 7d 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28    }.  }.  while(
32760 20 6e 51 50 6c 61 6e 3e 30 20 26 26 20 73 71 6c   nQPlan>0 && sql
32770 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
32780 6e 51 50 6c 61 6e 2d 31 5d 3d 3d 27 20 27 20 29  nQPlan-1]==' ' )
32790 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75  {.    sqlite3_qu
327a0 65 72 79 5f 70 6c 61 6e 5b 2d 2d 6e 51 50 6c 61  ery_plan[--nQPla
327b0 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  n] = 0;.  }.  sq
327c0 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
327d0 5b 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20  [nQPlan] = 0;.  
327e0 6e 51 50 6c 61 6e 20 3d 20 30 3b 0a 23 65 6e 64  nQPlan = 0;.#end
327f0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53  if /* SQLITE_TES
32800 54 20 2f 2f 20 54 65 73 74 69 6e 67 20 61 6e 64  T // Testing and
32810 20 64 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f   debugging use o
32820 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 63  nly */..  /* Rec
32830 6f 72 64 20 74 68 65 20 63 6f 6e 74 69 6e 75 61  ord the continua
32840 74 69 6f 6e 20 61 64 64 72 65 73 73 20 69 6e 20  tion address in 
32850 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74  the WhereInfo st
32860 72 75 63 74 75 72 65 2e 20 20 54 68 65 6e 0a 20  ructure.  Then. 
32870 20 2a 2a 20 63 6c 65 61 6e 20 75 70 20 61 6e 64   ** clean up and
32880 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20   return..  */.  
32890 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a  return pWInfo;..
328a0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
328b0 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a  f malloc fails *
328c0 2f 0a 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  /.whereBeginErro
328d0 72 3a 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 20  r:.  if( pWInfo 
328e0 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  ){.    pParse->n
328f0 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e  QueryLoop = pWIn
32900 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c  fo->savedNQueryL
32910 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65 49 6e  oop;.    whereIn
32920 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  foFree(db, pWInf
32930 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
32940 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   0;.}../*.** Gen
32950 65 72 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66  erate the end of
32960 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e   the WHERE loop.
32970 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f    See comments o
32980 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65  n .** sqlite3Whe
32990 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20 61 64  reBegin() for ad
329a0 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
329b0 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
329c0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 57 68  lite3WhereEnd(Wh
329d0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
329e0 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
329f0 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
32a00 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  se;.  Vdbe *v = 
32a10 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
32a20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c   int i;.  WhereL
32a30 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20  evel *pLevel;.  
32a40 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
32a50 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
32a60 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  List;.  sqlite3 
32a70 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
32a80 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
32a90 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f   loop terminatio
32aa0 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 73  n code..  */.  s
32ab0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
32ac0 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
32ad0 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c  for(i=pWInfo->nL
32ae0 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  evel-1; i>=0; i-
32af0 2d 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d  -){.    pLevel =
32b00 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a   &pWInfo->a[i];.
32b10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
32b20 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
32b30 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29  Level->addrCont)
32b40 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
32b50 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  ->op!=OP_Noop ){
32b60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
32b70 62 65 41 64 64 4f 70 32 28 76 2c 20 70 4c 65 76  beAddOp2(v, pLev
32b80 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e  el->op, pLevel->
32b90 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 29 3b  p1, pLevel->p2);
32ba0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
32bb0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 4c  beChangeP5(v, pL
32bc0 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20 7d  evel->p5);.    }
32bd0 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
32be0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
32bf0 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26  WHERE_IN_ABLE &&
32c00 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
32c10 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72  n>0 ){.      str
32c20 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b  uct InLoop *pIn;
32c30 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
32c40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
32c50 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
32c60 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b  Level->addrNxt);
32c70 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65  .      for(j=pLe
32c80 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70  vel->u.in.nIn, p
32c90 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  In=&pLevel->u.in
32ca0 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a  .aInLoop[j-1]; j
32cb0 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b  >0; j--, pIn--){
32cc0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
32cd0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
32ce0 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31  pIn->addrInTop+1
32cf0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
32d00 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
32d10 4f 50 5f 4e 65 78 74 2c 20 70 49 6e 2d 3e 69 43  OP_Next, pIn->iC
32d20 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54  ur, pIn->addrInT
32d30 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  op);.        sql
32d40 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
32d50 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54  (v, pIn->addrInT
32d60 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  op-1);.      }. 
32d70 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
32d80 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75  ee(db, pLevel->u
32d90 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20  .in.aInLoop);.  
32da0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
32db0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
32dc0 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42  v, pLevel->addrB
32dd0 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  rk);.    if( pLe
32de0 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29  vel->iLeftJoin )
32df0 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
32e00 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
32e10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
32e20 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c  (v, OP_IfPos, pL
32e30 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29  evel->iLeftJoin)
32e40 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
32e50 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
32e60 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
32e70 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20  X_ONLY)==0.     
32e80 20 20 20 20 20 20 7c 7c 20 28 70 4c 65 76 65 6c        || (pLevel
32e90 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
32ea0 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
32eb0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
32ec0 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
32ed0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
32ee0 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20  X_ONLY)==0 ){.  
32ef0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
32f00 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75  eAddOp1(v, OP_Nu
32f10 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d  llRow, pTabList-
32f20 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  >a[i].iCursor);.
32f30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
32f40 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  ( pLevel->iIdxCu
32f50 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r>=0 ){.        
32f60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
32f70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  1(v, OP_NullRow,
32f80 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
32f90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
32fa0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d   if( pLevel->op=
32fb0 3d 4f 50 5f 52 65 74 75 72 6e 20 29 7b 0a 20 20  =OP_Return ){.  
32fc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
32fd0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
32fe0 73 75 62 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c  sub, pLevel->p1,
32ff0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72   pLevel->addrFir
33000 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
33010 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
33020 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
33030 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65  P_Goto, 0, pLeve
33040 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20  l->addrFirst);. 
33050 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
33060 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
33070 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d  (v, addr);.    }
33080 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22  .  }..  /* The "
33090 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69 73 20  break" point is 
330a0 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73 74 20  here, just past 
330b0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f  the end of the o
330c0 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20  uter loop..  ** 
330d0 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73  Set it..  */.  s
330e0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
330f0 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f  eLabel(v, pWInfo
33100 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 2f 2a  ->iBreak);..  /*
33110 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68   Close all of th
33120 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 77  e cursors that w
33130 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20 73 71  ere opened by sq
33140 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 2e  lite3WhereBegin.
33150 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
33160 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d  pWInfo->nLevel==
33170 31 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  1 || pWInfo->nLe
33180 76 65 6c 3d 3d 70 54 61 62 4c 69 73 74 2d 3e 6e  vel==pTabList->n
33190 53 72 63 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Src );.  for(i=0
331a0 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d  , pLevel=pWInfo-
331b0 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c  >a; i<pWInfo->nL
331c0 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c 65 76 65  evel; i++, pLeve
331d0 6c 2b 2b 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  l++){.    Index 
331e0 2a 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 73  *pIdx = 0;.    s
331f0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
33200 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d 20 26  em *pTabItem = &
33210 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
33220 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
33230 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54  Table *pTab = pT
33240 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  abItem->pTab;.  
33250 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
33260 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  0 );.    if( (pT
33270 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
33280 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 0a  F_Ephemeral)==0.
33290 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e 70 53       && pTab->pS
332a0 65 6c 65 63 74 3d 3d 30 0a 20 20 20 20 20 26 26  elect==0.     &&
332b0 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
332c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49  lags & WHERE_OMI
332d0 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30  T_OPEN_CLOSE)==0
332e0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 6e  .    ){.      in
332f0 74 20 77 73 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  t ws = pLevel->p
33300 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20 20 20  lan.wsFlags;.   
33310 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e     if( !pWInfo->
33320 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 28 77 73  okOnePass && (ws
33330 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
33340 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)==0 ){.       
33350 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
33360 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
33370 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
33380 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
33390 20 20 69 66 28 20 28 77 73 20 26 20 57 48 45 52    if( (ws & WHER
333a0 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 26 26  E_INDEXED)!=0 &&
333b0 20 28 77 73 20 26 20 57 48 45 52 45 5f 54 45 4d   (ws & WHERE_TEM
333c0 50 5f 49 4e 44 45 58 29 3d 3d 30 20 29 7b 0a 20  P_INDEX)==0 ){. 
333d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
333e0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
333f0 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  lose, pLevel->iI
33400 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a  dxCur);.      }.
33410 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
33420 20 74 68 69 73 20 73 63 61 6e 20 75 73 65 73 20   this scan uses 
33430 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20 63  an index, make c
33440 6f 64 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e  ode substitution
33450 73 20 74 6f 20 72 65 61 64 20 64 61 74 61 0a 20  s to read data. 
33460 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69     ** from the i
33470 6e 64 65 78 20 69 6e 20 70 72 65 66 65 72 65 6e  ndex in preferen
33480 63 65 20 74 6f 20 74 68 65 20 74 61 62 6c 65 2e  ce to the table.
33490 20 53 6f 6d 65 74 69 6d 65 73 2c 20 74 68 69 73   Sometimes, this
334a0 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68   means.    ** th
334b0 65 20 74 61 62 6c 65 20 6e 65 65 64 20 6e 65 76  e table need nev
334c0 65 72 20 62 65 20 72 65 61 64 20 66 72 6f 6d 2e  er be read from.
334d0 20 54 68 69 73 20 69 73 20 61 20 70 65 72 66 6f   This is a perfo
334e0 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2c 0a 20 20  rmance boost,.  
334f0 20 20 2a 2a 20 61 73 20 74 68 65 20 76 64 62 65    ** as the vdbe
33500 20 6c 65 76 65 6c 20 77 61 69 74 73 20 75 6e 74   level waits unt
33510 69 6c 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  il the table is 
33520 72 65 61 64 20 62 65 66 6f 72 65 20 61 63 74 75  read before actu
33530 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 73 65 65 6b  ally.    ** seek
33540 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20 63 75  ing the table cu
33550 72 73 6f 72 20 74 6f 20 74 68 65 20 72 65 63 6f  rsor to the reco
33560 72 64 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  rd corresponding
33570 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 0a   to the current.
33580 20 20 20 20 2a 2a 20 70 6f 73 69 74 69 6f 6e 20      ** position 
33590 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  in the index..  
335a0 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c    ** .    ** Cal
335b0 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67  ls to the code g
335c0 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65 74 77  enerator in betw
335d0 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65 72 65  een sqlite3Where
335e0 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a  Begin and.    **
335f0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
33600 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65 61 74   will have creat
33610 65 64 20 63 6f 64 65 20 74 68 61 74 20 72 65 66  ed code that ref
33620 65 72 65 6e 63 65 73 20 74 68 65 20 74 61 62 6c  erences the tabl
33630 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c  e.    ** directl
33640 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20 73 63  y.  This loop sc
33650 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63 6f 64  ans all that cod
33660 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70  e looking for op
33670 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74 68 61  codes.    ** tha
33680 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  t reference the 
33690 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72  table and conver
336a0 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63  ts them into opc
336b0 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20 2a 2a  odes that.    **
336c0 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 69   reference the i
336d0 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ndex..    */.   
336e0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61   if( pLevel->pla
336f0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
33700 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20  E_INDEXED ){.   
33710 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c     pIdx = pLevel
33720 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20  ->plan.u.pIdx;. 
33730 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65     }else if( pLe
33740 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
33750 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f  s & WHERE_MULTI_
33760 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  OR ){.      pIdx
33770 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f   = pLevel->u.pCo
33780 76 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  vidx;.    }.    
33790 69 66 28 20 70 49 64 78 20 26 26 20 21 64 62 2d  if( pIdx && !db-
337a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 7b 0a  >mallocFailed){.
337b0 20 20 20 20 20 20 69 6e 74 20 6b 2c 20 6a 2c 20        int k, j, 
337c0 6c 61 73 74 3b 0a 20 20 20 20 20 20 56 64 62 65  last;.      Vdbe
337d0 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 20 20 20 20  Op *pOp;..      
337e0 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
337f0 65 47 65 74 4f 70 28 76 2c 20 70 57 49 6e 66 6f  eGetOp(v, pWInfo
33800 2d 3e 69 54 6f 70 29 3b 0a 20 20 20 20 20 20 6c  ->iTop);.      l
33810 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ast = sqlite3Vdb
33820 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
33830 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 57 49  .      for(k=pWI
33840 6e 66 6f 2d 3e 69 54 6f 70 3b 20 6b 3c 6c 61 73  nfo->iTop; k<las
33850 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a  t; k++, pOp++){.
33860 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
33870 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61  >p1!=pLevel->iTa
33880 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bCur ) continue;
33890 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
338a0 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c  ->opcode==OP_Col
338b0 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
338c0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78   for(j=0; j<pIdx
338d0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b  ->nColumn; j++){
338e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
338f0 20 70 4f 70 2d 3e 70 32 3d 3d 70 49 64 78 2d 3e   pOp->p2==pIdx->
33900 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b 0a 20  aiColumn[j] ){. 
33910 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70               pOp
33920 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20 20 20 20 20  ->p2 = j;.      
33930 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
33940 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  = pLevel->iIdxCu
33950 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
33960 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
33970 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
33980 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  }.          asse
33990 72 74 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  rt( (pLevel->pla
339a0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
339b0 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20  E_IDX_ONLY)==0. 
339c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
339d0 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   j<pIdx->nColumn
339e0 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   );.        }els
339f0 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  e if( pOp->opcod
33a00 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20  e==OP_Rowid ){. 
33a10 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31           pOp->p1
33a20 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   = pLevel->iIdxC
33a30 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  ur;.          pO
33a40 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49  p->opcode = OP_I
33a50 64 78 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20  dxRowid;.       
33a60 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
33a70 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c  .  }..  /* Final
33a80 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20   cleanup.  */.  
33a90 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
33aa0 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76  op = pWInfo->sav
33ab0 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  edNQueryLoop;.  
33ac0 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62  whereInfoFree(db
33ad0 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74  , pWInfo);.  ret
33ae0 75 72 6e 3b 0a 7d 0a                             urn;.}.