/ Hex Artifact Content
Login

Artifact 87de2616150606fd1b61d7c88afdb90089ddd53d:


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 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75  ../*.** Trace ou
0350: 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23  tput macros.*/.#
0360: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
0370: 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e  E_TEST) || defin
0380: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
0390: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72  .int sqlite3Wher
03a0: 65 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64  eTrace = 0;.#end
03b0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
03c0: 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 64  QLITE_TEST) && d
03d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
03e0: 42 55 47 29 0a 23 20 64 65 66 69 6e 65 20 57 48  BUG).# define WH
03f0: 45 52 45 54 52 41 43 45 28 58 29 20 20 69 66 28  ERETRACE(X)  if(
0400: 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
0410: 65 29 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  e) sqlite3DebugP
0420: 72 69 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23 20  rintf X.#else.# 
0430: 64 65 66 69 6e 65 20 57 48 45 52 45 54 52 41 43  define WHERETRAC
0440: 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  E(X).#endif../* 
0450: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
0460: 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  e.*/.typedef str
0470: 75 63 74 20 57 68 65 72 65 43 6c 61 75 73 65 20  uct WhereClause 
0480: 57 68 65 72 65 43 6c 61 75 73 65 3b 0a 74 79 70  WhereClause;.typ
0490: 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72  edef struct Wher
04a0: 65 4d 61 73 6b 53 65 74 20 57 68 65 72 65 4d 61  eMaskSet WhereMa
04b0: 73 6b 53 65 74 3b 0a 74 79 70 65 64 65 66 20 73  skSet;.typedef s
04c0: 74 72 75 63 74 20 57 68 65 72 65 4f 72 49 6e 66  truct WhereOrInf
04d0: 6f 20 57 68 65 72 65 4f 72 49 6e 66 6f 3b 0a 74  o WhereOrInfo;.t
04e0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68  ypedef struct Wh
04f0: 65 72 65 41 6e 64 49 6e 66 6f 20 57 68 65 72 65  ereAndInfo Where
0500: 41 6e 64 49 6e 66 6f 3b 0a 74 79 70 65 64 65 66  AndInfo;.typedef
0510: 20 73 74 72 75 63 74 20 57 68 65 72 65 43 6f 73   struct WhereCos
0520: 74 20 57 68 65 72 65 43 6f 73 74 3b 0a 0a 2f 2a  t WhereCost;../*
0530: 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20 67 65  .** The query ge
0540: 6e 65 72 61 74 6f 72 20 75 73 65 73 20 61 6e 20  nerator uses an 
0550: 61 72 72 61 79 20 6f 66 20 69 6e 73 74 61 6e 63  array of instanc
0560: 65 73 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  es of this struc
0570: 74 75 72 65 20 74 6f 0a 2a 2a 20 68 65 6c 70 20  ture to.** help 
0580: 69 74 20 61 6e 61 6c 79 7a 65 20 74 68 65 20 73  it analyze the s
0590: 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  ubexpressions of
05a0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
05b0: 65 2e 20 20 45 61 63 68 20 57 48 45 52 45 0a 2a  e.  Each WHERE.*
05c0: 2a 20 63 6c 61 75 73 65 20 73 75 62 65 78 70 72  * clause subexpr
05d0: 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61  ession is separa
05e0: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6f 74 68  ted from the oth
05f0: 65 72 73 20 62 79 20 41 4e 44 20 6f 70 65 72 61  ers by AND opera
0600: 74 6f 72 73 2c 0a 2a 2a 20 75 73 75 61 6c 6c 79  tors,.** usually
0610: 2c 20 6f 72 20 73 6f 6d 65 74 69 6d 65 73 20 73  , or sometimes s
0620: 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 73 65  ubexpressions se
0630: 70 61 72 61 74 65 64 20 62 79 20 4f 52 2e 0a 2a  parated by OR..*
0640: 2a 0a 2a 2a 20 41 6c 6c 20 57 68 65 72 65 54 65  *.** All WhereTe
0650: 72 6d 73 20 61 72 65 20 63 6f 6c 6c 65 63 74 65  rms are collecte
0660: 64 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  d into a single 
0670: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
0680: 63 74 75 72 65 2e 20 20 0a 2a 2a 20 54 68 65 20  cture.  .** The 
0690: 66 6f 6c 6c 6f 77 69 6e 67 20 69 64 65 6e 74 69  following identi
06a0: 74 79 20 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20  ty holds:.**.** 
06b0: 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d         WhereTerm
06c0: 2e 70 57 43 2d 3e 61 5b 57 68 65 72 65 54 65 72  .pWC->a[WhereTer
06d0: 6d 2e 69 64 78 5d 20 3d 3d 20 57 68 65 72 65 54  m.idx] == WhereT
06e0: 65 72 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  erm.**.** When a
06f0: 20 74 65 72 6d 20 69 73 20 6f 66 20 74 68 65 20   term is of the 
0700: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  form:.**.**     
0710: 20 20 20 20 20 20 20 20 20 58 20 3c 6f 70 3e 20           X <op> 
0720: 3c 65 78 70 72 3e 0a 2a 2a 0a 2a 2a 20 77 68 65  <expr>.**.** whe
0730: 72 65 20 58 20 69 73 20 61 20 63 6f 6c 75 6d 6e  re X is a column
0740: 20 6e 61 6d 65 20 61 6e 64 20 3c 6f 70 3e 20 69   name and <op> i
0750: 73 20 6f 6e 65 20 6f 66 20 63 65 72 74 61 69 6e  s one of certain
0760: 20 6f 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20 74   operators,.** t
0770: 68 65 6e 20 57 68 65 72 65 54 65 72 6d 2e 6c 65  hen WhereTerm.le
0780: 66 74 43 75 72 73 6f 72 20 61 6e 64 20 57 68 65  ftCursor and Whe
0790: 72 65 54 65 72 6d 2e 75 2e 6c 65 66 74 43 6f 6c  reTerm.u.leftCol
07a0: 75 6d 6e 20 72 65 63 6f 72 64 20 74 68 65 0a 2a  umn record the.*
07b0: 2a 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * cursor number 
07c0: 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  and column numbe
07d0: 72 20 66 6f 72 20 58 2e 20 20 57 68 65 72 65 54  r for X.  WhereT
07e0: 65 72 6d 2e 65 4f 70 65 72 61 74 6f 72 20 72 65  erm.eOperator re
07f0: 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 3c 6f 70  cords.** the <op
0800: 3e 20 75 73 69 6e 67 20 61 20 62 69 74 6d 61 73  > using a bitmas
0810: 6b 20 65 6e 63 6f 64 69 6e 67 20 64 65 66 69 6e  k encoding defin
0820: 65 64 20 62 79 20 57 4f 5f 78 78 78 20 62 65 6c  ed by WO_xxx bel
0830: 6f 77 2e 20 20 54 68 65 0a 2a 2a 20 75 73 65 20  ow.  The.** use 
0840: 6f 66 20 61 20 62 69 74 6d 61 73 6b 20 65 6e 63  of a bitmask enc
0850: 6f 64 69 6e 67 20 66 6f 72 20 74 68 65 20 6f 70  oding for the op
0860: 65 72 61 74 6f 72 20 61 6c 6c 6f 77 73 20 75 73  erator allows us
0870: 20 74 6f 20 73 65 61 72 63 68 0a 2a 2a 20 71 75   to search.** qu
0880: 69 63 6b 6c 79 20 66 6f 72 20 74 65 72 6d 73 20  ickly for terms 
0890: 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 6f  that match any o
08a0: 66 20 73 65 76 65 72 61 6c 20 64 69 66 66 65 72  f several differ
08b0: 65 6e 74 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a  ent operators..*
08c0: 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65 72 6d  *.** A WhereTerm
08d0: 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 74   might also be t
08e0: 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74 65  wo or more subte
08f0: 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  rms connected by
0900: 20 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20   OR:.**.**      
0910: 20 20 20 28 74 31 2e 58 20 3c 6f 70 3e 20 3c 65     (t1.X <op> <e
0920: 78 70 72 3e 29 20 4f 52 20 28 74 31 2e 59 20 3c  xpr>) OR (t1.Y <
0930: 6f 70 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20 2e  op> <expr>) OR .
0940: 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69  ....**.** In thi
0950: 73 20 73 65 63 6f 6e 64 20 63 61 73 65 2c 20 77  s second case, w
0960: 74 46 6c 61 67 20 61 73 20 74 68 65 20 54 45 52  tFlag as the TER
0970: 4d 5f 4f 52 49 4e 46 4f 20 73 65 74 20 61 6e 64  M_ORINFO set and
0980: 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f   eOperator==WO_O
0990: 52 0a 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65  R.** and the Whe
09a0: 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f  reTerm.u.pOrInfo
09b0: 20 66 69 65 6c 64 20 70 6f 69 6e 74 73 20 74 6f   field points to
09c0: 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72   auxiliary infor
09d0: 6d 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 69  mation that.** i
09e0: 73 20 63 6f 6c 6c 65 63 74 65 64 20 61 62 6f 75  s collected abou
09f0: 74 20 74 68 65 0a 2a 2a 0a 2a 2a 20 49 66 20 61  t the.**.** If a
0a00: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
0a10: 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e  RE clause does n
0a20: 6f 74 20 6d 61 74 63 68 20 65 69 74 68 65 72 20  ot match either 
0a30: 6f 66 20 74 68 65 20 74 77 6f 20 70 72 65 76 69  of the two previ
0a40: 6f 75 73 0a 2a 2a 20 63 61 74 65 67 6f 72 69 65  ous.** categorie
0a50: 73 2c 20 74 68 65 6e 20 65 4f 70 65 72 61 74 6f  s, then eOperato
0a60: 72 3d 3d 30 2e 20 20 54 68 65 20 57 68 65 72 65  r==0.  The Where
0a70: 54 65 72 6d 2e 70 45 78 70 72 20 66 69 65 6c 64  Term.pExpr field
0a80: 20 69 73 20 73 74 69 6c 6c 20 73 65 74 0a 2a 2a   is still set.**
0a90: 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
0aa0: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 63   subexpression c
0ab0: 6f 6e 74 65 6e 74 20 61 6e 64 20 77 74 46 6c 61  ontent and wtFla
0ac0: 67 73 20 69 73 20 73 65 74 20 75 70 20 61 70 70  gs is set up app
0ad0: 72 6f 70 72 69 61 74 65 6c 79 0a 2a 2a 20 62 75  ropriately.** bu
0ae0: 74 20 6e 6f 20 6f 74 68 65 72 20 66 69 65 6c 64  t no other field
0af0: 73 20 69 6e 20 74 68 65 20 57 68 65 72 65 54 65  s in the WhereTe
0b00: 72 6d 20 6f 62 6a 65 63 74 20 61 72 65 20 6d 65  rm object are me
0b10: 61 6e 69 6e 67 66 75 6c 2e 0a 2a 2a 0a 2a 2a 20  aningful..**.** 
0b20: 57 68 65 6e 20 65 4f 70 65 72 61 74 6f 72 21 3d  When eOperator!=
0b30: 30 2c 20 70 72 65 72 65 71 52 69 67 68 74 20 61  0, prereqRight a
0b40: 6e 64 20 70 72 65 72 65 71 41 6c 6c 20 72 65 63  nd prereqAll rec
0b50: 6f 72 64 20 73 65 74 73 20 6f 66 20 63 75 72 73  ord sets of curs
0b60: 6f 72 20 6e 75 6d 62 65 72 73 2c 0a 2a 2a 20 62  or numbers,.** b
0b70: 75 74 20 74 68 65 79 20 64 6f 20 73 6f 20 69 6e  ut they do so in
0b80: 64 69 72 65 63 74 6c 79 2e 20 20 41 20 73 69 6e  directly.  A sin
0b90: 67 6c 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74  gle WhereMaskSet
0ba0: 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e 73   structure trans
0bb0: 6c 61 74 65 73 0a 2a 2a 20 63 75 72 73 6f 72 20  lates.** cursor 
0bc0: 6e 75 6d 62 65 72 20 69 6e 74 6f 20 62 69 74 73  number into bits
0bd0: 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 6c 61   and the transla
0be0: 74 65 64 20 62 69 74 20 69 73 20 73 74 6f 72 65  ted bit is store
0bf0: 64 20 69 6e 20 74 68 65 20 70 72 65 72 65 71 0a  d in the prereq.
0c00: 2a 2a 20 66 69 65 6c 64 73 2e 20 20 54 68 65 20  ** fields.  The 
0c10: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 69 73 20 75  translation is u
0c20: 73 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  sed in order to 
0c30: 6d 61 78 69 6d 69 7a 65 20 74 68 65 20 6e 75 6d  maximize the num
0c40: 62 65 72 20 6f 66 0a 2a 2a 20 62 69 74 73 20 74  ber of.** bits t
0c50: 68 61 74 20 77 69 6c 6c 20 66 69 74 20 69 6e 20  hat will fit in 
0c60: 61 20 42 69 74 6d 61 73 6b 2e 20 20 54 68 65 20  a Bitmask.  The 
0c70: 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
0c80: 65 72 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20  ers might be.** 
0c90: 73 70 72 65 61 64 20 6f 75 74 20 6f 76 65 72 20  spread out over 
0ca0: 74 68 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65  the non-negative
0cb0: 20 69 6e 74 65 67 65 72 73 2e 20 20 46 6f 72 20   integers.  For 
0cc0: 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 63 75 72  example, the cur
0cd0: 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 6d  sor.** numbers m
0ce0: 69 67 68 74 20 62 65 20 33 2c 20 38 2c 20 39 2c  ight be 3, 8, 9,
0cf0: 20 31 30 2c 20 32 30 2c 20 32 33 2c 20 34 31 2c   10, 20, 23, 41,
0d00: 20 61 6e 64 20 34 35 2e 20 20 54 68 65 20 57 68   and 45.  The Wh
0d10: 65 72 65 4d 61 73 6b 53 65 74 0a 2a 2a 20 74 72  ereMaskSet.** tr
0d20: 61 6e 73 6c 61 74 65 73 20 74 68 65 73 65 20 73  anslates these s
0d30: 70 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75 6d  parse cursor num
0d40: 62 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63  bers into consec
0d50: 75 74 69 76 65 20 69 6e 74 65 67 65 72 73 0a 2a  utive integers.*
0d60: 2a 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68  * beginning with
0d70: 20 30 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d   0 in order to m
0d80: 61 6b 65 20 74 68 65 20 62 65 73 74 20 70 6f 73  ake the best pos
0d90: 73 69 62 6c 65 20 75 73 65 20 6f 66 20 74 68 65  sible use of the
0da0: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 62 69   available.** bi
0db0: 74 73 20 69 6e 20 74 68 65 20 42 69 74 6d 61 73  ts in the Bitmas
0dc0: 6b 2e 20 20 53 6f 2c 20 69 6e 20 74 68 65 20 65  k.  So, in the e
0dd0: 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68  xample above, th
0de0: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
0df0: 0a 2a 2a 20 77 6f 75 6c 64 20 62 65 20 6d 61 70  .** would be map
0e00: 70 65 64 20 69 6e 74 6f 20 69 6e 74 65 67 65 72  ped into integer
0e10: 73 20 30 20 74 68 72 6f 75 67 68 20 37 2e 0a 2a  s 0 through 7..*
0e20: 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
0e30: 6f 66 20 74 65 72 6d 73 20 69 6e 20 61 20 6a 6f  of terms in a jo
0e40: 69 6e 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79  in is limited by
0e50: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
0e60: 69 74 73 0a 2a 2a 20 69 6e 20 70 72 65 72 65 71  its.** in prereq
0e70: 52 69 67 68 74 20 61 6e 64 20 70 72 65 72 65 71  Right and prereq
0e80: 41 6c 6c 2e 20 20 54 68 65 20 64 65 66 61 75 6c  All.  The defaul
0e90: 74 20 69 73 20 36 34 20 62 69 74 73 2c 20 68 65  t is 64 bits, he
0ea0: 6e 63 65 20 53 51 4c 69 74 65 0a 2a 2a 20 69 73  nce SQLite.** is
0eb0: 20 6f 6e 6c 79 20 61 62 6c 65 20 74 6f 20 70 72   only able to pr
0ec0: 6f 63 65 73 73 20 6a 6f 69 6e 73 20 77 69 74 68  ocess joins with
0ed0: 20 36 34 20 6f 72 20 66 65 77 65 72 20 74 61 62   64 or fewer tab
0ee0: 6c 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  les..*/.typedef 
0ef0: 73 74 72 75 63 74 20 57 68 65 72 65 54 65 72 6d  struct WhereTerm
0f00: 20 57 68 65 72 65 54 65 72 6d 3b 0a 73 74 72 75   WhereTerm;.stru
0f10: 63 74 20 57 68 65 72 65 54 65 72 6d 20 7b 0a 20  ct WhereTerm {. 
0f20: 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20   Expr *pExpr;   
0f30: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
0f40: 74 65 72 20 74 6f 20 74 68 65 20 73 75 62 65 78  ter to the subex
0f50: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73  pression that is
0f60: 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20   this term */.  
0f70: 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20  int iParent;    
0f80: 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62          /* Disab
0f90: 6c 65 20 70 57 43 2d 3e 61 5b 69 50 61 72 65 6e  le pWC->a[iParen
0fa0: 74 5d 20 77 68 65 6e 20 74 68 69 73 20 74 65 72  t] when this ter
0fb0: 6d 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  m disabled */.  
0fc0: 69 6e 74 20 6c 65 66 74 43 75 72 73 6f 72 3b 20  int leftCursor; 
0fd0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
0fe0: 72 20 6e 75 6d 62 65 72 20 6f 66 20 58 20 69 6e  r number of X in
0ff0: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
1000: 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20   */.  union {.  
1010: 20 20 69 6e 74 20 6c 65 66 74 43 6f 6c 75 6d 6e    int leftColumn
1020: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c  ;         /* Col
1030: 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 58 20  umn number of X 
1040: 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  in "X <op> <expr
1050: 3e 22 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4f  >" */.    WhereO
1060: 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20  rInfo *pOrInfo; 
1070: 20 20 2f 2a 20 45 78 74 72 61 20 69 6e 66 6f 72    /* Extra infor
1080: 6d 61 74 69 6f 6e 20 69 66 20 65 4f 70 65 72 61  mation if eOpera
1090: 74 6f 72 3d 3d 57 4f 5f 4f 52 20 2a 2f 0a 20 20  tor==WO_OR */.  
10a0: 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a    WhereAndInfo *
10b0: 70 41 6e 64 49 6e 66 6f 3b 20 2f 2a 20 45 78 74  pAndInfo; /* Ext
10c0: 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ra information i
10d0: 66 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  f eOperator==WO_
10e0: 41 4e 44 20 2a 2f 0a 20 20 7d 20 75 3b 0a 20 20  AND */.  } u;.  
10f0: 75 31 36 20 65 4f 70 65 72 61 74 6f 72 3b 20 20  u16 eOperator;  
1100: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 4f 5f          /* A WO_
1110: 78 78 20 76 61 6c 75 65 20 64 65 73 63 72 69 62  xx value describ
1120: 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a 20 20 75 38  ing <op> */.  u8
1130: 20 77 74 46 6c 61 67 73 3b 20 20 20 20 20 20 20   wtFlags;       
1140: 20 20 20 20 20 20 2f 2a 20 54 45 52 4d 5f 78 78        /* TERM_xx
1150: 78 20 62 69 74 20 66 6c 61 67 73 2e 20 20 53 65  x bit flags.  Se
1160: 65 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 75 38 20  e below */.  u8 
1170: 6e 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20  nChild;         
1180: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1190: 66 20 63 68 69 6c 64 72 65 6e 20 74 68 61 74 20  f children that 
11a0: 6d 75 73 74 20 64 69 73 61 62 6c 65 20 75 73 20  must disable us 
11b0: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
11c0: 20 2a 70 57 43 3b 20 20 20 20 20 20 20 2f 2a 20   *pWC;       /* 
11d0: 54 68 65 20 63 6c 61 75 73 65 20 74 68 69 73 20  The clause this 
11e0: 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20  term is part of 
11f0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
1200: 72 65 71 52 69 67 68 74 3b 20 20 20 20 2f 2a 20  reqRight;    /* 
1210: 42 69 74 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65  Bitmask of table
1220: 73 20 75 73 65 64 20 62 79 20 70 45 78 70 72 2d  s used by pExpr-
1230: 3e 70 52 69 67 68 74 20 2a 2f 0a 20 20 42 69 74  >pRight */.  Bit
1240: 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20  mask prereqAll; 
1250: 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20       /* Bitmask 
1260: 6f 66 20 74 61 62 6c 65 73 20 72 65 66 65 72 65  of tables refere
1270: 6e 63 65 64 20 62 79 20 70 45 78 70 72 20 2a 2f  nced by pExpr */
1280: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  .};../*.** Allow
1290: 65 64 20 76 61 6c 75 65 73 20 6f 66 20 57 68 65  ed values of Whe
12a0: 72 65 54 65 72 6d 2e 77 74 46 6c 61 67 73 0a 2a  reTerm.wtFlags.*
12b0: 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 44  /.#define TERM_D
12c0: 59 4e 41 4d 49 43 20 20 20 20 30 78 30 31 20 20  YNAMIC    0x01  
12d0: 20 2f 2a 20 4e 65 65 64 20 74 6f 20 63 61 6c 6c   /* Need to call
12e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
12f0: 74 65 28 64 62 2c 20 70 45 78 70 72 29 20 2a 2f  te(db, pExpr) */
1300: 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 56 49  .#define TERM_VI
1310: 52 54 55 41 4c 20 20 20 20 30 78 30 32 20 20 20  RTUAL    0x02   
1320: 2f 2a 20 41 64 64 65 64 20 62 79 20 74 68 65 20  /* Added by the 
1330: 6f 70 74 69 6d 69 7a 65 72 2e 20 20 44 6f 20 6e  optimizer.  Do n
1340: 6f 74 20 63 6f 64 65 20 2a 2f 0a 23 64 65 66 69  ot code */.#defi
1350: 6e 65 20 54 45 52 4d 5f 43 4f 44 45 44 20 20 20  ne TERM_CODED   
1360: 20 20 20 30 78 30 34 20 20 20 2f 2a 20 54 68 69     0x04   /* Thi
1370: 73 20 74 65 72 6d 20 69 73 20 61 6c 72 65 61 64  s term is alread
1380: 79 20 63 6f 64 65 64 20 2a 2f 0a 23 64 65 66 69  y coded */.#defi
1390: 6e 65 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 20  ne TERM_COPIED  
13a0: 20 20 20 30 78 30 38 20 20 20 2f 2a 20 48 61 73     0x08   /* Has
13b0: 20 61 20 63 68 69 6c 64 20 2a 2f 0a 23 64 65 66   a child */.#def
13c0: 69 6e 65 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20  ine TERM_ORINFO 
13d0: 20 20 20 20 30 78 31 30 20 20 20 2f 2a 20 4e 65      0x10   /* Ne
13e0: 65 64 20 74 6f 20 66 72 65 65 20 74 68 65 20 57  ed to free the W
13f0: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
1400: 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 64 65  fo object */.#de
1410: 66 69 6e 65 20 54 45 52 4d 5f 41 4e 44 49 4e 46  fine TERM_ANDINF
1420: 4f 20 20 20 20 30 78 32 30 20 20 20 2f 2a 20 4e  O    0x20   /* N
1430: 65 65 64 20 74 6f 20 66 72 65 65 20 74 68 65 20  eed to free the 
1440: 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 41 6e 64  WhereTerm.u.pAnd
1450: 49 6e 66 6f 20 6f 62 6a 20 2a 2f 0a 23 64 65 66  Info obj */.#def
1460: 69 6e 65 20 54 45 52 4d 5f 4f 52 5f 4f 4b 20 20  ine TERM_OR_OK  
1470: 20 20 20 20 30 78 34 30 20 20 20 2f 2a 20 55 73      0x40   /* Us
1480: 65 64 20 64 75 72 69 6e 67 20 4f 52 2d 63 6c 61  ed during OR-cla
1490: 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 2a  use processing *
14a0: 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 56  /.#define TERM_V
14b0: 4e 55 4c 4c 20 20 20 20 20 20 30 78 38 30 20 20  NULL      0x80  
14c0: 20 2f 2a 20 4d 61 6e 75 66 61 63 74 75 72 65 64   /* Manufactured
14d0: 20 78 3e 4e 55 4c 4c 20 6f 72 20 78 3c 3d 4e 55   x>NULL or x<=NU
14e0: 4c 4c 20 74 65 72 6d 20 2a 2f 0a 0a 2f 2a 0a 2a  LL term */../*.*
14f0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
1500: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
1510: 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 61  tructure holds a
1520: 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ll information a
1530: 62 6f 75 74 20 61 0a 2a 2a 20 57 48 45 52 45 20  bout a.** WHERE 
1540: 63 6c 61 75 73 65 2e 20 20 4d 6f 73 74 6c 79 20  clause.  Mostly 
1550: 74 68 69 73 20 69 73 20 61 20 63 6f 6e 74 61 69  this is a contai
1560: 6e 65 72 20 66 6f 72 20 6f 6e 65 20 6f 72 20 6d  ner for one or m
1570: 6f 72 65 20 57 68 65 72 65 54 65 72 6d 73 2e 0a  ore WhereTerms..
1580: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 43  */.struct WhereC
1590: 6c 61 75 73 65 20 7b 0a 20 20 50 61 72 73 65 20  lause {.  Parse 
15a0: 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
15b0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
15c0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
15d0: 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
15e0: 6b 53 65 74 3b 20 20 2f 2a 20 4d 61 70 70 69 6e  kSet;  /* Mappin
15f0: 67 20 6f 66 20 74 61 62 6c 65 20 63 75 72 73 6f  g of table curso
1600: 72 20 6e 75 6d 62 65 72 73 20 74 6f 20 62 69 74  r numbers to bit
1610: 6d 61 73 6b 73 20 2a 2f 0a 20 20 42 69 74 6d 61  masks */.  Bitma
1620: 73 6b 20 76 6d 61 73 6b 3b 20 20 20 20 20 20 20  sk vmask;       
1630: 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 69      /* Bitmask i
1640: 64 65 6e 74 69 66 79 69 6e 67 20 76 69 72 74 75  dentifying virtu
1650: 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72 73  al table cursors
1660: 20 2a 2f 0a 20 20 75 38 20 6f 70 3b 20 20 20 20   */.  u8 op;    
1670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1680: 2a 20 53 70 6c 69 74 20 6f 70 65 72 61 74 6f 72  * Split operator
1690: 2e 20 20 54 4b 5f 41 4e 44 20 6f 72 20 54 4b 5f  .  TK_AND or TK_
16a0: 4f 52 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72  OR */.  int nTer
16b0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
16c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
16d0: 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 6c  rms */.  int nSl
16e0: 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ot;             
16f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
1700: 6e 74 72 69 65 73 20 69 6e 20 61 5b 5d 20 2a 2f  ntries in a[] */
1710: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b  .  WhereTerm *a;
1720: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
1730: 61 63 68 20 61 5b 5d 20 64 65 73 63 72 69 62 65  ach a[] describe
1740: 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20  s a term of the 
1750: 57 48 45 52 45 20 63 6c 75 61 73 65 20 2a 2f 0a  WHERE cluase */.
1760: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1770: 54 45 5f 53 4d 41 4c 4c 5f 53 54 41 43 4b 29 0a  TE_SMALL_STACK).
1780: 20 20 57 68 65 72 65 54 65 72 6d 20 61 53 74 61    WhereTerm aSta
1790: 74 69 63 5b 31 5d 3b 20 20 20 20 2f 2a 20 49 6e  tic[1];    /* In
17a0: 69 74 69 61 6c 20 73 74 61 74 69 63 20 73 70 61  itial static spa
17b0: 63 65 20 66 6f 72 20 61 5b 5d 20 2a 2f 0a 23 65  ce for a[] */.#e
17c0: 6c 73 65 0a 20 20 57 68 65 72 65 54 65 72 6d 20  lse.  WhereTerm 
17d0: 61 53 74 61 74 69 63 5b 38 5d 3b 20 20 20 20 2f  aStatic[8];    /
17e0: 2a 20 49 6e 69 74 69 61 6c 20 73 74 61 74 69 63  * Initial static
17f0: 20 73 70 61 63 65 20 66 6f 72 20 61 5b 5d 20 2a   space for a[] *
1800: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
1810: 2a 2a 20 41 20 57 68 65 72 65 54 65 72 6d 20 77  ** A WhereTerm w
1820: 69 74 68 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57  ith eOperator==W
1830: 4f 5f 4f 52 20 68 61 73 20 69 74 73 20 75 2e 70  O_OR has its u.p
1840: 4f 72 49 6e 66 6f 20 70 6f 69 6e 74 65 72 20 73  OrInfo pointer s
1850: 65 74 20 74 6f 0a 2a 2a 20 61 20 64 79 6e 61 6d  et to.** a dynam
1860: 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
1870: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
1880: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
1890: 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ture..*/.struct 
18a0: 57 68 65 72 65 4f 72 49 6e 66 6f 20 7b 0a 20 20  WhereOrInfo {.  
18b0: 57 68 65 72 65 43 6c 61 75 73 65 20 77 63 3b 20  WhereClause wc; 
18c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 63 6f           /* Deco
18d0: 6d 70 6f 73 69 74 69 6f 6e 20 69 6e 74 6f 20 73  mposition into s
18e0: 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74  ubterms */.  Bit
18f0: 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c 65 3b 20  mask indexable; 
1900: 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b        /* Bitmask
1910: 20 6f 66 20 61 6c 6c 20 69 6e 64 65 78 61 62 6c   of all indexabl
1920: 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  e tables in the 
1930: 63 6c 61 75 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  clause */.};../*
1940: 0a 2a 2a 20 41 20 57 68 65 72 65 54 65 72 6d 20  .** A WhereTerm 
1950: 77 69 74 68 20 65 4f 70 65 72 61 74 6f 72 3d 3d  with eOperator==
1960: 57 4f 5f 41 4e 44 20 68 61 73 20 69 74 73 20 75  WO_AND has its u
1970: 2e 70 41 6e 64 49 6e 66 6f 20 70 6f 69 6e 74 65  .pAndInfo pointe
1980: 72 20 73 65 74 20 74 6f 0a 2a 2a 20 61 20 64 79  r set to.** a dy
1990: 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
19a0: 74 65 64 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ted instance of 
19b0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
19c0: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75  ructure..*/.stru
19d0: 63 74 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20  ct WhereAndInfo 
19e0: 7b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  {.  WhereClause 
19f0: 77 63 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  wc;          /* 
1a00: 54 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  The subexpressio
1a10: 6e 20 62 72 6f 6b 65 6e 20 6f 75 74 20 2a 2f 0a  n broken out */.
1a20: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  };../*.** An ins
1a30: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
1a40: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
1a50: 20 6b 65 65 70 73 20 74 72 61 63 6b 20 6f 66 20   keeps track of 
1a60: 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 62 65 74  a mapping.** bet
1a70: 77 65 65 6e 20 56 44 42 45 20 63 75 72 73 6f 72  ween VDBE cursor
1a80: 20 6e 75 6d 62 65 72 73 20 61 6e 64 20 62 69 74   numbers and bit
1a90: 73 20 6f 66 20 74 68 65 20 62 69 74 6d 61 73 6b  s of the bitmask
1aa0: 73 20 69 6e 20 57 68 65 72 65 54 65 72 6d 2e 0a  s in WhereTerm..
1ab0: 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 63  **.** The VDBE c
1ac0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72  ursor numbers ar
1ad0: 65 20 73 6d 61 6c 6c 20 69 6e 74 65 67 65 72 73  e small integers
1ae0: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 0a 2a   contained in .*
1af0: 2a 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 2e 69  * SrcList_item.i
1b00: 43 75 72 73 6f 72 20 61 6e 64 20 45 78 70 72 2e  Cursor and Expr.
1b10: 69 54 61 62 6c 65 20 66 69 65 6c 64 73 2e 20 20  iTable fields.  
1b20: 46 6f 72 20 61 6e 79 20 67 69 76 65 6e 20 57 48  For any given WH
1b30: 45 52 45 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20  ERE .** clause, 
1b40: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
1b50: 72 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 67  rs might not beg
1b60: 69 6e 20 77 69 74 68 20 30 20 61 6e 64 20 74 68  in with 0 and th
1b70: 65 79 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6e 74  ey might.** cont
1b80: 61 69 6e 20 67 61 70 73 20 69 6e 20 74 68 65 20  ain gaps in the 
1b90: 6e 75 6d 62 65 72 69 6e 67 20 73 65 71 75 65 6e  numbering sequen
1ba0: 63 65 2e 20 20 42 75 74 20 77 65 20 77 61 6e 74  ce.  But we want
1bb0: 20 74 6f 20 6d 61 6b 65 20 6d 61 78 69 6d 75 6d   to make maximum
1bc0: 0a 2a 2a 20 75 73 65 20 6f 66 20 74 68 65 20 62  .** use of the b
1bd0: 69 74 73 20 69 6e 20 6f 75 72 20 62 69 74 6d 61  its in our bitma
1be0: 73 6b 73 2e 20 20 54 68 69 73 20 73 74 72 75 63  sks.  This struc
1bf0: 74 75 72 65 20 70 72 6f 76 69 64 65 73 20 61 20  ture provides a 
1c00: 6d 61 70 70 69 6e 67 0a 2a 2a 20 66 72 6f 6d 20  mapping.** from 
1c10: 74 68 65 20 73 70 61 72 73 65 20 63 75 72 73 6f  the sparse curso
1c20: 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 63  r numbers into c
1c30: 6f 6e 73 65 63 75 74 69 76 65 20 69 6e 74 65 67  onsecutive integ
1c40: 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a  ers beginning.**
1c50: 20 77 69 74 68 20 30 2e 0a 2a 2a 0a 2a 2a 20 49   with 0..**.** I
1c60: 66 20 57 68 65 72 65 4d 61 73 6b 53 65 74 2e 69  f WhereMaskSet.i
1c70: 78 5b 41 5d 3d 3d 42 20 69 74 20 6d 65 61 6e 73  x[A]==B it means
1c80: 20 74 68 61 74 20 54 68 65 20 41 2d 74 68 20 62   that The A-th b
1c90: 69 74 20 6f 66 20 61 20 42 69 74 6d 61 73 6b 0a  it of a Bitmask.
1ca0: 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 56  ** corresponds V
1cb0: 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
1cc0: 72 20 42 2e 20 20 54 68 65 20 41 2d 74 68 20 62  r B.  The A-th b
1cd0: 69 74 20 6f 66 20 61 20 62 69 74 6d 61 73 6b 20  it of a bitmask 
1ce0: 69 73 20 31 3c 3c 41 2e 0a 2a 2a 0a 2a 2a 20 46  is 1<<A..**.** F
1cf0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
1d00: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1d10: 65 78 70 72 65 73 73 69 6f 6e 20 75 73 65 64 20  expression used 
1d20: 74 68 65 73 65 20 56 44 42 45 0a 2a 2a 20 63 75  these VDBE.** cu
1d30: 72 73 6f 72 73 3a 20 20 34 2c 20 35 2c 20 38 2c  rsors:  4, 5, 8,
1d40: 20 32 39 2c 20 35 37 2c 20 37 33 2e 20 20 54 68   29, 57, 73.  Th
1d50: 65 6e 20 74 68 65 20 20 57 68 65 72 65 4d 61 73  en the  WhereMas
1d60: 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 0a 2a  kSet structure.*
1d70: 2a 20 77 6f 75 6c 64 20 6d 61 70 20 74 68 6f 73  * would map thos
1d80: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
1d90: 20 69 6e 74 6f 20 62 69 74 73 20 30 20 74 68 72   into bits 0 thr
1da0: 6f 75 67 68 20 35 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  ough 5..**.** No
1db0: 74 65 20 74 68 61 74 20 74 68 65 20 6d 61 70 70  te that the mapp
1dc0: 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  ing is not neces
1dd0: 73 61 72 69 6c 79 20 6f 72 64 65 72 65 64 2e 20  sarily ordered. 
1de0: 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 0a   In the example.
1df0: 2a 2a 20 61 62 6f 76 65 2c 20 74 68 65 20 6d 61  ** above, the ma
1e00: 70 70 69 6e 67 20 6d 69 67 68 74 20 67 6f 20 6c  pping might go l
1e10: 69 6b 65 20 74 68 69 73 3a 20 20 34 2d 3e 33 2c  ike this:  4->3,
1e20: 20 35 2d 3e 31 2c 20 38 2d 3e 32 2c 20 32 39 2d   5->1, 8->2, 29-
1e30: 3e 30 2c 0a 2a 2a 20 35 37 2d 3e 35 2c 20 37 33  >0,.** 57->5, 73
1e40: 2d 3e 34 2e 20 20 4f 72 20 6f 6e 65 20 6f 66 20  ->4.  Or one of 
1e50: 37 31 39 20 6f 74 68 65 72 20 63 6f 6d 62 69 6e  719 other combin
1e60: 61 74 69 6f 6e 73 20 6d 69 67 68 74 20 62 65 20  ations might be 
1e70: 75 73 65 64 2e 20 49 74 0a 2a 2a 20 64 6f 65 73  used. It.** does
1e80: 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6d 61 74 74   not really matt
1e90: 65 72 2e 20 20 57 68 61 74 20 69 73 20 69 6d 70  er.  What is imp
1ea0: 6f 72 74 61 6e 74 20 69 73 20 74 68 61 74 20 73  ortant is that s
1eb0: 70 61 72 73 65 20 63 75 72 73 6f 72 0a 2a 2a 20  parse cursor.** 
1ec0: 6e 75 6d 62 65 72 73 20 61 6c 6c 20 67 65 74 20  numbers all get 
1ed0: 6d 61 70 70 65 64 20 69 6e 74 6f 20 62 69 74 20  mapped into bit 
1ee0: 6e 75 6d 62 65 72 73 20 74 68 61 74 20 62 65 67  numbers that beg
1ef0: 69 6e 20 77 69 74 68 20 30 20 61 6e 64 20 63 6f  in with 0 and co
1f00: 6e 74 61 69 6e 0a 2a 2a 20 6e 6f 20 67 61 70 73  ntain.** no gaps
1f10: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72  ..*/.struct Wher
1f20: 65 4d 61 73 6b 53 65 74 20 7b 0a 20 20 69 6e 74  eMaskSet {.  int
1f30: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
1f40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1f50: 6d 62 65 72 20 6f 66 20 61 73 73 69 67 6e 65 64  mber of assigned
1f60: 20 63 75 72 73 6f 72 20 76 61 6c 75 65 73 20 2a   cursor values *
1f70: 2f 0a 20 20 69 6e 74 20 69 78 5b 42 4d 53 5d 3b  /.  int ix[BMS];
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f90: 20 20 2f 2a 20 43 75 72 73 6f 72 20 61 73 73 69    /* Cursor assi
1fa0: 67 6e 65 64 20 74 6f 20 65 61 63 68 20 62 69 74  gned to each bit
1fb0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20   */.};../*.** A 
1fc0: 57 68 65 72 65 43 6f 73 74 20 6f 62 6a 65 63 74  WhereCost object
1fd0: 20 72 65 63 6f 72 64 73 20 61 20 6c 6f 6f 6b 75   records a looku
1fe0: 70 20 73 74 72 61 74 65 67 79 20 61 6e 64 20 74  p strategy and t
1ff0: 68 65 20 65 73 74 69 6d 61 74 65 64 0a 2a 2a 20  he estimated.** 
2000: 63 6f 73 74 20 6f 66 20 70 75 72 73 75 69 6e 67  cost of pursuing
2010: 20 74 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a   that strategy..
2020: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 43  */.struct WhereC
2030: 6f 73 74 20 7b 0a 20 20 57 68 65 72 65 50 6c 61  ost {.  WherePla
2040: 6e 20 70 6c 61 6e 3b 20 20 20 20 2f 2a 20 54 68  n plan;    /* Th
2050: 65 20 6c 6f 6f 6b 75 70 20 73 74 72 61 74 65 67  e lookup strateg
2060: 79 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 72 43  y */.  double rC
2070: 6f 73 74 3b 20 20 20 20 20 20 2f 2a 20 4f 76 65  ost;      /* Ove
2080: 72 61 6c 6c 20 63 6f 73 74 20 6f 66 20 70 75 72  rall cost of pur
2090: 73 75 69 6e 67 20 74 68 69 73 20 73 65 61 72 63  suing this searc
20a0: 68 20 73 74 72 61 74 65 67 79 20 2a 2f 0a 20 20  h strategy */.  
20b0: 42 69 74 6d 61 73 6b 20 75 73 65 64 3b 20 20 20  Bitmask used;   
20c0: 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66     /* Bitmask of
20d0: 20 63 75 72 73 6f 72 73 20 75 73 65 64 20 62 79   cursors used by
20e0: 20 74 68 69 73 20 70 6c 61 6e 20 2a 2f 0a 7d 3b   this plan */.};
20f0: 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 6d 61 73 6b 73  ../*.** Bitmasks
2100: 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f   for the operato
2110: 72 73 20 74 68 61 74 20 69 6e 64 69 63 65 73 20  rs that indices 
2120: 61 72 65 20 61 62 6c 65 20 74 6f 20 65 78 70 6c  are able to expl
2130: 6f 69 74 2e 20 20 41 6e 0a 2a 2a 20 4f 52 2d 65  oit.  An.** OR-e
2140: 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  d combination of
2150: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 63 61   these values ca
2160: 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 73  n be used when s
2170: 65 61 72 63 68 69 6e 67 20 66 6f 72 0a 2a 2a 20  earching for.** 
2180: 74 65 72 6d 73 20 69 6e 20 74 68 65 20 77 68 65  terms in the whe
2190: 72 65 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 23 64  re clause..*/.#d
21a0: 65 66 69 6e 65 20 57 4f 5f 49 4e 20 20 20 20 20  efine WO_IN     
21b0: 30 78 30 30 31 0a 23 64 65 66 69 6e 65 20 57 4f  0x001.#define WO
21c0: 5f 45 51 20 20 20 20 20 30 78 30 30 32 0a 23 64  _EQ     0x002.#d
21d0: 65 66 69 6e 65 20 57 4f 5f 4c 54 20 20 20 20 20  efine WO_LT     
21e0: 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 54 2d 54  (WO_EQ<<(TK_LT-T
21f0: 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57  K_EQ)).#define W
2200: 4f 5f 4c 45 20 20 20 20 20 28 57 4f 5f 45 51 3c  O_LE     (WO_EQ<
2210: 3c 28 54 4b 5f 4c 45 2d 54 4b 5f 45 51 29 29 0a  <(TK_LE-TK_EQ)).
2220: 23 64 65 66 69 6e 65 20 57 4f 5f 47 54 20 20 20  #define WO_GT   
2230: 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 54    (WO_EQ<<(TK_GT
2240: 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65  -TK_EQ)).#define
2250: 20 57 4f 5f 47 45 20 20 20 20 20 28 57 4f 5f 45   WO_GE     (WO_E
2260: 51 3c 3c 28 54 4b 5f 47 45 2d 54 4b 5f 45 51 29  Q<<(TK_GE-TK_EQ)
2270: 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4d 41 54  ).#define WO_MAT
2280: 43 48 20 20 30 78 30 34 30 0a 23 64 65 66 69 6e  CH  0x040.#defin
2290: 65 20 57 4f 5f 49 53 4e 55 4c 4c 20 30 78 30 38  e WO_ISNULL 0x08
22a0: 30 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4f 52 20  0.#define WO_OR 
22b0: 20 20 20 20 30 78 31 30 30 20 20 20 20 20 20 20      0x100       
22c0: 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20 4f  /* Two or more O
22d0: 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d  R-connected term
22e0: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f  s */.#define WO_
22f0: 41 4e 44 20 20 20 20 30 78 32 30 30 20 20 20 20  AND    0x200    
2300: 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f 72     /* Two or mor
2310: 65 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20  e AND-connected 
2320: 74 65 72 6d 73 20 2a 2f 0a 23 64 65 66 69 6e 65  terms */.#define
2330: 20 57 4f 5f 4e 4f 4f 50 20 20 20 30 78 38 30 30   WO_NOOP   0x800
2340: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 74         /* This t
2350: 65 72 6d 20 64 6f 65 73 20 6e 6f 74 20 72 65 73  erm does not res
2360: 74 72 69 63 74 20 73 65 61 72 63 68 20 73 70 61  trict search spa
2370: 63 65 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 57  ce */..#define W
2380: 4f 5f 41 4c 4c 20 20 20 20 30 78 66 66 66 20 20  O_ALL    0xfff  
2390: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
23a0: 61 6c 6c 20 70 6f 73 73 69 62 6c 65 20 57 4f 5f  all possible WO_
23b0: 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 23 64 65 66  * values */.#def
23c0: 69 6e 65 20 57 4f 5f 53 49 4e 47 4c 45 20 30 78  ine WO_SINGLE 0x
23d0: 30 66 66 20 20 20 20 20 20 20 2f 2a 20 4d 61 73  0ff       /* Mas
23e0: 6b 20 6f 66 20 61 6c 6c 20 6e 6f 6e 2d 63 6f 6d  k of all non-com
23f0: 70 6f 75 6e 64 20 57 4f 5f 2a 20 76 61 6c 75 65  pound WO_* value
2400: 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75  s */../*.** Valu
2410: 65 20 66 6f 72 20 77 73 46 6c 61 67 73 20 72 65  e for wsFlags re
2420: 74 75 72 6e 65 64 20 62 79 20 62 65 73 74 49 6e  turned by bestIn
2430: 64 65 78 28 29 20 61 6e 64 20 73 74 6f 72 65 64  dex() and stored
2440: 20 69 6e 0a 2a 2a 20 57 68 65 72 65 4c 65 76 65   in.** WhereLeve
2450: 6c 2e 77 73 46 6c 61 67 73 2e 20 20 54 68 65 73  l.wsFlags.  Thes
2460: 65 20 66 6c 61 67 73 20 64 65 74 65 72 6d 69 6e  e flags determin
2470: 65 20 77 68 69 63 68 20 73 65 61 72 63 68 0a 2a  e which search.*
2480: 2a 20 73 74 72 61 74 65 67 69 65 73 20 61 72 65  * strategies are
2490: 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2a   appropriate..**
24a0: 0a 2a 2a 20 54 68 65 20 6c 65 61 73 74 20 73 69  .** The least si
24b0: 67 6e 69 66 69 63 61 6e 74 20 31 32 20 62 69 74  gnificant 12 bit
24c0: 73 20 69 73 20 72 65 73 65 72 76 65 64 20 61 73  s is reserved as
24d0: 20 61 20 6d 61 73 6b 20 66 6f 72 20 57 4f 5f 20   a mask for WO_ 
24e0: 76 61 6c 75 65 73 20 61 62 6f 76 65 2e 0a 2a 2a  values above..**
24f0: 20 54 68 65 20 57 68 65 72 65 4c 65 76 65 6c 2e   The WhereLevel.
2500: 77 73 46 6c 61 67 73 20 66 69 65 6c 64 20 69 73  wsFlags field is
2510: 20 75 73 75 61 6c 6c 79 20 73 65 74 20 74 6f 20   usually set to 
2520: 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 49  WO_IN|WO_EQ|WO_I
2530: 53 4e 55 4c 4c 2e 0a 2a 2a 20 42 75 74 20 69 66  SNULL..** But if
2540: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 74 68   the table is th
2550: 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66  e right table of
2560: 20 61 20 6c 65 66 74 20 6a 6f 69 6e 2c 20 57 68   a left join, Wh
2570: 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67 73  ereLevel.wsFlags
2580: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 57 4f  .** is set to WO
2590: 5f 49 4e 7c 57 4f 5f 45 51 2e 20 20 54 68 65 20  _IN|WO_EQ.  The 
25a0: 57 68 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c 61  WhereLevel.wsFla
25b0: 67 73 20 66 69 65 6c 64 20 63 61 6e 20 74 68 65  gs field can the
25c0: 6e 20 62 65 20 75 73 65 64 20 61 73 0a 2a 2a 20  n be used as.** 
25d0: 74 68 65 20 22 6f 70 22 20 70 61 72 61 6d 65 74  the "op" paramet
25e0: 65 72 20 74 6f 20 66 69 6e 64 54 65 72 6d 20 77  er to findTerm w
25f0: 68 65 6e 20 77 65 20 61 72 65 20 72 65 73 6f 6c  hen we are resol
2600: 76 69 6e 67 20 65 71 75 61 6c 69 74 79 20 63 6f  ving equality co
2610: 6e 73 74 72 61 69 6e 74 73 2e 0a 2a 2a 20 49 53  nstraints..** IS
2620: 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73  NULL constraints
2630: 20 77 69 6c 6c 20 74 68 65 6e 20 6e 6f 74 20 62   will then not b
2640: 65 20 75 73 65 64 20 6f 6e 20 74 68 65 20 72 69  e used on the ri
2650: 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 6c  ght table of a l
2660: 65 66 74 0a 2a 2a 20 6a 6f 69 6e 2e 20 20 54 69  eft.** join.  Ti
2670: 63 6b 65 74 73 20 23 32 31 37 37 20 61 6e 64 20  ckets #2177 and 
2680: 23 32 31 38 39 2e 0a 2a 2f 0a 23 64 65 66 69 6e  #2189..*/.#defin
2690: 65 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51  e WHERE_ROWID_EQ
26a0: 20 20 20 20 20 30 78 30 30 30 30 31 30 30 30 20       0x00001000 
26b0: 20 2f 2a 20 72 6f 77 69 64 3d 45 58 50 52 20 6f   /* rowid=EXPR o
26c0: 72 20 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29  r rowid IN (...)
26d0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
26e0: 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20 20 30  E_ROWID_RANGE  0
26f0: 78 30 30 30 30 32 30 30 30 20 20 2f 2a 20 72 6f  x00002000  /* ro
2700: 77 69 64 3c 45 58 50 52 20 61 6e 64 2f 6f 72 20  wid<EXPR and/or 
2710: 72 6f 77 69 64 3e 45 58 50 52 20 2a 2f 0a 23 64  rowid>EXPR */.#d
2720: 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55  efine WHERE_COLU
2730: 4d 4e 5f 45 51 20 20 20 20 30 78 30 30 30 31 30  MN_EQ    0x00010
2740: 30 30 30 20 20 2f 2a 20 78 3d 45 58 50 52 20 6f  000  /* x=EXPR o
2750: 72 20 78 20 49 4e 20 28 2e 2e 2e 29 20 6f 72 20  r x IN (...) or 
2760: 78 20 49 53 20 4e 55 4c 4c 20 2a 2f 0a 23 64 65  x IS NULL */.#de
2770: 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d  fine WHERE_COLUM
2780: 4e 5f 52 41 4e 47 45 20 30 78 30 30 30 32 30 30  N_RANGE 0x000200
2790: 30 30 20 20 2f 2a 20 78 3c 45 58 50 52 20 61 6e  00  /* x<EXPR an
27a0: 64 2f 6f 72 20 78 3e 45 58 50 52 20 2a 2f 0a 23  d/or x>EXPR */.#
27b0: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c  define WHERE_COL
27c0: 55 4d 4e 5f 49 4e 20 20 20 20 30 78 30 30 30 34  UMN_IN    0x0004
27d0: 30 30 30 30 20 20 2f 2a 20 78 20 49 4e 20 28 2e  0000  /* x IN (.
27e0: 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ..) */.#define W
27f0: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c  HERE_COLUMN_NULL
2800: 20 20 30 78 30 30 30 38 30 30 30 30 20 20 2f 2a    0x00080000  /*
2810: 20 78 20 49 53 20 4e 55 4c 4c 20 2a 2f 0a 23 64   x IS NULL */.#d
2820: 65 66 69 6e 65 20 57 48 45 52 45 5f 49 4e 44 45  efine WHERE_INDE
2830: 58 45 44 20 20 20 20 20 20 30 78 30 30 30 66 30  XED      0x000f0
2840: 30 30 30 20 20 2f 2a 20 41 6e 79 74 68 69 6e 67  000  /* Anything
2850: 20 74 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e   that uses an in
2860: 64 65 78 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  dex */.#define W
2870: 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41  HERE_NOT_FULLSCA
2880: 4e 20 30 78 31 30 30 66 33 30 30 30 20 20 2f 2a  N 0x100f3000  /*
2890: 20 44 6f 65 73 20 6e 6f 74 20 64 6f 20 61 20 66   Does not do a f
28a0: 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 2a  ull table scan *
28b0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
28c0: 49 4e 5f 41 42 4c 45 20 20 20 20 20 20 30 78 30  IN_ABLE      0x0
28d0: 30 30 66 31 30 30 30 20 20 2f 2a 20 41 62 6c 65  00f1000  /* Able
28e0: 20 74 6f 20 73 75 70 70 6f 72 74 20 61 6e 20 49   to support an I
28f0: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 23 64  N operator */.#d
2900: 65 66 69 6e 65 20 57 48 45 52 45 5f 54 4f 50 5f  efine WHERE_TOP_
2910: 4c 49 4d 49 54 20 20 20 20 30 78 30 30 31 30 30  LIMIT    0x00100
2920: 30 30 30 20 20 2f 2a 20 78 3c 45 58 50 52 20 6f  000  /* x<EXPR o
2930: 72 20 78 3c 3d 45 58 50 52 20 63 6f 6e 73 74 72  r x<=EXPR constr
2940: 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20  aint */.#define 
2950: 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
2960: 20 20 20 30 78 30 30 32 30 30 30 30 30 20 20 2f     0x00200000  /
2970: 2a 20 78 3e 45 58 50 52 20 6f 72 20 78 3e 3d 45  * x>EXPR or x>=E
2980: 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  XPR constraint *
2990: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
29a0: 42 4f 54 48 5f 4c 49 4d 49 54 20 20 20 30 78 30  BOTH_LIMIT   0x0
29b0: 30 33 30 30 30 30 30 20 20 2f 2a 20 42 6f 74 68  0300000  /* Both
29c0: 20 78 3e 45 58 50 52 20 61 6e 64 20 78 3c 45 58   x>EXPR and x<EX
29d0: 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  PR */.#define WH
29e0: 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 20 20 20  ERE_IDX_ONLY    
29f0: 20 30 78 30 30 38 30 30 30 30 30 20 20 2f 2a 20   0x00800000  /* 
2a00: 55 73 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2d  Use index only -
2a10: 20 6f 6d 69 74 20 74 61 62 6c 65 20 2a 2f 0a 23   omit table */.#
2a20: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4f 52 44  define WHERE_ORD
2a30: 45 52 42 59 20 20 20 20 20 20 30 78 30 31 30 30  ERBY      0x0100
2a40: 30 30 30 30 20 20 2f 2a 20 4f 75 74 70 75 74 20  0000  /* Output 
2a50: 77 69 6c 6c 20 61 70 70 65 61 72 20 69 6e 20 63  will appear in c
2a60: 6f 72 72 65 63 74 20 6f 72 64 65 72 20 2a 2f 0a  orrect order */.
2a70: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52 45  #define WHERE_RE
2a80: 56 45 52 53 45 20 20 20 20 20 20 30 78 30 32 30  VERSE      0x020
2a90: 30 30 30 30 30 20 20 2f 2a 20 53 63 61 6e 20 69  00000  /* Scan i
2aa0: 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
2ab0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
2ac0: 5f 55 4e 49 51 55 45 20 20 20 20 20 20 20 30 78  _UNIQUE       0x
2ad0: 30 34 30 30 30 30 30 30 20 20 2f 2a 20 53 65 6c  04000000  /* Sel
2ae0: 65 63 74 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61  ects no more tha
2af0: 6e 20 6f 6e 65 20 72 6f 77 20 2a 2f 0a 23 64 65  n one row */.#de
2b00: 66 69 6e 65 20 57 48 45 52 45 5f 56 49 52 54 55  fine WHERE_VIRTU
2b10: 41 4c 54 41 42 4c 45 20 30 78 30 38 30 30 30 30  ALTABLE 0x080000
2b20: 30 30 20 20 2f 2a 20 55 73 65 20 76 69 72 74 75  00  /* Use virtu
2b30: 61 6c 2d 74 61 62 6c 65 20 70 72 6f 63 65 73 73  al-table process
2b40: 69 6e 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ing */.#define W
2b50: 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 20 20  HERE_MULTI_OR   
2b60: 20 20 30 78 31 30 30 30 30 30 30 30 20 20 2f 2a    0x10000000  /*
2b70: 20 4f 52 20 75 73 69 6e 67 20 6d 75 6c 74 69 70   OR using multip
2b80: 6c 65 20 69 6e 64 69 63 65 73 20 2a 2f 0a 23 64  le indices */.#d
2b90: 65 66 69 6e 65 20 57 48 45 52 45 5f 54 45 4d 50  efine WHERE_TEMP
2ba0: 5f 49 4e 44 45 58 20 20 20 30 78 32 30 30 30 30  _INDEX   0x20000
2bb0: 30 30 30 20 20 2f 2a 20 55 73 65 73 20 61 6e 20  000  /* Uses an 
2bc0: 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20  ephemeral index 
2bd0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  */../*.** Initia
2be0: 6c 69 7a 65 20 61 20 70 72 65 61 6c 6c 6f 63 61  lize a prealloca
2bf0: 74 65 64 20 57 68 65 72 65 43 6c 61 75 73 65 20  ted WhereClause 
2c00: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
2c10: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 43  atic void whereC
2c20: 6c 61 75 73 65 49 6e 69 74 28 0a 20 20 57 68 65  lauseInit(.  Whe
2c30: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
2c40: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65        /* The Whe
2c50: 72 65 43 6c 61 75 73 65 20 74 6f 20 62 65 20 69  reClause to be i
2c60: 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
2c70: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2c80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2c90: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
2ca0: 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
2cb0: 74 20 2a 70 4d 61 73 6b 53 65 74 20 20 20 2f 2a  t *pMaskSet   /*
2cc0: 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 61   Mapping from ta
2cd0: 62 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ble cursor numbe
2ce0: 72 73 20 74 6f 20 62 69 74 6d 61 73 6b 73 20 2a  rs to bitmasks *
2cf0: 2f 0a 29 7b 0a 20 20 70 57 43 2d 3e 70 50 61 72  /.){.  pWC->pPar
2d00: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
2d10: 57 43 2d 3e 70 4d 61 73 6b 53 65 74 20 3d 20 70  WC->pMaskSet = p
2d20: 4d 61 73 6b 53 65 74 3b 0a 20 20 70 57 43 2d 3e  MaskSet;.  pWC->
2d30: 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 57 43  nTerm = 0;.  pWC
2d40: 2d 3e 6e 53 6c 6f 74 20 3d 20 41 72 72 61 79 53  ->nSlot = ArrayS
2d50: 69 7a 65 28 70 57 43 2d 3e 61 53 74 61 74 69 63  ize(pWC->aStatic
2d60: 29 3b 0a 20 20 70 57 43 2d 3e 61 20 3d 20 70 57  );.  pWC->a = pW
2d70: 43 2d 3e 61 53 74 61 74 69 63 3b 0a 20 20 70 57  C->aStatic;.  pW
2d80: 43 2d 3e 76 6d 61 73 6b 20 3d 20 30 3b 0a 7d 0a  C->vmask = 0;.}.
2d90: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
2da0: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
2db0: 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65  void whereClause
2dc0: 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61 75 73  Clear(WhereClaus
2dd0: 65 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c  e*);../*.** Deal
2de0: 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d 6f 72  locate all memor
2df0: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
2e00: 68 20 61 20 57 68 65 72 65 4f 72 49 6e 66 6f 20  h a WhereOrInfo 
2e10: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  object..*/.stati
2e20: 63 20 76 6f 69 64 20 77 68 65 72 65 4f 72 49 6e  c void whereOrIn
2e30: 66 6f 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  foDelete(sqlite3
2e40: 20 2a 64 62 2c 20 57 68 65 72 65 4f 72 49 6e 66   *db, WhereOrInf
2e50: 6f 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 43 6c  o *p){.  whereCl
2e60: 61 75 73 65 43 6c 65 61 72 28 26 70 2d 3e 77 63  auseClear(&p->wc
2e70: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
2e80: 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
2e90: 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61  .** Deallocate a
2ea0: 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ll memory associ
2eb0: 61 74 65 64 20 77 69 74 68 20 61 20 57 68 65 72  ated with a Wher
2ec0: 65 41 6e 64 49 6e 66 6f 20 6f 62 6a 65 63 74 2e  eAndInfo object.
2ed0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2ee0: 77 68 65 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65  whereAndInfoDele
2ef0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
2f00: 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70 29  WhereAndInfo *p)
2f10: 7b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43  {.  whereClauseC
2f20: 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20  lear(&p->wc);.  
2f30: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2f40: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  , p);.}../*.** D
2f50: 65 61 6c 6c 6f 63 61 74 65 20 61 20 57 68 65 72  eallocate a Wher
2f60: 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
2f70: 65 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c 61  e.  The WhereCla
2f80: 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  use structure.**
2f90: 20 69 74 73 65 6c 66 20 69 73 20 6e 6f 74 20 66   itself is not f
2fa0: 72 65 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74  reed.  This rout
2fb0: 69 6e 65 20 69 73 20 74 68 65 20 69 6e 76 65 72  ine is the inver
2fc0: 73 65 20 6f 66 20 77 68 65 72 65 43 6c 61 75 73  se of whereClaus
2fd0: 65 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74  eInit()..*/.stat
2fe0: 69 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61  ic void whereCla
2ff0: 75 73 65 43 6c 65 61 72 28 57 68 65 72 65 43 6c  useClear(WhereCl
3000: 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 69 6e  ause *pWC){.  in
3010: 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  t i;.  WhereTerm
3020: 20 2a 61 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *a;.  sqlite3 *
3030: 64 62 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65  db = pWC->pParse
3040: 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d 70 57  ->db;.  for(i=pW
3050: 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d 70 57  C->nTerm-1, a=pW
3060: 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c  C->a; i>=0; i--,
3070: 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   a++){.    if( a
3080: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
3090: 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20  _DYNAMIC ){.    
30a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
30b0: 65 74 65 28 64 62 2c 20 61 2d 3e 70 45 78 70 72  ete(db, a->pExpr
30c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
30d0: 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45   a->wtFlags & TE
30e0: 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20 20 20  RM_ORINFO ){.   
30f0: 20 20 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65     whereOrInfoDe
3100: 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70 4f  lete(db, a->u.pO
3110: 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65 6c 73  rInfo);.    }els
3120: 65 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73  e if( a->wtFlags
3130: 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 20   & TERM_ANDINFO 
3140: 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 41 6e  ){.      whereAn
3150: 64 49 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c 20  dInfoDelete(db, 
3160: 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29 3b 0a  a->u.pAndInfo);.
3170: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
3180: 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61 53 74  pWC->a!=pWC->aSt
3190: 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71 6c 69  atic ){.    sqli
31a0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57  te3DbFree(db, pW
31b0: 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  C->a);.  }.}../*
31c0: 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65  .** Add a single
31d0: 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 65   new WhereTerm e
31e0: 6e 74 72 79 20 74 6f 20 74 68 65 20 57 68 65 72  ntry to the Wher
31f0: 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70  eClause object p
3200: 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77 20 57  WC..** The new W
3210: 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 20  hereTerm object 
3220: 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64 20 66  is constructed f
3230: 72 6f 6d 20 45 78 70 72 20 70 20 61 6e 64 20 77  rom Expr p and w
3240: 69 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a 2a 20  ith wtFlags..** 
3250: 54 68 65 20 69 6e 64 65 78 20 69 6e 20 70 57 43  The index in pWC
3260: 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e 65 77  ->a[] of the new
3270: 20 57 68 65 72 65 54 65 72 6d 20 69 73 20 72 65   WhereTerm is re
3280: 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
3290: 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74 75 72  s..** 0 is retur
32a0: 6e 65 64 20 69 66 20 74 68 65 20 6e 65 77 20 57  ned if the new W
32b0: 68 65 72 65 54 65 72 6d 20 63 6f 75 6c 64 20 6e  hereTerm could n
32c0: 6f 74 20 62 65 20 61 64 64 65 64 20 64 75 65 20  ot be added due 
32d0: 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61  to a memory.** a
32e0: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 2e  llocation error.
32f0: 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c    The memory all
3300: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20  ocation failure 
3310: 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64  will be recorded
3320: 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d 3e 6d   in.** the db->m
3330: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
3340: 20 73 6f 20 74 68 61 74 20 68 69 67 68 65 72 2d   so that higher-
3350: 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e 73 20  level functions 
3360: 63 61 6e 20 64 65 74 65 63 74 20 69 74 2e 0a 2a  can detect it..*
3370: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3380: 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20  e will increase 
3390: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
33a0: 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79 20 61  pWC->a[] array a
33b0: 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a  s necessary..**.
33c0: 2a 2a 20 49 66 20 74 68 65 20 77 74 46 6c 61 67  ** If the wtFlag
33d0: 73 20 61 72 67 75 6d 65 6e 74 20 69 6e 63 6c 75  s argument inclu
33e0: 64 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43  des TERM_DYNAMIC
33f0: 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e 73 69 62  , then responsib
3400: 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66 72 65  ility.** for fre
3410: 65 69 6e 67 20 74 68 65 20 65 78 70 72 65 73 73  eing the express
3420: 69 6f 6e 20 70 20 69 73 20 61 73 73 75 6d 65 64  ion p is assumed
3430: 20 62 79 20 74 68 65 20 57 68 65 72 65 43 6c 61   by the WhereCla
3440: 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a  use object pWC..
3450: 2a 2a 20 54 68 69 73 20 69 73 20 74 72 75 65 20  ** This is true 
3460: 65 76 65 6e 20 69 66 20 74 68 69 73 20 72 6f 75  even if this rou
3470: 74 69 6e 65 20 66 61 69 6c 73 20 74 6f 20 61 6c  tine fails to al
3480: 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68 65  locate a new Whe
3490: 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 57 41  reTerm..**.** WA
34a0: 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72 6f 75  RNING:  This rou
34b0: 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61 6c 6c  tine might reall
34c0: 6f 63 61 74 65 20 74 68 65 20 73 70 61 63 65 20  ocate the space 
34d0: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a  used to store.**
34e0: 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20 41 6c   WhereTerms.  Al
34f0: 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 57 68  l pointers to Wh
3500: 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c 64 20  ereTerms should 
3510: 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61  be invalidated a
3520: 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20  fter.** calling 
3530: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 53  this routine.  S
3540: 75 63 68 20 70 6f 69 6e 74 65 72 73 20 6d 61 79  uch pointers may
3550: 20 62 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65   be reinitialize
3560: 64 20 62 79 20 72 65 66 65 72 65 6e 63 69 6e 67  d by referencing
3570: 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d  .** the pWC->a[]
3580: 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69   array..*/.stati
3590: 63 20 69 6e 74 20 77 68 65 72 65 43 6c 61 75 73  c int whereClaus
35a0: 65 49 6e 73 65 72 74 28 57 68 65 72 65 43 6c 61  eInsert(WhereCla
35b0: 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a  use *pWC, Expr *
35c0: 70 2c 20 75 38 20 77 74 46 6c 61 67 73 29 7b 0a  p, u8 wtFlags){.
35d0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
35e0: 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  rm;.  int idx;. 
35f0: 20 74 65 73 74 63 61 73 65 28 20 77 74 46 6c 61   testcase( wtFla
3600: 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
3610: 4c 20 29 3b 20 20 2f 2a 20 45 56 3a 20 52 2d 30  L );  /* EV: R-0
3620: 30 32 31 31 2d 31 35 31 30 30 20 2a 2f 0a 20 20  0211-15100 */.  
3630: 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 3d  if( pWC->nTerm>=
3640: 70 57 43 2d 3e 6e 53 6c 6f 74 20 29 7b 0a 20 20  pWC->nSlot ){.  
3650: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 6c    WhereTerm *pOl
3660: 64 20 3d 20 70 57 43 2d 3e 61 3b 0a 20 20 20 20  d = pWC->a;.    
3670: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
3680: 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20  C->pParse->db;. 
3690: 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71 6c 69     pWC->a = sqli
36a0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
36b0: 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61  b, sizeof(pWC->a
36c0: 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74 2a  [0])*pWC->nSlot*
36d0: 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70 57 43  2 );.    if( pWC
36e0: 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->a==0 ){.      
36f0: 69 66 28 20 77 74 46 6c 61 67 73 20 26 20 54 45  if( wtFlags & TE
3700: 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  RM_DYNAMIC ){.  
3710: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
3720: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a  rDelete(db, p);.
3730: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57        }.      pW
3740: 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20 20 20  C->a = pOld;.   
3750: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
3760: 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 57   }.    memcpy(pW
3770: 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69 7a 65  C->a, pOld, size
3780: 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57  of(pWC->a[0])*pW
3790: 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69  C->nTerm);.    i
37a0: 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e 61 53  f( pOld!=pWC->aS
37b0: 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20 73  tatic ){.      s
37c0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
37d0: 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20   pOld);.    }.  
37e0: 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 73    pWC->nSlot = s
37f0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69  qlite3DbMallocSi
3800: 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29 2f 73  ze(db, pWC->a)/s
3810: 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29  izeof(pWC->a[0])
3820: 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20  ;.  }.  pTerm = 
3830: 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20 70 57  &pWC->a[idx = pW
3840: 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20 70  C->nTerm++];.  p
3850: 54 65 72 6d 2d 3e 70 45 78 70 72 20 3d 20 70 3b  Term->pExpr = p;
3860: 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  .  pTerm->wtFlag
3870: 73 20 3d 20 77 74 46 6c 61 67 73 3b 0a 20 20 70  s = wtFlags;.  p
3880: 54 65 72 6d 2d 3e 70 57 43 20 3d 20 70 57 43 3b  Term->pWC = pWC;
3890: 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  .  pTerm->iParen
38a0: 74 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e  t = -1;.  return
38b0: 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   idx;.}../*.** T
38c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 64 65 6e  his routine iden
38d0: 74 69 66 69 65 73 20 73 75 62 65 78 70 72 65 73  tifies subexpres
38e0: 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48 45  sions in the WHE
38f0: 52 45 20 63 6c 61 75 73 65 20 77 68 65 72 65 0a  RE clause where.
3900: 2a 2a 20 65 61 63 68 20 73 75 62 65 78 70 72 65  ** each subexpre
3910: 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74  ssion is separat
3920: 65 64 20 62 79 20 74 68 65 20 41 4e 44 20 6f 70  ed by the AND op
3930: 65 72 61 74 6f 72 20 6f 72 20 73 6f 6d 65 20 6f  erator or some o
3940: 74 68 65 72 0a 2a 2a 20 6f 70 65 72 61 74 6f 72  ther.** operator
3950: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
3960: 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 20  e op parameter. 
3970: 20 54 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   The WhereClause
3980: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 73   structure.** is
3990: 20 66 69 6c 6c 65 64 20 77 69 74 68 20 70 6f 69   filled with poi
39a0: 6e 74 65 72 73 20 74 6f 20 73 75 62 65 78 70 72  nters to subexpr
39b0: 65 73 73 69 6f 6e 73 2e 20 20 46 6f 72 20 65 78  essions.  For ex
39c0: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
39d0: 57 48 45 52 45 20 20 61 3d 3d 27 68 65 6c 6c 6f  WHERE  a=='hello
39e0: 27 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28 62  ' AND coalesce(b
39f0: 2c 31 31 29 3c 31 30 20 41 4e 44 20 28 63 2b 31  ,11)<10 AND (c+1
3a00: 32 21 3d 64 20 4f 52 20 63 3d 3d 32 32 29 0a 2a  2!=d OR c==22).*
3a10: 2a 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f  *           \___
3a20: 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f  _____/     \____
3a30: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20  ___________/    
3a40: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
3a50: 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  __/.**          
3a60: 20 20 73 6c 6f 74 5b 30 5d 20 20 20 20 20 20 20    slot[0]       
3a70: 20 20 20 20 20 73 6c 6f 74 5b 31 5d 20 20 20 20       slot[1]    
3a80: 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b             slot[
3a90: 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69  2].**.** The ori
3aa0: 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c 61 75  ginal WHERE clau
3ab0: 73 65 20 69 6e 20 70 45 78 70 72 20 69 73 20 75  se in pExpr is u
3ac0: 6e 61 6c 74 65 72 65 64 2e 20 20 41 6c 6c 20 74  naltered.  All t
3ad0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64  his routine.** d
3ae0: 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 6c 6f 74  oes is make slot
3af0: 5b 5d 20 65 6e 74 72 69 65 73 20 70 6f 69 6e 74  [] entries point
3b00: 20 74 6f 20 73 75 62 73 74 72 75 63 74 75 72 65   to substructure
3b10: 20 77 69 74 68 69 6e 20 70 45 78 70 72 2e 0a 2a   within pExpr..*
3b20: 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 70 72 65 76  *.** In the prev
3b30: 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 20 61 6e  ious sentence an
3b40: 64 20 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d  d in the diagram
3b50: 2c 20 22 73 6c 6f 74 5b 5d 22 20 72 65 66 65 72  , "slot[]" refer
3b60: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 57 68 65 72  s to.** the Wher
3b70: 65 43 6c 61 75 73 65 2e 61 5b 5d 20 61 72 72 61  eClause.a[] arra
3b80: 79 2e 20 20 54 68 65 20 73 6c 6f 74 5b 5d 20 61  y.  The slot[] a
3b90: 72 72 61 79 20 67 72 6f 77 73 20 61 73 20 6e 65  rray grows as ne
3ba0: 65 64 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 0a  eded to contain.
3bb0: 2a 2a 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  ** all terms of 
3bc0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
3bd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3be0: 20 77 68 65 72 65 53 70 6c 69 74 28 57 68 65 72   whereSplit(Wher
3bf0: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78  eClause *pWC, Ex
3c00: 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6f  pr *pExpr, int o
3c10: 70 29 7b 0a 20 20 70 57 43 2d 3e 6f 70 20 3d 20  p){.  pWC->op = 
3c20: 28 75 38 29 6f 70 3b 0a 20 20 69 66 28 20 70 45  (u8)op;.  if( pE
3c30: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
3c40: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
3c50: 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65 72  !=op ){.    wher
3c60: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
3c70: 43 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  C, pExpr, 0);.  
3c80: 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72 65  }else{.    where
3c90: 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72  Split(pWC, pExpr
3ca0: 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20  ->pLeft, op);.  
3cb0: 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43    whereSplit(pWC
3cc0: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
3cd0: 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   op);.  }.}../*.
3ce0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e  ** Initialize an
3cf0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b   expression mask
3d00: 20 73 65 74 20 28 61 20 57 68 65 72 65 4d 61 73   set (a WhereMas
3d10: 6b 53 65 74 20 6f 62 6a 65 63 74 29 0a 2a 2f 0a  kSet object).*/.
3d20: 23 64 65 66 69 6e 65 20 69 6e 69 74 4d 61 73 6b  #define initMask
3d30: 53 65 74 28 50 29 20 20 6d 65 6d 73 65 74 28 50  Set(P)  memset(P
3d40: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 50 29 29  , 0, sizeof(*P))
3d50: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
3d60: 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74  he bitmask for t
3d70: 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20  he given cursor 
3d80: 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20  number.  Return 
3d90: 30 20 69 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20  0 if.** iCursor 
3da0: 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 73 65  is not in the se
3db0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74  t..*/.static Bit
3dc0: 6d 61 73 6b 20 67 65 74 4d 61 73 6b 28 57 68 65  mask getMask(Whe
3dd0: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
3de0: 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72  Set, int iCursor
3df0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  ){.  int i;.  as
3e00: 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e  sert( pMaskSet->
3e10: 6e 3c 3d 73 69 7a 65 6f 66 28 42 69 74 6d 61 73  n<=sizeof(Bitmas
3e20: 6b 29 2a 38 20 29 3b 0a 20 20 66 6f 72 28 69 3d  k)*8 );.  for(i=
3e30: 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e  0; i<pMaskSet->n
3e40: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
3e50: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d  pMaskSet->ix[i]=
3e60: 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  =iCursor ){.    
3e70: 20 20 72 65 74 75 72 6e 20 28 28 42 69 74 6d 61    return ((Bitma
3e80: 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 20 20 7d 0a  sk)1)<<i;.    }.
3e90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
3ea0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
3eb0: 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72 20 63  a new mask for c
3ec0: 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e 0a 2a  ursor iCursor..*
3ed0: 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  *.** There is on
3ee0: 65 20 63 75 72 73 6f 72 20 70 65 72 20 74 61 62  e cursor per tab
3ef0: 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
3f00: 6c 61 75 73 65 2e 20 20 54 68 65 20 6e 75 6d 62  lause.  The numb
3f10: 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65 73 20  er of.** tables 
3f20: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
3f30: 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79  se is limited by
3f40: 20 61 20 74 65 73 74 20 65 61 72 6c 79 20 69 6e   a test early in
3f50: 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 57   the.** sqlite3W
3f60: 68 65 72 65 42 65 67 69 6e 28 29 20 72 6f 75 74  hereBegin() rout
3f70: 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e 6f 77  ine.  So we know
3f80: 20 74 68 61 74 20 74 68 65 20 70 4d 61 73 6b 53   that the pMaskS
3f90: 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72 72 61  et->ix[].** arra
3fa0: 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76 65  y will never ove
3fb0: 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  rflow..*/.static
3fc0: 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61 73 6b   void createMask
3fd0: 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70  (WhereMaskSet *p
3fe0: 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75  MaskSet, int iCu
3ff0: 72 73 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28  rsor){.  assert(
4000: 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c 20 41   pMaskSet->n < A
4010: 72 72 61 79 53 69 7a 65 28 70 4d 61 73 6b 53 65  rraySize(pMaskSe
4020: 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d 61 73  t->ix) );.  pMas
4030: 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b 53 65  kSet->ix[pMaskSe
4040: 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72 73 6f  t->n++] = iCurso
4050: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  r;.}../*.** This
4060: 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 28   routine walks (
4070: 72 65 63 75 72 73 69 76 65 6c 79 29 20 61 6e 20  recursively) an 
4080: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
4090: 61 6e 64 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a  and generates.**
40a0: 20 61 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63   a bitmask indic
40b0: 61 74 69 6e 67 20 77 68 69 63 68 20 74 61 62 6c  ating which tabl
40c0: 65 73 20 61 72 65 20 75 73 65 64 20 69 6e 20 74  es are used in t
40d0: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  hat expression.*
40e0: 2a 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e  * tree..**.** In
40f0: 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73 20   order for this 
4100: 72 6f 75 74 69 6e 65 20 74 6f 20 77 6f 72 6b 2c  routine to work,
4110: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
4120: 63 74 69 6f 6e 20 6d 75 73 74 20 68 61 76 65 0a  ction must have.
4130: 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e  ** previously in
4140: 76 6f 6b 65 64 20 73 71 6c 69 74 65 33 52 65 73  voked sqlite3Res
4150: 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 20  olveExprNames() 
4160: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
4170: 6e 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20 68  n.  See.** the h
4180: 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e  eader comment on
4190: 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66 6f   that routine fo
41a0: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
41b0: 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65  ormation..** The
41c0: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
41d0: 78 70 72 4e 61 6d 65 73 28 29 20 72 6f 75 74 69  xprNames() routi
41e0: 6e 65 73 20 6c 6f 6f 6b 73 20 66 6f 72 20 63 6f  nes looks for co
41f0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 0a 2a  lumn names and.*
4200: 2a 20 73 65 74 73 20 74 68 65 69 72 20 6f 70 63  * sets their opc
4210: 6f 64 65 73 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d  odes to TK_COLUM
4220: 4e 20 61 6e 64 20 74 68 65 69 72 20 45 78 70 72  N and their Expr
4230: 2e 69 54 61 62 6c 65 20 66 69 65 6c 64 73 20 74  .iTable fields t
4240: 6f 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 63 75  o.** the VDBE cu
4250: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
4260: 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  he table.  This 
4270: 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 68 61 73  routine just has
4280: 20 74 6f 0a 2a 2a 20 74 72 61 6e 73 6c 61 74 65   to.** translate
4290: 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
42a0: 65 72 73 20 69 6e 74 6f 20 62 69 74 6d 61 73 6b  ers into bitmask
42b0: 20 76 61 6c 75 65 73 20 61 6e 64 20 4f 52 20 61   values and OR a
42c0: 6c 6c 0a 2a 2a 20 74 68 65 20 62 69 74 6d 61 73  ll.** the bitmas
42d0: 6b 73 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2f 0a  ks together..*/.
42e0: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
42f0: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
4300: 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c  e(WhereMaskSet*,
4310: 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61   ExprList*);.sta
4320: 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72  tic Bitmask expr
4330: 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65  SelectTableUsage
4340: 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c 20  (WhereMaskSet*, 
4350: 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74 69 63  Select*);.static
4360: 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54 61 62   Bitmask exprTab
4370: 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73  leUsage(WhereMas
4380: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
4390: 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69 74 6d  Expr *p){.  Bitm
43a0: 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20  ask mask = 0;.  
43b0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
43c0: 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70  n 0;.  if( p->op
43d0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  ==TK_COLUMN ){. 
43e0: 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d 61 73     mask = getMas
43f0: 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69  k(pMaskSet, p->i
4400: 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65 74 75  Table);.    retu
4410: 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20 6d  rn mask;.  }.  m
4420: 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c 65 55  ask = exprTableU
4430: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
4440: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d 61 73  ->pRight);.  mas
4450: 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73  k |= exprTableUs
4460: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  age(pMaskSet, p-
4470: 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 45  >pLeft);.  if( E
4480: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
4490: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
44a0: 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  ){.    mask |= e
44b0: 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73  xprSelectTableUs
44c0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  age(pMaskSet, p-
44d0: 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d  >x.pSelect);.  }
44e0: 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b 20 7c  else{.    mask |
44f0: 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  = exprListTableU
4500: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
4510: 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a  ->x.pList);.  }.
4520: 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d    return mask;.}
4530: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
4540: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
4550: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  ge(WhereMaskSet 
4560: 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 4c  *pMaskSet, ExprL
4570: 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
4580: 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73 6b 20  nt i;.  Bitmask 
4590: 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20  mask = 0;.  if( 
45a0: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72  pList ){.    for
45b0: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
45c0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
45d0: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61    mask |= exprTa
45e0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
45f0: 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  t, pList->a[i].p
4600: 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Expr);.    }.  }
4610: 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a  .  return mask;.
4620: 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  }.static Bitmask
4630: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
4640: 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53  Usage(WhereMaskS
4650: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 53 65  et *pMaskSet, Se
4660: 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42 69 74  lect *pS){.  Bit
4670: 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20  mask mask = 0;. 
4680: 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a 20 20   while( pS ){.  
4690: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
46a0: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
46b0: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73  skSet, pS->pELis
46c0: 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  t);.    mask |= 
46d0: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
46e0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
46f0: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
4700: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74  mask |= exprList
4710: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
4720: 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42  Set, pS->pOrderB
4730: 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  y);.    mask |= 
4740: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
4750: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68  MaskSet, pS->pWh
4760: 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  ere);.    mask |
4770: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
4780: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
4790: 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 70 53 20  Having);.    pS 
47a0: 3d 20 70 53 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  = pS->pPrior;.  
47b0: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
47c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
47d0: 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
47e0: 65 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 6f  en operator is o
47f0: 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74  ne of the operat
4800: 6f 72 73 20 74 68 61 74 20 69 73 0a 2a 2a 20 61  ors that is.** a
4810: 6c 6c 6f 77 65 64 20 66 6f 72 20 61 6e 20 69 6e  llowed for an in
4820: 64 65 78 61 62 6c 65 20 57 48 45 52 45 20 63 6c  dexable WHERE cl
4830: 61 75 73 65 20 74 65 72 6d 2e 20 20 54 68 65 20  ause term.  The 
4840: 61 6c 6c 6f 77 65 64 20 6f 70 65 72 61 74 6f 72  allowed operator
4850: 73 20 61 72 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c  s are.** "=", "<
4860: 22 2c 20 22 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e  ", ">", "<=", ">
4870: 3d 22 2c 20 61 6e 64 20 22 49 4e 22 2e 0a 2a 2a  =", and "IN"..**
4880: 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49  .** IMPLEMENTATI
4890: 4f 4e 2d 4f 46 3a 20 52 2d 35 39 39 32 36 2d 32  ON-OF: R-59926-2
48a0: 36 33 39 33 20 54 6f 20 62 65 20 75 73 61 62 6c  6393 To be usabl
48b0: 65 20 62 79 20 61 6e 20 69 6e 64 65 78 20 61 20  e by an index a 
48c0: 74 65 72 6d 20 6d 75 73 74 20 62 65 0a 2a 2a 20  term must be.** 
48d0: 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  of one of the fo
48e0: 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 20 63  llowing forms: c
48f0: 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 65 73 73 69  olumn = expressi
4900: 6f 6e 20 63 6f 6c 75 6d 6e 20 3e 20 65 78 70 72  on column > expr
4910: 65 73 73 69 6f 6e 0a 2a 2a 20 63 6f 6c 75 6d 6e  ession.** column
4920: 20 3e 3d 20 65 78 70 72 65 73 73 69 6f 6e 20 63   >= expression c
4930: 6f 6c 75 6d 6e 20 3c 20 65 78 70 72 65 73 73 69  olumn < expressi
4940: 6f 6e 20 63 6f 6c 75 6d 6e 20 3c 3d 20 65 78 70  on column <= exp
4950: 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 78 70 72 65  ression.** expre
4960: 73 73 69 6f 6e 20 3d 20 63 6f 6c 75 6d 6e 20 65  ssion = column e
4970: 78 70 72 65 73 73 69 6f 6e 20 3e 20 63 6f 6c 75  xpression > colu
4980: 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 3e 3d  mn expression >=
4990: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 65 78 70 72 65   column.** expre
49a0: 73 73 69 6f 6e 20 3c 20 63 6f 6c 75 6d 6e 20 65  ssion < column e
49b0: 78 70 72 65 73 73 69 6f 6e 20 3c 3d 20 63 6f 6c  xpression <= col
49c0: 75 6d 6e 20 63 6f 6c 75 6d 6e 20 49 4e 0a 2a 2a  umn column IN.**
49d0: 20 28 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73   (expression-lis
49e0: 74 29 20 63 6f 6c 75 6d 6e 20 49 4e 20 28 73 75  t) column IN (su
49f0: 62 71 75 65 72 79 29 20 63 6f 6c 75 6d 6e 20 49  bquery) column I
4a00: 53 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63  S NULL.*/.static
4a10: 20 69 6e 74 20 61 6c 6c 6f 77 65 64 4f 70 28 69   int allowedOp(i
4a20: 6e 74 20 6f 70 29 7b 0a 20 20 61 73 73 65 72 74  nt op){.  assert
4a30: 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 26 26  ( TK_GT>TK_EQ &&
4a40: 20 54 4b 5f 47 54 3c 54 4b 5f 47 45 20 29 3b 0a   TK_GT<TK_GE );.
4a50: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3e    assert( TK_LT>
4a60: 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 54 3c 54  TK_EQ && TK_LT<T
4a70: 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  K_GE );.  assert
4a80: 28 20 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20 26 26  ( TK_LE>TK_EQ &&
4a90: 20 54 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29 3b 0a   TK_LE<TK_GE );.
4aa0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d    assert( TK_GE=
4ab0: 3d 54 4b 5f 45 51 2b 34 20 29 3b 0a 20 20 72 65  =TK_EQ+4 );.  re
4ac0: 74 75 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e 20 7c  turn op==TK_IN |
4ad0: 7c 20 28 6f 70 3e 3d 54 4b 5f 45 51 20 26 26 20  | (op>=TK_EQ && 
4ae0: 6f 70 3c 3d 54 4b 5f 47 45 29 20 7c 7c 20 6f 70  op<=TK_GE) || op
4af0: 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 3b 0a 7d 0a 0a  ==TK_ISNULL;.}..
4b00: 2f 2a 0a 2a 2a 20 53 77 61 70 20 74 77 6f 20 6f  /*.** Swap two o
4b10: 62 6a 65 63 74 73 20 6f 66 20 74 79 70 65 20 54  bjects of type T
4b20: 59 50 45 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  YPE..*/.#define 
4b30: 53 57 41 50 28 54 59 50 45 2c 41 2c 42 29 20 7b  SWAP(TYPE,A,B) {
4b40: 54 59 50 45 20 74 3d 41 3b 20 41 3d 42 3b 20 42  TYPE t=A; A=B; B
4b50: 3d 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  =t;}../*.** Comm
4b60: 75 74 65 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e  ute a comparison
4b70: 20 6f 70 65 72 61 74 6f 72 2e 20 20 45 78 70 72   operator.  Expr
4b80: 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66  essions of the f
4b90: 6f 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a 20  orm "X op Y".** 
4ba0: 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e  are converted in
4bb0: 74 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2a 0a  to "Y op X"..**.
4bc0: 2a 2a 20 49 66 20 61 20 63 6f 6c 6c 61 74 69 6f  ** If a collatio
4bd0: 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20 61 73  n sequence is as
4be0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 69  sociated with ei
4bf0: 74 68 65 72 20 74 68 65 20 6c 65 66 74 20 6f 72  ther the left or
4c00: 20 72 69 67 68 74 0a 2a 2a 20 73 69 64 65 20 6f   right.** side o
4c10: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
4c20: 2c 20 69 74 20 72 65 6d 61 69 6e 73 20 61 73 73  , it remains ass
4c30: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
4c40: 20 73 61 6d 65 20 73 69 64 65 20 61 66 74 65 72   same side after
4c50: 0a 2a 2a 20 74 68 65 20 63 6f 6d 6d 75 74 61 74  .** the commutat
4c60: 69 6f 6e 2e 20 53 6f 20 22 59 20 63 6f 6c 6c 61  ion. So "Y colla
4c70: 74 65 20 4e 4f 43 41 53 45 20 6f 70 20 58 22 20  te NOCASE op X" 
4c80: 62 65 63 6f 6d 65 73 20 0a 2a 2a 20 22 58 20 63  becomes .** "X c
4c90: 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f 70  ollate NOCASE op
4ca0: 20 59 22 2e 20 54 68 69 73 20 69 73 20 62 65 63   Y". This is bec
4cb0: 61 75 73 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69  ause any collati
4cc0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 6e 0a 2a  on sequence on.*
4cd0: 2a 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20  * the left hand 
4ce0: 73 69 64 65 20 6f 66 20 61 20 63 6f 6d 70 61 72  side of a compar
4cf0: 69 73 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61  ison overrides a
4d00: 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ny collation seq
4d10: 75 65 6e 63 65 20 0a 2a 2a 20 61 74 74 61 63 68  uence .** attach
4d20: 65 64 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e  ed to the right.
4d30: 20 46 6f 72 20 74 68 65 20 73 61 6d 65 20 72 65   For the same re
4d40: 61 73 6f 6e 20 74 68 65 20 45 50 5f 45 78 70 43  ason the EP_ExpC
4d50: 6f 6c 6c 61 74 65 20 66 6c 61 67 0a 2a 2a 20 69  ollate flag.** i
4d60: 73 20 6e 6f 74 20 63 6f 6d 6d 75 74 65 64 2e 0a  s not commuted..
4d70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
4d80: 78 70 72 43 6f 6d 6d 75 74 65 28 50 61 72 73 65  xprCommute(Parse
4d90: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
4da0: 70 45 78 70 72 29 7b 0a 20 20 75 31 36 20 65 78  pExpr){.  u16 ex
4db0: 70 52 69 67 68 74 20 3d 20 28 70 45 78 70 72 2d  pRight = (pExpr-
4dc0: 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26  >pRight->flags &
4dd0: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3b   EP_ExpCollate);
4de0: 0a 20 20 75 31 36 20 65 78 70 4c 65 66 74 20 3d  .  u16 expLeft =
4df0: 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e   (pExpr->pLeft->
4e00: 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f  flags & EP_ExpCo
4e10: 6c 6c 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74  llate);.  assert
4e20: 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70  ( allowedOp(pExp
4e30: 72 2d 3e 6f 70 29 20 26 26 20 70 45 78 70 72 2d  r->op) && pExpr-
4e40: 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20  >op!=TK_IN );.  
4e50: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 70  pExpr->pRight->p
4e60: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
4e70: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
4e80: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
4e90: 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  ;.  pExpr->pLeft
4ea0: 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65  ->pColl = sqlite
4eb0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
4ec0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
4ed0: 74 29 3b 0a 20 20 53 57 41 50 28 43 6f 6c 6c 53  t);.  SWAP(CollS
4ee0: 65 71 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68  eq*,pExpr->pRigh
4ef0: 74 2d 3e 70 43 6f 6c 6c 2c 70 45 78 70 72 2d 3e  t->pColl,pExpr->
4f00: 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 29 3b 0a 20  pLeft->pColl);. 
4f10: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e   pExpr->pRight->
4f20: 66 6c 61 67 73 20 3d 20 28 70 45 78 70 72 2d 3e  flags = (pExpr->
4f30: 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20  pRight->flags & 
4f40: 7e 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 20  ~EP_ExpCollate) 
4f50: 7c 20 65 78 70 4c 65 66 74 3b 0a 20 20 70 45 78  | expLeft;.  pEx
4f60: 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73  pr->pLeft->flags
4f70: 20 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74   = (pExpr->pLeft
4f80: 2d 3e 66 6c 61 67 73 20 26 20 7e 45 50 5f 45 78  ->flags & ~EP_Ex
4f90: 70 43 6f 6c 6c 61 74 65 29 20 7c 20 65 78 70 52  pCollate) | expR
4fa0: 69 67 68 74 3b 0a 20 20 53 57 41 50 28 45 78 70  ight;.  SWAP(Exp
4fb0: 72 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r*,pExpr->pRight
4fc0: 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  ,pExpr->pLeft);.
4fd0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e    if( pExpr->op>
4fe0: 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61 73  =TK_GT ){.    as
4ff0: 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f  sert( TK_LT==TK_
5000: 47 54 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65  GT+2 );.    asse
5010: 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45  rt( TK_GE==TK_LE
5020: 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +2 );.    assert
5030: 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29 3b  ( TK_GT>TK_EQ );
5040: 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f  .    assert( TK_
5050: 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20  GT<TK_LE );.    
5060: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
5070: 70 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45 78 70  p>=TK_GT && pExp
5080: 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a  r->op<=TK_GE );.
5090: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
50a0: 28 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47  ((pExpr->op-TK_G
50b0: 54 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d  T)^2)+TK_GT;.  }
50c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c  .}../*.** Transl
50d0: 61 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20 6f  ate from TK_xx o
50e0: 70 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78 78  perator to WO_xx
50f0: 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61   bitmask..*/.sta
5100: 74 69 63 20 75 31 36 20 6f 70 65 72 61 74 6f 72  tic u16 operator
5110: 4d 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20 20  Mask(int op){.  
5120: 75 31 36 20 63 3b 0a 20 20 61 73 73 65 72 74 28  u16 c;.  assert(
5130: 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29   allowedOp(op) )
5140: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  ;.  if( op==TK_I
5150: 4e 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f  N ){.    c = WO_
5160: 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  IN;.  }else if( 
5170: 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b  op==TK_ISNULL ){
5180: 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e 55  .    c = WO_ISNU
5190: 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
51a0: 20 61 73 73 65 72 74 28 20 28 57 4f 5f 45 51 3c   assert( (WO_EQ<
51b0: 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20 30  <(op-TK_EQ)) < 0
51c0: 78 37 66 66 66 20 29 3b 0a 20 20 20 20 63 20 3d  x7fff );.    c =
51d0: 20 28 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28 6f   (u16)(WO_EQ<<(o
51e0: 70 2d 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a 20  p-TK_EQ));.  }. 
51f0: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
5200: 49 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f  ISNULL || c==WO_
5210: 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65  ISNULL );.  asse
5220: 72 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c  rt( op!=TK_IN ||
5230: 20 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61   c==WO_IN );.  a
5240: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51  ssert( op!=TK_EQ
5250: 20 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a   || c==WO_EQ );.
5260: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
5270: 5f 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20  _LT || c==WO_LT 
5280: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
5290: 3d 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_LE || c==WO_
52a0: 4c 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  LE );.  assert( 
52b0: 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d  op!=TK_GT || c==
52c0: 57 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65 72  WO_GT );.  asser
52d0: 74 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20  t( op!=TK_GE || 
52e0: 63 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65  c==WO_GE );.  re
52f0: 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn c;.}../*.**
5300: 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 65   Search for a te
5310: 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  rm in the WHERE 
5320: 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 6f  clause that is o
5330: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f  f the form "X <o
5340: 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77 68  p> <expr>".** wh
5350: 65 72 65 20 58 20 69 73 20 61 20 72 65 66 65 72  ere X is a refer
5360: 65 6e 63 65 20 74 6f 20 74 68 65 20 69 43 6f 6c  ence to the iCol
5370: 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75  umn of table iCu
5380: 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e  r and <op> is on
5390: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f 78  e of.** the WO_x
53a0: 78 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65 73  x operator codes
53b0: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68   specified by th
53c0: 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 0a  e op parameter..
53d0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
53e0: 74 65 72 20 74 6f 20 74 68 65 20 74 65 72 6d 2e  ter to the term.
53f0: 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f    Return 0 if no
5400: 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  t found..*/.stat
5410: 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 66 69  ic WhereTerm *fi
5420: 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72 65 43  ndTerm(.  WhereC
5430: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
5440: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
5450: 75 73 65 20 74 6f 20 62 65 20 73 65 61 72 63 68  use to be search
5460: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  ed */.  int iCur
5470: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
5480: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   Cursor number o
5490: 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69  f LHS */.  int i
54a0: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20  Column,         
54b0: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65   /* Column numbe
54c0: 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42 69  r of LHS */.  Bi
54d0: 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20  tmask notReady, 
54e0: 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73 74 20      /* RHS must 
54f0: 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69 74 68  not overlap with
5500: 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20 20   this mask */.  
5510: 75 33 32 20 6f 70 2c 20 20 20 20 20 20 20 20 20  u32 op,         
5520: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
5530: 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20 64 65   WO_xx values de
5540: 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61 74 6f  scribing operato
5550: 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  r */.  Index *pI
5560: 64 78 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dx           /* 
5570: 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62  Must be compatib
5580: 6c 65 20 77 69 74 68 20 74 68 69 73 20 69 6e 64  le with this ind
5590: 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20  ex, if not NULL 
55a0: 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72  */.){.  WhereTer
55b0: 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20  m *pTerm;.  int 
55c0: 6b 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43 75  k;.  assert( iCu
55d0: 72 3e 3d 30 20 29 3b 0a 20 20 6f 70 20 26 3d 20  r>=0 );.  op &= 
55e0: 57 4f 5f 41 4c 4c 3b 0a 20 20 66 6f 72 28 70 54  WO_ALL;.  for(pT
55f0: 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6b 3d 70 57  erm=pWC->a, k=pW
5600: 43 2d 3e 6e 54 65 72 6d 3b 20 6b 3b 20 6b 2d 2d  C->nTerm; k; k--
5610: 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
5620: 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
5630: 75 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20  ursor==iCur.    
5640: 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 70 72     && (pTerm->pr
5650: 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52  ereqRight & notR
5660: 65 61 64 79 29 3d 3d 30 0a 20 20 20 20 20 20 20  eady)==0.       
5670: 26 26 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74  && pTerm->u.left
5680: 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a  Column==iColumn.
5690: 20 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d         && (pTerm
56a0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 6f 70  ->eOperator & op
56b0: 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )!=0.    ){.    
56c0: 20 20 69 66 28 20 70 49 64 78 20 26 26 20 70 54    if( pIdx && pT
56d0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d  erm->eOperator!=
56e0: 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  WO_ISNULL ){.   
56f0: 20 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20       Expr *pX = 
5700: 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
5710: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
5720: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 63 68  Coll;.        ch
5730: 61 72 20 69 64 78 61 66 66 3b 0a 20 20 20 20 20  ar idxaff;.     
5740: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
5750: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
5760: 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 3b 0a 0a  = pWC->pParse;..
5770: 20 20 20 20 20 20 20 20 69 64 78 61 66 66 20 3d          idxaff =
5780: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61   pIdx->pTable->a
5790: 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66  Col[iColumn].aff
57a0: 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20 69  inity;.        i
57b0: 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78  f( !sqlite3Index
57c0: 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20 69  AffinityOk(pX, i
57d0: 64 78 61 66 66 29 20 29 20 63 6f 6e 74 69 6e 75  dxaff) ) continu
57e0: 65 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46  e;..        /* F
57f0: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 63 6f  igure out the co
5800: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
5810: 20 72 65 71 75 69 72 65 64 20 66 72 6f 6d 20 61   required from a
5820: 6e 20 69 6e 64 65 78 20 66 6f 72 0a 20 20 20 20  n index for.    
5830: 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 62 65 20      ** it to be 
5840: 75 73 65 66 75 6c 20 66 6f 72 20 6f 70 74 69 6d  useful for optim
5850: 69 73 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  ising expression
5860: 20 70 58 2e 20 53 74 6f 72 65 20 74 68 69 73 0a   pX. Store this.
5870: 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65          ** value
5880: 20 69 6e 20 76 61 72 69 61 62 6c 65 20 70 43 6f   in variable pCo
5890: 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ll..        */. 
58a0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70 58         assert(pX
58b0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
58c0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
58d0: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
58e0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58  llSeq(pParse, pX
58f0: 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69  ->pLeft, pX->pRi
5900: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ght);.        as
5910: 73 65 72 74 28 70 43 6f 6c 6c 20 7c 7c 20 70 50  sert(pColl || pP
5920: 61 72 73 65 2d 3e 6e 45 72 72 29 3b 0a 0a 20 20  arse->nErr);..  
5930: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 70        for(j=0; p
5940: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
5950: 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b  !=iColumn; j++){
5960: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4e  .          if( N
5970: 45 56 45 52 28 6a 3e 3d 70 49 64 78 2d 3e 6e 43  EVER(j>=pIdx->nC
5980: 6f 6c 75 6d 6e 29 20 29 20 72 65 74 75 72 6e 20  olumn) ) return 
5990: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
59a0: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 26       if( pColl &
59b0: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
59c0: 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70  (pColl->zName, p
59d0: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 20  Idx->azColl[j]) 
59e0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
59f0: 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
5a00: 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20   pTerm;.    }.  
5a10: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
5a20: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
5a30: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
5a40: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
5a50: 28 53 72 63 4c 69 73 74 2a 2c 20 57 68 65 72 65  (SrcList*, Where
5a60: 43 6c 61 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a  Clause*, int);..
5a70: 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41  /*.** Call exprA
5a80: 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65  nalyze on all te
5a90: 72 6d 73 20 69 6e 20 61 20 57 48 45 52 45 20 63  rms in a WHERE c
5aa0: 6c 61 75 73 65 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a  lause.  .**.**.*
5ab0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
5ac0: 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20 20  prAnalyzeAll(.  
5ad0: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
5ae0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20  t,       /* the 
5af0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
5b00: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
5b10: 43 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  C         /* the
5b20: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
5b30: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
5b40: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
5b50: 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31  r(i=pWC->nTerm-1
5b60: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
5b70: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 54    exprAnalyze(pT
5b80: 61 62 4c 69 73 74 2c 20 70 57 43 2c 20 69 29 3b  abList, pWC, i);
5b90: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
5ba0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45  SQLITE_OMIT_LIKE
5bb0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a  _OPTIMIZATION./*
5bc0: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
5bd0: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   if the given ex
5be0: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 4c 49  pression is a LI
5bf0: 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61  KE or GLOB opera
5c00: 74 6f 72 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20  tor that.** can 
5c10: 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69  be optimized usi
5c20: 6e 67 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  ng inequality co
5c30: 6e 73 74 72 61 69 6e 74 73 2e 20 20 52 65 74 75  nstraints.  Retu
5c40: 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73  rn TRUE if it is
5c50: 0a 2a 2a 20 73 6f 20 61 6e 64 20 66 61 6c 73 65  .** so and false
5c60: 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49   if not..**.** I
5c70: 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20  n order for the 
5c80: 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f  operator to be o
5c90: 70 74 69 6d 69 7a 69 62 6c 65 2c 20 74 68 65 20  ptimizible, the 
5ca0: 52 48 53 20 6d 75 73 74 20 62 65 20 61 20 73 74  RHS must be a st
5cb0: 72 69 6e 67 0a 2a 2a 20 6c 69 74 65 72 61 6c 20  ring.** literal 
5cc0: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 62 65  that does not be
5cd0: 67 69 6e 20 77 69 74 68 20 61 20 77 69 6c 64 63  gin with a wildc
5ce0: 61 72 64 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63  ard.  .*/.static
5cf0: 20 69 6e 74 20 69 73 4c 69 6b 65 4f 72 47 6c 6f   int isLikeOrGlo
5d00: 62 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  b(.  Parse *pPar
5d10: 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
5d20: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
5d30: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
5d40: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
5d50: 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69       /* Test thi
5d60: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  s expression */.
5d70: 20 20 45 78 70 72 20 2a 2a 70 70 50 72 65 66 69    Expr **ppPrefi
5d80: 78 2c 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  x,  /* Pointer t
5d90: 6f 20 54 4b 5f 53 54 52 49 4e 47 20 65 78 70 72  o TK_STRING expr
5da0: 65 73 73 69 6f 6e 20 77 69 74 68 20 70 61 74 74  ession with patt
5db0: 65 72 6e 20 70 72 65 66 69 78 20 2a 2f 0a 20 20  ern prefix */.  
5dc0: 69 6e 74 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65  int *pisComplete
5dd0: 2c 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65  , /* True if the
5de0: 20 6f 6e 6c 79 20 77 69 6c 64 63 61 72 64 20 69   only wildcard i
5df0: 73 20 25 20 69 6e 20 74 68 65 20 6c 61 73 74 20  s % in the last 
5e00: 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 69  character */.  i
5e10: 6e 74 20 2a 70 6e 6f 43 61 73 65 20 20 20 20 20  nt *pnoCase     
5e20: 20 2f 2a 20 54 72 75 65 20 69 66 20 75 70 70 65   /* True if uppe
5e30: 72 63 61 73 65 20 69 73 20 65 71 75 69 76 61 6c  rcase is equival
5e40: 65 6e 74 20 74 6f 20 6c 6f 77 65 72 63 61 73 65  ent to lowercase
5e50: 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
5e60: 68 61 72 20 2a 7a 20 3d 20 30 3b 20 20 20 20 20  har *z = 0;     
5e70: 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 6e      /* String on
5e80: 20 52 48 53 20 6f 66 20 4c 49 4b 45 20 6f 70 65   RHS of LIKE ope
5e90: 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 20  rator */.  Expr 
5ea0: 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b  *pRight, *pLeft;
5eb0: 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 61        /* Right a
5ec0: 6e 64 20 6c 65 66 74 20 73 69 7a 65 20 6f 66 20  nd left size of 
5ed0: 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f  LIKE operator */
5ee0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
5ef0: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
5f00: 20 4c 69 73 74 20 6f 66 20 6f 70 65 72 61 6e 64   List of operand
5f10: 73 20 74 6f 20 74 68 65 20 4c 49 4b 45 20 6f 70  s to the LIKE op
5f20: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
5f30: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
5f40: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 68         /* One ch
5f50: 61 72 61 63 74 65 72 20 69 6e 20 7a 5b 5d 20 2a  aracter in z[] *
5f60: 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20  /.  int cnt;    
5f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5f80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d  * Number of non-
5f90: 77 69 6c 64 63 61 72 64 20 70 72 65 66 69 78 20  wildcard prefix 
5fa0: 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20  characters */.  
5fb0: 63 68 61 72 20 77 63 5b 33 5d 3b 20 20 20 20 20  char wc[3];     
5fc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69             /* Wi
5fd0: 6c 64 63 61 72 64 20 63 68 61 72 61 63 74 65 72  ldcard character
5fe0: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
5ff0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
6000: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
6010: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  nnection */.  sq
6020: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
6030: 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6f 70 3b  l = 0;.  int op;
6040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6050: 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 6f 66      /* Opcode of
6060: 20 70 52 69 67 68 74 20 2a 2f 0a 0a 20 20 69 66   pRight */..  if
6070: 28 20 21 73 71 6c 69 74 65 33 49 73 4c 69 6b 65  ( !sqlite3IsLike
6080: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 45 78  Function(db, pEx
6090: 70 72 2c 20 70 6e 6f 43 61 73 65 2c 20 77 63 29  pr, pnoCase, wc)
60a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
60b0: 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
60c0: 49 54 45 5f 45 42 43 44 49 43 0a 20 20 69 66 28  ITE_EBCDIC.  if(
60d0: 20 2a 70 6e 6f 43 61 73 65 20 29 20 72 65 74 75   *pnoCase ) retu
60e0: 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70  rn 0;.#endif.  p
60f0: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
6100: 70 4c 69 73 74 3b 0a 20 20 70 4c 65 66 74 20 3d  pList;.  pLeft =
6110: 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78   pList->a[1].pEx
6120: 70 72 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d  pr;.  if( pLeft-
6130: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op!=TK_COLUMN |
6140: 7c 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  | sqlite3ExprAff
6150: 69 6e 69 74 79 28 70 4c 65 66 74 29 21 3d 53 51  inity(pLeft)!=SQ
6160: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29 7b  LITE_AFF_TEXT ){
6170: 0a 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30  .    /* IMP: R-0
6180: 32 30 36 35 2d 34 39 34 36 35 20 54 68 65 20 6c  2065-49465 The l
6190: 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  eft-hand side of
61a0: 20 74 68 65 20 4c 49 4b 45 20 6f 72 20 47 4c 4f   the LIKE or GLO
61b0: 42 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 0a  B operator must.
61c0: 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20 6e 61      ** be the na
61d0: 6d 65 20 6f 66 20 61 6e 20 69 6e 64 65 78 65 64  me of an indexed
61e0: 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 54 45 58   column with TEX
61f0: 54 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20  T affinity. */. 
6200: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
6210: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74  .  assert( pLeft
6220: 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 28 2d 31 29 20  ->iColumn!=(-1) 
6230: 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 49 50  ); /* Because IP
6240: 4b 20 6e 65 76 65 72 20 68 61 73 20 41 46 46 5f  K never has AFF_
6250: 54 45 58 54 20 2a 2f 0a 0a 20 20 70 52 69 67 68  TEXT */..  pRigh
6260: 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  t = pList->a[0].
6270: 70 45 78 70 72 3b 0a 20 20 6f 70 20 3d 20 70 52  pExpr;.  op = pR
6280: 69 67 68 74 2d 3e 6f 70 3b 0a 20 20 69 66 28 20  ight->op;.  if( 
6290: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
62a0: 29 7b 0a 20 20 20 20 6f 70 20 3d 20 70 52 69 67  ){.    op = pRig
62b0: 68 74 2d 3e 6f 70 32 3b 0a 20 20 7d 0a 20 20 69  ht->op2;.  }.  i
62c0: 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42  f( op==TK_VARIAB
62d0: 4c 45 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  LE ){.    Vdbe *
62e0: 70 52 65 70 72 65 70 61 72 65 20 3d 20 70 50 61  pReprepare = pPa
62f0: 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65 3b  rse->pReprepare;
6300: 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  .    int iCol = 
6310: 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b  pRight->iColumn;
6320: 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  .    pVal = sqli
6330: 74 65 33 56 64 62 65 47 65 74 56 61 6c 75 65 28  te3VdbeGetValue(
6340: 70 52 65 70 72 65 70 61 72 65 2c 20 69 43 6f 6c  pReprepare, iCol
6350: 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  , SQLITE_AFF_NON
6360: 45 29 3b 0a 20 20 20 20 69 66 28 20 70 56 61 6c  E);.    if( pVal
6370: 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   && sqlite3_valu
6380: 65 5f 74 79 70 65 28 70 56 61 6c 29 3d 3d 53 51  e_type(pVal)==SQ
6390: 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20  LITE_TEXT ){.   
63a0: 20 20 20 7a 20 3d 20 28 63 68 61 72 20 2a 29 73     z = (char *)s
63b0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
63c0: 74 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20  t(pVal);.    }. 
63d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
63e0: 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d  tVarmask(pParse-
63f0: 3e 70 56 64 62 65 2c 20 69 43 6f 6c 29 3b 20 2f  >pVdbe, iCol); /
6400: 2a 20 49 4d 50 3a 20 52 2d 32 33 32 35 37 2d 30  * IMP: R-23257-0
6410: 32 37 37 38 20 2a 2f 0a 20 20 20 20 61 73 73 65  2778 */.    asse
6420: 72 74 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  rt( pRight->op==
6430: 54 4b 5f 56 41 52 49 41 42 4c 45 20 7c 7c 20 70  TK_VARIABLE || p
6440: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 52 45  Right->op==TK_RE
6450: 47 49 53 54 45 52 20 29 3b 0a 20 20 7d 65 6c 73  GISTER );.  }els
6460: 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 54 52  e if( op==TK_STR
6470: 49 4e 47 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70  ING ){.    z = p
6480: 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  Right->u.zToken;
6490: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 7b 0a  .  }.  if( z ){.
64a0: 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20      cnt = 0;.   
64b0: 20 77 68 69 6c 65 28 20 28 63 3d 7a 5b 63 6e 74   while( (c=z[cnt
64c0: 5d 29 21 3d 30 20 26 26 20 63 21 3d 77 63 5b 30  ])!=0 && c!=wc[0
64d0: 5d 20 26 26 20 63 21 3d 77 63 5b 31 5d 20 26 26  ] && c!=wc[1] &&
64e0: 20 63 21 3d 77 63 5b 32 5d 20 29 7b 0a 20 20 20   c!=wc[2] ){.   
64f0: 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a     cnt++;.    }.
6500: 20 20 20 20 69 66 28 20 63 6e 74 21 3d 30 20 26      if( cnt!=0 &
6510: 26 20 32 35 35 21 3d 28 75 38 29 7a 5b 63 6e 74  & 255!=(u8)z[cnt
6520: 2d 31 5d 20 29 7b 0a 20 20 20 20 20 20 45 78 70  -1] ){.      Exp
6530: 72 20 2a 70 50 72 65 66 69 78 3b 0a 20 20 20 20  r *pPrefix;.    
6540: 20 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 3d    *pisComplete =
6550: 20 63 3d 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63   c==wc[0] && z[c
6560: 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20 20 20 20 20  nt+1]==0;.      
6570: 70 50 72 65 66 69 78 20 3d 20 73 71 6c 69 74 65  pPrefix = sqlite
6580: 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 53 54 52  3Expr(db, TK_STR
6590: 49 4e 47 2c 20 7a 29 3b 0a 20 20 20 20 20 20 69  ING, z);.      i
65a0: 66 28 20 70 50 72 65 66 69 78 20 29 20 70 50 72  f( pPrefix ) pPr
65b0: 65 66 69 78 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 63  efix->u.zToken[c
65c0: 6e 74 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 2a  nt] = 0;.      *
65d0: 70 70 50 72 65 66 69 78 20 3d 20 70 50 72 65 66  ppPrefix = pPref
65e0: 69 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70  ix;.      if( op
65f0: 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b  ==TK_VARIABLE ){
6600: 0a 20 20 20 20 20 20 20 20 56 64 62 65 20 2a 76  .        Vdbe *v
6610: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
6620: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
6630: 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28  3VdbeSetVarmask(
6640: 76 2c 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75  v, pRight->iColu
6650: 6d 6e 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 32  mn); /* IMP: R-2
6660: 33 32 35 37 2d 30 32 37 37 38 20 2a 2f 0a 20 20  3257-02778 */.  
6670: 20 20 20 20 20 20 69 66 28 20 2a 70 69 73 43 6f        if( *pisCo
6680: 6d 70 6c 65 74 65 20 26 26 20 70 52 69 67 68 74  mplete && pRight
6690: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 20 29 7b  ->u.zToken[1] ){
66a0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
66b0: 20 74 68 65 20 72 68 73 20 6f 66 20 74 68 65 20   the rhs of the 
66c0: 4c 49 4b 45 20 65 78 70 72 65 73 73 69 6f 6e 20  LIKE expression 
66d0: 69 73 20 61 20 76 61 72 69 61 62 6c 65 2c 20 61  is a variable, a
66e0: 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  nd the current. 
66f0: 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75           ** valu
6700: 65 20 6f 66 20 74 68 65 20 76 61 72 69 61 62 6c  e of the variabl
6710: 65 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69 73  e means there is
6720: 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 76 6f   no need to invo
6730: 6b 65 20 74 68 65 20 4c 49 4b 45 0a 20 20 20 20  ke the LIKE.    
6740: 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
6750: 6e 2c 20 74 68 65 6e 20 6e 6f 20 4f 50 5f 56 61  n, then no OP_Va
6760: 72 69 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 61  riable will be a
6770: 64 64 65 64 20 74 6f 20 74 68 65 20 70 72 6f 67  dded to the prog
6780: 72 61 6d 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ram..          *
6790: 2a 20 54 68 69 73 20 63 61 75 73 65 73 20 70 72  * This causes pr
67a0: 6f 62 6c 65 6d 73 20 66 6f 72 20 74 68 65 20 73  oblems for the s
67b0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
67c0: 6d 65 74 65 72 5f 6e 61 6d 65 28 29 0a 20 20 20  meter_name().   
67d0: 20 20 20 20 20 20 20 2a 2a 20 41 50 49 2e 20 54         ** API. T
67e0: 6f 20 77 6f 72 6b 61 72 6f 75 6e 64 20 74 68 65  o workaround the
67f0: 6d 2c 20 61 64 64 20 61 20 64 75 6d 6d 79 20 4f  m, add a dummy O
6800: 50 5f 56 61 72 69 61 62 6c 65 20 68 65 72 65 2e  P_Variable here.
6810: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 20 0a 20  .          */ . 
6820: 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20           int r1 
6830: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
6840: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
6850: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
6860: 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
6870: 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 31 29  rse, pRight, r1)
6880: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
6890: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
68a0: 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  v, sqlite3VdbeCu
68b0: 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20  rrentAddr(v)-1, 
68c0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  0);.          sq
68d0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
68e0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
68f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6900: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
6910: 20 20 20 20 7a 20 3d 20 30 3b 0a 20 20 20 20 7d      z = 0;.    }
6920: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56  .  }..  sqlite3V
6930: 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
6940: 20 20 72 65 74 75 72 6e 20 28 7a 21 3d 30 29 3b    return (z!=0);
6950: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
6960: 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50  ITE_OMIT_LIKE_OP
6970: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 0a  TIMIZATION */...
6980: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6990: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
69a0: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
69b0: 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65 6e  see if the given
69c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
69d0: 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a  f the form.**.**
69e0: 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20           column 
69f0: 4d 41 54 43 48 20 65 78 70 72 0a 2a 2a 0a 2a 2a  MATCH expr.**.**
6a00: 20 49 66 20 69 74 20 69 73 20 74 68 65 6e 20 72   If it is then r
6a10: 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20  eturn TRUE.  If 
6a20: 6e 6f 74 2c 20 72 65 74 75 72 6e 20 46 41 4c 53  not, return FALS
6a30: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
6a40: 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e   isMatchOfColumn
6a50: 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  (.  Expr *pExpr 
6a60: 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69       /* Test thi
6a70: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  s expression */.
6a80: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
6a90: 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45 78  List;..  if( pEx
6aa0: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54  pr->op!=TK_FUNCT
6ab0: 49 4f 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ION ){.    retur
6ac0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 0;.  }.  if( s
6ad0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 45  qlite3StrICmp(pE
6ae0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d  xpr->u.zToken,"m
6af0: 61 74 63 68 22 29 21 3d 30 20 29 7b 0a 20 20 20  atch")!=0 ){.   
6b00: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
6b10: 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e   pList = pExpr->
6b20: 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  x.pList;.  if( p
6b30: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20 29  List->nExpr!=2 )
6b40: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
6b50: 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d    }.  if( pList-
6b60: 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 20  >a[1].pExpr->op 
6b70: 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  != TK_COLUMN ){.
6b80: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6b90: 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
6ba0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
6bb0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
6bc0: 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  LE */../*.** If 
6bd0: 74 68 65 20 70 42 61 73 65 20 65 78 70 72 65 73  the pBase expres
6be0: 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64 20  sion originated 
6bf0: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
6c00: 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a 20  NG clause of.** 
6c10: 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72 61  a join, then tra
6c20: 6e 73 66 65 72 20 74 68 65 20 61 70 70 72 6f 70  nsfer the approp
6c30: 72 69 61 74 65 20 6d 61 72 6b 69 6e 67 73 20 6f  riate markings o
6c40: 76 65 72 20 74 6f 20 64 65 72 69 76 65 64 2e 0a  ver to derived..
6c50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
6c60: 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69  ransferJoinMarki
6c70: 6e 67 73 28 45 78 70 72 20 2a 70 44 65 72 69 76  ngs(Expr *pDeriv
6c80: 65 64 2c 20 45 78 70 72 20 2a 70 42 61 73 65 29  ed, Expr *pBase)
6c90: 7b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e 66 6c  {.  pDerived->fl
6ca0: 61 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e 66 6c  ags |= pBase->fl
6cb0: 61 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a 6f 69  ags & EP_FromJoi
6cc0: 6e 3b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e 69  n;.  pDerived->i
6cd0: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d  RightJoinTable =
6ce0: 20 70 42 61 73 65 2d 3e 69 52 69 67 68 74 4a 6f   pBase->iRightJo
6cf0: 69 6e 54 61 62 6c 65 3b 0a 7d 0a 0a 23 69 66 20  inTable;.}..#if 
6d00: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6d10: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
6d20: 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65  TION) && !define
6d30: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
6d40: 42 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20 41 6e  BQUERY)./*.** An
6d50: 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61  alyze a term tha
6d60: 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 77  t consists of tw
6d70: 6f 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e  o or more OR-con
6d80: 6e 65 63 74 65 64 0a 2a 2a 20 73 75 62 74 65 72  nected.** subter
6d90: 6d 73 2e 20 20 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a  ms.  So in:.**.*
6da0: 2a 20 20 20 20 20 2e 2e 2e 20 57 48 45 52 45 20  *     ... WHERE 
6db0: 20 28 61 3d 35 29 20 41 4e 44 20 28 62 3d 37 20   (a=5) AND (b=7 
6dc0: 4f 52 20 63 3d 39 20 4f 52 20 64 3d 31 33 29 20  OR c=9 OR d=13) 
6dd0: 41 4e 44 20 28 64 3d 31 33 29 0a 2a 2a 20 20 20  AND (d=13).**   
6de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6df0: 20 20 20 20 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e         ^^^^^^^^^
6e00: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a  ^^^^^^^^^^^.**.*
6e10: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
6e20: 6e 61 6c 79 7a 65 73 20 74 65 72 6d 73 20 73 75  nalyzes terms su
6e30: 63 68 20 61 73 20 74 68 65 20 6d 69 64 64 6c 65  ch as the middle
6e40: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 61 62 6f   term in the abo
6e50: 76 65 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a 20 41  ve example..** A
6e60: 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a   WhereOrTerm obj
6e70: 65 63 74 20 69 73 20 63 6f 6d 70 75 74 65 64 20  ect is computed 
6e80: 61 6e 64 20 61 74 74 61 63 68 65 64 20 74 6f 20  and attached to 
6e90: 74 68 65 20 74 65 72 6d 20 75 6e 64 65 72 0a 2a  the term under.*
6ea0: 2a 20 61 6e 61 6c 79 73 69 73 2c 20 72 65 67 61  * analysis, rega
6eb0: 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f 75  rdless of the ou
6ec0: 74 63 6f 6d 65 20 6f 66 20 74 68 65 20 61 6e 61  tcome of the ana
6ed0: 6c 79 73 69 73 2e 20 20 48 65 6e 63 65 3a 0a 2a  lysis.  Hence:.*
6ee0: 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65  *.**     WhereTe
6ef0: 72 6d 2e 77 74 46 6c 61 67 73 20 20 20 7c 3d 20  rm.wtFlags   |= 
6f00: 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a 20   TERM_ORINFO.** 
6f10: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e      WhereTerm.u.
6f20: 70 4f 72 49 6e 66 6f 20 20 3d 20 20 61 20 64 79  pOrInfo  =  a dy
6f30: 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
6f40: 74 65 64 20 57 68 65 72 65 4f 72 54 65 72 6d 20  ted WhereOrTerm 
6f50: 6f 62 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65  object.**.** The
6f60: 20 74 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c   term being anal
6f70: 79 7a 65 64 20 6d 75 73 74 20 68 61 76 65 20 74  yzed must have t
6f80: 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 66 20 4f 52  wo or more of OR
6f90: 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 74 65  -connected subte
6fa0: 72 6d 73 2e 0a 2a 2a 20 41 20 73 69 6e 67 6c 65  rms..** A single
6fb0: 20 73 75 62 74 65 72 6d 20 6d 69 67 68 74 20 62   subterm might b
6fc0: 65 20 61 20 73 65 74 20 6f 66 20 41 4e 44 2d 63  e a set of AND-c
6fd0: 6f 6e 6e 65 63 74 65 64 20 73 75 62 2d 73 75 62  onnected sub-sub
6fe0: 74 65 72 6d 73 2e 0a 2a 2a 20 45 78 61 6d 70 6c  terms..** Exampl
6ff0: 65 73 20 6f 66 20 74 65 72 6d 73 20 75 6e 64 65  es of terms unde
7000: 72 20 61 6e 61 6c 79 73 69 73 3a 0a 2a 2a 0a 2a  r analysis:.**.*
7010: 2a 20 20 20 20 20 28 41 29 20 20 20 20 20 74 31  *     (A)     t1
7020: 2e 78 3d 74 32 2e 79 20 4f 52 20 74 31 2e 78 3d  .x=t2.y OR t1.x=
7030: 74 32 2e 7a 20 4f 52 20 74 31 2e 79 3d 31 35 20  t2.z OR t1.y=15 
7040: 4f 52 20 74 31 2e 7a 3d 74 33 2e 61 2b 35 0a 2a  OR t1.z=t3.a+5.*
7050: 2a 20 20 20 20 20 28 42 29 20 20 20 20 20 78 3d  *     (B)     x=
7060: 65 78 70 72 31 20 4f 52 20 65 78 70 72 32 3d 78  expr1 OR expr2=x
7070: 20 4f 52 20 78 3d 65 78 70 72 33 0a 2a 2a 20 20   OR x=expr3.**  
7080: 20 20 20 28 43 29 20 20 20 20 20 74 31 2e 78 3d     (C)     t1.x=
7090: 74 32 2e 79 20 4f 52 20 28 74 31 2e 78 3d 74 32  t2.y OR (t1.x=t2
70a0: 2e 7a 20 41 4e 44 20 74 31 2e 79 3d 31 35 29 0a  .z AND t1.y=15).
70b0: 2a 2a 20 20 20 20 20 28 44 29 20 20 20 20 20 78  **     (D)     x
70c0: 3d 65 78 70 72 31 20 4f 52 20 28 79 3e 31 31 20  =expr1 OR (y>11 
70d0: 41 4e 44 20 79 3c 32 32 20 41 4e 44 20 7a 20 4c  AND y<22 AND z L
70e0: 49 4b 45 20 27 2a 68 65 6c 6c 6f 2a 27 29 0a 2a  IKE '*hello*').*
70f0: 2a 20 20 20 20 20 28 45 29 20 20 20 20 20 28 70  *     (E)     (p
7100: 2e 61 3d 31 20 41 4e 44 20 71 2e 62 3d 32 20 41  .a=1 AND q.b=2 A
7110: 4e 44 20 72 2e 63 3d 33 29 20 4f 52 20 28 70 2e  ND r.c=3) OR (p.
7120: 78 3d 34 20 41 4e 44 20 71 2e 79 3d 35 20 41 4e  x=4 AND q.y=5 AN
7130: 44 20 72 2e 7a 3d 36 29 0a 2a 2a 0a 2a 2a 20 43  D r.z=6).**.** C
7140: 41 53 45 20 31 3a 0a 2a 2a 0a 2a 2a 20 49 66 20  ASE 1:.**.** If 
7150: 61 6c 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65  all subterms are
7160: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 54 2e 43   of the form T.C
7170: 3d 65 78 70 72 20 66 6f 72 20 73 6f 6d 65 20 73  =expr for some s
7180: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
7190: 43 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61  C.** a single ta
71a0: 62 6c 65 20 54 20 28 61 73 20 73 68 6f 77 6e 20  ble T (as shown 
71b0: 69 6e 20 65 78 61 6d 70 6c 65 20 42 20 61 62 6f  in example B abo
71c0: 76 65 29 20 74 68 65 6e 20 63 72 65 61 74 65 20  ve) then create 
71d0: 61 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a  a new virtual.**
71e0: 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 61 6e   term that is an
71f0: 20 65 71 75 69 76 61 6c 65 6e 74 20 49 4e 20 65   equivalent IN e
7200: 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20 6f  xpression.  In o
7210: 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74  ther words, if t
7220: 68 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e 67  he term.** being
7230: 20 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a 2a   analyzed is:.**
7240: 0a 2a 2a 20 20 20 20 20 20 78 20 3d 20 65 78 70  .**      x = exp
7250: 72 31 20 20 4f 52 20 20 65 78 70 72 32 20 3d 20  r1  OR  expr2 = 
7260: 78 20 20 4f 52 20 20 78 20 3d 20 65 78 70 72 33  x  OR  x = expr3
7270: 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65 61  .**.** then crea
7280: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
7290: 20 74 65 72 6d 20 6c 69 6b 65 20 74 68 69 73 3a   term like this:
72a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e  .**.**      x IN
72b0: 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78   (expr1,expr2,ex
72c0: 70 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20  pr3).**.** CASE 
72d0: 32 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20  2:.**.** If all 
72e0: 73 75 62 74 65 72 6d 73 20 61 72 65 20 69 6e 64  subterms are ind
72f0: 65 78 61 62 6c 65 20 62 79 20 61 20 73 69 6e 67  exable by a sing
7300: 6c 65 20 74 61 62 6c 65 20 54 2c 20 74 68 65 6e  le table T, then
7310: 20 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57   set.**.**     W
7320: 68 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74  hereTerm.eOperat
7330: 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  or              
7340: 3d 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20 20  =  WO_OR.**     
7350: 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49  WhereTerm.u.pOrI
7360: 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 20  nfo->indexable  
7370: 7c 3d 20 20 74 68 65 20 63 75 72 73 6f 72 20 6e  |=  the cursor n
7380: 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20  umber for table 
7390: 54 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65 72  T.**.** A subter
73a0: 6d 20 69 73 20 22 69 6e 64 65 78 61 62 6c 65 22  m is "indexable"
73b0: 20 69 66 20 69 74 20 69 73 20 6f 66 20 74 68 65   if it is of the
73c0: 20 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c 6f   form.** "T.C <o
73d0: 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72 65  p> <expr>" where
73e0: 20 43 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d 6e   C is any column
73f0: 20 6f 66 20 74 61 62 6c 65 20 54 20 61 6e 64 20   of table T and 
7400: 0a 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20  .** <op> is one 
7410: 6f 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c 3d  of "=", "<", "<=
7420: 22 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22 49  ", ">", ">=", "I
7430: 53 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e 22  S NULL", or "IN"
7440: 2e 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69  ..** A subterm i
7450: 73 20 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c 65  s also indexable
7460: 20 69 66 20 69 74 20 69 73 20 61 6e 20 41 4e 44   if it is an AND
7470: 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a   of two or more.
7480: 2a 2a 20 73 75 62 73 75 62 74 65 72 6d 73 20 61  ** subsubterms a
7490: 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 77  t least one of w
74a0: 68 69 63 68 20 69 73 20 69 6e 64 65 78 61 62 6c  hich is indexabl
74b0: 65 2e 20 20 49 6e 64 65 78 61 62 6c 65 20 41 4e  e.  Indexable AN
74c0: 44 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20 68  D .** subterms h
74d0: 61 76 65 20 74 68 65 69 72 20 65 4f 70 65 72 61  ave their eOpera
74e0: 74 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f 41 4e  tor set to WO_AN
74f0: 44 20 61 6e 64 20 74 68 65 79 20 68 61 76 65 0a  D and they have.
7500: 2a 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73 65  ** u.pAndInfo se
7510: 74 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c  t to a dynamical
7520: 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65  ly allocated Whe
7530: 72 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63 74  reAndTerm object
7540: 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e 6f  ..**.** From ano
7550: 74 68 65 72 20 70 6f 69 6e 74 20 6f 66 20 76 69  ther point of vi
7560: 65 77 2c 20 22 69 6e 64 65 78 61 62 6c 65 22 20  ew, "indexable" 
7570: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 73  means that the s
7580: 75 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a 20  ubterm could.** 
7590: 70 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20 75  potentially be u
75a0: 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65  sed with an inde
75b0: 78 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69  x if an appropri
75c0: 61 74 65 20 69 6e 64 65 78 20 65 78 69 73 74 73  ate index exists
75d0: 2e 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79 73  ..** This analys
75e0: 69 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 73  is does not cons
75f0: 69 64 65 72 20 77 68 65 74 68 65 72 20 6f 72 20  ider whether or 
7600: 6e 6f 74 20 74 68 65 20 69 6e 64 65 78 20 65 78  not the index ex
7610: 69 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69 73  ists; that.** is
7620: 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 65 20 62   something the b
7630: 65 73 74 49 6e 64 65 78 28 29 20 72 6f 75 74 69  estIndex() routi
7640: 6e 65 20 77 69 6c 6c 20 64 65 74 65 72 6d 69 6e  ne will determin
7650: 65 2e 20 20 54 68 69 73 20 61 6e 61 6c 79 73 69  e.  This analysi
7660: 73 0a 2a 2a 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20  s.** only looks 
7670: 61 74 20 77 68 65 74 68 65 72 20 73 75 62 74 65  at whether subte
7680: 72 6d 73 20 61 70 70 72 6f 70 72 69 61 74 65 20  rms appropriate 
7690: 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 65 78 69  for indexing exi
76a0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65 78  st..**.** All ex
76b0: 61 6d 70 6c 65 73 20 41 20 74 68 72 6f 75 67 68  amples A through
76c0: 20 45 20 61 62 6f 76 65 20 61 6c 6c 20 73 61 74   E above all sat
76d0: 69 73 66 79 20 63 61 73 65 20 32 2e 20 20 42 75  isfy case 2.  Bu
76e0: 74 20 69 66 20 61 20 74 65 72 6d 0a 2a 2a 20 61  t if a term.** a
76f0: 6c 73 6f 20 73 74 61 74 69 73 66 69 65 73 20 63  lso statisfies c
7700: 61 73 65 20 31 20 28 73 75 63 68 20 61 73 20 42  ase 1 (such as B
7710: 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  ) we know that t
7720: 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 77 69 6c  he optimizer wil
7730: 6c 0a 2a 2a 20 61 6c 77 61 79 73 20 70 72 65 66  l.** always pref
7740: 65 72 20 63 61 73 65 20 31 2c 20 73 6f 20 69 6e  er case 1, so in
7750: 20 74 68 61 74 20 63 61 73 65 20 77 65 20 70 72   that case we pr
7760: 65 74 65 6e 64 20 74 68 61 74 20 63 61 73 65 20  etend that case 
7770: 32 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 61 74 69  2 is not.** sati
7780: 73 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  sfied..**.** It 
7790: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
77a0: 65 20 74 68 61 74 20 6d 75 6c 74 69 70 6c 65 20  e that multiple 
77b0: 74 61 62 6c 65 73 20 61 72 65 20 69 6e 64 65 78  tables are index
77c0: 61 62 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70  able.  For examp
77d0: 6c 65 2c 0a 2a 2a 20 28 45 29 20 61 62 6f 76 65  le,.** (E) above
77e0: 20 69 73 20 69 6e 64 65 78 61 62 6c 65 20 6f 6e   is indexable on
77f0: 20 74 61 62 6c 65 73 20 50 2c 20 51 2c 20 61 6e   tables P, Q, an
7800: 64 20 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73  d R..**.** Terms
7810: 20 74 68 61 74 20 73 61 74 69 73 66 79 20 63 61   that satisfy ca
7820: 73 65 20 32 20 61 72 65 20 63 61 6e 64 69 64 61  se 2 are candida
7830: 74 65 73 20 66 6f 72 20 6c 6f 6f 6b 75 70 20 62  tes for lookup b
7840: 79 20 75 73 69 6e 67 0a 2a 2a 20 73 65 70 61 72  y using.** separ
7850: 61 74 65 20 69 6e 64 69 63 65 73 20 74 6f 20 66  ate indices to f
7860: 69 6e 64 20 72 6f 77 69 64 73 20 66 6f 72 20 65  ind rowids for e
7870: 61 63 68 20 73 75 62 74 65 72 6d 20 61 6e 64 20  ach subterm and 
7880: 63 6f 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74 68 65  composing.** the
7890: 20 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 72 6f   union of all ro
78a0: 77 69 64 73 20 75 73 69 6e 67 20 61 20 52 6f 77  wids using a Row
78b0: 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69  Set object.  Thi
78c0: 73 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a 20  s is similar.** 
78d0: 74 6f 20 22 62 69 74 6d 61 70 20 69 6e 64 69 63  to "bitmap indic
78e0: 65 73 22 20 69 6e 20 6f 74 68 65 72 20 64 61 74  es" in other dat
78f0: 61 62 61 73 65 20 65 6e 67 69 6e 65 73 2e 0a 2a  abase engines..*
7900: 2a 0a 2a 2a 20 4f 54 48 45 52 57 49 53 45 3a 0a  *.** OTHERWISE:.
7910: 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72  **.** If neither
7920: 20 63 61 73 65 20 31 20 6e 6f 72 20 63 61 73 65   case 1 nor case
7930: 20 32 20 61 70 70 6c 79 2c 20 74 68 65 6e 20 6c   2 apply, then l
7940: 65 61 76 65 20 74 68 65 20 65 4f 70 65 72 61 74  eave the eOperat
7950: 6f 72 20 73 65 74 20 74 6f 0a 2a 2a 20 7a 65 72  or set to.** zer
7960: 6f 2e 20 20 54 68 69 73 20 74 65 72 6d 20 69 73  o.  This term is
7970: 20 6e 6f 74 20 75 73 65 66 75 6c 20 66 6f 72 20   not useful for 
7980: 73 65 61 72 63 68 2e 0a 2a 2f 0a 73 74 61 74 69  search..*/.stati
7990: 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79  c void exprAnaly
79a0: 7a 65 4f 72 54 65 72 6d 28 0a 20 20 53 72 63 4c  zeOrTerm(.  SrcL
79b0: 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20  ist *pSrc,      
79c0: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
79d0: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  M clause */.  Wh
79e0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
79f0: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 63          /* the c
7a00: 6f 6d 70 6c 65 74 65 20 57 48 45 52 45 20 63 6c  omplete WHERE cl
7a10: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64  ause */.  int id
7a20: 78 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20  xTerm           
7a30: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
7a40: 74 68 65 20 4f 52 2d 74 65 72 6d 20 74 6f 20 62  the OR-term to b
7a50: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b  e analyzed */.){
7a60: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
7a70: 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 3b 20   = pWC->pParse; 
7a80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
7a90: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
7aa0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
7ab0: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
7ac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
7ad0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
7ae0: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
7af0: 2a 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61  *pTerm = &pWC->a
7b00: 5b 69 64 78 54 65 72 6d 5d 3b 20 20 20 20 2f 2a  [idxTerm];    /*
7b10: 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20   The term to be 
7b20: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 45 78  analyzed */.  Ex
7b30: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
7b40: 6d 2d 3e 70 45 78 70 72 3b 20 20 20 20 20 20 20  m->pExpr;       
7b50: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
7b60: 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 74  ression of the t
7b70: 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61  erm */.  WhereMa
7b80: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 20  skSet *pMaskSet 
7b90: 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 3b  = pWC->pMaskSet;
7ba0: 20 2f 2a 20 54 61 62 6c 65 20 75 73 65 20 6d 61   /* Table use ma
7bb0: 73 6b 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  sks */.  int i; 
7bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7be0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
7bf0: 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  s */.  WhereClau
7c00: 73 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 20 20  se *pOrWc;      
7c10: 20 2f 2a 20 42 72 65 61 6b 75 70 20 6f 66 20 70   /* Breakup of p
7c20: 54 65 72 6d 20 69 6e 74 6f 20 73 75 62 74 65 72  Term into subter
7c30: 6d 73 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  ms */.  WhereTer
7c40: 6d 20 2a 70 4f 72 54 65 72 6d 3b 20 20 20 20 20  m *pOrTerm;     
7c50: 20 20 2f 2a 20 41 20 53 75 62 2d 74 65 72 6d 20    /* A Sub-term 
7c60: 77 69 74 68 69 6e 20 74 68 65 20 70 4f 72 57 63  within the pOrWc
7c70: 20 2a 2f 0a 20 20 57 68 65 72 65 4f 72 49 6e 66   */.  WhereOrInf
7c80: 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 20 20  o *pOrInfo;     
7c90: 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 69 6e  /* Additional in
7ca0: 66 6f 72 6d 61 74 69 6f 6e 20 61 73 73 6f 63 69  formation associ
7cb0: 61 74 65 64 20 77 69 74 68 20 70 54 65 72 6d 20  ated with pTerm 
7cc0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 63 68 6e  */.  Bitmask chn
7cd0: 67 54 6f 49 4e 3b 20 20 20 20 20 20 20 20 20 2f  gToIN;         /
7ce0: 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d 69  * Tables that mi
7cf0: 67 68 74 20 73 61 74 69 73 66 79 20 63 61 73 65  ght satisfy case
7d00: 20 31 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20   1 */.  Bitmask 
7d10: 69 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20 20  indexable;      
7d20: 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74    /* Tables that
7d30: 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2c 20   are indexable, 
7d40: 73 61 74 69 73 66 79 69 6e 67 20 63 61 73 65 20  satisfying case 
7d50: 32 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  2 */..  /*.  ** 
7d60: 42 72 65 61 6b 20 74 68 65 20 4f 52 20 63 6c 61  Break the OR cla
7d70: 75 73 65 20 69 6e 74 6f 20 69 74 73 20 73 65 70  use into its sep
7d80: 61 72 61 74 65 20 73 75 62 74 65 72 6d 73 2e 20  arate subterms. 
7d90: 20 54 68 65 20 73 75 62 74 65 72 6d 73 20 61 72   The subterms ar
7da0: 65 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e  e.  ** stored in
7db0: 20 61 20 57 68 65 72 65 43 6c 61 75 73 65 20 73   a WhereClause s
7dc0: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
7dd0: 69 6e 67 20 77 69 74 68 69 6e 20 74 68 65 20 57  ing within the W
7de0: 68 65 72 65 4f 72 49 6e 66 6f 0a 20 20 2a 2a 20  hereOrInfo.  ** 
7df0: 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 61  object that is a
7e00: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6f  ttached to the o
7e10: 72 69 67 69 6e 61 6c 20 4f 52 20 63 6c 61 75 73  riginal OR claus
7e20: 65 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20 61  e term..  */.  a
7e30: 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77  ssert( (pTerm->w
7e40: 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 44  tFlags & (TERM_D
7e50: 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 4f 52 49 4e  YNAMIC|TERM_ORIN
7e60: 46 4f 7c 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 29  FO|TERM_ANDINFO)
7e70: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
7e80: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
7e90: 4f 52 20 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 75  OR );.  pTerm->u
7ea0: 2e 70 4f 72 49 6e 66 6f 20 3d 20 70 4f 72 49 6e  .pOrInfo = pOrIn
7eb0: 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
7ec0: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
7ed0: 65 6f 66 28 2a 70 4f 72 49 6e 66 6f 29 29 3b 0a  eof(*pOrInfo));.
7ee0: 20 20 69 66 28 20 70 4f 72 49 6e 66 6f 3d 3d 30    if( pOrInfo==0
7ef0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 65   ) return;.  pTe
7f00: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
7f10: 45 52 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20 70 4f  ERM_ORINFO;.  pO
7f20: 72 57 63 20 3d 20 26 70 4f 72 49 6e 66 6f 2d 3e  rWc = &pOrInfo->
7f30: 77 63 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73  wc;.  whereClaus
7f40: 65 49 6e 69 74 28 70 4f 72 57 63 2c 20 70 57 43  eInit(pOrWc, pWC
7f50: 2d 3e 70 50 61 72 73 65 2c 20 70 4d 61 73 6b 53  ->pParse, pMaskS
7f60: 65 74 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69  et);.  whereSpli
7f70: 74 28 70 4f 72 57 63 2c 20 70 45 78 70 72 2c 20  t(pOrWc, pExpr, 
7f80: 54 4b 5f 4f 52 29 3b 0a 20 20 65 78 70 72 41 6e  TK_OR);.  exprAn
7f90: 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70  alyzeAll(pSrc, p
7fa0: 4f 72 57 63 29 3b 0a 20 20 69 66 28 20 64 62 2d  OrWc);.  if( db-
7fb0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
7fc0: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
7fd0: 28 20 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d  ( pOrWc->nTerm>=
7fe0: 32 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  2 );..  /*.  ** 
7ff0: 43 6f 6d 70 75 74 65 20 74 68 65 20 73 65 74 20  Compute the set 
8000: 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d  of tables that m
8010: 69 67 68 74 20 73 61 74 69 73 66 79 20 63 61 73  ight satisfy cas
8020: 65 73 20 31 20 6f 72 20 32 2e 0a 20 20 2a 2f 0a  es 1 or 2..  */.
8030: 20 20 69 6e 64 65 78 61 62 6c 65 20 3d 20 7e 28    indexable = ~(
8040: 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 63 68 6e  Bitmask)0;.  chn
8050: 67 54 6f 49 4e 20 3d 20 7e 28 70 57 43 2d 3e 76  gToIN = ~(pWC->v
8060: 6d 61 73 6b 29 3b 0a 20 20 66 6f 72 28 69 3d 70  mask);.  for(i=p
8070: 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70  OrWc->nTerm-1, p
8080: 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b  OrTerm=pOrWc->a;
8090: 20 69 3e 3d 30 20 26 26 20 69 6e 64 65 78 61 62   i>=0 && indexab
80a0: 6c 65 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  le; i--, pOrTerm
80b0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 4f  ++){.    if( (pO
80c0: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
80d0: 20 26 20 57 4f 5f 53 49 4e 47 4c 45 29 3d 3d 30   & WO_SINGLE)==0
80e0: 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 41   ){.      WhereA
80f0: 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e 66 6f  ndInfo *pAndInfo
8100: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8110: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
8120: 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  or==0 );.      a
8130: 73 73 65 72 74 28 20 28 70 4f 72 54 65 72 6d 2d  ssert( (pOrTerm-
8140: 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
8150: 5f 41 4e 44 49 4e 46 4f 7c 54 45 52 4d 5f 4f 52  _ANDINFO|TERM_OR
8160: 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 20  INFO))==0 );.   
8170: 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b     chngToIN = 0;
8180: 0a 20 20 20 20 20 20 70 41 6e 64 49 6e 66 6f 20  .      pAndInfo 
8190: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
81a0: 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
81b0: 2a 70 41 6e 64 49 6e 66 6f 29 29 3b 0a 20 20 20  *pAndInfo));.   
81c0: 20 20 20 69 66 28 20 70 41 6e 64 49 6e 66 6f 20     if( pAndInfo 
81d0: 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  ){.        Where
81e0: 43 6c 61 75 73 65 20 2a 70 41 6e 64 57 43 3b 0a  Clause *pAndWC;.
81f0: 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72          WhereTer
8200: 6d 20 2a 70 41 6e 64 54 65 72 6d 3b 0a 20 20 20  m *pAndTerm;.   
8210: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
8220: 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20      Bitmask b = 
8230: 30 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65  0;.        pOrTe
8240: 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 20 3d  rm->u.pAndInfo =
8250: 20 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20   pAndInfo;.     
8260: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c     pOrTerm->wtFl
8270: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 41 4e 44 49  ags |= TERM_ANDI
8280: 4e 46 4f 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  NFO;.        pOr
8290: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
82a0: 3d 20 57 4f 5f 41 4e 44 3b 0a 20 20 20 20 20 20  = WO_AND;.      
82b0: 20 20 70 41 6e 64 57 43 20 3d 20 26 70 41 6e 64    pAndWC = &pAnd
82c0: 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20  Info->wc;.      
82d0: 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69    whereClauseIni
82e0: 74 28 70 41 6e 64 57 43 2c 20 70 57 43 2d 3e 70  t(pAndWC, pWC->p
82f0: 50 61 72 73 65 2c 20 70 4d 61 73 6b 53 65 74 29  Parse, pMaskSet)
8300: 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 53  ;.        whereS
8310: 70 6c 69 74 28 70 41 6e 64 57 43 2c 20 70 4f 72  plit(pAndWC, pOr
8320: 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 54 4b 5f  Term->pExpr, TK_
8330: 41 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 65 78  AND);.        ex
8340: 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72  prAnalyzeAll(pSr
8350: 63 2c 20 70 41 6e 64 57 43 29 3b 0a 20 20 20 20  c, pAndWC);.    
8360: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64 62      testcase( db
8370: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
8380: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 64  ;.        if( !d
8390: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
83a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ){.          for
83b0: 28 6a 3d 30 2c 20 70 41 6e 64 54 65 72 6d 3d 70  (j=0, pAndTerm=p
83c0: 41 6e 64 57 43 2d 3e 61 3b 20 6a 3c 70 41 6e 64  AndWC->a; j<pAnd
83d0: 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20  WC->nTerm; j++, 
83e0: 70 41 6e 64 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  pAndTerm++){.   
83f0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
8400: 20 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72   pAndTerm->pExpr
8410: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
8420: 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 41  if( allowedOp(pA
8430: 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f  ndTerm->pExpr->o
8440: 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  p) ){.          
8450: 20 20 20 20 62 20 7c 3d 20 67 65 74 4d 61 73 6b      b |= getMask
8460: 28 70 4d 61 73 6b 53 65 74 2c 20 70 41 6e 64 54  (pMaskSet, pAndT
8470: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29  erm->leftCursor)
8480: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
8490: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
84a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 6e      }.        in
84b0: 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20  dexable &= b;.  
84c0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
84d0: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46  if( pOrTerm->wtF
84e0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49  lags & TERM_COPI
84f0: 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53  ED ){.      /* S
8500: 6b 69 70 20 74 68 69 73 20 74 65 72 6d 20 66 6f  kip this term fo
8510: 72 20 6e 6f 77 2e 20 20 57 65 20 72 65 76 69 73  r now.  We revis
8520: 69 74 20 69 74 20 77 68 65 6e 20 77 65 20 70 72  it it when we pr
8530: 6f 63 65 73 73 20 74 68 65 0a 20 20 20 20 20 20  ocess the.      
8540: 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
8550: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 74 65   TERM_VIRTUAL te
8560: 72 6d 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b  rm */.    }else{
8570: 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62  .      Bitmask b
8580: 3b 0a 20 20 20 20 20 20 62 20 3d 20 67 65 74 4d  ;.      b = getM
8590: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 4f  ask(pMaskSet, pO
85a0: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
85b0: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  r);.      if( pO
85c0: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
85d0: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 7b   TERM_VIRTUAL ){
85e0: 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65  .        WhereTe
85f0: 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 4f  rm *pOther = &pO
8600: 72 57 63 2d 3e 61 5b 70 4f 72 54 65 72 6d 2d 3e  rWc->a[pOrTerm->
8610: 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20  iParent];.      
8620: 20 20 62 20 7c 3d 20 67 65 74 4d 61 73 6b 28 70    b |= getMask(p
8630: 4d 61 73 6b 53 65 74 2c 20 70 4f 74 68 65 72 2d  MaskSet, pOther-
8640: 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20  >leftCursor);.  
8650: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 64 65      }.      inde
8660: 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20  xable &= b;.    
8670: 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 65    if( pOrTerm->e
8680: 4f 70 65 72 61 74 6f 72 21 3d 57 4f 5f 45 51 20  Operator!=WO_EQ 
8690: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54  ){.        chngT
86a0: 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  oIN = 0;.      }
86b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68  else{.        ch
86c0: 6e 67 54 6f 49 4e 20 26 3d 20 62 3b 0a 20 20 20  ngToIN &= b;.   
86d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
86e0: 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 63 6f 72 64    /*.  ** Record
86f0: 20 74 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c   the set of tabl
8700: 65 73 20 74 68 61 74 20 73 61 74 69 73 66 79 20  es that satisfy 
8710: 63 61 73 65 20 32 2e 20 20 54 68 65 20 73 65 74  case 2.  The set
8720: 20 6d 69 67 68 74 20 62 65 0a 20 20 2a 2a 20 65   might be.  ** e
8730: 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72  mpty..  */.  pOr
8740: 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20  Info->indexable 
8750: 3d 20 69 6e 64 65 78 61 62 6c 65 3b 0a 20 20 70  = indexable;.  p
8760: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
8770: 3d 20 69 6e 64 65 78 61 62 6c 65 3d 3d 30 20 3f  = indexable==0 ?
8780: 20 30 20 3a 20 57 4f 5f 4f 52 3b 0a 0a 20 20 2f   0 : WO_OR;..  /
8790: 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20  *.  ** chngToIN 
87a0: 68 6f 6c 64 73 20 61 20 73 65 74 20 6f 66 20 74  holds a set of t
87b0: 61 62 6c 65 73 20 74 68 61 74 20 2a 6d 69 67 68  ables that *migh
87c0: 74 2a 20 73 61 74 69 73 66 79 20 63 61 73 65 20  t* satisfy case 
87d0: 31 2e 20 20 42 75 74 0a 20 20 2a 2a 20 77 65 20  1.  But.  ** we 
87e0: 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20  have to do some 
87f0: 61 64 64 69 74 69 6f 6e 61 6c 20 63 68 65 63 6b  additional check
8800: 69 6e 67 20 74 6f 20 73 65 65 20 69 66 20 63 61  ing to see if ca
8810: 73 65 20 31 20 72 65 61 6c 6c 79 0a 20 20 2a 2a  se 1 really.  **
8820: 20 69 73 20 73 61 74 69 73 66 69 65 64 2e 0a 20   is satisfied.. 
8830: 20 2a 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49   **.  ** chngToI
8840: 4e 20 77 69 6c 6c 20 68 6f 6c 64 20 65 69 74 68  N will hold eith
8850: 65 72 20 30 2c 20 31 2c 20 6f 72 20 32 20 62 69  er 0, 1, or 2 bi
8860: 74 73 2e 20 20 54 68 65 20 30 2d 62 69 74 20 63  ts.  The 0-bit c
8870: 61 73 65 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74  ase means.  ** t
8880: 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hat there is no 
8890: 70 6f 73 73 69 62 69 6c 69 74 79 20 6f 66 20 74  possibility of t
88a0: 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 20  ransforming the 
88b0: 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 61  OR clause into a
88c0: 6e 0a 20 20 2a 2a 20 49 4e 20 6f 70 65 72 61 74  n.  ** IN operat
88d0: 6f 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f  or because one o
88e0: 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 69 6e 20  r more terms in 
88f0: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 63 6f  the OR clause co
8900: 6e 74 61 69 6e 0a 20 20 2a 2a 20 73 6f 6d 65 74  ntain.  ** somet
8910: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
8920: 3d 3d 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 69  == on a column i
8930: 6e 20 74 68 65 20 73 69 6e 67 6c 65 20 74 61 62  n the single tab
8940: 6c 65 2e 20 20 54 68 65 20 31 2d 62 69 74 0a 20  le.  The 1-bit. 
8950: 20 2a 2a 20 63 61 73 65 20 6d 65 61 6e 73 20 74   ** case means t
8960: 68 61 74 20 65 76 65 72 79 20 74 65 72 6d 20 6f  hat every term o
8970: 66 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20  f the OR clause 
8980: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 20  is of the form. 
8990: 20 2a 2a 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d   ** "table.colum
89a0: 6e 3d 65 78 70 72 22 20 66 6f 72 20 73 6f 6d 65  n=expr" for some
89b0: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20   single table.  
89c0: 54 68 65 20 6f 6e 65 20 62 69 74 20 74 68 61 74  The one bit that
89d0: 20 69 73 20 73 65 74 0a 20 20 2a 2a 20 77 69 6c   is set.  ** wil
89e0: 6c 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20  l correspond to 
89f0: 74 68 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65  the common table
8a00: 2e 20 20 57 65 20 73 74 69 6c 6c 20 6e 65 65 64  .  We still need
8a10: 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b   to check to mak
8a20: 65 0a 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20  e.  ** sure the 
8a30: 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 73 20 75  same column is u
8a40: 73 65 64 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73  sed on all terms
8a50: 2e 20 20 54 68 65 20 32 2d 62 69 74 20 63 61 73  .  The 2-bit cas
8a60: 65 20 69 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74  e is when.  ** t
8a70: 68 65 20 61 6c 6c 20 74 65 72 6d 73 20 61 72 65  he all terms are
8a80: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 74 61   of the form "ta
8a90: 62 6c 65 31 2e 63 6f 6c 75 6d 6e 3d 74 61 62 6c  ble1.column=tabl
8aa0: 65 32 2e 63 6f 6c 75 6d 6e 22 2e 20 20 49 74 0a  e2.column".  It.
8ab0: 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 70 6f    ** might be po
8ac0: 73 73 69 62 6c 65 20 74 6f 20 66 6f 72 6d 20 61  ssible to form a
8ad0: 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  n IN operator wi
8ae0: 74 68 20 65 69 74 68 65 72 20 74 61 62 6c 65 31  th either table1
8af0: 2e 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 72 20  .column.  ** or 
8b00: 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 20 61 73  table2.column as
8b10: 20 74 68 65 20 4c 48 53 20 69 66 20 65 69 74 68   the LHS if eith
8b20: 65 72 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20  er is common to 
8b30: 65 76 65 72 79 20 74 65 72 6d 20 6f 66 0a 20 20  every term of.  
8b40: 2a 2a 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  ** the OR clause
8b50: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65  ..  **.  ** Note
8b60: 20 74 68 61 74 20 74 65 72 6d 73 20 6f 66 20 74   that terms of t
8b70: 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 2e 63  he form "table.c
8b80: 6f 6c 75 6d 6e 31 3d 74 61 62 6c 65 2e 63 6f 6c  olumn1=table.col
8b90: 75 6d 6e 32 22 20 28 74 68 65 0a 20 20 2a 2a 20  umn2" (the.  ** 
8ba0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 6e 20 62 6f  same table on bo
8bb0: 74 68 20 73 69 7a 65 73 20 6f 66 20 74 68 65 20  th sizes of the 
8bc0: 3d 3d 29 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70  ==) cannot be op
8bd0: 74 69 6d 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  timized..  */.  
8be0: 69 66 28 20 63 68 6e 67 54 6f 49 4e 20 29 7b 0a  if( chngToIN ){.
8bf0: 20 20 20 20 69 6e 74 20 6f 6b 54 6f 43 68 6e 67      int okToChng
8c00: 54 6f 49 4e 20 3d 20 30 3b 20 20 20 20 20 2f 2a  ToIN = 0;     /*
8c10: 20 54 72 75 65 20 69 66 20 74 68 65 20 63 6f 6e   True if the con
8c20: 76 65 72 73 69 6f 6e 20 74 6f 20 49 4e 20 69 73  version to IN is
8c30: 20 76 61 6c 69 64 20 2a 2f 0a 20 20 20 20 69 6e   valid */.    in
8c40: 74 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20  t iColumn = -1; 
8c50: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
8c60: 6e 20 69 6e 64 65 78 20 6f 6e 20 6c 68 73 20 6f  n index on lhs o
8c70: 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  f IN operator */
8c80: 0a 20 20 20 20 69 6e 74 20 69 43 75 72 73 6f 72  .    int iCursor
8c90: 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f   = -1;         /
8ca0: 2a 20 54 61 62 6c 65 20 63 75 72 73 6f 72 20 63  * Table cursor c
8cb0: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 74 65 72  ommon to all ter
8cc0: 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20  ms */.    int j 
8cd0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
8ce0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
8cf0: 74 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ter */..    /* S
8d00: 65 61 72 63 68 20 66 6f 72 20 61 20 74 61 62 6c  earch for a tabl
8d10: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 74 68 61  e and column tha
8d20: 74 20 61 70 70 65 61 72 73 20 6f 6e 20 6f 6e 65  t appears on one
8d30: 20 73 69 64 65 20 6f 72 20 74 68 65 0a 20 20 20   side or the.   
8d40: 20 2a 2a 20 6f 74 68 65 72 20 6f 66 20 74 68 65   ** other of the
8d50: 20 3d 3d 20 6f 70 65 72 61 74 6f 72 20 69 6e 20   == operator in 
8d60: 65 76 65 72 79 20 73 75 62 74 65 72 6d 2e 20 20  every subterm.  
8d70: 54 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 63  That table and c
8d80: 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2a 20 77 69 6c  olumn.    ** wil
8d90: 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20 69 6e  l be recorded in
8da0: 20 69 43 75 72 73 6f 72 20 61 6e 64 20 69 43 6f   iCursor and iCo
8db0: 6c 75 6d 6e 2e 20 20 54 68 65 72 65 20 6d 69 67  lumn.  There mig
8dc0: 68 74 20 6e 6f 74 20 62 65 20 61 6e 79 0a 20 20  ht not be any.  
8dd0: 20 20 2a 2a 20 73 75 63 68 20 74 61 62 6c 65 20    ** such table 
8de0: 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 53 65 74  and column.  Set
8df0: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 66   okToChngToIN if
8e00: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
8e10: 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 61 6e 64  table.    ** and
8e20: 20 63 6f 6c 75 6d 6e 20 69 73 20 66 6f 75 6e 64   column is found
8e30: 20 62 75 74 20 6c 65 61 76 65 20 6f 6b 54 6f 43   but leave okToC
8e40: 68 6e 67 54 6f 49 4e 20 66 61 6c 73 65 20 69 66  hngToIN false if
8e50: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 20 20   not found..    
8e60: 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  */.    for(j=0; 
8e70: 6a 3c 32 20 26 26 20 21 6f 6b 54 6f 43 68 6e 67  j<2 && !okToChng
8e80: 54 6f 49 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  ToIN; j++){.    
8e90: 20 20 70 4f 72 54 65 72 6d 20 3d 20 70 4f 72 57    pOrTerm = pOrW
8ea0: 63 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28  c->a;.      for(
8eb0: 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31  i=pOrWc->nTerm-1
8ec0: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72  ; i>=0; i--, pOr
8ed0: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
8ee0: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
8ef0: 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
8f00: 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  EQ );.        pO
8f10: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
8f20: 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20  = ~TERM_OR_OK;. 
8f30: 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65         if( pOrTe
8f40: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
8f50: 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
8f60: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20       /* This is 
8f70: 74 68 65 20 32 2d 62 69 74 20 63 61 73 65 20 61  the 2-bit case a
8f80: 6e 64 20 77 65 20 61 72 65 20 6f 6e 20 74 68 65  nd we are on the
8f90: 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f   second iteratio
8fa0: 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  n and.          
8fb0: 2a 2a 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20  ** current term 
8fc0: 69 73 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73  is from the firs
8fd0: 74 20 69 74 65 72 61 74 69 6f 6e 2e 20 20 53 6f  t iteration.  So
8fe0: 20 73 6b 69 70 20 74 68 69 73 20 74 65 72 6d 2e   skip this term.
8ff0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
9000: 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20  sert( j==1 );.  
9010: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
9020: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9030: 20 20 20 20 69 66 28 20 28 63 68 6e 67 54 6f 49      if( (chngToI
9040: 4e 20 26 20 67 65 74 4d 61 73 6b 28 70 4d 61 73  N & getMask(pMas
9050: 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c  kSet, pOrTerm->l
9060: 65 66 74 43 75 72 73 6f 72 29 29 3d 3d 30 20 29  eftCursor))==0 )
9070: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
9080: 68 69 73 20 74 65 72 6d 20 6d 75 73 74 20 62 65  his term must be
9090: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 74 31 2e   of the form t1.
90a0: 61 3d 3d 74 32 2e 62 20 77 68 65 72 65 20 74 32  a==t2.b where t2
90b0: 20 69 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20   is in the.     
90c0: 20 20 20 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e       ** chngToIN
90d0: 20 73 65 74 20 62 75 74 20 74 31 20 69 73 20 6e   set but t1 is n
90e0: 6f 74 2e 20 20 54 68 69 73 20 74 65 72 6d 20 77  ot.  This term w
90f0: 69 6c 6c 20 62 65 20 65 69 74 68 65 72 20 70 72  ill be either pr
9100: 65 63 65 65 64 65 64 0a 20 20 20 20 20 20 20 20  eceeded.        
9110: 20 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77 65 64 20    ** or follwed 
9120: 62 79 20 61 6e 20 69 6e 76 65 72 74 65 64 20 63  by an inverted c
9130: 6f 70 79 20 28 74 32 2e 62 3d 3d 74 31 2e 61 29  opy (t2.b==t1.a)
9140: 2e 20 20 53 6b 69 70 20 74 68 69 73 20 74 65 72  .  Skip this ter
9150: 6d 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  m .          ** 
9160: 61 6e 64 20 75 73 65 20 69 74 73 20 69 6e 76 65  and use its inve
9170: 72 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  rsion. */.      
9180: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4f      testcase( pO
9190: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
91a0: 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 3b 0a   TERM_COPIED );.
91b0: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
91c0: 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46  se( pOrTerm->wtF
91d0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
91e0: 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 20  UAL );.         
91f0: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
9200: 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
9210: 4d 5f 43 4f 50 49 45 44 7c 54 45 52 4d 5f 56 49  M_COPIED|TERM_VI
9220: 52 54 55 41 4c 29 20 29 3b 0a 20 20 20 20 20 20  RTUAL) );.      
9230: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
9240: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9250: 69 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72 54 65 72  iColumn = pOrTer
9260: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  m->u.leftColumn;
9270: 0a 20 20 20 20 20 20 20 20 69 43 75 72 73 6f 72  .        iCursor
9280: 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74   = pOrTerm->left
9290: 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20  Cursor;.        
92a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
92b0: 20 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a       if( i<0 ){.
92c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63 61          /* No ca
92d0: 6e 64 69 64 61 74 65 20 74 61 62 6c 65 2b 63 6f  ndidate table+co
92e0: 6c 75 6d 6e 20 77 61 73 20 66 6f 75 6e 64 2e 20  lumn was found. 
92f0: 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f   This can only o
9300: 63 63 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  ccur.        ** 
9310: 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74  on the second it
9320: 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  eration */.     
9330: 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31 20     assert( j==1 
9340: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
9350: 74 28 20 28 63 68 6e 67 54 6f 49 4e 26 28 63 68  t( (chngToIN&(ch
9360: 6e 67 54 6f 49 4e 2d 31 29 29 3d 3d 30 20 29 3b  ngToIN-1))==0 );
9370: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
9380: 20 63 68 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d 61   chngToIN==getMa
9390: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 69 43 75  sk(pMaskSet, iCu
93a0: 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20  rsor) );.       
93b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
93c0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
93d0: 6a 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f  j==1 );..      /
93e0: 2a 20 57 65 20 68 61 76 65 20 66 6f 75 6e 64 20  * We have found 
93f0: 61 20 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c  a candidate tabl
9400: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 43  e and column.  C
9410: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
9420: 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 74 61 62  hat.      ** tab
9430: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73  le and column is
9440: 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79   common to every
9450: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 4f 52 20   term in the OR 
9460: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
9470: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 31  okToChngToIN = 1
9480: 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3e  ;.      for(; i>
9490: 3d 30 20 26 26 20 6f 6b 54 6f 43 68 6e 67 54 6f  =0 && okToChngTo
94a0: 49 4e 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  IN; i--, pOrTerm
94b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ++){.        ass
94c0: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f  ert( pOrTerm->eO
94d0: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20 29  perator==WO_EQ )
94e0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
94f0: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
9500: 72 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  r!=iCursor ){.  
9510: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
9520: 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52  >wtFlags &= ~TER
9530: 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  M_OR_OK;.       
9540: 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65   }else if( pOrTe
9550: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
9560: 21 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  !=iColumn ){.   
9570: 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54         okToChngT
9580: 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  oIN = 0;.       
9590: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
95a0: 20 20 69 6e 74 20 61 66 66 4c 65 66 74 2c 20 61    int affLeft, a
95b0: 66 66 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  ffRight;.       
95c0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 69 67     /* If the rig
95d0: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
95e0: 61 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20 74  also a column, t
95f0: 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 69  hen the affiniti
9600: 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
9610: 6f 66 20 62 6f 74 68 20 72 69 67 68 74 20 61 6e  of both right an
9620: 64 20 6c 65 66 74 20 73 69 64 65 73 20 6d 75 73  d left sides mus
9630: 74 20 62 65 20 73 75 63 68 20 74 68 61 74 20 6e  t be such that n
9640: 6f 20 74 79 70 65 0a 20 20 20 20 20 20 20 20 20  o type.         
9650: 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20   ** conversions 
9660: 61 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20  are required on 
9670: 74 68 65 20 72 69 67 68 74 2e 20 20 28 54 69 63  the right.  (Tic
9680: 6b 65 74 20 23 32 32 34 39 29 0a 20 20 20 20 20  ket #2249).     
9690: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
96a0: 20 20 61 66 66 52 69 67 68 74 20 3d 20 73 71 6c    affRight = sql
96b0: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
96c0: 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d  (pOrTerm->pExpr-
96d0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
96e0: 20 20 20 20 61 66 66 4c 65 66 74 20 3d 20 73 71      affLeft = sq
96f0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
9700: 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  y(pOrTerm->pExpr
9710: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
9720: 20 20 20 20 69 66 28 20 61 66 66 52 69 67 68 74      if( affRight
9730: 21 3d 30 20 26 26 20 61 66 66 52 69 67 68 74 21  !=0 && affRight!
9740: 3d 61 66 66 4c 65 66 74 20 29 7b 0a 20 20 20 20  =affLeft ){.    
9750: 20 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67          okToChng
9760: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20  ToIN = 0;.      
9770: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9780: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
9790: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
97a0: 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  OR_OK;.         
97b0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
97c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
97d0: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
97e0: 2c 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69  , okToChngToIN i
97f0: 73 20 74 72 75 65 20 69 66 20 6f 72 69 67 69 6e  s true if origin
9800: 61 6c 20 70 54 65 72 6d 20 73 61 74 69 73 66 69  al pTerm satisfi
9810: 65 73 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 31  es.    ** case 1
9820: 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  .  In that case,
9830: 20 63 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77   construct a new
9840: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 74 68   virtual term th
9850: 61 74 20 69 73 20 0a 20 20 20 20 2a 2a 20 70 54  at is .    ** pT
9860: 65 72 6d 20 63 6f 6e 76 65 72 74 65 64 20 69 6e  erm converted in
9870: 74 6f 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  to an IN operato
9880: 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  r..    **.    **
9890: 20 45 56 3a 20 52 2d 30 30 32 31 31 2d 31 35 31   EV: R-00211-151
98a0: 30 30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  00.    */.    if
98b0: 28 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 29  ( okToChngToIN )
98c0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44  {.      Expr *pD
98d0: 75 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  up;            /
98e0: 2a 20 41 20 74 72 61 6e 73 69 65 6e 74 20 64 75  * A transient du
98f0: 70 6c 69 63 61 74 65 20 65 78 70 72 65 73 73 69  plicate expressi
9900: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
9910: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b  List *pList = 0;
9920: 20 20 20 2f 2a 20 54 68 65 20 52 48 53 20 6f 66     /* The RHS of
9930: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
9940: 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
9950: 70 4c 65 66 74 20 3d 20 30 3b 20 20 20 20 20 20  pLeft = 0;      
9960: 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20 74   /* The LHS of t
9970: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  he IN operator *
9980: 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  /.      Expr *pN
9990: 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ew;            /
99a0: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 49  * The complete I
99b0: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 0a 20  N operator */.. 
99c0: 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63       for(i=pOrWc
99d0: 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65  ->nTerm-1, pOrTe
99e0: 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d  rm=pOrWc->a; i>=
99f0: 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b  0; i--, pOrTerm+
9a00: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
9a10: 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67  (pOrTerm->wtFlag
9a20: 73 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d  s & TERM_OR_OK)=
9a30: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
9a40: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
9a50: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
9a60: 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20  r==WO_EQ );.    
9a70: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
9a80: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
9a90: 3d 69 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  =iCursor );.    
9aa0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
9ab0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
9ac0: 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  n==iColumn );.  
9ad0: 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c        pDup = sql
9ae0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
9af0: 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  pOrTerm->pExpr->
9b00: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
9b10: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
9b20: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
9b30: 64 28 70 57 43 2d 3e 70 50 61 72 73 65 2c 20 70  d(pWC->pParse, p
9b40: 4c 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20 20  List, pDup);.   
9b50: 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4f 72       pLeft = pOr
9b60: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65  Term->pExpr->pLe
9b70: 66 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ft;.      }.    
9b80: 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 21    assert( pLeft!
9b90: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44 75 70  =0 );.      pDup
9ba0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
9bb0: 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b  p(db, pLeft, 0);
9bc0: 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71  .      pNew = sq
9bd0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
9be0: 65 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20  e, TK_IN, pDup, 
9bf0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
9c00: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
9c10: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
9c20: 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69       transferJoi
9c30: 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20  nMarkings(pNew, 
9c40: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
9c50: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
9c60: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
9c70: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
9c80: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e          pNew->x.
9c90: 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20  pList = pList;. 
9ca0: 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20         idxNew = 
9cb0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
9cc0: 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 52  t(pWC, pNew, TER
9cd0: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
9ce0: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20  YNAMIC);.       
9cf0: 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
9d00: 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  w==0 );.        
9d10: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
9d20: 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a  , pWC, idxNew);.
9d30: 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
9d40: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
9d50: 3b 0a 20 20 20 20 20 20 20 20 70 57 43 2d 3e 61  ;.        pWC->a
9d60: 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74  [idxNew].iParent
9d70: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
9d80: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
9d90: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  d = 1;.      }el
9da0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
9db0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
9dc0: 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
9dd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 65 72      }.      pTer
9de0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57  m->eOperator = W
9df0: 4f 5f 4e 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65  O_NOOP;  /* case
9e00: 20 31 20 74 72 75 6d 70 73 20 63 61 73 65 20 32   1 trumps case 2
9e10: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   */.    }.  }.}.
9e20: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
9e30: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
9e40: 5a 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49 54  ZATION && !SQLIT
9e50: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
9e60: 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  */.../*.** The i
9e70: 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75  nput to this rou
9e80: 74 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65  tine is an Where
9e90: 54 65 72 6d 20 73 74 72 75 63 74 75 72 65 20 77  Term structure w
9ea0: 69 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  ith only the.** 
9eb0: 22 70 45 78 70 72 22 20 66 69 65 6c 64 20 66 69  "pExpr" field fi
9ec0: 6c 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f  lled in.  The jo
9ed0: 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  b of this routin
9ee0: 65 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20  e is to analyze 
9ef0: 74 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73  the.** subexpres
9f00: 73 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74  sion and populat
9f10: 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20  e all the other 
9f20: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68  fields of the Wh
9f30: 65 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63  ereTerm.** struc
9f40: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ture..**.** If t
9f50: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
9f60: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65   of the form "<e
9f70: 78 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20  xpr> <op> X" it 
9f80: 67 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a  gets commuted.**
9f90: 20 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64   to the standard
9fa0: 20 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e   form of "X <op>
9fb0: 20 3c 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20   <expr>"..**.** 
9fc0: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
9fd0: 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  n is of the form
9fe0: 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72   "X <op> Y" wher
9ff0: 65 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61  e both X and Y a
a000: 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74  re.** columns, t
a010: 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hen the original
a020: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75   expression is u
a030: 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e  nchanged and a n
a040: 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65  ew virtual.** te
a050: 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rm of the form "
a060: 59 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64  Y <op> X" is add
a070: 65 64 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ed to the WHERE 
a080: 63 6c 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e  clause and.** an
a090: 61 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c  alyzed separatel
a0a0: 79 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  y.  The original
a0b0: 20 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20   term is marked 
a0c0: 77 69 74 68 20 54 45 52 4d 5f 43 4f 50 49 45 44  with TERM_COPIED
a0d0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20  .** and the new 
a0e0: 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77  term is marked w
a0f0: 69 74 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43  ith TERM_DYNAMIC
a100: 20 28 62 65 63 61 75 73 65 20 69 74 27 73 20 70   (because it's p
a110: 45 78 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f  Expr.** needs to
a120: 20 62 65 20 66 72 65 65 64 20 77 69 74 68 20 74   be freed with t
a130: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 29 20  he WhereClause) 
a140: 61 6e 64 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  and TERM_VIRTUAL
a150: 20 28 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20   (because it.** 
a160: 69 73 20 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f  is a commuted co
a170: 70 79 20 6f 66 20 61 20 70 72 69 6f 72 20 74 65  py of a prior te
a180: 72 6d 2e 29 20 20 54 68 65 20 6f 72 69 67 69 6e  rm.)  The origin
a190: 61 6c 20 74 65 72 6d 20 68 61 73 20 6e 43 68 69  al term has nChi
a1a0: 6c 64 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ld=1.** and the 
a1b0: 63 6f 70 79 20 68 61 73 20 69 64 78 50 61 72 65  copy has idxPare
a1c0: 6e 74 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e  nt set to the in
a1d0: 64 65 78 20 6f 66 20 74 68 65 20 6f 72 69 67 69  dex of the origi
a1e0: 6e 61 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61  nal term..*/.sta
a1f0: 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61  tic void exprAna
a200: 6c 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20  lyze(.  SrcList 
a210: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20  *pSrc,          
a220: 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    /* the FROM cl
a230: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
a240: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
a250: 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45      /* the WHERE
a260: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
a270: 20 69 64 78 54 65 72 6d 20 20 20 20 20 20 20 20   idxTerm        
a280: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
a290: 6f 66 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62  of the term to b
a2a0: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b  e analyzed */.){
a2b0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
a2c0: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
a2d0: 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20      /* The term 
a2e0: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
a2f0: 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74  /.  WhereMaskSet
a300: 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 20   *pMaskSet;     
a310: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 74       /* Set of t
a320: 61 62 6c 65 20 69 6e 64 65 78 20 6d 61 73 6b 73  able index masks
a330: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
a340: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
a350: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
a360: 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61  pression to be a
a370: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42 69 74  nalyzed */.  Bit
a380: 6d 61 73 6b 20 70 72 65 72 65 71 4c 65 66 74 3b  mask prereqLeft;
a390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a3a0: 20 50 72 65 72 65 71 75 65 73 69 74 65 73 20 6f   Prerequesites o
a3b0: 66 20 74 68 65 20 70 45 78 70 72 2d 3e 70 4c 65  f the pExpr->pLe
a3c0: 66 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ft */.  Bitmask 
a3d0: 70 72 65 72 65 71 41 6c 6c 3b 20 20 20 20 20 20  prereqAll;      
a3e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72           /* Prer
a3f0: 65 71 75 65 73 69 74 65 73 20 6f 66 20 70 45 78  equesites of pEx
a400: 70 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  pr */.  Bitmask 
a410: 65 78 74 72 61 52 69 67 68 74 20 3d 20 30 3b 20  extraRight = 0; 
a420: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
a430: 61 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f  a dependencies o
a440: 6e 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20  n LEFT JOIN */. 
a450: 20 45 78 70 72 20 2a 70 53 74 72 31 20 3d 20 30   Expr *pStr1 = 0
a460: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a470: 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45    /* RHS of LIKE
a480: 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a  /GLOB operator *
a490: 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65  /.  int isComple
a4a0: 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  te = 0;         
a4b0: 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c       /* RHS of L
a4c0: 49 4b 45 2f 47 4c 4f 42 20 65 6e 64 73 20 77 69  IKE/GLOB ends wi
a4d0: 74 68 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20  th wildcard */. 
a4e0: 20 69 6e 74 20 6e 6f 43 61 73 65 20 3d 20 30 3b   int noCase = 0;
a4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a500: 20 20 2f 2a 20 4c 49 4b 45 2f 47 4c 4f 42 20 64    /* LIKE/GLOB d
a510: 69 73 74 69 6e 67 75 69 73 68 65 73 20 63 61 73  istinguishes cas
a520: 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  e */.  int op;  
a530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a540: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 2d 6c          /* Top-l
a550: 65 76 65 6c 20 6f 70 65 72 61 74 6f 72 2e 20 20  evel operator.  
a560: 70 45 78 70 72 2d 3e 6f 70 20 2a 2f 0a 20 20 50  pExpr->op */.  P
a570: 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
a580: 57 43 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20  WC->pParse;     
a590: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
a5a0: 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  xt */.  sqlite3 
a5b0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
a5c0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  ;        /* Data
a5d0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
a5e0: 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  */..  if( db->ma
a5f0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
a600: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
a610: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
a620: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 70 4d 61 73  idxTerm];.  pMas
a630: 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61 73  kSet = pWC->pMas
a640: 6b 53 65 74 3b 0a 20 20 70 45 78 70 72 20 3d 20  kSet;.  pExpr = 
a650: 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
a660: 70 72 65 72 65 71 4c 65 66 74 20 3d 20 65 78 70  prereqLeft = exp
a670: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
a680: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65  kSet, pExpr->pLe
a690: 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70  ft);.  op = pExp
a6a0: 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  r->op;.  if( op=
a6b0: 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73  =TK_IN ){.    as
a6c0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69  sert( pExpr->pRi
a6d0: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  ght==0 );.    if
a6e0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
a6f0: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
a700: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
a710: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
a720: 68 74 20 3d 20 65 78 70 72 53 65 6c 65 63 74 54  ht = exprSelectT
a730: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
a740: 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  et, pExpr->x.pSe
a750: 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lect);.    }else
a760: 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70  {.      pTerm->p
a770: 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70  rereqRight = exp
a780: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
a790: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
a7a0: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  >x.pList);.    }
a7b0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
a7c0: 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =TK_ISNULL ){.  
a7d0: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
a7e0: 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  ight = 0;.  }els
a7f0: 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72  e{.    pTerm->pr
a800: 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72  ereqRight = expr
a810: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
a820: 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  Set, pExpr->pRig
a830: 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65  ht);.  }.  prere
a840: 71 41 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c 65  qAll = exprTable
a850: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
a860: 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 45 78  pExpr);.  if( Ex
a870: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
a880: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
a890: 29 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b  ) ){.    Bitmask
a8a0: 20 78 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61   x = getMask(pMa
a8b0: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 52  skSet, pExpr->iR
a8c0: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a  ightJoinTable);.
a8d0: 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d      prereqAll |=
a8e0: 20 78 3b 0a 20 20 20 20 65 78 74 72 61 52 69 67   x;.    extraRig
a8f0: 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e  ht = x-1;  /* ON
a900: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61   clause terms ma
a910: 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69  y not be used wi
a920: 74 68 20 61 6e 20 69 6e 64 65 78 0a 20 20 20 20  th an index.    
a930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a940: 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 74 61     ** on left ta
a950: 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  ble of a LEFT JO
a960: 49 4e 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31  IN.  Ticket #301
a970: 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 65 72 6d  5 */.  }.  pTerm
a980: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72  ->prereqAll = pr
a990: 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d  ereqAll;.  pTerm
a9a0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d  ->leftCursor = -
a9b0: 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72  1;.  pTerm->iPar
a9c0: 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72  ent = -1;.  pTer
a9d0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 30  m->eOperator = 0
a9e0: 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f  ;.  if( allowedO
a9f0: 70 28 6f 70 29 20 26 26 20 28 70 54 65 72 6d 2d  p(op) && (pTerm-
aa00: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70  >prereqRight & p
aa10: 72 65 72 65 71 4c 65 66 74 29 3d 3d 30 20 29 7b  rereqLeft)==0 ){
aa20: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74  .    Expr *pLeft
aa30: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
aa40: 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68  .    Expr *pRigh
aa50: 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68  t = pExpr->pRigh
aa60: 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74  t;.    if( pLeft
aa70: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
aa80: 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ){.      pTerm->
aa90: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65  leftCursor = pLe
aaa0: 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  ft->iTable;.    
aab0: 20 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43    pTerm->u.leftC
aac0: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
aad0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54  Column;.      pT
aae0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
aaf0: 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 6f 70   operatorMask(op
ab00: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
ab10: 20 70 52 69 67 68 74 20 26 26 20 70 52 69 67 68   pRight && pRigh
ab20: 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
ab30: 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54   ){.      WhereT
ab40: 65 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20  erm *pNew;.     
ab50: 20 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 20   Expr *pDup;.   
ab60: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
ab70: 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20  ftCursor>=0 ){. 
ab80: 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65         int idxNe
ab90: 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  w;.        pDup 
aba0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
abb0: 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  (db, pExpr, 0);.
abc0: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
abd0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
abe0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
abf0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
ac00: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20  pDup);.         
ac10: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
ac20: 20 7d 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65   }.        idxNe
ac30: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
ac40: 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75 70 2c  nsert(pWC, pDup,
ac50: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
ac60: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
ac70: 20 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 3d       if( idxNew=
ac80: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
ac90: 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57 43       pNew = &pWC
aca0: 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20  ->a[idxNew];.   
acb0: 20 20 20 20 20 70 4e 65 77 2d 3e 69 50 61 72 65       pNew->iPare
acc0: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
acd0: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
ace0: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
acf0: 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e          pTerm->n
ad00: 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Child = 1;.     
ad10: 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
ad20: 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44  s |= TERM_COPIED
ad30: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
ad40: 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 70 45         pDup = pE
ad50: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  xpr;.        pNe
ad60: 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  w = pTerm;.     
ad70: 20 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f 6d   }.      exprCom
ad80: 6d 75 74 65 28 70 50 61 72 73 65 2c 20 70 44 75  mute(pParse, pDu
ad90: 70 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74 20  p);.      pLeft 
ada0: 3d 20 70 44 75 70 2d 3e 70 4c 65 66 74 3b 0a 20  = pDup->pLeft;. 
adb0: 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43       pNew->leftC
adc0: 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69  ursor = pLeft->i
add0: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65  Table;.      pNe
ade0: 77 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20  w->u.leftColumn 
adf0: 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  = pLeft->iColumn
ae00: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
ae10: 28 20 28 70 72 65 72 65 71 4c 65 66 74 20 7c 20  ( (prereqLeft | 
ae20: 65 78 74 72 61 52 69 67 68 74 29 20 21 3d 20 70  extraRight) != p
ae30: 72 65 72 65 71 4c 65 66 74 20 29 3b 0a 20 20 20  rereqLeft );.   
ae40: 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 52     pNew->prereqR
ae50: 69 67 68 74 20 3d 20 70 72 65 72 65 71 4c 65 66  ight = prereqLef
ae60: 74 20 7c 20 65 78 74 72 61 52 69 67 68 74 3b 0a  t | extraRight;.
ae70: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
ae80: 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c  eqAll = prereqAl
ae90: 6c 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65  l;.      pNew->e
aea0: 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61  Operator = opera
aeb0: 74 6f 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70  torMask(pDup->op
aec0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  );.    }.  }..#i
aed0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
aee0: 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49  T_BETWEEN_OPTIMI
aef0: 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20 61  ZATION.  /* If a
af00: 20 74 65 72 6d 20 69 73 20 74 68 65 20 42 45 54   term is the BET
af10: 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20 63  WEEN operator, c
af20: 72 65 61 74 65 20 74 77 6f 20 6e 65 77 20 76 69  reate two new vi
af30: 72 74 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a 2a  rtual terms.  **
af40: 20 74 68 61 74 20 64 65 66 69 6e 65 20 74 68 65   that define the
af50: 20 72 61 6e 67 65 20 74 68 61 74 20 74 68 65 20   range that the 
af60: 42 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65 6e  BETWEEN implemen
af70: 74 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  ts.  For example
af80: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
af90: 20 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44   a BETWEEN b AND
afa0: 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20   c.  **.  ** is 
afb0: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 3a 0a  converted into:.
afc0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 28    **.  **      (
afd0: 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20  a BETWEEN b AND 
afe0: 63 29 20 41 4e 44 20 28 61 3e 3d 62 29 20 41 4e  c) AND (a>=b) AN
aff0: 44 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a 20 20  D (a<=c).  **.  
b000: 2a 2a 20 54 68 65 20 74 77 6f 20 6e 65 77 20 74  ** The two new t
b010: 65 72 6d 73 20 61 72 65 20 61 64 64 65 64 20 6f  erms are added o
b020: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
b030: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f  he WhereClause o
b040: 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20  bject..  ** The 
b050: 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20 22 64  new terms are "d
b060: 79 6e 61 6d 69 63 22 20 61 6e 64 20 61 72 65 20  ynamic" and are 
b070: 63 68 69 6c 64 72 65 6e 20 6f 66 20 74 68 65 20  children of the 
b080: 6f 72 69 67 69 6e 61 6c 20 42 45 54 57 45 45 4e  original BETWEEN
b090: 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54 68 61  .  ** term.  Tha
b0a0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20  t means that if 
b0b0: 74 68 65 20 42 45 54 57 45 45 4e 20 74 65 72 6d  the BETWEEN term
b0c0: 20 69 73 20 63 6f 64 65 64 2c 20 74 68 65 20 63   is coded, the c
b0d0: 68 69 6c 64 72 65 6e 20 61 72 65 0a 20 20 2a 2a  hildren are.  **
b0e0: 20 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c 20 69   skipped.  Or, i
b0f0: 66 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61  f the children a
b100: 72 65 20 73 61 74 69 73 66 69 65 64 20 62 79 20  re satisfied by 
b110: 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f 72  an index, the or
b120: 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45 54 57  iginal.  ** BETW
b130: 45 45 4e 20 74 65 72 6d 20 69 73 20 73 6b 69 70  EEN term is skip
b140: 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  ped..  */.  else
b150: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
b160: 54 4b 5f 42 45 54 57 45 45 4e 20 26 26 20 70 57  TK_BETWEEN && pW
b170: 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b  C->op==TK_AND ){
b180: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
b190: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
b1a0: 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69  pList;.    int i
b1b0: 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
b1c0: 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b 54  st u8 ops[] = {T
b1d0: 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20  K_GE, TK_LE};.  
b1e0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
b1f0: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
b200: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  ( pList->nExpr==
b210: 32 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  2 );.    for(i=0
b220: 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<2; i++){.   
b230: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
b240: 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78  r;.      int idx
b250: 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 45  New;.      pNewE
b260: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
b270: 70 72 28 70 50 61 72 73 65 2c 20 6f 70 73 5b 69  pr(pParse, ops[i
b280: 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ], .            
b290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2a0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
b2b0: 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  db, pExpr->pLeft
b2c0: 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  , 0),.          
b2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2e0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
b2f0: 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  p(db, pList->a[i
b300: 5d 2e 70 45 78 70 72 2c 20 30 29 2c 20 30 29 3b  ].pExpr, 0), 0);
b310: 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20  .      idxNew = 
b320: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
b330: 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c  t(pWC, pNewExpr,
b340: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
b350: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
b360: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78     testcase( idx
b370: 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  New==0 );.      
b380: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
b390: 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a  , pWC, idxNew);.
b3a0: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
b3b0: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
b3c0: 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78        pWC->a[idx
b3d0: 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69  New].iParent = i
b3e0: 64 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20  dxTerm;.    }.  
b3f0: 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
b400: 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  = 2;.  }.#endif 
b410: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  /* SQLITE_OMIT_B
b420: 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54  ETWEEN_OPTIMIZAT
b430: 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66  ION */..#if !def
b440: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
b450: 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
b460: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
b470: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
b480: 52 59 29 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65  RY).  /* Analyze
b490: 20 61 20 74 65 72 6d 20 74 68 61 74 20 69 73 20   a term that is 
b4a0: 63 6f 6d 70 6f 73 65 64 20 6f 66 20 74 77 6f 20  composed of two 
b4b0: 6f 72 20 6d 6f 72 65 20 73 75 62 74 65 72 6d 73  or more subterms
b4c0: 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20   connected by.  
b4d0: 2a 2a 20 61 6e 20 4f 52 20 6f 70 65 72 61 74 6f  ** an OR operato
b4e0: 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69  r..  */.  else i
b4f0: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
b500: 5f 4f 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OR ){.    asser
b510: 74 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41  t( pWC->op==TK_A
b520: 4e 44 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e  ND );.    exprAn
b530: 61 6c 79 7a 65 4f 72 54 65 72 6d 28 70 53 72 63  alyzeOrTerm(pSrc
b540: 2c 20 70 57 43 2c 20 69 64 78 54 65 72 6d 29 3b  , pWC, idxTerm);
b550: 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57  .    pTerm = &pW
b560: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
b570: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
b580: 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49  ITE_OMIT_OR_OPTI
b590: 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66  MIZATION */..#if
b5a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b5b0: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
b5c0: 4f 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e 73  ON.  /* Add cons
b5d0: 74 72 61 69 6e 74 73 20 74 6f 20 72 65 64 75 63  traints to reduc
b5e0: 65 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  e the search spa
b5f0: 63 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72 20  ce on a LIKE or 
b600: 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61 74  GLOB.  ** operat
b610: 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  or..  **.  ** A 
b620: 6c 69 6b 65 20 70 61 74 74 65 72 6e 20 6f 66 20  like pattern of 
b630: 74 68 65 20 66 6f 72 6d 20 22 78 20 4c 49 4b 45  the form "x LIKE
b640: 20 27 61 62 63 25 27 22 20 69 73 20 63 68 61 6e   'abc%'" is chan
b650: 67 65 64 20 69 6e 74 6f 20 63 6f 6e 73 74 72 61  ged into constra
b660: 69 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ints.  **.  **  
b670: 20 20 20 20 20 20 20 20 78 3e 3d 27 61 62 63 27          x>='abc'
b680: 20 41 4e 44 20 78 3c 27 61 62 64 27 20 41 4e 44   AND x<'abd' AND
b690: 20 78 20 4c 49 4b 45 20 27 61 62 63 25 27 0a 20   x LIKE 'abc%'. 
b6a0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 61 73   **.  ** The las
b6b0: 74 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74  t character of t
b6c0: 68 65 20 70 72 65 66 69 78 20 22 61 62 63 22 20  he prefix "abc" 
b6d0: 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 74  is incremented t
b6e0: 6f 20 66 6f 72 6d 20 74 68 65 0a 20 20 2a 2a 20  o form the.  ** 
b6f0: 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64  termination cond
b700: 69 74 69 6f 6e 20 22 61 62 64 22 2e 0a 20 20 2a  ition "abd"..  *
b710: 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e 6f 70 3d  /.  if( pWC->op=
b720: 3d 54 4b 5f 41 4e 44 20 0a 20 20 20 26 26 20 69  =TK_AND .   && i
b730: 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 50 61 72  sLikeOrGlob(pPar
b740: 73 65 2c 20 70 45 78 70 72 2c 20 26 70 53 74 72  se, pExpr, &pStr
b750: 31 2c 20 26 69 73 43 6f 6d 70 6c 65 74 65 2c 20  1, &isComplete, 
b760: 26 6e 6f 43 61 73 65 29 0a 20 20 29 7b 0a 20 20  &noCase).  ){.  
b770: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20 20    Expr *pLeft;  
b780: 20 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66 20 4c       /* LHS of L
b790: 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f  IKE/GLOB operato
b7a0: 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70  r */.    Expr *p
b7b0: 53 74 72 32 3b 20 20 20 20 20 20 20 2f 2a 20 43  Str2;       /* C
b7c0: 6f 70 79 20 6f 66 20 70 53 74 72 31 20 2d 20 52  opy of pStr1 - R
b7d0: 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20  HS of LIKE/GLOB 
b7e0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
b7f0: 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 31 3b  Expr *pNewExpr1;
b800: 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45  .    Expr *pNewE
b810: 78 70 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 64  xpr2;.    int id
b820: 78 4e 65 77 31 3b 0a 20 20 20 20 69 6e 74 20 69  xNew1;.    int i
b830: 64 78 4e 65 77 32 3b 0a 20 20 20 20 43 6f 6c 6c  dxNew2;.    Coll
b840: 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f  Seq *pColl;    /
b850: 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
b860: 65 6e 63 65 20 74 6f 20 75 73 65 20 2a 2f 0a 0a  ence to use */..
b870: 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70      pLeft = pExp
b880: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d  r->x.pList->a[1]
b890: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72  .pExpr;.    pStr
b8a0: 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  2 = sqlite3ExprD
b8b0: 75 70 28 64 62 2c 20 70 53 74 72 31 2c 20 30 29  up(db, pStr1, 0)
b8c0: 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d  ;.    if( !db->m
b8d0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
b8e0: 20 20 20 20 20 75 38 20 63 2c 20 2a 70 43 3b 20       u8 c, *pC; 
b8f0: 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 63 68        /* Last ch
b900: 61 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74  aracter before t
b910: 68 65 20 66 69 72 73 74 20 77 69 6c 64 63 61 72  he first wildcar
b920: 64 20 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d 20  d */.      pC = 
b930: 28 75 38 2a 29 26 70 53 74 72 32 2d 3e 75 2e 7a  (u8*)&pStr2->u.z
b940: 54 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53 74 72  Token[sqlite3Str
b950: 6c 65 6e 33 30 28 70 53 74 72 32 2d 3e 75 2e 7a  len30(pStr2->u.z
b960: 54 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20 20 20  Token)-1];.     
b970: 20 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20 20   c = *pC;.      
b980: 69 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20  if( noCase ){.  
b990: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69        /* The poi
b9a0: 6e 74 20 69 73 20 74 6f 20 69 6e 63 72 65 6d 65  nt is to increme
b9b0: 6e 74 20 74 68 65 20 6c 61 73 74 20 63 68 61 72  nt the last char
b9c0: 61 63 74 65 72 20 62 65 66 6f 72 65 20 74 68 65  acter before the
b9d0: 20 66 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a   first.        *
b9e0: 2a 20 77 69 6c 64 63 61 72 64 2e 20 20 42 75 74  * wildcard.  But
b9f0: 20 69 66 20 77 65 20 69 6e 63 72 65 6d 65 6e 74   if we increment
ba00: 20 27 40 27 2c 20 74 68 61 74 20 77 69 6c 6c 20   '@', that will 
ba10: 70 75 73 68 20 69 74 20 69 6e 74 6f 20 74 68 65  push it into the
ba20: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 70 68  .        ** alph
ba30: 61 62 65 74 69 63 20 72 61 6e 67 65 20 77 68 65  abetic range whe
ba40: 72 65 20 63 61 73 65 20 63 6f 6e 76 65 72 73 69  re case conversi
ba50: 6f 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20 75 70  ons will mess up
ba60: 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
ba70: 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 54 6f   inequality.  To
ba80: 20 61 76 6f 69 64 20 74 68 69 73 2c 20 6d 61 6b   avoid this, mak
ba90: 65 20 73 75 72 65 20 74 6f 20 61 6c 73 6f 20 72  e sure to also r
baa0: 75 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20 20 20  un the full.    
bab0: 20 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20 61      ** LIKE on a
bac0: 6c 6c 20 63 61 6e 64 69 64 61 74 65 20 65 78 70  ll candidate exp
bad0: 72 65 73 73 69 6f 6e 73 20 62 79 20 63 6c 65 61  ressions by clea
bae0: 72 69 6e 67 20 74 68 65 20 69 73 43 6f 6d 70 6c  ring the isCompl
baf0: 65 74 65 20 66 6c 61 67 0a 20 20 20 20 20 20 20  ete flag.       
bb00: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
bb10: 63 3d 3d 27 41 27 2d 31 20 29 20 69 73 43 6f 6d  c=='A'-1 ) isCom
bb20: 70 6c 65 74 65 20 3d 20 30 3b 20 20 20 2f 2a 20  plete = 0;   /* 
bb30: 45 56 3a 20 52 2d 36 34 33 33 39 2d 30 38 32 30  EV: R-64339-0820
bb40: 37 20 2a 2f 0a 0a 0a 20 20 20 20 20 20 20 20 63  7 */...        c
bb50: 20 3d 20 73 71 6c 69 74 65 33 55 70 70 65 72 54   = sqlite3UpperT
bb60: 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20 20 20 20  oLower[c];.     
bb70: 20 7d 0a 20 20 20 20 20 20 2a 70 43 20 3d 20 63   }.      *pC = c
bb80: 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   + 1;.    }.    
bb90: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
bba0: 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53  indCollSeq(db, S
bbb0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 6e 6f 43 61  QLITE_UTF8, noCa
bbc0: 73 65 20 3f 20 22 4e 4f 43 41 53 45 22 20 3a 20  se ? "NOCASE" : 
bbd0: 22 42 49 4e 41 52 59 22 2c 30 29 3b 0a 20 20 20  "BINARY",0);.   
bbe0: 20 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c   pNewExpr1 = sql
bbf0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
bc00: 2c 20 54 4b 5f 47 45 2c 20 0a 20 20 20 20 20 20  , TK_GE, .      
bc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
bc20: 71 6c 69 74 65 33 45 78 70 72 53 65 74 43 6f 6c  qlite3ExprSetCol
bc30: 6c 28 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  l(sqlite3ExprDup
bc40: 28 64 62 2c 70 4c 65 66 74 2c 30 29 2c 20 70 43  (db,pLeft,0), pC
bc50: 6f 6c 6c 29 2c 0a 20 20 20 20 20 20 20 20 20 20  oll),.          
bc60: 20 20 20 20 20 20 20 20 20 20 20 70 53 74 72 31             pStr1
bc70: 2c 20 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77  , 0);.    idxNew
bc80: 31 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  1 = whereClauseI
bc90: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45  nsert(pWC, pNewE
bca0: 78 70 72 31 2c 20 54 45 52 4d 5f 56 49 52 54 55  xpr1, TERM_VIRTU
bcb0: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29  AL|TERM_DYNAMIC)
bcc0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
bcd0: 69 64 78 4e 65 77 31 3d 3d 30 20 29 3b 0a 20 20  idxNew1==0 );.  
bce0: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
bcf0: 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 31  rc, pWC, idxNew1
bd00: 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32  );.    pNewExpr2
bd10: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
bd20: 70 50 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 0a 20  pParse, TK_LT,. 
bd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd40: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53      sqlite3ExprS
bd50: 65 74 43 6f 6c 6c 28 73 71 6c 69 74 65 33 45 78  etColl(sqlite3Ex
bd60: 70 72 44 75 70 28 64 62 2c 70 4c 65 66 74 2c 30  prDup(db,pLeft,0
bd70: 29 2c 20 70 43 6f 6c 6c 29 2c 0a 20 20 20 20 20  ), pColl),.     
bd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd90: 70 53 74 72 32 2c 20 30 29 3b 0a 20 20 20 20 69  pStr2, 0);.    i
bda0: 64 78 4e 65 77 32 20 3d 20 77 68 65 72 65 43 6c  dxNew2 = whereCl
bdb0: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
bdc0: 70 4e 65 77 45 78 70 72 32 2c 20 54 45 52 4d 5f  pNewExpr2, TERM_
bdd0: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
bde0: 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73 74 63  AMIC);.    testc
bdf0: 61 73 65 28 20 69 64 78 4e 65 77 32 3d 3d 30 20  ase( idxNew2==0 
be00: 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79  );.    exprAnaly
be10: 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  ze(pSrc, pWC, id
be20: 78 4e 65 77 32 29 3b 0a 20 20 20 20 70 54 65 72  xNew2);.    pTer
be30: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
be40: 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20 69 73  erm];.    if( is
be50: 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20  Complete ){.    
be60: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31    pWC->a[idxNew1
be70: 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ].iParent = idxT
be80: 65 72 6d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e  erm;.      pWC->
be90: 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61 72 65  a[idxNew2].iPare
bea0: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
beb0: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
bec0: 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 2;.    }.  }
bed0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
bee0: 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49  E_OMIT_LIKE_OPTI
bef0: 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66  MIZATION */..#if
bf00: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
bf10: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
bf20: 2f 2a 20 41 64 64 20 61 20 57 4f 5f 4d 41 54 43  /* Add a WO_MATC
bf30: 48 20 61 75 78 69 6c 69 61 72 79 20 74 65 72 6d  H auxiliary term
bf40: 20 74 6f 20 74 68 65 20 63 6f 6e 73 74 72 61 69   to the constrai
bf50: 6e 74 20 73 65 74 20 69 66 20 74 68 65 0a 20 20  nt set if the.  
bf60: 2a 2a 20 63 75 72 72 65 6e 74 20 65 78 70 72 65  ** current expre
bf70: 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ssion is of the 
bf80: 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41  form:  column MA
bf90: 54 43 48 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54  TCH expr..  ** T
bfa0: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
bfb0: 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 78  is used by the x
bfc0: 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64  BestIndex method
bfd0: 73 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74 75 61  s of.  ** virtua
bfe0: 6c 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20 6e  l tables.  The n
bff0: 61 74 69 76 65 20 71 75 65 72 79 20 6f 70 74 69  ative query opti
c000: 6d 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20 61  mizer does not a
c010: 74 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64  ttempt.  ** to d
c020: 6f 20 61 6e 79 74 68 69 6e 67 20 77 69 74 68 20  o anything with 
c030: 4d 41 54 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e  MATCH functions.
c040: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61  .  */.  if( isMa
c050: 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70  tchOfColumn(pExp
c060: 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64  r) ){.    int id
c070: 78 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 20 2a  xNew;.    Expr *
c080: 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a  pRight, *pLeft;.
c090: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
c0a0: 4e 65 77 54 65 72 6d 3b 0a 20 20 20 20 42 69 74  NewTerm;.    Bit
c0b0: 6d 61 73 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d  mask prereqColum
c0c0: 6e 2c 20 70 72 65 72 65 71 45 78 70 72 3b 0a 0a  n, prereqExpr;..
c0d0: 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78      pRight = pEx
c0e0: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30  pr->x.pList->a[0
c0f0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 4c 65  ].pExpr;.    pLe
c100: 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ft = pExpr->x.pL
c110: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
c120: 0a 20 20 20 20 70 72 65 72 65 71 45 78 70 72 20  .    prereqExpr 
c130: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
c140: 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 69 67 68  (pMaskSet, pRigh
c150: 74 29 3b 0a 20 20 20 20 70 72 65 72 65 71 43 6f  t);.    prereqCo
c160: 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61 62 6c 65  lumn = exprTable
c170: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
c180: 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20  pLeft);.    if( 
c190: 28 70 72 65 72 65 71 45 78 70 72 20 26 20 70 72  (prereqExpr & pr
c1a0: 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29  ereqColumn)==0 )
c1b0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  {.      Expr *pN
c1c0: 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e  ewExpr;.      pN
c1d0: 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ewExpr = sqlite3
c1e0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
c1f0: 5f 4d 41 54 43 48 2c 20 0a 20 20 20 20 20 20 20  _MATCH, .       
c200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c210: 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74 65         0, sqlite
c220: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 52 69  3ExprDup(db, pRi
c230: 67 68 74 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20  ght, 0), 0);.   
c240: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
c250: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
c260: 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52  C, pNewExpr, TER
c270: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
c280: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74  YNAMIC);.      t
c290: 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d  estcase( idxNew=
c2a0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  =0 );.      pNew
c2b0: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
c2c0: 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e  dxNew];.      pN
c2d0: 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  ewTerm->prereqRi
c2e0: 67 68 74 20 3d 20 70 72 65 72 65 71 45 78 70 72  ght = prereqExpr
c2f0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
c300: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70  ->leftCursor = p
c310: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Left->iTable;.  
c320: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e      pNewTerm->u.
c330: 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65  leftColumn = pLe
c340: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ft->iColumn;.   
c350: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70     pNewTerm->eOp
c360: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d 41 54 43  erator = WO_MATC
c370: 48 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  H;.      pNewTer
c380: 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  m->iParent = idx
c390: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72  Term;.      pTer
c3a0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
c3b0: 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65 72  erm];.      pTer
c3c0: 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20  m->nChild = 1;. 
c3d0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
c3e0: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49  ags |= TERM_COPI
c3f0: 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  ED;.      pNewTe
c400: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20  rm->prereqAll = 
c410: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
c420: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
c430: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
c440: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
c450: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
c460: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a 20 20  _ENABLE_STAT2.  
c470: 2f 2a 20 57 68 65 6e 20 73 71 6c 69 74 65 5f 73  /* When sqlite_s
c480: 74 61 74 32 20 68 69 73 74 6f 67 72 61 6d 20 64  tat2 histogram d
c490: 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ata is available
c4a0: 20 61 6e 20 6f 70 65 72 61 74 6f 72 20 6f 66 20   an operator of 
c4b0: 74 68 65 0a 20 20 2a 2a 20 66 6f 72 6d 20 22 78  the.  ** form "x
c4c0: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 63 61   IS NOT NULL" ca
c4d0: 6e 20 73 6f 6d 65 74 69 6d 65 73 20 62 65 20 65  n sometimes be e
c4e0: 76 61 6c 75 61 74 65 64 20 6d 6f 72 65 20 65 66  valuated more ef
c4f0: 66 69 63 69 65 6e 74 6c 79 0a 20 20 2a 2a 20 61  ficiently.  ** a
c500: 73 20 22 78 3e 4e 55 4c 4c 22 20 69 66 20 78 20  s "x>NULL" if x 
c510: 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45  is not an INTEGE
c520: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20  R PRIMARY KEY.  
c530: 53 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 0a 20  So construct a. 
c540: 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 65 72 6d   ** virtual term
c550: 20 6f 66 20 74 68 61 74 20 66 6f 72 6d 2e 0a 20   of that form.. 
c560: 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68   **.  ** Note th
c570: 61 74 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  at the virtual t
c580: 65 72 6d 20 6d 75 73 74 20 62 65 20 74 61 67 67  erm must be tagg
c590: 65 64 20 77 69 74 68 20 54 45 52 4d 5f 56 4e 55  ed with TERM_VNU
c5a0: 4c 4c 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 54  LL.  This.  ** T
c5b0: 45 52 4d 5f 56 4e 55 4c 4c 20 74 61 67 20 77 69  ERM_VNULL tag wi
c5c0: 6c 6c 20 73 75 70 70 72 65 73 73 20 74 68 65 20  ll suppress the 
c5d0: 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61  not-null check a
c5e0: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a  t the beginning.
c5f0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 70    ** of the loop
c600: 2e 20 20 57 69 74 68 6f 75 74 20 74 68 65 20 54  .  Without the T
c610: 45 52 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c 20  ERM_VNULL flag, 
c620: 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65  the not-null che
c630: 63 6b 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 73  ck at.  ** the s
c640: 74 61 72 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70  tart of the loop
c650: 20 77 69 6c 6c 20 70 72 65 76 65 6e 74 20 61 6e   will prevent an
c660: 79 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 62  y results from b
c670: 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0a 20  eing returned.. 
c680: 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d   */.  if( pExpr-
c690: 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20  >op==TK_NOTNULL 
c6a0: 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  && pExpr->pLeft-
c6b0: 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20  >iColumn>=0 ){. 
c6c0: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
c6d0: 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65  r;.    Expr *pLe
c6e0: 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
c6f0: 74 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65  t;.    int idxNe
c700: 77 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  w;.    WhereTerm
c710: 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 0a 20 20 20   *pNewTerm;..   
c720: 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69   pNewExpr = sqli
c730: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
c740: 20 54 4b 5f 47 54 2c 0a 20 20 20 20 20 20 20 20   TK_GT,.        
c750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c760: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
c770: 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29  up(db, pLeft, 0)
c780: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
c7a0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
c7b0: 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30  e, TK_NULL, 0, 0
c7c0: 2c 20 30 29 2c 20 30 29 3b 0a 0a 20 20 20 20 69  , 0), 0);..    i
c7d0: 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61  dxNew = whereCla
c7e0: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
c7f0: 4e 65 77 45 78 70 72 2c 0a 20 20 20 20 20 20 20  NewExpr,.       
c800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c810: 20 20 20 20 20 20 20 54 45 52 4d 5f 56 49 52 54         TERM_VIRT
c820: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
c830: 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20 20  |TERM_VNULL);.  
c840: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
c850: 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4e 65  ew==0 );.    pNe
c860: 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  wTerm = &pWC->a[
c870: 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 70 4e 65  idxNew];.    pNe
c880: 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  wTerm->leftCurso
c890: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
c8a0: 65 3b 0a 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  e;.    pNewTerm-
c8b0: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20  >u.leftColumn = 
c8c0: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pLeft->iColumn;.
c8d0: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f      pNewTerm->eO
c8e0: 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 47 54 3b  perator = WO_GT;
c8f0: 0a 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69  .    pNewTerm->i
c900: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
c910: 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70  ;.    pTerm = &p
c920: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
c930: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
c940: 64 20 3d 20 31 3b 0a 20 20 20 20 70 54 65 72 6d  d = 1;.    pTerm
c950: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
c960: 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 70 4e  M_COPIED;.    pN
c970: 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  ewTerm->prereqAl
c980: 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  l = pTerm->prere
c990: 71 41 6c 6c 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  qAll;.  }.#endif
c9a0: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
c9b0: 45 5f 53 54 41 54 32 20 2a 2f 0a 0a 20 20 2f 2a  E_STAT2 */..  /*
c9c0: 20 50 72 65 76 65 6e 74 20 4f 4e 20 63 6c 61 75   Prevent ON clau
c9d0: 73 65 20 74 65 72 6d 73 20 6f 66 20 61 20 4c 45  se terms of a LE
c9e0: 46 54 20 4a 4f 49 4e 20 66 72 6f 6d 20 62 65 69  FT JOIN from bei
c9f0: 6e 67 20 75 73 65 64 20 74 6f 20 64 72 69 76 65  ng used to drive
ca00: 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 66  .  ** an index f
ca10: 6f 72 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  or tables to the
ca20: 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69   left of the joi
ca30: 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 2d  n..  */.  pTerm-
ca40: 3e 70 72 65 72 65 71 52 69 67 68 74 20 7c 3d 20  >prereqRight |= 
ca50: 65 78 74 72 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f  extraRight;.}../
ca60: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
ca70: 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65   if any of the e
ca80: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 70 4c  xpressions in pL
ca90: 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 2e 2e 2e  ist->a[iFirst...
caa0: 5d 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 20 72  ] contain.** a r
cab0: 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20  eference to any 
cac0: 74 61 62 6c 65 20 6f 74 68 65 72 20 74 68 61 6e  table other than
cad0: 20 74 68 65 20 69 42 61 73 65 20 74 61 62 6c 65   the iBase table
cae0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
caf0: 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54  referencesOtherT
cb00: 61 62 6c 65 73 28 0a 20 20 45 78 70 72 4c 69 73  ables(.  ExprLis
cb10: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
cb20: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 65 78 70     /* Search exp
cb30: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 73 20  ressions in ths 
cb40: 6c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d  list */.  WhereM
cb50: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
cb60: 2c 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66  ,   /* Mapping f
cb70: 72 6f 6d 20 74 61 62 6c 65 73 20 74 6f 20 62 69  rom tables to bi
cb80: 74 6d 61 70 73 20 2a 2f 0a 20 20 69 6e 74 20 69  tmaps */.  int i
cb90: 46 69 72 73 74 2c 20 20 20 20 20 20 20 20 20 20  First,          
cba0: 20 20 20 20 20 2f 2a 20 42 65 20 73 65 61 72 63       /* Be searc
cbb0: 68 69 6e 67 20 77 69 74 68 20 74 68 65 20 69 46  hing with the iF
cbc0: 69 72 73 74 2d 74 68 20 65 78 70 72 65 73 73 69  irst-th expressi
cbd0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73  on */.  int iBas
cbe0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
cbf0: 20 20 2f 2a 20 49 67 6e 6f 72 65 20 72 65 66 65    /* Ignore refe
cc00: 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74  rences to this t
cc10: 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 42 69 74  able */.){.  Bit
cc20: 6d 61 73 6b 20 61 6c 6c 6f 77 65 64 20 3d 20 7e  mask allowed = ~
cc30: 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
cc40: 2c 20 69 42 61 73 65 29 3b 0a 20 20 77 68 69 6c  , iBase);.  whil
cc50: 65 28 20 69 46 69 72 73 74 3c 70 4c 69 73 74 2d  e( iFirst<pList-
cc60: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 69 66  >nExpr ){.    if
cc70: 28 20 28 65 78 70 72 54 61 62 6c 65 55 73 61 67  ( (exprTableUsag
cc80: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73  e(pMaskSet, pLis
cc90: 74 2d 3e 61 5b 69 46 69 72 73 74 2b 2b 5d 2e 70  t->a[iFirst++].p
cca0: 45 78 70 72 29 26 61 6c 6c 6f 77 65 64 29 21 3d  Expr)&allowed)!=
ccb0: 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
ccc0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
ccd0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f   return 0;.}.../
cce0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
ccf0: 65 20 64 65 63 69 64 65 73 20 69 66 20 70 49 64  e decides if pId
cd00: 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  x can be used to
cd10: 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44   satisfy the ORD
cd20: 45 52 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65 2e  ER BY.** clause.
cd30: 20 20 49 66 20 69 74 20 63 61 6e 2c 20 69 74 20    If it can, it 
cd40: 72 65 74 75 72 6e 73 20 31 2e 20 20 49 66 20 70  returns 1.  If p
cd50: 49 64 78 20 63 61 6e 6e 6f 74 20 73 61 74 69 73  Idx cannot satis
cd60: 66 79 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20  fy the.** ORDER 
cd70: 42 59 20 63 6c 61 75 73 65 2c 20 74 68 69 73 20  BY clause, this 
cd80: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
cd90: 30 2e 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42  0..**.** pOrderB
cda0: 79 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  y is an ORDER BY
cdb0: 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 61 20 53   clause from a S
cdc0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
cdd0: 20 20 70 54 61 62 20 69 73 20 74 68 65 0a 2a 2a    pTab is the.**
cde0: 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65   left-most table
cdf0: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
ce00: 75 73 65 20 6f 66 20 74 68 61 74 20 73 61 6d 65  use of that same
ce10: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
ce20: 74 20 61 6e 64 0a 2a 2a 20 74 68 65 20 74 61 62  t and.** the tab
ce30: 6c 65 20 68 61 73 20 61 20 63 75 72 73 6f 72 20  le has a cursor 
ce40: 6e 75 6d 62 65 72 20 6f 66 20 22 62 61 73 65 22  number of "base"
ce50: 2e 20 20 70 49 64 78 20 69 73 20 61 6e 20 69 6e  .  pIdx is an in
ce60: 64 65 78 20 6f 6e 20 70 54 61 62 2e 0a 2a 2a 0a  dex on pTab..**.
ce70: 2a 2a 20 6e 45 71 43 6f 6c 20 69 73 20 74 68 65  ** nEqCol is the
ce80: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
ce90: 6e 73 20 6f 66 20 70 49 64 78 20 74 68 61 74 20  ns of pIdx that 
cea0: 61 72 65 20 75 73 65 64 20 61 73 20 65 71 75 61  are used as equa
ceb0: 6c 69 74 79 0a 2a 2a 20 63 6f 6e 73 74 72 61 69  lity.** constrai
cec0: 6e 74 73 2e 20 20 41 6e 79 20 6f 66 20 74 68 65  nts.  Any of the
ced0: 73 65 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62  se columns may b
cee0: 65 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 74  e missing from t
cef0: 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63  he ORDER BY.** c
cf00: 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 6d 61  lause and the ma
cf10: 74 63 68 20 63 61 6e 20 73 74 69 6c 6c 20 62 65  tch can still be
cf20: 20 61 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a   a success..**.*
cf30: 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  * All terms of t
cf40: 68 65 20 4f 52 44 45 52 20 42 59 20 74 68 61 74  he ORDER BY that
cf50: 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 74   match against t
cf60: 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62 65  he index must be
cf70: 20 65 69 74 68 65 72 0a 2a 2a 20 41 53 43 20 6f   either.** ASC o
cf80: 72 20 44 45 53 43 2e 20 20 28 54 65 72 6d 73 20  r DESC.  (Terms 
cf90: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
cfa0: 63 6c 61 75 73 65 20 70 61 73 74 20 74 68 65 20  clause past the 
cfb0: 65 6e 64 20 6f 66 20 61 20 55 4e 49 51 55 45 0a  end of a UNIQUE.
cfc0: 2a 2a 20 69 6e 64 65 78 20 64 6f 20 6e 6f 74 20  ** index do not 
cfd0: 6e 65 65 64 20 74 6f 20 73 61 74 69 73 66 79 20  need to satisfy 
cfe0: 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e  this constraint.
cff0: 29 20 20 54 68 65 20 2a 70 62 52 65 76 20 76 61  )  The *pbRev va
d000: 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  lue is.** set to
d010: 20 31 20 69 66 20 74 68 65 20 4f 52 44 45 52 20   1 if the ORDER 
d020: 42 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c 6c  BY clause is all
d030: 20 44 45 53 43 20 61 6e 64 20 69 74 20 69 73 20   DESC and it is 
d040: 73 65 74 20 74 6f 20 30 20 69 66 0a 2a 2a 20 74  set to 0 if.** t
d050: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
d060: 73 65 20 69 73 20 61 6c 6c 20 41 53 43 2e 0a 2a  se is all ASC..*
d070: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 53  /.static int isS
d080: 6f 72 74 69 6e 67 49 6e 64 65 78 28 0a 20 20 50  ortingIndex(.  P
d090: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
d0a0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
d0b0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
d0c0: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
d0d0: 73 6b 53 65 74 2c 20 2f 2a 20 4d 61 70 70 69 6e  skSet, /* Mappin
d0e0: 67 20 66 72 6f 6d 20 74 61 62 6c 65 20 63 75 72  g from table cur
d0f0: 73 6f 72 20 6e 75 6d 62 65 72 73 20 74 6f 20 62  sor numbers to b
d100: 69 74 6d 61 70 73 20 2a 2f 0a 20 20 49 6e 64 65  itmaps */.  Inde
d110: 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
d120: 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
d130: 20 77 65 20 61 72 65 20 74 65 73 74 69 6e 67 20   we are testing 
d140: 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65 2c 20 20  */.  int base,  
d150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d160: 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  Cursor number fo
d170: 72 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  r the table to b
d180: 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 45 78  e sorted */.  Ex
d190: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
d1a0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  ,     /* The ORD
d1b0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
d1c0: 20 20 69 6e 74 20 6e 45 71 43 6f 6c 2c 20 20 20    int nEqCol,   
d1d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
d1e0: 62 65 72 20 6f 66 20 69 6e 64 65 78 20 63 6f 6c  ber of index col
d1f0: 75 6d 6e 73 20 77 69 74 68 20 3d 3d 20 63 6f 6e  umns with == con
d200: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 69 6e  straints */.  in
d210: 74 20 2a 70 62 52 65 76 20 20 20 20 20 20 20 20  t *pbRev        
d220: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
d230: 31 20 69 66 20 4f 52 44 45 52 20 42 59 20 69 73  1 if ORDER BY is
d240: 20 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 69 6e   DESC */.){.  in
d250: 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
d260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d270: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
d280: 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
d290: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
d2a0: 20 20 20 20 2f 2a 20 58 4f 52 20 6f 66 20 69 6e      /* XOR of in
d2b0: 64 65 78 20 61 6e 64 20 4f 52 44 45 52 20 42 59  dex and ORDER BY
d2c0: 20 73 6f 72 74 20 64 69 72 65 63 74 69 6f 6e 20   sort direction 
d2d0: 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20  */.  int nTerm; 
d2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
d300: 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  f ORDER BY terms
d310: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70   */.  struct Exp
d320: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72  rList_item *pTer
d330: 6d 3b 20 20 20 20 2f 2a 20 41 20 74 65 72 6d 20  m;    /* A term 
d340: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
d350: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 71 6c 69  clause */.  sqli
d360: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
d370: 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  ->db;..  assert(
d380: 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a   pOrderBy!=0 );.
d390: 20 20 6e 54 65 72 6d 20 3d 20 70 4f 72 64 65 72    nTerm = pOrder
d3a0: 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73  By->nExpr;.  ass
d3b0: 65 72 74 28 20 6e 54 65 72 6d 3e 30 20 29 3b 0a  ert( nTerm>0 );.
d3c0: 0a 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 70  .  /* Argument p
d3d0: 49 64 78 20 6d 75 73 74 20 65 69 74 68 65 72 20  Idx must either 
d3e0: 70 6f 69 6e 74 20 74 6f 20 61 20 27 72 65 61 6c  point to a 'real
d3f0: 27 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 73 74  ' named index st
d400: 72 75 63 74 75 72 65 2c 20 0a 20 20 2a 2a 20 6f  ructure, .  ** o
d410: 72 20 61 6e 20 69 6e 64 65 78 20 73 74 72 75 63  r an index struc
d420: 74 75 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f  ture allocated o
d430: 6e 20 74 68 65 20 73 74 61 63 6b 20 62 79 20 62  n the stack by b
d440: 65 73 74 42 74 72 65 65 49 6e 64 65 78 28 29 20  estBtreeIndex() 
d450: 74 6f 0a 20 20 2a 2a 20 72 65 70 72 65 73 65 6e  to.  ** represen
d460: 74 20 74 68 65 20 72 6f 77 69 64 20 69 6e 64 65  t the rowid inde
d470: 78 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  x that is part o
d480: 66 20 65 76 65 72 79 20 74 61 62 6c 65 2e 20 20  f every table.  
d490: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  */.  assert( pId
d4a0: 78 2d 3e 7a 4e 61 6d 65 20 7c 7c 20 28 70 49 64  x->zName || (pId
d4b0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26  x->nColumn==1 &&
d4c0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
d4d0: 30 5d 3d 3d 2d 31 29 20 29 3b 0a 0a 20 20 2f 2a  0]==-1) );..  /*
d4e0: 20 4d 61 74 63 68 20 74 65 72 6d 73 20 6f 66 20   Match terms of 
d4f0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
d500: 75 73 65 20 61 67 61 69 6e 73 74 20 63 6f 6c 75  use against colu
d510: 6d 6e 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  mns of.  ** the 
d520: 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  index..  **.  **
d530: 20 4e 6f 74 65 20 74 68 61 74 20 69 6e 64 69 63   Note that indic
d540: 65 73 20 68 61 76 65 20 70 49 64 78 2d 3e 6e 43  es have pIdx->nC
d550: 6f 6c 75 6d 6e 20 72 65 67 75 6c 61 72 20 63 6f  olumn regular co
d560: 6c 75 6d 6e 73 20 70 6c 75 73 0a 20 20 2a 2a 20  lumns plus.  ** 
d570: 6f 6e 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63  one additional c
d580: 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 69 6e 67  olumn containing
d590: 20 74 68 65 20 72 6f 77 69 64 2e 20 20 54 68 65   the rowid.  The
d5a0: 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 0a 20 20   rowid column.  
d5b0: 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ** of the index 
d5c0: 69 73 20 61 6c 73 6f 20 61 6c 6c 6f 77 65 64 20  is also allowed 
d5d0: 74 6f 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74  to match against
d5e0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20   the ORDER BY.  
d5f0: 2a 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a  ** clause..  */.
d600: 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65    for(i=j=0, pTe
d610: 72 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20  rm=pOrderBy->a; 
d620: 6a 3c 6e 54 65 72 6d 20 26 26 20 69 3c 3d 70 49  j<nTerm && i<=pI
d630: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  dx->nColumn; i++
d640: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
d650: 70 72 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  pr;       /* The
d660: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74   expression of t
d670: 68 65 20 4f 52 44 45 52 20 42 59 20 70 54 65 72  he ORDER BY pTer
d680: 6d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71  m */.    CollSeq
d690: 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 54   *pColl;    /* T
d6a0: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
d6b0: 75 65 6e 63 65 20 6f 66 20 70 45 78 70 72 20 2a  uence of pExpr *
d6c0: 2f 0a 20 20 20 20 69 6e 74 20 74 65 72 6d 53 6f  /.    int termSo
d6d0: 72 74 4f 72 64 65 72 3b 20 2f 2a 20 53 6f 72 74  rtOrder; /* Sort
d6e0: 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73 20   order for this 
d6f0: 74 65 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  term */.    int 
d700: 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 2f  iColumn;       /
d710: 2a 20 54 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d  * The i-th colum
d720: 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  n of the index. 
d730: 20 2d 31 20 66 6f 72 20 72 6f 77 69 64 20 2a 2f   -1 for rowid */
d740: 0a 20 20 20 20 69 6e 74 20 69 53 6f 72 74 4f 72  .    int iSortOr
d750: 64 65 72 3b 20 20 20 20 2f 2a 20 31 20 66 6f 72  der;    /* 1 for
d760: 20 44 45 53 43 2c 20 30 20 66 6f 72 20 41 53 43   DESC, 0 for ASC
d770: 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 69 6e 64   on the i-th ind
d780: 65 78 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 63  ex term */.    c
d790: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
d7a0: 3b 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65  ; /* Name of the
d7b0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
d7c0: 6e 63 65 20 66 6f 72 20 69 2d 74 68 20 69 6e 64  nce for i-th ind
d7d0: 65 78 20 74 65 72 6d 20 2a 2f 0a 0a 20 20 20 20  ex term */..    
d7e0: 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
d7f0: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45  Expr;.    if( pE
d800: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
d810: 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61  MN || pExpr->iTa
d820: 62 6c 65 21 3d 62 61 73 65 20 29 7b 0a 20 20 20  ble!=base ){.   
d830: 20 20 20 2f 2a 20 43 61 6e 20 6e 6f 74 20 75 73     /* Can not us
d840: 65 20 61 6e 20 69 6e 64 65 78 20 73 6f 72 74 20  e an index sort 
d850: 6f 6e 20 61 6e 79 74 68 69 6e 67 20 74 68 61 74  on anything that
d860: 20 69 73 20 6e 6f 74 20 61 20 63 6f 6c 75 6d 6e   is not a column
d870: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   in the.      **
d880: 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65   left-most table
d890: 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
d8a0: 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  use */.      bre
d8b0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  ak;.    }.    pC
d8c0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
d8d0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
d8e0: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28   pExpr);.    if(
d8f0: 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
d900: 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
d910: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20  ltColl;.    }.  
d920: 20 20 69 66 28 20 70 49 64 78 2d 3e 7a 4e 61 6d    if( pIdx->zNam
d930: 65 20 26 26 20 69 3c 70 49 64 78 2d 3e 6e 43 6f  e && i<pIdx->nCo
d940: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69 43  lumn ){.      iC
d950: 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 61 69  olumn = pIdx->ai
d960: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
d970: 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49   if( iColumn==pI
d980: 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65  dx->pTable->iPKe
d990: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f  y ){.        iCo
d9a0: 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
d9b0: 20 7d 0a 20 20 20 20 20 20 69 53 6f 72 74 4f 72   }.      iSortOr
d9c0: 64 65 72 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72  der = pIdx->aSor
d9d0: 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 20  tOrder[i];.     
d9e0: 20 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61   zColl = pIdx->a
d9f0: 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 7d 65  zColl[i];.    }e
da00: 6c 73 65 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75  lse{.      iColu
da10: 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69  mn = -1;.      i
da20: 53 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a 20  SortOrder = 0;. 
da30: 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 43 6f       zColl = pCo
da40: 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 7d  ll->zName;.    }
da50: 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
da60: 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e  iColumn!=iColumn
da70: 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43   || sqlite3StrIC
da80: 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c  mp(pColl->zName,
da90: 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20   zColl) ){.     
daa0: 20 2f 2a 20 54 65 72 6d 20 6a 20 6f 66 20 74 68   /* Term j of th
dab0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
dac0: 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  e does not match
dad0: 20 63 6f 6c 75 6d 6e 20 69 20 6f 66 20 74 68 65   column i of the
dae0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
daf0: 69 66 28 20 69 3c 6e 45 71 43 6f 6c 20 29 7b 0a  if( i<nEqCol ){.
db00: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e          /* If an
db10: 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68   index column th
db20: 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65  at is constraine
db30: 64 20 62 79 20 3d 3d 20 66 61 69 6c 73 20 74 6f  d by == fails to
db40: 20 6d 61 74 63 68 20 61 6e 0a 20 20 20 20 20 20   match an.      
db50: 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 74 65    ** ORDER BY te
db60: 72 6d 2c 20 74 68 61 74 20 69 73 20 4f 4b 2e 20  rm, that is OK. 
db70: 20 4a 75 73 74 20 69 67 6e 6f 72 65 20 74 68 61   Just ignore tha
db80: 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
db90: 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 2a 2f  index.        */
dba0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
dbb0: 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  e;.      }else i
dbc0: 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c  f( i==pIdx->nCol
dbd0: 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  umn ){.        /
dbe0: 2a 20 49 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 69  * Index column i
dbf0: 20 69 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20   is the rowid.  
dc00: 41 6c 6c 20 6f 74 68 65 72 20 74 65 72 6d 73 20  All other terms 
dc10: 6d 61 74 63 68 2e 20 2a 2f 0a 20 20 20 20 20 20  match. */.      
dc20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
dc30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
dc40: 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c   If an index col
dc50: 75 6d 6e 20 66 61 69 6c 73 20 74 6f 20 6d 61 74  umn fails to mat
dc60: 63 68 20 61 6e 64 20 69 73 20 6e 6f 74 20 63 6f  ch and is not co
dc70: 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 0a  nstrained by ==.
dc80: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
dc90: 74 68 65 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74  the index cannot
dca0: 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44   satisfy the ORD
dcb0: 45 52 20 42 59 20 63 6f 6e 73 74 72 61 69 6e 74  ER BY constraint
dcc0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
dcd0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
dce0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
dcf0: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
dd00: 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 7c 7c 20  SortOrder!=0 || 
dd10: 69 43 6f 6c 75 6d 6e 3d 3d 2d 31 20 29 3b 0a 20  iColumn==-1 );. 
dd20: 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
dd30: 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c  ->sortOrder==0 |
dd40: 7c 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64  | pTerm->sortOrd
dd50: 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  er==1 );.    ass
dd60: 65 72 74 28 20 69 53 6f 72 74 4f 72 64 65 72 3d  ert( iSortOrder=
dd70: 3d 30 20 7c 7c 20 69 53 6f 72 74 4f 72 64 65 72  =0 || iSortOrder
dd80: 3d 3d 31 20 29 3b 0a 20 20 20 20 74 65 72 6d 53  ==1 );.    termS
dd90: 6f 72 74 4f 72 64 65 72 20 3d 20 69 53 6f 72 74  ortOrder = iSort
dda0: 4f 72 64 65 72 20 5e 20 70 54 65 72 6d 2d 3e 73  Order ^ pTerm->s
ddb0: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 69 66  ortOrder;.    if
ddc0: 28 20 69 3e 6e 45 71 43 6f 6c 20 29 7b 0a 20 20  ( i>nEqCol ){.  
ddd0: 20 20 20 20 69 66 28 20 74 65 72 6d 53 6f 72 74      if( termSort
dde0: 4f 72 64 65 72 21 3d 73 6f 72 74 4f 72 64 65 72  Order!=sortOrder
ddf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
de00: 6e 64 69 63 65 73 20 63 61 6e 20 6f 6e 6c 79 20  ndices can only 
de10: 62 65 20 75 73 65 64 20 69 66 20 61 6c 6c 20 4f  be used if all O
de20: 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 70 61  RDER BY terms pa
de30: 73 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  st the.        *
de40: 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  * equality const
de50: 72 61 69 6e 74 73 20 61 72 65 20 61 6c 6c 20 65  raints are all e
de60: 69 74 68 65 72 20 44 45 53 43 20 6f 72 20 41 53  ither DESC or AS
de70: 43 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  C. */.        re
de80: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
de90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
dea0: 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 74 65 72   sortOrder = ter
deb0: 6d 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  mSortOrder;.    
dec0: 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 70  }.    j++;.    p
ded0: 54 65 72 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Term++;.    if( 
dee0: 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 72 65  iColumn<0 && !re
def0: 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54 61 62  ferencesOtherTab
df00: 6c 65 73 28 70 4f 72 64 65 72 42 79 2c 20 70 4d  les(pOrderBy, pM
df10: 61 73 6b 53 65 74 2c 20 6a 2c 20 62 61 73 65 29  askSet, j, base)
df20: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
df30: 74 68 65 20 69 6e 64 65 78 65 64 20 63 6f 6c 75  the indexed colu
df40: 6d 6e 20 69 73 20 74 68 65 20 70 72 69 6d 61 72  mn is the primar
df50: 79 20 6b 65 79 20 61 6e 64 20 65 76 65 72 79 74  y key and everyt
df60: 68 69 6e 67 20 6d 61 74 63 68 65 73 0a 20 20 20  hing matches.   
df70: 20 20 20 2a 2a 20 73 6f 20 66 61 72 20 61 6e 64     ** so far and
df80: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44   none of the ORD
df90: 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 74  ER BY terms to t
dfa0: 68 65 20 72 69 67 68 74 20 72 65 66 65 72 65 6e  he right referen
dfb0: 63 65 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a  ce other.      *
dfc0: 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  * tables in the 
dfd0: 6a 6f 69 6e 2c 20 74 68 65 6e 20 77 65 20 61 72  join, then we ar
dfe0: 65 20 61 73 73 75 72 65 64 20 74 68 61 74 20 74  e assured that t
dff0: 68 65 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20  he index can be 
e000: 75 73 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 74  used .      ** t
e010: 6f 20 73 6f 72 74 20 62 65 63 61 75 73 65 20 74  o sort because t
e020: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  he primary key i
e030: 73 20 75 6e 69 71 75 65 20 61 6e 64 20 73 6f 20  s unique and so 
e040: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 6f 74 68 65  none of the othe
e050: 72 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  r.      ** colum
e060: 6e 73 20 77 69 6c 6c 20 6d 61 6b 65 20 61 6e 79  ns will make any
e070: 20 64 69 66 66 65 72 65 6e 63 65 0a 20 20 20 20   difference.    
e080: 20 20 2a 2f 0a 20 20 20 20 20 20 6a 20 3d 20 6e    */.      j = n
e090: 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Term;.    }.  }.
e0a0: 0a 20 20 2a 70 62 52 65 76 20 3d 20 73 6f 72 74  .  *pbRev = sort
e0b0: 4f 72 64 65 72 21 3d 30 3b 0a 20 20 69 66 28 20  Order!=0;.  if( 
e0c0: 6a 3e 3d 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20  j>=nTerm ){.    
e0d0: 2f 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20  /* All terms of 
e0e0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
e0f0: 75 73 65 20 61 72 65 20 63 6f 76 65 72 65 64 20  use are covered 
e100: 62 79 20 74 68 69 73 20 69 6e 64 65 78 20 73 6f  by this index so
e110: 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 6e 64  .    ** this ind
e120: 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 66  ex can be used f
e130: 6f 72 20 73 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20  or sorting. */. 
e140: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
e150: 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45  .  if( pIdx->onE
e160: 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26  rror!=OE_None &&
e170: 20 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   i==pIdx->nColum
e180: 6e 0a 20 20 20 20 20 20 26 26 20 21 72 65 66 65  n.      && !refe
e190: 72 65 6e 63 65 73 4f 74 68 65 72 54 61 62 6c 65  rencesOtherTable
e1a0: 73 28 70 4f 72 64 65 72 42 79 2c 20 70 4d 61 73  s(pOrderBy, pMas
e1b0: 6b 53 65 74 2c 20 6a 2c 20 62 61 73 65 29 20 29  kSet, j, base) )
e1c0: 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 74 65 72  {.    /* All ter
e1d0: 6d 73 20 6f 66 20 74 68 69 73 20 69 6e 64 65 78  ms of this index
e1e0: 20 6d 61 74 63 68 20 73 6f 6d 65 20 70 72 65 66   match some pref
e1f0: 69 78 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ix of the ORDER 
e200: 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a  BY clause.    **
e210: 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69   and the index i
e220: 73 20 55 4e 49 51 55 45 20 61 6e 64 20 6e 6f 20  s UNIQUE and no 
e230: 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 74 61 69  terms on the tai
e240: 6c 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  l of the ORDER B
e250: 59 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20  Y.    ** clause 
e260: 72 65 66 65 72 65 6e 63 65 20 6f 74 68 65 72 20  reference other 
e270: 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e  tables in a join
e280: 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 61 6c  .  If this is al
e290: 6c 20 74 72 75 65 20 74 68 65 6e 0a 20 20 20 20  l true then.    
e2a0: 2a 2a 20 74 68 65 20 6f 72 64 65 72 20 62 79 20  ** the order by 
e2b0: 63 6c 61 75 73 65 20 69 73 20 73 75 70 65 72 66  clause is superf
e2c0: 6c 75 6f 75 73 2e 20 2a 2f 0a 20 20 20 20 72 65  luous. */.    re
e2d0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
e2e0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
e2f0: 20 50 72 65 70 61 72 65 20 61 20 63 72 75 64 65   Prepare a crude
e300: 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
e310: 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68   logarithm of th
e320: 65 20 69 6e 70 75 74 20 76 61 6c 75 65 2e 0a 2a  e input value..*
e330: 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6e 65  * The results ne
e340: 65 64 20 6e 6f 74 20 62 65 20 65 78 61 63 74 2e  ed not be exact.
e350: 20 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 75    This is only u
e360: 73 65 64 20 66 6f 72 20 65 73 74 69 6d 61 74 69  sed for estimati
e370: 6e 67 0a 2a 2a 20 74 68 65 20 74 6f 74 61 6c 20  ng.** the total 
e380: 63 6f 73 74 20 6f 66 20 70 65 72 66 6f 72 6d 69  cost of performi
e390: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 69  ng operations wi
e3a0: 74 68 20 4f 28 6c 6f 67 4e 29 20 6f 72 20 4f 28  th O(logN) or O(
e3b0: 4e 6c 6f 67 4e 29 0a 2a 2a 20 63 6f 6d 70 6c 65  NlogN).** comple
e3c0: 78 69 74 79 2e 20 20 42 65 63 61 75 73 65 20 4e  xity.  Because N
e3d0: 20 69 73 20 6a 75 73 74 20 61 20 67 75 65 73 73   is just a guess
e3e0: 2c 20 69 74 20 69 73 20 6e 6f 20 67 72 65 61 74  , it is no great
e3f0: 20 74 72 61 67 65 64 79 20 69 66 0a 2a 2a 20 6c   tragedy if.** l
e400: 6f 67 4e 20 69 73 20 61 20 6c 69 74 74 6c 65 20  ogN is a little 
e410: 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 64  off..*/.static d
e420: 6f 75 62 6c 65 20 65 73 74 4c 6f 67 28 64 6f 75  ouble estLog(dou
e430: 62 6c 65 20 4e 29 7b 0a 20 20 64 6f 75 62 6c 65  ble N){.  double
e440: 20 6c 6f 67 4e 20 3d 20 31 3b 0a 20 20 64 6f 75   logN = 1;.  dou
e450: 62 6c 65 20 78 20 3d 20 31 30 3b 0a 20 20 77 68  ble x = 10;.  wh
e460: 69 6c 65 28 20 4e 3e 78 20 29 7b 0a 20 20 20 20  ile( N>x ){.    
e470: 6c 6f 67 4e 20 2b 3d 20 31 3b 0a 20 20 20 20 78  logN += 1;.    x
e480: 20 2a 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 72 65   *= 10;.  }.  re
e490: 74 75 72 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a 2f 2a  turn logN;.}../*
e4a0: 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65 73  .** Two routines
e4b0: 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 74 68   for printing th
e4c0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20  e content of an 
e4d0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
e4e0: 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  fo.** structure.
e4f0: 20 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69    Used for testi
e500: 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
e510: 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74 68   only.  If neith
e520: 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53  er.** SQLITE_TES
e530: 54 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 42 55  T or SQLITE_DEBU
e540: 47 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20 74  G are defined, t
e550: 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69 6e  hen these routin
e560: 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73  es.** are no-ops
e570: 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  ..*/.#if !define
e580: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
e590: 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64  RTUALTABLE) && d
e5a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
e5b0: 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64  BUG).static void
e5c0: 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54   TRACE_IDX_INPUT
e5d0: 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  S(sqlite3_index_
e5e0: 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20  info *p){.  int 
e5f0: 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  i;.  if( !sqlite
e600: 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65  3WhereTrace ) re
e610: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
e620: 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
e630: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  t; i++){.    sql
e640: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
e650: 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64  "  constraint[%d
e660: 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64  ]: col=%d termid
e670: 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c 65  =%d op=%d usable
e680: 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d=%d\n",.       
e690: 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  i,.       p->aCo
e6a0: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c  nstraint[i].iCol
e6b0: 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  umn,.       p->a
e6c0: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54  Constraint[i].iT
e6d0: 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20 20  ermOffset,.     
e6e0: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
e6f0: 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70  [i].op,.       p
e700: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
e710: 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20  .usable);.  }.  
e720: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
e730: 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
e740: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
e750: 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79 5b  intf("  orderby[
e760: 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63  %d]: col=%d desc
e770: 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69  =%d\n",.       i
e780: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64  ,.       p->aOrd
e790: 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c  erBy[i].iColumn,
e7a0: 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65  .       p->aOrde
e7b0: 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20  rBy[i].desc);.  
e7c0: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
e7d0: 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
e7e0: 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  S(sqlite3_index_
e7f0: 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20  info *p){.  int 
e800: 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  i;.  if( !sqlite
e810: 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65  3WhereTrace ) re
e820: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
e830: 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
e840: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  t; i++){.    sql
e850: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
e860: 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61 72  "  usage[%d]: ar
e870: 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64  gvIdx=%d omit=%d
e880: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
e890: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
e8a0: 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67  aintUsage[i].arg
e8b0: 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 70  vIndex,.       p
e8c0: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
e8d0: 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d  ge[i].omit);.  }
e8e0: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
e8f0: 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d 3d  rintf("  idxNum=
e900: 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d  %d\n", p->idxNum
e910: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
e920: 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 53 74  gPrintf("  idxSt
e930: 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53  r=%s\n", p->idxS
e940: 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  tr);.  sqlite3De
e950: 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64  bugPrintf("  ord
e960: 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c  erByConsumed=%d\
e970: 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f  n", p->orderByCo
e980: 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74  nsumed);.  sqlit
e990: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
e9a0: 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d 25   estimatedCost=%
e9b0: 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74  g\n", p->estimat
e9c0: 65 64 43 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73 65  edCost);.}.#else
e9d0: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49  .#define TRACE_I
e9e0: 44 58 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65  DX_INPUTS(A).#de
e9f0: 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f  fine TRACE_IDX_O
ea00: 55 54 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66  UTPUTS(A).#endif
ea10: 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 71 75 69 72 65  ../* .** Require
ea20: 64 20 62 65 63 61 75 73 65 20 62 65 73 74 49 6e  d because bestIn
ea30: 64 65 78 28 29 20 69 73 20 63 61 6c 6c 65 64 20  dex() is called 
ea40: 62 79 20 62 65 73 74 4f 72 43 6c 61 75 73 65 49  by bestOrClauseI
ea50: 6e 64 65 78 28 29 20 0a 2a 2f 0a 73 74 61 74 69  ndex() .*/.stati
ea60: 63 20 76 6f 69 64 20 62 65 73 74 49 6e 64 65 78  c void bestIndex
ea70: 28 0a 20 20 20 20 50 61 72 73 65 2a 2c 20 57 68  (.    Parse*, Wh
ea80: 65 72 65 43 6c 61 75 73 65 2a 2c 20 73 74 72 75  ereClause*, stru
ea90: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 2a  ct SrcList_item*
eaa0: 2c 0a 20 20 20 20 42 69 74 6d 61 73 6b 2c 20 42  ,.    Bitmask, B
eab0: 69 74 6d 61 73 6b 2c 20 45 78 70 72 4c 69 73 74  itmask, ExprList
eac0: 2a 2c 20 57 68 65 72 65 43 6f 73 74 2a 29 3b 0a  *, WhereCost*);.
ead0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
eae0: 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
eaf0: 66 69 6e 64 20 61 6e 20 73 63 61 6e 6e 69 6e 67  find an scanning
eb00: 20 73 74 72 61 74 65 67 79 20 74 68 61 74 20 63   strategy that c
eb10: 61 6e 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 74  an be used .** t
eb20: 6f 20 6f 70 74 69 6d 69 7a 65 20 61 6e 20 27 4f  o optimize an 'O
eb30: 52 27 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  R' expression th
eb40: 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  at is part of a 
eb50: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 0a 2a  WHERE clause. .*
eb60: 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 61  *.** The table a
eb70: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 46  ssociated with F
eb80: 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
eb90: 70 53 72 63 20 6d 61 79 20 62 65 20 65 69 74 68  pSrc may be eith
eba0: 65 72 20 61 0a 2a 2a 20 72 65 67 75 6c 61 72 20  er a.** regular 
ebb0: 42 2d 54 72 65 65 20 74 61 62 6c 65 20 6f 72 20  B-Tree table or 
ebc0: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
ebd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ebe0: 62 65 73 74 4f 72 43 6c 61 75 73 65 49 6e 64 65  bestOrClauseInde
ebf0: 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
ec00: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
ec10: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
ec20: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
ec30: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
ec40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
ec50: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
ec60: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
ec70: 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a  _item *pSrc,  /*
ec80: 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
ec90: 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20   term to search 
eca0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
ecb0: 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20  Ready,          
ecc0: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73   /* Mask of curs
ecd0: 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  ors not availabl
ece0: 65 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a  e for indexing *
ecf0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 56  /.  Bitmask notV
ed00: 61 6c 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  alid,           
ed10: 2f 2a 20 43 75 72 73 6f 72 73 20 6e 6f 74 20 61  /* Cursors not a
ed20: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6e 79  vailable for any
ed30: 20 70 75 72 70 6f 73 65 20 2a 2f 0a 20 20 45 78   purpose */.  Ex
ed40: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
ed50: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
ed60: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
ed70: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20   */.  WhereCost 
ed80: 2a 70 43 6f 73 74 20 20 20 20 20 20 20 20 20 20  *pCost          
ed90: 20 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74    /* Lowest cost
eda0: 20 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 29   query plan */.)
edb0: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
edc0: 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
edd0: 41 54 49 4f 4e 0a 20 20 63 6f 6e 73 74 20 69 6e  ATION.  const in
ede0: 74 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e 69  t iCur = pSrc->i
edf0: 43 75 72 73 6f 72 3b 20 20 20 2f 2a 20 54 68 65  Cursor;   /* The
ee00: 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74   cursor of the t
ee10: 61 62 6c 65 20 74 6f 20 62 65 20 61 63 63 65 73  able to be acces
ee20: 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 42  sed */.  const B
ee30: 69 74 6d 61 73 6b 20 6d 61 73 6b 53 72 63 20 3d  itmask maskSrc =
ee40: 20 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70 4d   getMask(pWC->pM
ee50: 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 20 20  askSet, iCur);  
ee60: 2f 2a 20 42 69 74 6d 61 73 6b 20 66 6f 72 20 70  /* Bitmask for p
ee70: 53 72 63 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  Src */.  WhereTe
ee80: 72 6d 20 2a 20 63 6f 6e 73 74 20 70 57 43 45 6e  rm * const pWCEn
ee90: 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d  d = &pWC->a[pWC-
eea0: 3e 6e 54 65 72 6d 5d 3b 20 20 20 20 20 20 20 20  >nTerm];        
eeb0: 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61  /* End of pWC->a
eec0: 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  [] */.  WhereTer
eed0: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
eee0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
eef0: 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68  ingle term of th
ef00: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
ef10: 2f 0a 0a 20 20 2f 2a 20 4e 6f 20 4f 52 2d 63 6c  /..  /* No OR-cl
ef20: 61 75 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ause optimizatio
ef30: 6e 20 61 6c 6c 6f 77 65 64 20 69 66 20 74 68 65  n allowed if the
ef40: 20 49 4e 44 45 58 45 44 20 42 59 20 6f 72 20 4e   INDEXED BY or N
ef50: 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73  OT INDEXED claus
ef60: 65 73 0a 20 20 2a 2a 20 61 72 65 20 75 73 65 64  es.  ** are used
ef70: 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e   */.  if( pSrc->
ef80: 6e 6f 74 49 6e 64 65 78 65 64 20 7c 7c 20 70 53  notIndexed || pS
ef90: 72 63 2d 3e 70 49 6e 64 65 78 21 3d 30 20 29 7b  rc->pIndex!=0 ){
efa0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
efb0: 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68  ..  /* Search th
efc0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
efd0: 65 72 6d 73 20 66 6f 72 20 61 20 75 73 61 62 6c  erms for a usabl
efe0: 65 20 57 4f 5f 4f 52 20 74 65 72 6d 2e 20 2a 2f  e WO_OR term. */
eff0: 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
f000: 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
f010: 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
f020: 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
f030: 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 0a 20 20  rator==WO_OR .  
f040: 20 20 20 26 26 20 28 28 70 54 65 72 6d 2d 3e 70     && ((pTerm->p
f050: 72 65 72 65 71 41 6c 6c 20 26 20 7e 6d 61 73 6b  rereqAll & ~mask
f060: 53 72 63 29 20 26 20 6e 6f 74 52 65 61 64 79 29  Src) & notReady)
f070: 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65  ==0.     && (pTe
f080: 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69  rm->u.pOrInfo->i
f090: 6e 64 65 78 61 62 6c 65 20 26 20 6d 61 73 6b 53  ndexable & maskS
f0a0: 72 63 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20  rc)!=0 .    ){. 
f0b0: 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65       WhereClause
f0c0: 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d   * const pOrWC =
f0d0: 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e   &pTerm->u.pOrIn
f0e0: 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68  fo->wc;.      Wh
f0f0: 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20  ereTerm * const 
f100: 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57  pOrWCEnd = &pOrW
f110: 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72  C->a[pOrWC->nTer
f120: 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54  m];.      WhereT
f130: 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20  erm *pOrTerm;.  
f140: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
f150: 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a  WHERE_MULTI_OR;.
f160: 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 54 6f        double rTo
f170: 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 64  tal = 0;.      d
f180: 6f 75 62 6c 65 20 6e 52 6f 77 20 3d 20 30 3b 0a  ouble nRow = 0;.
f190: 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 75 73        Bitmask us
f1a0: 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 66  ed = 0;..      f
f1b0: 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43  or(pOrTerm=pOrWC
f1c0: 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72  ->a; pOrTerm<pOr
f1d0: 57 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b  WCEnd; pOrTerm++
f1e0: 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  ){.        Where
f1f0: 43 6f 73 74 20 73 54 65 72 6d 43 6f 73 74 3b 0a  Cost sTermCost;.
f200: 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
f210: 43 45 28 28 22 2e 2e 2e 20 4d 75 6c 74 69 2d 69  CE(("... Multi-i
f220: 6e 64 65 78 20 4f 52 20 74 65 73 74 69 6e 67 20  ndex OR testing 
f230: 66 6f 72 20 74 65 72 6d 20 25 64 20 6f 66 20 25  for term %d of %
f240: 64 2e 2e 2e 2e 5c 6e 22 2c 20 0a 20 20 20 20 20  d....\n", .     
f250: 20 20 20 20 20 28 70 4f 72 54 65 72 6d 20 2d 20       (pOrTerm - 
f260: 70 4f 72 57 43 2d 3e 61 29 2c 20 28 70 54 65 72  pOrWC->a), (pTer
f270: 6d 20 2d 20 70 57 43 2d 3e 61 29 0a 20 20 20 20  m - pWC->a).    
f280: 20 20 20 20 29 29 3b 0a 20 20 20 20 20 20 20 20      ));.        
f290: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  if( pOrTerm->eOp
f2a0: 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 29  erator==WO_AND )
f2b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68 65 72  {.          Wher
f2c0: 65 43 6c 61 75 73 65 20 2a 70 41 6e 64 57 43 20  eClause *pAndWC 
f2d0: 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41  = &pOrTerm->u.pA
f2e0: 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20  ndInfo->wc;.    
f2f0: 20 20 20 20 20 20 62 65 73 74 49 6e 64 65 78 28        bestIndex(
f300: 70 50 61 72 73 65 2c 20 70 41 6e 64 57 43 2c 20  pParse, pAndWC, 
f310: 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20  pSrc, notReady, 
f320: 6e 6f 74 56 61 6c 69 64 2c 20 30 2c 20 26 73 54  notValid, 0, &sT
f330: 65 72 6d 43 6f 73 74 29 3b 0a 20 20 20 20 20 20  ermCost);.      
f340: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54    }else if( pOrT
f350: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
f360: 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20  =iCur ){.       
f370: 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 74     WhereClause t
f380: 65 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20  empWC;.         
f390: 20 74 65 6d 70 57 43 2e 70 50 61 72 73 65 20 3d   tempWC.pParse =
f3a0: 20 70 57 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pWC->pParse;.  
f3b0: 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70          tempWC.p
f3c0: 4d 61 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70  MaskSet = pWC->p
f3d0: 4d 61 73 6b 53 65 74 3b 0a 20 20 20 20 20 20 20  MaskSet;.       
f3e0: 20 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d 20 54     tempWC.op = T
f3f0: 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 20  K_AND;.         
f400: 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54   tempWC.a = pOrT
f410: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 74  erm;.          t
f420: 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b  empWC.nTerm = 1;
f430: 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74 49  .          bestI
f440: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26 74 65  ndex(pParse, &te
f450: 6d 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52  mpWC, pSrc, notR
f460: 65 61 64 79 2c 20 6e 6f 74 56 61 6c 69 64 2c 20  eady, notValid, 
f470: 30 2c 20 26 73 54 65 72 6d 43 6f 73 74 29 3b 0a  0, &sTermCost);.
f480: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
f490: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
f4a0: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
f4b0: 20 20 20 20 20 72 54 6f 74 61 6c 20 2b 3d 20 73       rTotal += s
f4c0: 54 65 72 6d 43 6f 73 74 2e 72 43 6f 73 74 3b 0a  TermCost.rCost;.
f4d0: 20 20 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20          nRow += 
f4e0: 73 54 65 72 6d 43 6f 73 74 2e 70 6c 61 6e 2e 6e  sTermCost.plan.n
f4f0: 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 75 73 65  Row;.        use
f500: 64 20 7c 3d 20 73 54 65 72 6d 43 6f 73 74 2e 75  d |= sTermCost.u
f510: 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28  sed;.        if(
f520: 20 72 54 6f 74 61 6c 3e 3d 70 43 6f 73 74 2d 3e   rTotal>=pCost->
f530: 72 43 6f 73 74 20 29 20 62 72 65 61 6b 3b 0a 20  rCost ) break;. 
f540: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
f550: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
f560: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
f570: 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 73 63   increase the sc
f580: 61 6e 20 63 6f 73 74 20 74 6f 20 61 63 63 6f 75  an cost to accou
f590: 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  nt .      ** for
f5a0: 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65   the cost of the
f5b0: 20 73 6f 72 74 2e 20 2a 2f 0a 20 20 20 20 20 20   sort. */.      
f5c0: 69 66 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20  if( pOrderBy!=0 
f5d0: 29 7b 0a 20 20 20 20 20 20 20 20 57 48 45 52 45  ){.        WHERE
f5e0: 54 52 41 43 45 28 28 22 2e 2e 2e 20 73 6f 72 74  TRACE(("... sort
f5f0: 69 6e 67 20 69 6e 63 72 65 61 73 65 73 20 4f 52  ing increases OR
f600: 20 63 6f 73 74 20 25 2e 39 67 20 74 6f 20 25 2e   cost %.9g to %.
f610: 39 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  9g\n",.         
f620: 20 20 20 20 20 20 20 20 20 20 20 72 54 6f 74 61             rTota
f630: 6c 2c 20 72 54 6f 74 61 6c 2b 6e 52 6f 77 2a 65  l, rTotal+nRow*e
f640: 73 74 4c 6f 67 28 6e 52 6f 77 29 29 29 3b 0a 20  stLog(nRow)));. 
f650: 20 20 20 20 20 20 20 72 54 6f 74 61 6c 20 2b 3d         rTotal +=
f660: 20 6e 52 6f 77 2a 65 73 74 4c 6f 67 28 6e 52 6f   nRow*estLog(nRo
f670: 77 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  w);.      }..   
f680: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 73     /* If the cos
f690: 74 20 6f 66 20 73 63 61 6e 6e 69 6e 67 20 75 73  t of scanning us
f6a0: 69 6e 67 20 74 68 69 73 20 4f 52 20 74 65 72 6d  ing this OR term
f6b0: 20 66 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f   for optimizatio
f6c0: 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c 65  n is.      ** le
f6d0: 73 73 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  ss than the curr
f6e0: 65 6e 74 20 63 6f 73 74 20 73 74 6f 72 65 64 20  ent cost stored 
f6f0: 69 6e 20 70 43 6f 73 74 2c 20 72 65 70 6c 61 63  in pCost, replac
f700: 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20  e the contents. 
f710: 20 20 20 20 20 2a 2a 20 6f 66 20 70 43 6f 73 74       ** of pCost
f720: 2e 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45  . */.      WHERE
f730: 54 52 41 43 45 28 28 22 2e 2e 2e 20 6d 75 6c 74  TRACE(("... mult
f740: 69 2d 69 6e 64 65 78 20 4f 52 20 63 6f 73 74 3d  i-index OR cost=
f750: 25 2e 39 67 20 6e 72 6f 77 3d 25 2e 39 67 5c 6e  %.9g nrow=%.9g\n
f760: 22 2c 20 72 54 6f 74 61 6c 2c 20 6e 52 6f 77 29  ", rTotal, nRow)
f770: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 54 6f  );.      if( rTo
f780: 74 61 6c 3c 70 43 6f 73 74 2d 3e 72 43 6f 73 74  tal<pCost->rCost
f790: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 73   ){.        pCos
f7a0: 74 2d 3e 72 43 6f 73 74 20 3d 20 72 54 6f 74 61  t->rCost = rTota
f7b0: 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74  l;.        pCost
f7c0: 2d 3e 75 73 65 64 20 3d 20 75 73 65 64 3b 0a 20  ->used = used;. 
f7d0: 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c         pCost->pl
f7e0: 61 6e 2e 6e 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a  an.nRow = nRow;.
f7f0: 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70          pCost->p
f800: 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 66 6c  lan.wsFlags = fl
f810: 61 67 73 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  ags;.        pCo
f820: 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 54 65 72 6d  st->plan.u.pTerm
f830: 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
f840: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
f850: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
f860: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
f870: 4e 20 2a 2f 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  N */.}..#ifndef 
f880: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
f890: 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a  MATIC_INDEX./*.*
f8a0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
f8b0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
f8c0: 65 20 74 65 72 6d 20 70 54 65 72 6d 20 69 73 20  e term pTerm is 
f8d0: 6f 66 20 61 20 66 6f 72 6d 20 77 68 65 72 65 20  of a form where 
f8e0: 69 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 75  it.** could be u
f8f0: 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65  sed with an inde
f900: 78 20 74 6f 20 61 63 63 65 73 73 20 70 53 72 63  x to access pSrc
f910: 2c 20 61 73 73 75 6d 69 6e 67 20 61 6e 20 61 70  , assuming an ap
f920: 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e 64  propriate.** ind
f930: 65 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a 73  ex existed..*/.s
f940: 74 61 74 69 63 20 69 6e 74 20 74 65 72 6d 43 61  tatic int termCa
f950: 6e 44 72 69 76 65 49 6e 64 65 78 28 0a 20 20 57  nDriveIndex(.  W
f960: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
f970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f980: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
f990: 72 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  rm to check */. 
f9a0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
f9b0: 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20  item *pSrc,     
f9c0: 2f 2a 20 54 61 62 6c 65 20 77 65 20 61 72 65 20  /* Table we are 
f9d0: 74 72 79 69 6e 67 20 74 6f 20 61 63 63 65 73 73  trying to access
f9e0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
f9f0: 74 52 65 61 64 79 20 20 20 20 20 20 20 20 20 20  tReady          
fa00: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 69       /* Tables i
fa10: 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f 66  n outer loops of
fa20: 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a   the join */.){.
fa30: 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 69 66    char aff;.  if
fa40: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
fa50: 73 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75 72 73  sor!=pSrc->iCurs
fa60: 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  or ) return 0;. 
fa70: 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
fa80: 72 61 74 6f 72 21 3d 57 4f 5f 45 51 20 29 20 72  rator!=WO_EQ ) r
fa90: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
faa0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
fab0: 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d  ht & notReady)!=
fac0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
fad0: 61 66 66 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  aff = pSrc->pTab
fae0: 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e 75 2e  ->aCol[pTerm->u.
faf0: 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69  leftColumn].affi
fb00: 6e 69 74 79 3b 0a 20 20 69 66 28 20 21 73 71 6c  nity;.  if( !sql
fb10: 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
fb20: 79 4f 6b 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  yOk(pTerm->pExpr
fb30: 2c 20 61 66 66 29 20 29 20 72 65 74 75 72 6e 20  , aff) ) return 
fb40: 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  0;.  return 1;.}
fb50: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
fb60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
fb70: 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a  OMATIC_INDEX./*.
fb80: 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  ** If the query 
fb90: 70 6c 61 6e 20 66 6f 72 20 70 53 72 63 20 73 70  plan for pSrc sp
fba0: 65 63 69 66 69 65 64 20 69 6e 20 70 43 6f 73 74  ecified in pCost
fbb0: 20 69 73 20 61 20 66 75 6c 6c 20 74 61 62 6c 65   is a full table
fbc0: 20 73 63 61 6e 0a 2a 2a 20 61 6e 64 20 69 6e 64   scan.** and ind
fbd0: 65 78 69 6e 67 20 69 73 20 61 6c 6c 6f 77 73 20  exing is allows 
fbe0: 28 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20  (if there is no 
fbf0: 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75  NOT INDEXED clau
fc00: 73 65 29 20 61 6e 64 20 69 74 0a 2a 2a 20 70 6f  se) and it.** po
fc10: 73 73 69 62 6c 65 20 74 6f 20 63 6f 6e 73 74 72  ssible to constr
fc20: 75 63 74 20 61 20 74 72 61 6e 73 69 65 6e 74 20  uct a transient 
fc30: 69 6e 64 65 78 20 74 68 61 74 20 77 6f 75 6c 64  index that would
fc40: 20 70 65 72 66 6f 72 6d 20 62 65 74 74 65 72 0a   perform better.
fc50: 2a 2a 20 74 68 61 6e 20 61 20 66 75 6c 6c 20 74  ** than a full t
fc60: 61 62 6c 65 20 73 63 61 6e 20 65 76 65 6e 20 77  able scan even w
fc70: 68 65 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 20  hen the cost of 
fc80: 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 74 68 65  constructing the
fc90: 20 69 6e 64 65 78 0a 2a 2a 20 69 73 20 74 61 6b   index.** is tak
fca0: 65 6e 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2c  en into account,
fcb0: 20 74 68 65 6e 20 61 6c 74 65 72 20 74 68 65 20   then alter the 
fcc0: 71 75 65 72 79 20 70 6c 61 6e 20 74 6f 20 75 73  query plan to us
fcd0: 65 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 69 65  e the.** transie
fce0: 6e 74 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  nt index..*/.sta
fcf0: 74 69 63 20 76 6f 69 64 20 62 65 73 74 41 75 74  tic void bestAut
fd00: 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20 50  omaticIndex(.  P
fd10: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
fd20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
fd30: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
fd40: 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
fd50: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
fd60: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
fd70: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
fd80: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
fd90: 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46  *pSrc,  /* The F
fda0: 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
fdb0: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42  to search */.  B
fdc0: 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
fdd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
fde0: 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68  sk of cursors th
fdf0: 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  at are not avail
fe00: 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  able */.  WhereC
fe10: 6f 73 74 20 2a 70 43 6f 73 74 20 20 20 20 20 20  ost *pCost      
fe20: 20 20 20 20 20 20 2f 2a 20 4c 6f 77 65 73 74 20        /* Lowest 
fe30: 63 6f 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20  cost query plan 
fe40: 2a 2f 0a 29 7b 0a 20 20 64 6f 75 62 6c 65 20 6e  */.){.  double n
fe50: 54 61 62 6c 65 52 6f 77 3b 20 20 20 20 20 20 20  TableRow;       
fe60: 20 20 20 20 2f 2a 20 52 6f 77 73 20 69 6e 20 74      /* Rows in t
fe70: 68 65 20 69 6e 70 75 74 20 74 61 62 6c 65 20 2a  he input table *
fe80: 2f 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 67 4e 3b  /.  double logN;
fe90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fea0: 2f 2a 20 6c 6f 67 28 6e 54 61 62 6c 65 52 6f 77  /* log(nTableRow
feb0: 29 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 63 6f  ) */.  double co
fec0: 73 74 54 65 6d 70 49 64 78 3b 20 20 20 20 20 20  stTempIdx;      
fed0: 20 20 20 2f 2a 20 70 65 72 2d 71 75 65 72 79 20     /* per-query 
fee0: 63 6f 73 74 20 6f 66 20 74 68 65 20 74 72 61 6e  cost of the tran
fef0: 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20  sient index */. 
ff00: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
ff10: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
ff20: 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66  A single term of
ff30: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
ff40: 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
ff50: 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20 20   *pWCEnd;       
ff60: 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43     /* End of pWC
ff70: 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 54 61 62 6c 65  ->a[] */.  Table
ff80: 20 2a 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20   *pTable;       
ff90: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
ffa0: 74 68 74 20 6d 69 67 68 74 20 62 65 20 69 6e 64  tht might be ind
ffb0: 65 78 65 64 20 2a 2f 0a 0a 20 20 69 66 28 20 28  exed */..  if( (
ffc0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
ffd0: 73 20 26 20 53 51 4c 49 54 45 5f 41 75 74 6f 49  s & SQLITE_AutoI
ffe0: 6e 64 65 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ndex)==0 ){.    
fff0: 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64  /* Automatic ind
10000 69 63 65 73 20 61 72 65 20 64 69 73 61 62 6c 65  ices are disable
10010 64 20 61 74 20 72 75 6e 2d 74 69 6d 65 20 2a 2f  d at run-time */
10020 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
10030 0a 20 20 69 66 28 20 28 70 43 6f 73 74 2d 3e 70  .  if( (pCost->p
10040 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
10050 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e  ERE_NOT_FULLSCAN
10060 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57  )!=0 ){.    /* W
10070 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 73  e already have s
10080 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 69 6e 64 65  ome kind of inde
10090 78 20 69 6e 20 75 73 65 20 66 6f 72 20 74 68 69  x in use for thi
100a0 73 20 71 75 65 72 79 2e 20 2a 2f 0a 20 20 20 20  s query. */.    
100b0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
100c0 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78  ( pSrc->notIndex
100d0 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ed ){.    /* The
100e0 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61   NOT INDEXED cla
100f0 75 73 65 20 61 70 70 65 61 72 73 20 69 6e 20 74  use appears in t
10100 68 65 20 53 51 4c 2e 20 2a 2f 0a 20 20 20 20 72  he SQL. */.    r
10110 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61 73  eturn;.  }..  as
10120 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 51  sert( pParse->nQ
10130 75 65 72 79 4c 6f 6f 70 20 3e 3d 20 28 64 6f 75  ueryLoop >= (dou
10140 62 6c 65 29 31 20 29 3b 0a 20 20 70 54 61 62 6c  ble)1 );.  pTabl
10150 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a  e = pSrc->pTab;.
10160 20 20 6e 54 61 62 6c 65 52 6f 77 20 3d 20 70 54    nTableRow = pT
10170 61 62 6c 65 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20  able->nRowEst;. 
10180 20 6c 6f 67 4e 20 3d 20 65 73 74 4c 6f 67 28 6e   logN = estLog(n
10190 54 61 62 6c 65 52 6f 77 29 3b 0a 20 20 63 6f 73  TableRow);.  cos
101a0 74 54 65 6d 70 49 64 78 20 3d 20 32 2a 6c 6f 67  tTempIdx = 2*log
101b0 4e 2a 28 6e 54 61 62 6c 65 52 6f 77 2f 70 50 61  N*(nTableRow/pPa
101c0 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
101d0 2b 20 31 29 3b 0a 20 20 69 66 28 20 63 6f 73 74  + 1);.  if( cost
101e0 54 65 6d 70 49 64 78 3e 3d 70 43 6f 73 74 2d 3e  TempIdx>=pCost->
101f0 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20  rCost ){.    /* 
10200 54 68 65 20 63 6f 73 74 20 6f 66 20 63 72 65 61  The cost of crea
10210 74 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65  ting the transie
10220 6e 74 20 74 61 62 6c 65 20 77 6f 75 6c 64 20 62  nt table would b
10230 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 20  e greater than. 
10240 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 65 20     ** doing the 
10250 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20  full table scan 
10260 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  */.    return;. 
10270 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
10280 66 6f 72 20 61 6e 79 20 65 71 75 61 6c 69 74 79  for any equality
10290 20 63 6f 6d 70 61 72 69 73 6f 6e 20 74 65 72 6d   comparison term
102a0 20 2a 2f 0a 20 20 70 57 43 45 6e 64 20 3d 20 26   */.  pWCEnd = &
102b0 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
102c0 6d 5d 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d  m];.  for(pTerm=
102d0 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
102e0 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  CEnd; pTerm++){.
102f0 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44      if( termCanD
10300 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c  riveIndex(pTerm,
10310 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29   pSrc, notReady)
10320 20 29 7b 0a 20 20 20 20 20 20 57 48 45 52 45 54   ){.      WHERET
10330 52 41 43 45 28 28 22 61 75 74 6f 2d 69 6e 64 65  RACE(("auto-inde
10340 78 20 72 65 64 75 63 65 73 20 63 6f 73 74 20 66  x reduces cost f
10350 72 6f 6d 20 25 2e 32 66 20 74 6f 20 25 2e 32 66  rom %.2f to %.2f
10360 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
10370 20 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e           pCost->
10380 72 43 6f 73 74 2c 20 63 6f 73 74 54 65 6d 70 49  rCost, costTempI
10390 64 78 29 29 3b 0a 20 20 20 20 20 20 70 43 6f 73  dx));.      pCos
103a0 74 2d 3e 72 43 6f 73 74 20 3d 20 63 6f 73 74 54  t->rCost = costT
103b0 65 6d 70 49 64 78 3b 0a 20 20 20 20 20 20 70 43  empIdx;.      pC
103c0 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 20 3d  ost->plan.nRow =
103d0 20 6c 6f 67 4e 20 2b 20 31 3b 0a 20 20 20 20 20   logN + 1;.     
103e0 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46   pCost->plan.wsF
103f0 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 54 45 4d  lags = WHERE_TEM
10400 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20 20 70  P_INDEX;.      p
10410 43 6f 73 74 2d 3e 75 73 65 64 20 3d 20 70 54 65  Cost->used = pTe
10420 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b  rm->prereqRight;
10430 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10440 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a    }.  }.}.#else.
10450 23 20 64 65 66 69 6e 65 20 62 65 73 74 41 75 74  # define bestAut
10460 6f 6d 61 74 69 63 49 6e 64 65 78 28 41 2c 42 2c  omaticIndex(A,B,
10470 43 2c 44 2c 45 29 20 20 2f 2a 20 6e 6f 2d 6f 70  C,D,E)  /* no-op
10480 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51   */.#endif /* SQ
10490 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
104a0 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 0a 23  TIC_INDEX */...#
104b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
104c0 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
104d0 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  EX./*.** Generat
104e0 65 20 63 6f 64 65 20 74 6f 20 63 6f 6e 73 74 72  e code to constr
104f0 75 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62  uct the Index ob
10500 6a 65 63 74 20 66 6f 72 20 61 6e 20 61 75 74 6f  ject for an auto
10510 6d 61 74 69 63 20 69 6e 64 65 78 0a 2a 2a 20 61  matic index.** a
10520 6e 64 20 74 6f 20 73 65 74 20 75 70 20 74 68 65  nd to set up the
10530 20 57 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65   WhereLevel obje
10540 63 74 20 70 4c 65 76 65 6c 20 73 6f 20 74 68 61  ct pLevel so tha
10550 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  t the code gener
10560 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20 75 73  ator.** makes us
10570 65 20 6f 66 20 74 68 65 20 61 75 74 6f 6d 61 74  e of the automat
10580 69 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ic index..*/.sta
10590 74 69 63 20 76 6f 69 64 20 63 6f 6e 73 74 72 75  tic void constru
105a0 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78  ctAutomaticIndex
105b0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
105c0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
105d0 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
105e0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
105f0 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
10600 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
10610 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
10620 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
10630 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20  item *pSrc,  /* 
10640 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
10650 74 65 72 6d 20 74 6f 20 67 65 74 20 74 68 65 20  term to get the 
10660 6e 65 78 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  next index */.  
10670 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
10680 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ,           /* M
10690 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74  ask of cursors t
106a0 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69  hat are not avai
106b0 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65  lable */.  Where
106c0 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20 20  Level *pLevel   
106d0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
106e0 6e 65 77 20 69 6e 64 65 78 20 68 65 72 65 20 2a  new index here *
106f0 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  /.){.  int nColu
10700 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mn;             
10710 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
10720 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63  columns in the c
10730 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 64 65 78  onstructed index
10740 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
10750 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
10760 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65    /* A single te
10770 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
10780 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
10790 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20  eTerm *pWCEnd;  
107a0 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
107b0 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20  f pWC->a[] */.  
107c0 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20  int nByte;      
107d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
107e0 79 74 65 20 6f 66 20 6d 65 6d 6f 72 79 20 6e 65  yte of memory ne
107f0 65 64 65 64 20 66 6f 72 20 70 49 64 78 20 2a 2f  eded for pIdx */
10800 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
10810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10820 2a 20 4f 62 6a 65 63 74 20 64 65 73 63 72 69 62  * Object describ
10830 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65 6e  ing the transien
10840 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62  t index */.  Vdb
10850 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
10860 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70           /* Prep
10870 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75  ared statement u
10880 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
10890 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 49 73  n */.  int regIs
108a0 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
108b0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73     /* Register s
108c0 65 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 61  et by initializa
108d0 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tion */.  int ad
108e0 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20  drInit;         
108f0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
10900 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69   of the initiali
10910 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a 75  zation bypass ju
10920 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  mp */.  Table *p
10930 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20  Table;          
10940 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
10950 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a   being indexed *
10960 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
10970 79 69 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  yinfo;          
10980 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69  /* Key informati
10990 6f 6e 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  on for the index
109a0 20 2a 2f 20 20 20 0a 20 20 69 6e 74 20 61 64 64   */   .  int add
109b0 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  rTop;           
109c0 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
109d0 68 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f  he index fill lo
109e0 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  op */.  int regR
109f0 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20  ecord;          
10a00 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
10a10 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65 78  holding an index
10a20 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
10a30 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
10a40 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
10a50 6d 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  mn counter */.  
10a60 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
10a70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
10a80 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
10a90 20 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20   int mxBitCol;  
10aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10ab0 4d 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69  Maximum column i
10ac0 6e 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  n pSrc->colUsed 
10ad0 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  */.  CollSeq *pC
10ae0 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
10af0 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65   /* Collating se
10b00 71 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63  quence to on a c
10b10 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 42 69 74 6d 61  olumn */.  Bitma
10b20 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20 20 20 20  sk idxCols;     
10b30 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70         /* Bitmap
10b40 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64   of columns used
10b50 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f   for indexing */
10b60 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61  .  Bitmask extra
10b70 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20 2f  Cols;          /
10b80 2a 20 42 69 74 6d 61 70 20 6f 66 20 61 64 64 69  * Bitmap of addi
10b90 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a  tional columns *
10ba0 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  /..  /* Generate
10bb0 20 63 6f 64 65 20 74 6f 20 73 6b 69 70 20 6f 76   code to skip ov
10bc0 65 72 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20  er the creation 
10bd0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  and initializati
10be0 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 74  on of the.  ** t
10bf0 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 6f  ransient index o
10c00 6e 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71  n 2nd and subseq
10c10 75 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 73 20  uent iterations 
10c20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a  of the loop. */.
10c30 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
10c40 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76  dbe;.  assert( v
10c50 21 3d 30 20 29 3b 0a 20 20 72 65 67 49 73 49 6e  !=0 );.  regIsIn
10c60 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  it = ++pParse->n
10c70 4d 65 6d 3b 0a 20 20 61 64 64 72 49 6e 69 74 20  Mem;.  addrInit 
10c80 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
10c90 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op1(v, OP_If, re
10ca0 67 49 73 49 6e 69 74 29 3b 0a 20 20 73 71 6c 69  gIsInit);.  sqli
10cb0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10cc0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
10cd0 72 65 67 49 73 49 6e 69 74 29 3b 0a 0a 20 20 2f  regIsInit);..  /
10ce0 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
10cf0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68  er of columns th
10d00 61 74 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64  at will be added
10d10 20 74 6f 20 74 68 65 20 69 6e 64 65 78 0a 20 20   to the index.  
10d20 2a 2a 20 61 6e 64 20 75 73 65 64 20 74 6f 20 6d  ** and used to m
10d30 61 74 63 68 20 57 48 45 52 45 20 63 6c 61 75 73  atch WHERE claus
10d40 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  e constraints */
10d50 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a  .  nColumn = 0;.
10d60 20 20 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d    pTable = pSrc-
10d70 3e 70 54 61 62 3b 0a 20 20 70 57 43 45 6e 64 20  >pTab;.  pWCEnd 
10d80 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e  = &pWC->a[pWC->n
10d90 54 65 72 6d 5d 3b 0a 20 20 69 64 78 43 6f 6c 73  Term];.  idxCols
10da0 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72   = 0;.  for(pTer
10db0 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
10dc0 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
10dd0 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61  {.    if( termCa
10de0 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72  nDriveIndex(pTer
10df0 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  m, pSrc, notRead
10e00 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  y) ){.      int 
10e10 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  iCol = pTerm->u.
10e20 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
10e30 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20    Bitmask cMask 
10e40 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 28 28  = iCol>=BMS ? ((
10e50 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53  Bitmask)1)<<(BMS
10e60 2d 31 29 20 3a 20 28 28 42 69 74 6d 61 73 6b 29  -1) : ((Bitmask)
10e70 31 29 3c 3c 69 43 6f 6c 3b 0a 20 20 20 20 20 20  1)<<iCol;.      
10e80 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
10e90 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  BMS );.      tes
10ea0 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53  tcase( iCol==BMS
10eb0 2d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  -1 );.      if( 
10ec0 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b  (idxCols & cMask
10ed0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
10ee0 6e 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20  nColumn++;.     
10ef0 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d     idxCols |= cM
10f00 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ask;.      }.   
10f10 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
10f20 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 3b 0a 20 20   nColumn>0 );.  
10f30 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71  pLevel->plan.nEq
10f40 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 2f   = nColumn;..  /
10f50 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
10f60 65 72 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c  er of additional
10f70 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20   columns needed 
10f80 74 6f 20 63 72 65 61 74 65 20 61 0a 20 20 2a 2a  to create a.  **
10f90 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e   covering index.
10fa0 20 20 41 20 22 63 6f 76 65 72 69 6e 67 20 69 6e    A "covering in
10fb0 64 65 78 22 20 69 73 20 61 6e 20 69 6e 64 65 78  dex" is an index
10fc0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
10fd0 6c 6c 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20  ll.  ** columns 
10fe0 74 68 61 74 20 61 72 65 20 6e 65 65 64 65 64 20  that are needed 
10ff0 62 79 20 74 68 65 20 71 75 65 72 79 2e 20 20 57  by the query.  W
11000 69 74 68 20 61 20 63 6f 76 65 72 69 6e 67 20 69  ith a covering i
11010 6e 64 65 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f  ndex, the.  ** o
11020 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65  riginal table ne
11030 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ver needs to be 
11040 61 63 63 65 73 73 65 64 2e 20 20 41 75 74 6f 6d  accessed.  Autom
11050 61 74 69 63 20 69 6e 64 69 63 65 73 20 6d 75 73  atic indices mus
11060 74 0a 20 20 2a 2a 20 62 65 20 61 20 63 6f 76 65  t.  ** be a cove
11070 72 69 6e 67 20 69 6e 64 65 78 20 62 65 63 61 75  ring index becau
11080 73 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c  se the index wil
11090 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64  l not be updated
110a0 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69   if the.  ** ori
110b0 67 69 6e 61 6c 20 74 61 62 6c 65 20 63 68 61 6e  ginal table chan
110c0 67 65 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ges and the inde
110d0 78 20 61 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e  x and table cann
110e0 6f 74 20 62 6f 74 68 20 62 65 20 75 73 65 64 0a  ot both be used.
110f0 20 20 2a 2a 20 69 66 20 74 68 65 79 20 67 6f 20    ** if they go 
11100 6f 75 74 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a  out of sync..  *
11110 2f 0a 20 20 65 78 74 72 61 43 6f 6c 73 20 3d 20  /.  extraCols = 
11120 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20  pSrc->colUsed & 
11130 28 7e 69 64 78 43 6f 6c 73 20 7c 20 28 28 28 42  (~idxCols | (((B
11140 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d  itmask)1)<<(BMS-
11150 31 29 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c  1)));.  mxBitCol
11160 20 3d 20 28 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c   = (pTable->nCol
11170 20 3e 3d 20 42 4d 53 2d 31 29 20 3f 20 42 4d 53   >= BMS-1) ? BMS
11180 2d 31 20 3a 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  -1 : pTable->nCo
11190 6c 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  l;.  testcase( p
111a0 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53  Table->nCol==BMS
111b0 2d 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  -1 );.  testcase
111c0 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d  ( pTable->nCol==
111d0 42 4d 53 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69  BMS-2 );.  for(i
111e0 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20  =0; i<mxBitCol; 
111f0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78  i++){.    if( ex
11200 74 72 61 43 6f 6c 73 20 26 20 28 28 28 42 69 74  traCols & (((Bit
11210 6d 61 73 6b 29 31 29 3c 3c 69 29 20 29 20 6e 43  mask)1)<<i) ) nC
11220 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69  olumn++;.  }.  i
11230 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  f( pSrc->colUsed
11240 20 26 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29   & (((Bitmask)1)
11250 3c 3c 28 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20  <<(BMS-1)) ){.  
11260 20 20 6e 43 6f 6c 75 6d 6e 20 2b 3d 20 70 54 61    nColumn += pTa
11270 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20  ble->nCol - BMS 
11280 2b 20 31 3b 0a 20 20 7d 0a 20 20 70 4c 65 76 65  + 1;.  }.  pLeve
11290 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
112a0 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
112b0 45 51 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f  EQ | WHERE_IDX_O
112c0 4e 4c 59 20 7c 20 57 4f 5f 45 51 3b 0a 0a 20 20  NLY | WO_EQ;..  
112d0 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65  /* Construct the
112e0 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f   Index object to
112f0 20 64 65 73 63 72 69 62 65 20 74 68 69 73 20 69   describe this i
11300 6e 64 65 78 20 2a 2f 0a 20 20 6e 42 79 74 65 20  ndex */.  nByte 
11310 3d 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 3b  = sizeof(Index);
11320 0a 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c  .  nByte += nCol
11330 75 6d 6e 2a 73 69 7a 65 6f 66 28 69 6e 74 29 3b  umn*sizeof(int);
11340 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69       /* Index.ai
11350 43 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 6e 42 79 74  Column */.  nByt
11360 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a  e += nColumn*siz
11370 65 6f 66 28 63 68 61 72 2a 29 3b 20 20 20 2f 2a  eof(char*);   /*
11380 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 2a 2f   Index.azColl */
11390 0a 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c  .  nByte += nCol
113a0 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  umn;            
113b0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53       /* Index.aS
113c0 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 49  ortOrder */.  pI
113d0 64 78 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  dx = sqlite3DbMa
113e0 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
113f0 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69  >db, nByte);.  i
11400 66 28 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74  f( pIdx==0 ) ret
11410 75 72 6e 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 70  urn;.  pLevel->p
11420 6c 61 6e 2e 75 2e 70 49 64 78 20 3d 20 70 49 64  lan.u.pIdx = pId
11430 78 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  x;.  pIdx->azCol
11440 6c 20 3d 20 28 63 68 61 72 2a 2a 29 26 70 49 64  l = (char**)&pId
11450 78 5b 31 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 69  x[1];.  pIdx->ai
11460 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26  Column = (int*)&
11470 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f  pIdx->azColl[nCo
11480 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e 61  lumn];.  pIdx->a
11490 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
114a0 29 26 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  )&pIdx->aiColumn
114b0 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64  [nColumn];.  pId
114c0 78 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f  x->zName = "auto
114d0 2d 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78 2d  -index";.  pIdx-
114e0 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 75  >nColumn = nColu
114f0 6d 6e 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61 62  mn;.  pIdx->pTab
11500 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e  le = pTable;.  n
11510 20 3d 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20   = 0;.  idxCols 
11520 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d  = 0;.  for(pTerm
11530 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70  =pWC->a; pTerm<p
11540 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  WCEnd; pTerm++){
11550 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e  .    if( termCan
11560 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d  DriveIndex(pTerm
11570 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79  , pSrc, notReady
11580 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
11590 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  Col = pTerm->u.l
115a0 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
115b0 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d   Bitmask cMask =
115c0 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 28 28 42   iCol>=BMS ? ((B
115d0 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d  itmask)1)<<(BMS-
115e0 31 29 20 3a 20 28 28 42 69 74 6d 61 73 6b 29 31  1) : ((Bitmask)1
115f0 29 3c 3c 69 43 6f 6c 3b 0a 20 20 20 20 20 20 69  )<<iCol;.      i
11600 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d  f( (idxCols & cM
11610 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
11620 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54     Expr *pX = pT
11630 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
11640 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63      idxCols |= c
11650 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 49  Mask;.        pI
11660 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20  dx->aiColumn[n] 
11670 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
11680 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70  olumn;.        p
11690 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  Coll = sqlite3Bi
116a0 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
116b0 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  eq(pParse, pX->p
116c0 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74  Left, pX->pRight
116d0 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  );.        pIdx-
116e0 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 70 43 6f  >azColl[n] = pCo
116f0 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ll->zName;.     
11700 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a     n++;.      }.
11710 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
11720 72 74 28 20 28 75 33 32 29 6e 3d 3d 70 4c 65 76  rt( (u32)n==pLev
11730 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20 29 3b 0a  el->plan.nEq );.
11740 0a 20 20 2f 2a 20 41 64 64 20 61 64 64 69 74 69  .  /* Add additi
11750 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65  onal columns nee
11760 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  ded to make the 
11770 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
11780 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63 6f 76 65  into.  ** a cove
11790 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ring index */.  
117a0 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74  for(i=0; i<mxBit
117b0 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
117c0 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20 28  f( extraCols & (
117d0 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69 29  ((Bitmask)1)<<i)
117e0 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   ){.      pIdx->
117f0 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b  aiColumn[n] = i;
11800 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43  .      pIdx->azC
11810 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59  oll[n] = "BINARY
11820 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20  ";.      n++;.  
11830 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53    }.  }.  if( pS
11840 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 28  rc->colUsed & ((
11850 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d  (Bitmask)1)<<(BM
11860 53 2d 31 29 29 20 29 7b 0a 20 20 20 20 66 6f 72  S-1)) ){.    for
11870 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61 62  (i=BMS-1; i<pTab
11880 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  le->nCol; i++){.
11890 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f        pIdx->aiCo
118a0 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20  lumn[n] = i;.   
118b0 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
118c0 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20  n] = "BINARY";. 
118d0 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a       n++;.    }.
118e0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3d    }.  assert( n=
118f0 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 0a 20 20 2f  =nColumn );..  /
11900 2a 20 43 72 65 61 74 65 20 74 68 65 20 61 75 74  * Create the aut
11910 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a  omatic index */.
11920 20 20 70 4b 65 79 69 6e 66 6f 20 3d 20 73 71 6c    pKeyinfo = sql
11930 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f  ite3IndexKeyinfo
11940 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a  (pParse, pIdx);.
11950 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c    assert( pLevel
11960 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a  ->iIdxCur>=0 );.
11970 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11980 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 41 75  Op4(v, OP_OpenAu
11990 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76 65 6c 2d  toindex, pLevel-
119a0 3e 69 49 64 78 43 75 72 2c 20 6e 43 6f 6c 75 6d  >iIdxCur, nColum
119b0 6e 2b 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  n+1, 0,.        
119c0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
119d0 72 2a 29 70 4b 65 79 69 6e 66 6f 2c 20 50 34 5f  r*)pKeyinfo, P4_
119e0 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
119f0 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
11a00 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70 54  (v, "for %s", pT
11a10 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a  able->zName));..
11a20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61 75    /* Fill the au
11a30 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77 69  tomatic index wi
11a40 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  th content */.  
11a50 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
11a60 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
11a70 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76 65 6c  P_Rewind, pLevel
11a80 2d 3e 69 54 61 62 43 75 72 29 3b 0a 20 20 72 65  ->iTabCur);.  re
11a90 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65  gRecord = sqlite
11aa0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
11ab0 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65  se);.  sqlite3Ge
11ac0 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70  nerateIndexKey(p
11ad0 50 61 72 73 65 2c 20 70 49 64 78 2c 20 70 4c 65  Parse, pIdx, pLe
11ae0 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72 65  vel->iTabCur, re
11af0 67 52 65 63 6f 72 64 2c 20 31 29 3b 0a 20 20 73  gRecord, 1);.  s
11b00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11b10 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
11b20 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  , pLevel->iIdxCu
11b30 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  r, regRecord);. 
11b40 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
11b50 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55  geP5(v, OPFLAG_U
11b60 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20  SESEEKRESULT);. 
11b70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11b80 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70  p2(v, OP_Next, p
11b90 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20  Level->iTabCur, 
11ba0 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20 20 73 71  addrTop+1);.  sq
11bb0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
11bc0 35 28 76 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54  5(v, SQLITE_STMT
11bd0 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58  STATUS_AUTOINDEX
11be0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
11bf0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
11c00 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  Top);.  sqlite3R
11c10 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
11c20 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29  arse, regRecord)
11c30 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  ;.  .  /* Jump h
11c40 65 72 65 20 77 68 65 6e 20 73 6b 69 70 70 69 6e  ere when skippin
11c50 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  g the initializa
11c60 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tion */.  sqlite
11c70 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
11c80 20 61 64 64 72 49 6e 69 74 29 3b 0a 7d 0a 23 65   addrInit);.}.#e
11c90 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
11ca0 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
11cb0 44 45 58 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  DEX */..#ifndef 
11cc0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
11cd0 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41  UALTABLE./*.** A
11ce0 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f 70 75  llocate and popu
11cf0 6c 61 74 65 20 61 6e 20 73 71 6c 69 74 65 33 5f  late an sqlite3_
11d00 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
11d10 74 75 72 65 2e 20 49 74 20 69 73 20 74 68 65 20  ture. It is the 
11d20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  .** responsibili
11d30 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
11d40 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 72   to eventually r
11d50 65 6c 65 61 73 65 20 74 68 65 20 73 74 72 75 63  elease the struc
11d60 74 75 72 65 0a 2a 2a 20 62 79 20 70 61 73 73 69  ture.** by passi
11d70 6e 67 20 74 68 65 20 70 6f 69 6e 74 65 72 20 72  ng the pointer r
11d80 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
11d90 66 75 6e 63 74 69 6f 6e 20 74 6f 20 73 71 6c 69  function to sqli
11da0 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73  te3_free()..*/.s
11db0 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e  tatic sqlite3_in
11dc0 64 65 78 5f 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61  dex_info *alloca
11dd0 74 65 49 6e 64 65 78 49 6e 66 6f 28 0a 20 20 50  teIndexInfo(.  P
11de0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20  arse *pParse, . 
11df0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
11e00 43 2c 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  C,.  struct SrcL
11e10 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 0a  ist_item *pSrc,.
11e20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
11e30 65 72 42 79 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  erBy.){.  int i,
11e40 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b   j;.  int nTerm;
11e50 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
11e60 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
11e70 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20  nt *pIdxCons;.  
11e80 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
11e90 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a 70 49  ndex_orderby *pI
11ea0 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73 74 72  dxOrderBy;.  str
11eb0 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
11ec0 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
11ed0 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68  ge *pUsage;.  Wh
11ee0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
11ef0 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a    int nOrderBy;.
11f00 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
11f10 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a  info *pIdxInfo;.
11f20 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22  .  WHERETRACE(("
11f30 52 65 63 6f 6d 70 75 74 69 6e 67 20 69 6e 64 65  Recomputing inde
11f40 78 20 69 6e 66 6f 20 66 6f 72 20 25 73 2e 2e 2e  x info for %s...
11f50 5c 6e 22 2c 20 70 53 72 63 2d 3e 70 54 61 62 2d  \n", pSrc->pTab-
11f60 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20  >zName));..  /* 
11f70 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
11f80 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57 48 45   of possible WHE
11f90 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72  RE clause constr
11fa0 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e 67 0a  aints referring.
11fb0 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 76 69 72    ** to this vir
11fc0 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tual table */.  
11fd0 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20 70  for(i=nTerm=0, p
11fe0 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70  Term=pWC->a; i<p
11ff0 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20  WC->nTerm; i++, 
12000 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
12010 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
12020 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75  sor != pSrc->iCu
12030 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  rsor ) continue;
12040 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54  .    assert( (pT
12050 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28  erm->eOperator&(
12060 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
12070 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 74  -1))==0 );.    t
12080 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
12090 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e  eOperator==WO_IN
120a0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
120b0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
120c0 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  or==WO_ISNULL );
120d0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
120e0 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
120f0 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20  IN|WO_ISNULL) ) 
12100 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54  continue;.    nT
12110 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  erm++;.  }..  /*
12120 20 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   If the ORDER BY
12130 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
12140 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   only columns in
12150 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20   the current .  
12160 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
12170 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73   then allocate s
12180 70 61 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72  pace for the aOr
12190 64 65 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20  derBy part of.  
121a0 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ** the sqlite3_i
121b0 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
121c0 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64  ure..  */.  nOrd
121d0 65 72 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  erBy = 0;.  if( 
121e0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
121f0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
12200 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
12210 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
12220 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  xpr = pOrderBy->
12230 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
12240 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
12250 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45  =TK_COLUMN || pE
12260 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72  xpr->iTable!=pSr
12270 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 62 72 65  c->iCursor ) bre
12280 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
12290 28 20 69 3d 3d 70 4f 72 64 65 72 42 79 2d 3e 6e  ( i==pOrderBy->n
122a0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 6e 4f  Expr ){.      nO
122b0 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
122c0 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 7d 0a  y->nExpr;.    }.
122d0 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
122e0 74 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  te the sqlite3_i
122f0 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
12300 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49  ure.  */.  pIdxI
12310 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
12320 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65  allocZero(pParse
12330 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49  ->db, sizeof(*pI
12340 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20  dxInfo).        
12350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12360 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49     + (sizeof(*pI
12370 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66  dxCons) + sizeof
12380 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d  (*pUsage))*nTerm
12390 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
123a0 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69              + si
123b0 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65 72 42  zeof(*pIdxOrderB
123c0 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20  y)*nOrderBy );. 
123d0 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30   if( pIdxInfo==0
123e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
123f0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
12400 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29  "out of memory")
12410 3b 0a 20 20 20 20 2f 2a 20 28 64 6f 75 62 6c 65  ;.    /* (double
12420 29 30 20 49 6e 20 63 61 73 65 20 6f 66 20 53 51  )0 In case of SQ
12430 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
12440 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20  NG_POINT... */. 
12450 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
12460 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
12470 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e  e the structure.
12480 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e    The sqlite3_in
12490 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
124a0 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a  re contains.  **
124b0 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68 61   many fields tha
124c0 74 20 61 72 65 20 64 65 63 6c 61 72 65 64 20 22  t are declared "
124d0 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65 6e  const" to preven
124e0 74 20 78 42 65 73 74 49 6e 64 65 78 20 66 72 6f  t xBestIndex fro
124f0 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20  m.  ** changing 
12500 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65 20 74  them.  We have t
12510 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20  o do some funky 
12520 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64 65 72  casting in order
12530 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c   to.  ** initial
12540 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c 64 73  ize those fields
12550 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e  ..  */.  pIdxCon
12560 73 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69  s = (struct sqli
12570 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
12580 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 5b  aint*)&pIdxInfo[
12590 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65 72 42  1];.  pIdxOrderB
125a0 79 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69  y = (struct sqli
125b0 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62  te3_index_orderb
125c0 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65  y*)&pIdxCons[nTe
125d0 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20 3d 20  rm];.  pUsage = 
125e0 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
125f0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
12600 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f 72 64  _usage*)&pIdxOrd
12610 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a  erBy[nOrderBy];.
12620 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e    *(int*)&pIdxIn
12630 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20  fo->nConstraint 
12640 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69 6e 74  = nTerm;.  *(int
12650 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72  *)&pIdxInfo->nOr
12660 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79  derBy = nOrderBy
12670 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c  ;.  *(struct sql
12680 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
12690 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66  raint**)&pIdxInf
126a0 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d  o->aConstraint =
126b0 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a 28 73   pIdxCons;.  *(s
126c0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
126d0 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70  dex_orderby**)&p
126e0 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42  IdxInfo->aOrderB
126f0 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42 79 3b  y = pIdxOrderBy;
12700 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69  .  *(struct sqli
12710 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
12720 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70 49  aint_usage**)&pI
12730 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
12740 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20 20 20  intUsage =.     
12750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 55                pU
12790 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a  sage;..  for(i=j
127a0 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61  =0, pTerm=pWC->a
127b0 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; i<pWC->nTerm; 
127c0 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  i++, pTerm++){. 
127d0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
127e0 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63  ftCursor != pSrc
127f0 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74  ->iCursor ) cont
12800 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
12810 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
12820 74 6f 72 26 28 70 54 65 72 6d 2d 3e 65 4f 70 65  tor&(pTerm->eOpe
12830 72 61 74 6f 72 2d 31 29 29 3d 3d 30 20 29 3b 0a  rator-1))==0 );.
12840 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
12850 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
12860 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73  WO_IN );.    tes
12870 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
12880 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55  perator==WO_ISNU
12890 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54  LL );.    if( pT
128a0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
128b0 20 28 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c   (WO_IN|WO_ISNUL
128c0 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  L) ) continue;. 
128d0 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69     pIdxCons[j].i
128e0 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e  Column = pTerm->
128f0 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
12900 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54    pIdxCons[j].iT
12910 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20  ermOffset = i;. 
12920 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f     pIdxCons[j].o
12930 70 20 3d 20 28 75 38 29 70 54 65 72 6d 2d 3e 65  p = (u8)pTerm->e
12940 4f 70 65 72 61 74 6f 72 3b 0a 20 20 20 20 2f 2a  Operator;.    /*
12950 20 54 68 65 20 64 69 72 65 63 74 20 61 73 73 69   The direct assi
12960 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70 72  gnment in the pr
12970 65 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20 70  evious line is p
12980 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63  ossible only bec
12990 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  ause.    ** the 
129a0 57 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f 49  WO_ and SQLITE_I
129b0 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
129c0 20 63 6f 64 65 73 20 61 72 65 20 69 64 65 6e 74   codes are ident
129d0 69 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20 2a  ical.  The.    *
129e0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  * following asse
129f0 72 74 73 20 76 65 72 69 66 79 20 74 68 69 73 20  rts verify this 
12a00 66 61 63 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73  fact. */.    ass
12a10 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49  ert( WO_EQ==SQLI
12a20 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
12a30 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 61 73  INT_EQ );.    as
12a40 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c  sert( WO_LT==SQL
12a50 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
12a60 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 61  AINT_LT );.    a
12a70 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51  ssert( WO_LE==SQ
12a80 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
12a90 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20  RAINT_LE );.    
12aa0 61 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53  assert( WO_GT==S
12ab0 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
12ac0 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20  TRAINT_GT );.   
12ad0 20 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d   assert( WO_GE==
12ae0 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
12af0 53 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20  STRAINT_GE );.  
12b00 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4d 41 54    assert( WO_MAT
12b10 43 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  CH==SQLITE_INDEX
12b20 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43  _CONSTRAINT_MATC
12b30 48 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  H );.    assert(
12b40 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
12b50 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 4c 54  r & (WO_EQ|WO_LT
12b60 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f  |WO_LE|WO_GT|WO_
12b70 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a  GE|WO_MATCH) );.
12b80 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66      j++;.  }.  f
12b90 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
12ba0 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  By; i++){.    Ex
12bb0 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64  pr *pExpr = pOrd
12bc0 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
12bd0 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42  ;.    pIdxOrderB
12be0 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70  y[i].iColumn = p
12bf0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
12c00 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69     pIdxOrderBy[i
12c10 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42  ].desc = pOrderB
12c20 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
12c30 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  r;.  }..  return
12c40 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a   pIdxInfo;.}../*
12c50 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 62  .** The table ob
12c60 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65 20 70  ject reference p
12c70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
12c80 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
12c90 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
12ca0 20 6d 75 73 74 20 72 65 70 72 65 73 65 6e 74 20   must represent 
12cb0 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
12cc0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
12cd0 6e 76 6f 6b 65 73 20 74 68 65 20 78 42 65 73 74  nvokes the xBest
12ce0 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f  Index().** metho
12cf0 64 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c  d of the virtual
12d00 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
12d10 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
12d20 66 6f 20 70 6f 69 6e 74 65 72 20 70 61 73 73 65  fo pointer passe
12d30 64 0a 2a 2a 20 61 73 20 74 68 65 20 61 72 67 75  d.** as the argu
12d40 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ment..**.** If a
12d50 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
12d60 70 50 61 72 73 65 20 69 73 20 70 6f 70 75 6c 61  pParse is popula
12d70 74 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f  ted with an erro
12d80 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20 61 0a  r message and a.
12d90 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ** non-zero valu
12da0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
12db0 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72  therwise, 0 is r
12dc0 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
12dd0 6f 75 74 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f  output.** part o
12de0 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  f the sqlite3_in
12df0 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
12e00 72 65 20 69 73 20 6c 65 66 74 20 70 6f 70 75 6c  re is left popul
12e10 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74  ated..**.** Whet
12e20 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72  her or not an er
12e30 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ror is returned,
12e40 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   it is the respo
12e50 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
12e60 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  .** caller to ev
12e70 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 70 2d  entually free p-
12e80 3e 69 64 78 53 74 72 20 69 66 20 70 2d 3e 6e 65  >idxStr if p->ne
12e90 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 69  edToFreeIdxStr i
12ea0 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74 68 61 74  ndicates.** that
12eb0 20 74 68 69 73 20 69 73 20 72 65 71 75 69 72 65   this is require
12ec0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
12ed0 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 50   vtabBestIndex(P
12ee0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
12ef0 62 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c 69 74  ble *pTab, sqlit
12f00 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
12f10 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  ){.  sqlite3_vta
12f20 62 20 2a 70 56 74 61 62 20 3d 20 73 71 6c 69 74  b *pVtab = sqlit
12f30 65 33 47 65 74 56 54 61 62 6c 65 28 70 50 61 72  e3GetVTable(pPar
12f40 73 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70  se->db, pTab)->p
12f50 56 74 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vtab;.  int i;. 
12f60 20 69 6e 74 20 72 63 3b 0a 0a 20 20 57 48 45 52   int rc;..  WHER
12f70 45 54 52 41 43 45 28 28 22 78 42 65 73 74 49 6e  ETRACE(("xBestIn
12f80 64 65 78 20 66 6f 72 20 25 73 5c 6e 22 2c 20 70  dex for %s\n", p
12f90 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
12fa0 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53  TRACE_IDX_INPUTS
12fb0 28 70 29 3b 0a 20 20 72 63 20 3d 20 70 56 74 61  (p);.  rc = pVta
12fc0 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73  b->pModule->xBes
12fd0 74 49 6e 64 65 78 28 70 56 74 61 62 2c 20 70 29  tIndex(pVtab, p)
12fe0 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 4f 55  ;.  TRACE_IDX_OU
12ff0 54 50 55 54 53 28 70 29 3b 0a 0a 20 20 69 66 28  TPUTS(p);..  if(
13000 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13010 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  {.    if( rc==SQ
13020 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
13030 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
13040 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
13050 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
13060 21 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20  !pVtab->zErrMsg 
13070 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13080 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
13090 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72   "%s", sqlite3Er
130a0 72 53 74 72 28 72 63 29 29 3b 0a 20 20 20 20 7d  rStr(rc));.    }
130b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
130c0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
130d0 73 65 2c 20 22 25 73 22 2c 20 70 56 74 61 62 2d  se, "%s", pVtab-
130e0 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d  >zErrMsg);.    }
130f0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
13100 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d  ree(pVtab->zErrM
13110 73 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45  sg);.  pVtab->zE
13120 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 66 6f  rrMsg = 0;..  fo
13130 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e  r(i=0; i<p->nCon
13140 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  straint; i++){. 
13150 20 20 20 69 66 28 20 21 70 2d 3e 61 43 6f 6e 73     if( !p->aCons
13160 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65  traint[i].usable
13170 20 26 26 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69   && p->aConstrai
13180 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49  ntUsage[i].argvI
13190 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20 20 20 20  ndex>0 ){.      
131a0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
131b0 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
131c0 20 20 20 22 74 61 62 6c 65 20 25 73 3a 20 78 42     "table %s: xB
131d0 65 73 74 49 6e 64 65 78 20 72 65 74 75 72 6e 65  estIndex returne
131e0 64 20 61 6e 20 69 6e 76 61 6c 69 64 20 70 6c 61  d an invalid pla
131f0 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  n", pTab->zName)
13200 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
13210 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45  eturn pParse->nE
13220 72 72 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f  rr;.}.../*.** Co
13230 6d 70 75 74 65 20 74 68 65 20 62 65 73 74 20 69  mpute the best i
13240 6e 64 65 78 20 66 6f 72 20 61 20 76 69 72 74 75  ndex for a virtu
13250 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
13260 54 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 69  The best index i
13270 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68  s computed by th
13280 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74  e xBestIndex met
13290 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75  hod of the virtu
132a0 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 6d 6f 64 75  al.** table modu
132b0 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  le.  This routin
132c0 65 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  e is really just
132d0 20 61 20 77 72 61 70 70 65 72 20 74 68 61 74 20   a wrapper that 
132e0 73 65 74 73 20 75 70 0a 2a 2a 20 74 68 65 20 73  sets up.** the s
132f0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
13300 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
13310 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 6d   is used to comm
13320 75 6e 69 63 61 74 65 20 77 69 74 68 0a 2a 2a 20  unicate with.** 
13330 78 42 65 73 74 49 6e 64 65 78 2e 0a 2a 2a 0a 2a  xBestIndex..**.*
13340 2a 20 49 6e 20 61 20 6a 6f 69 6e 2c 20 74 68 69  * In a join, thi
13350 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
13360 62 65 20 63 61 6c 6c 65 64 20 6d 75 6c 74 69 70  be called multip
13370 6c 65 20 74 69 6d 65 73 20 66 6f 72 20 74 68 65  le times for the
13380 0a 2a 2a 20 73 61 6d 65 20 76 69 72 74 75 61 6c  .** same virtual
13390 20 74 61 62 6c 65 2e 20 20 54 68 65 20 73 71 6c   table.  The sql
133a0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
133b0 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65  structure is cre
133c0 61 74 65 64 0a 2a 2a 20 61 6e 64 20 69 6e 69 74  ated.** and init
133d0 69 61 6c 69 7a 65 64 20 6f 6e 20 74 68 65 20 66  ialized on the f
133e0 69 72 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20  irst invocation 
133f0 61 6e 64 20 72 65 75 73 65 64 20 6f 6e 20 61 6c  and reused on al
13400 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20  l subsequent.** 
13410 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 20 20 54 68  invocations.  Th
13420 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
13430 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  info structure i
13440 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e  s also used when
13450 0a 2a 2a 20 63 6f 64 65 20 69 73 20 67 65 6e 65  .** code is gene
13460 72 61 74 65 64 20 74 6f 20 61 63 63 65 73 73 20  rated to access 
13470 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
13480 65 2e 20 20 54 68 65 20 77 68 65 72 65 49 6e 66  e.  The whereInf
13490 6f 44 65 6c 65 74 65 28 29 20 0a 2a 2a 20 72 6f  oDelete() .** ro
134a0 75 74 69 6e 65 20 74 61 6b 65 73 20 63 61 72 65  utine takes care
134b0 20 6f 66 20 66 72 65 65 69 6e 67 20 74 68 65 20   of freeing the 
134c0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
134d0 66 6f 20 73 74 72 75 63 74 75 72 65 20 61 66 74  fo structure aft
134e0 65 72 0a 2a 2a 20 65 76 65 72 79 62 6f 64 79 20  er.** everybody 
134f0 68 61 73 20 66 69 6e 69 73 68 65 64 20 77 69 74  has finished wit
13500 68 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  h it..*/.static 
13510 76 6f 69 64 20 62 65 73 74 56 69 72 74 75 61 6c  void bestVirtual
13520 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
13530 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
13540 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
13550 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
13560 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
13570 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20   *pWC,          
13580 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
13590 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
135a0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
135b0 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 20 2f 2a  m *pSrc,      /*
135c0 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
135d0 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20   term to search 
135e0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
135f0 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20  Ready,          
13600 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
13610 63 75 72 73 6f 72 73 20 6e 6f 74 20 61 76 61 69  cursors not avai
13620 6c 61 62 6c 65 20 66 6f 72 20 69 6e 64 65 78 20  lable for index 
13630 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
13640 56 61 6c 69 64 2c 20 20 20 20 20 20 20 20 20 20  Valid,          
13650 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20       /* Cursors 
13660 6e 6f 74 20 76 61 6c 69 64 20 66 6f 72 20 61 6e  not valid for an
13670 79 20 70 75 72 70 6f 73 65 20 2a 2f 0a 20 20 45  y purpose */.  E
13680 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
13690 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  y,             /
136a0 2a 20 54 68 65 20 6f 72 64 65 72 20 62 79 20 63  * The order by c
136b0 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
136c0 43 6f 73 74 20 2a 70 43 6f 73 74 2c 20 20 20 20  Cost *pCost,    
136d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
136e0 77 65 73 74 20 63 6f 73 74 20 71 75 65 72 79 20  west cost query 
136f0 70 6c 61 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  plan */.  sqlite
13700 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 2a 70  3_index_info **p
13710 70 49 64 78 49 6e 66 6f 20 20 2f 2a 20 49 6e 64  pIdxInfo  /* Ind
13720 65 78 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70  ex information p
13730 61 73 73 65 64 20 74 6f 20 78 42 65 73 74 49 6e  assed to xBestIn
13740 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  dex */.){.  Tabl
13750 65 20 2a 70 54 61 62 20 3d 20 70 53 72 63 2d 3e  e *pTab = pSrc->
13760 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pTab;.  sqlite3_
13770 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78  index_info *pIdx
13780 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 73  Info;.  struct s
13790 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
137a0 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e  straint *pIdxCon
137b0 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  s;.  struct sqli
137c0 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
137d0 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61  aint_usage *pUsa
137e0 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  ge;.  WhereTerm 
137f0 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 2c  *pTerm;.  int i,
13800 20 6a 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72   j;.  int nOrder
13810 42 79 3b 0a 20 20 64 6f 75 62 6c 65 20 72 43 6f  By;.  double rCo
13820 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  st;..  /* Make s
13830 75 72 65 20 77 73 46 6c 61 67 73 20 69 73 20 69  ure wsFlags is i
13840 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 73 6f  nitialized to so
13850 6d 65 20 73 61 6e 65 20 76 61 6c 75 65 2e 20 4f  me sane value. O
13860 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
13870 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 69 6e   .  ** malloc in
13880 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e   allocateIndexIn
13890 66 6f 28 29 20 66 61 69 6c 73 20 61 6e 64 20 74  fo() fails and t
138a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
138b0 75 72 6e 73 20 6c 65 61 76 69 6e 67 0a 20 20 2a  urns leaving.  *
138c0 2a 20 77 73 46 6c 61 67 73 20 69 6e 20 61 6e 20  * wsFlags in an 
138d0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 74  uninitialized st
138e0 61 74 65 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ate, the caller 
138f0 6d 61 79 20 62 65 68 61 76 65 20 75 6e 70 72 65  may behave unpre
13900 64 69 63 74 61 62 6c 79 2e 0a 20 20 2a 2f 0a 20  dictably..  */. 
13910 20 6d 65 6d 73 65 74 28 70 43 6f 73 74 2c 20 30   memset(pCost, 0
13920 2c 20 73 69 7a 65 6f 66 28 2a 70 43 6f 73 74 29  , sizeof(*pCost)
13930 29 3b 0a 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e  );.  pCost->plan
13940 2e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  .wsFlags = WHERE
13950 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 0a  _VIRTUALTABLE;..
13960 20 20 2f 2a 20 49 66 20 74 68 65 20 73 71 6c 69    /* If the sqli
13970 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
13980 74 72 75 63 74 75 72 65 20 68 61 73 20 6e 6f 74  tructure has not
13990 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79   been previously
139a0 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  .  ** allocated 
139b0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c  and initialized,
139c0 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61   then allocate a
139d0 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  nd initialize it
139e0 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 49 64   now..  */.  pId
139f0 78 49 6e 66 6f 20 3d 20 2a 70 70 49 64 78 49 6e  xInfo = *ppIdxIn
13a00 66 6f 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e  fo;.  if( pIdxIn
13a10 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 70  fo==0 ){.    *pp
13a20 49 64 78 49 6e 66 6f 20 3d 20 70 49 64 78 49 6e  IdxInfo = pIdxIn
13a30 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64  fo = allocateInd
13a40 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  exInfo(pParse, p
13a50 57 43 2c 20 70 53 72 63 2c 20 70 4f 72 64 65 72  WC, pSrc, pOrder
13a60 42 79 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  By);.  }.  if( p
13a70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20  IdxInfo==0 ){.  
13a80 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
13a90 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
13aa0 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  t, the sqlite3_i
13ab0 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
13ac0 75 72 65 20 74 68 61 74 20 70 49 64 78 49 6e 66  ure that pIdxInf
13ad0 6f 20 70 6f 69 6e 74 73 0a 20 20 2a 2a 20 74 6f  o points.  ** to
13ae0 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20   will have been 
13af0 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 65 69 74  initialized, eit
13b00 68 65 72 20 64 75 72 69 6e 67 20 74 68 65 20 63  her during the c
13b10 75 72 72 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f  urrent invocatio
13b20 6e 20 6f 72 0a 20 20 2a 2a 20 64 75 72 69 6e 67  n or.  ** during
13b30 20 73 6f 6d 65 20 70 72 69 6f 72 20 69 6e 76 6f   some prior invo
13b40 63 61 74 69 6f 6e 2e 20 20 4e 6f 77 20 77 65 20  cation.  Now we 
13b50 6a 75 73 74 20 68 61 76 65 20 74 6f 20 63 75 73  just have to cus
13b60 74 6f 6d 69 7a 65 20 74 68 65 0a 20 20 2a 2a 20  tomize the.  ** 
13b70 64 65 74 61 69 6c 73 20 6f 66 20 70 49 64 78 49  details of pIdxI
13b80 6e 66 6f 20 66 6f 72 20 74 68 65 20 63 75 72 72  nfo for the curr
13b90 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61  ent invocation a
13ba0 6e 64 20 70 61 73 73 20 69 74 20 74 6f 0a 20 20  nd pass it to.  
13bb0 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 2e 0a 20  ** xBestIndex.. 
13bc0 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 6f   */..  /* The mo
13bd0 64 75 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62  dule name must b
13be0 65 20 64 65 66 69 6e 65 64 2e 20 41 6c 73 6f 2c  e defined. Also,
13bf0 20 62 79 20 74 68 69 73 20 70 6f 69 6e 74 20 74   by this point t
13c00 68 65 72 65 20 6d 75 73 74 0a 20 20 2a 2a 20 62  here must.  ** b
13c10 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
13c20 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73  n sqlite3_vtab s
13c30 74 72 75 63 74 75 72 65 2e 20 4f 74 68 65 72 77  tructure. Otherw
13c40 69 73 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  ise.  ** sqlite3
13c50 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
13c60 65 73 28 29 20 77 6f 75 6c 64 20 68 61 76 65 20  es() would have 
13c70 70 69 63 6b 65 64 20 75 70 20 74 68 65 20 65 72  picked up the er
13c80 72 6f 72 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73  ror. .  */.  ass
13c90 65 72 74 28 20 70 54 61 62 2d 3e 61 7a 4d 6f 64  ert( pTab->azMod
13ca0 75 6c 65 41 72 67 20 26 26 20 70 54 61 62 2d 3e  uleArg && pTab->
13cb0 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 30 5d 20 29  azModuleArg[0] )
13cc0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
13cd0 74 65 33 47 65 74 56 54 61 62 6c 65 28 70 50 61  te3GetVTable(pPa
13ce0 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 29 20 29  rse->db, pTab) )
13cf0 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
13d00 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e 75 73  aConstraint[].us
13d10 61 62 6c 65 20 66 69 65 6c 64 73 20 61 6e 64 20  able fields and 
13d20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20 0a  initialize all .
13d30 20 20 2a 2a 20 6f 75 74 70 75 74 20 76 61 72 69    ** output vari
13d40 61 62 6c 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 20  ables to zero.. 
13d50 20 2a 2a 0a 20 20 2a 2a 20 61 43 6f 6e 73 74 72   **.  ** aConstr
13d60 61 69 6e 74 5b 5d 2e 75 73 61 62 6c 65 20 69 73  aint[].usable is
13d70 20 74 72 75 65 20 66 6f 72 20 63 6f 6e 73 74 72   true for constr
13d80 61 69 6e 74 73 20 77 68 65 72 65 20 74 68 65 20  aints where the 
13d90 72 69 67 68 74 2d 68 61 6e 64 0a 20 20 2a 2a 20  right-hand.  ** 
13da0 73 69 64 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  side contains on
13db0 6c 79 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ly references to
13dc0 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
13dd0 65 66 74 20 6f 66 20 74 68 65 20 63 75 72 72 65  eft of the curre
13de0 6e 74 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20  nt.  ** table.  
13df0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
13e00 69 66 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  if the constrain
13e10 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
13e20 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
13e30 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 3d 20 65        column = e
13e40 78 70 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e  xpr.  **.  ** an
13e50 64 20 77 65 20 61 72 65 20 65 76 61 6c 75 61 74  d we are evaluat
13e60 69 6e 67 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e  ing a join, then
13e70 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
13e80 6f 6e 20 63 6f 6c 75 6d 6e 20 69 73 20 0a 20 20  on column is .  
13e90 2a 2a 20 6f 6e 6c 79 20 76 61 6c 69 64 20 69 66  ** only valid if
13ea0 20 61 6c 6c 20 74 61 62 6c 65 73 20 72 65 66 65   all tables refe
13eb0 72 65 6e 63 65 64 20 69 6e 20 65 78 70 72 20 6f  renced in expr o
13ec0 63 63 75 72 20 74 6f 20 74 68 65 20 6c 65 66 74  ccur to the left
13ed0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62  .  ** of the tab
13ee0 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f  le containing co
13ef0 6c 75 6d 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lumn..  **.  ** 
13f00 54 68 65 20 61 43 6f 6e 73 74 72 61 69 6e 74 73  The aConstraints
13f10 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e  [] array contain
13f20 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  s entries for al
13f30 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  l constraints.  
13f40 2a 2a 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ** on the curren
13f50 74 20 74 61 62 6c 65 2e 20 20 54 68 61 74 20 77  t table.  That w
13f60 61 79 20 77 65 20 6f 6e 6c 79 20 68 61 76 65 20  ay we only have 
13f70 74 6f 20 63 6f 6d 70 75 74 65 20 69 74 20 6f 6e  to compute it on
13f80 63 65 0a 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f  ce.  ** even tho
13f90 75 67 68 20 77 65 20 6d 69 67 68 74 20 74 72 79  ugh we might try
13fa0 20 74 6f 20 70 69 63 6b 20 74 68 65 20 62 65 73   to pick the bes
13fb0 74 20 69 6e 64 65 78 20 6d 75 6c 74 69 70 6c 65  t index multiple
13fc0 20 74 69 6d 65 73 2e 0a 20 20 2a 2a 20 46 6f 72   times..  ** For
13fd0 20 65 61 63 68 20 61 74 74 65 6d 70 74 20 61 74   each attempt at
13fe0 20 70 69 63 6b 69 6e 67 20 61 6e 20 69 6e 64 65   picking an inde
13ff0 78 2c 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  x, the order of 
14000 74 61 62 6c 65 73 20 69 6e 20 74 68 65 0a 20 20  tables in the.  
14010 2a 2a 20 6a 6f 69 6e 20 6d 69 67 68 74 20 62 65  ** join might be
14020 20 64 69 66 66 65 72 65 6e 74 20 73 6f 20 77 65   different so we
14030 20 68 61 76 65 20 74 6f 20 72 65 63 6f 6d 70 75   have to recompu
14040 74 65 20 74 68 65 20 75 73 61 62 6c 65 20 66 6c  te the usable fl
14050 61 67 0a 20 20 2a 2a 20 65 61 63 68 20 74 69 6d  ag.  ** each tim
14060 65 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f  e..  */.  pIdxCo
14070 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71  ns = *(struct sq
14080 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
14090 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
140a0 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->aConstraint;
140b0 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49 64 78  .  pUsage = pIdx
140c0 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
140d0 74 55 73 61 67 65 3b 0a 20 20 66 6f 72 28 69 3d  tUsage;.  for(i=
140e0 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e  0; i<pIdxInfo->n
140f0 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c  Constraint; i++,
14100 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20   pIdxCons++){.  
14110 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e    j = pIdxCons->
14120 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20  iTermOffset;.   
14130 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
14140 5b 6a 5d 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  [j];.    pIdxCon
14150 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65  s->usable = (pTe
14160 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 26  rm->prereqRight&
14170 6e 6f 74 52 65 61 64 79 29 20 3f 20 30 20 3a 20  notReady) ? 0 : 
14180 31 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  1;.  }.  memset(
14190 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f  pUsage, 0, sizeo
141a0 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 70 49 64  f(pUsage[0])*pId
141b0 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
141c0 6e 74 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49  nt);.  if( pIdxI
141d0 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
141e0 64 78 53 74 72 20 29 7b 0a 20 20 20 20 73 71 6c  dxStr ){.    sql
141f0 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e  ite3_free(pIdxIn
14200 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 7d  fo->idxStr);.  }
14210 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  .  pIdxInfo->idx
14220 53 74 72 20 3d 20 30 3b 0a 20 20 70 49 64 78 49  Str = 0;.  pIdxI
14230 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b  nfo->idxNum = 0;
14240 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65  .  pIdxInfo->nee
14250 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20  dToFreeIdxStr = 
14260 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f  0;.  pIdxInfo->o
14270 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d  rderByConsumed =
14280 20 30 3b 0a 20 20 2f 2a 20 28 28 64 6f 75 62 6c   0;.  /* ((doubl
14290 65 29 32 29 20 49 6e 20 63 61 73 65 20 6f 66 20  e)2) In case of 
142a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
142b0 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f  TING_POINT... */
142c0 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74  .  pIdxInfo->est
142d0 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c  imatedCost = SQL
142e0 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28 28  ITE_BIG_DBL / ((
142f0 64 6f 75 62 6c 65 29 32 29 3b 0a 20 20 6e 4f 72  double)2);.  nOr
14300 64 65 72 42 79 20 3d 20 70 49 64 78 49 6e 66 6f  derBy = pIdxInfo
14310 2d 3e 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 66  ->nOrderBy;.  if
14320 28 20 21 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  ( !pOrderBy ){. 
14330 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72     pIdxInfo->nOr
14340 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a  derBy = 0;.  }..
14350 20 20 69 66 28 20 76 74 61 62 42 65 73 74 49 6e    if( vtabBestIn
14360 64 65 78 28 70 50 61 72 73 65 2c 20 70 54 61 62  dex(pParse, pTab
14370 2c 20 70 49 64 78 49 6e 66 6f 29 20 29 7b 0a 20  , pIdxInfo) ){. 
14380 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
14390 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73    pIdxCons = *(s
143a0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
143b0 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a  dex_constraint**
143c0 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
143d0 73 74 72 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69  straint;.  for(i
143e0 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e  =0; i<pIdxInfo->
143f0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
14400 29 7b 0a 20 20 20 20 69 66 28 20 70 55 73 61 67  ){.    if( pUsag
14410 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30  e[i].argvIndex>0
14420 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d   ){.      pCost-
14430 3e 75 73 65 64 20 7c 3d 20 70 57 43 2d 3e 61 5b  >used |= pWC->a[
14440 70 49 64 78 43 6f 6e 73 5b 69 5d 2e 69 54 65 72  pIdxCons[i].iTer
14450 6d 4f 66 66 73 65 74 5d 2e 70 72 65 72 65 71 52  mOffset].prereqR
14460 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ight;.    }.  }.
14470 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
14480 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
14490 61 75 73 65 2c 20 61 6e 64 20 74 68 65 20 73 65  ause, and the se
144a0 6c 65 63 74 65 64 20 76 69 72 74 75 61 6c 20 74  lected virtual t
144b0 61 62 6c 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20  able index.  ** 
144c0 64 6f 65 73 20 6e 6f 74 20 73 61 74 69 73 66 79  does not satisfy
144d0 20 69 74 2c 20 69 6e 63 72 65 61 73 65 20 74 68   it, increase th
144e0 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20 73 63  e cost of the sc
144f0 61 6e 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20  an accordingly. 
14500 54 68 69 73 0a 20 20 2a 2a 20 6d 61 74 63 68 65  This.  ** matche
14510 73 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  s the processing
14520 20 66 6f 72 20 6e 6f 6e 2d 76 69 72 74 75 61 6c   for non-virtual
14530 20 74 61 62 6c 65 73 20 69 6e 20 62 65 73 74 42   tables in bestB
14540 74 72 65 65 49 6e 64 65 78 28 29 2e 0a 20 20 2a  treeIndex()..  *
14550 2f 0a 20 20 72 43 6f 73 74 20 3d 20 70 49 64 78  /.  rCost = pIdx
14560 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
14570 6f 73 74 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  ost;.  if( pOrde
14580 72 42 79 20 26 26 20 70 49 64 78 49 6e 66 6f 2d  rBy && pIdxInfo-
14590 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
145a0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 43 6f 73 74  ==0 ){.    rCost
145b0 20 2b 3d 20 65 73 74 4c 6f 67 28 72 43 6f 73 74   += estLog(rCost
145c0 29 2a 72 43 6f 73 74 3b 0a 20 20 7d 0a 0a 20 20  )*rCost;.  }..  
145d0 2f 2a 20 54 68 65 20 63 6f 73 74 20 69 73 20 6e  /* The cost is n
145e0 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  ot allowed to be
145f0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 53 51 4c   larger than SQL
14600 49 54 45 5f 42 49 47 5f 44 42 4c 20 28 74 68 65  ITE_BIG_DBL (the
14610 0a 20 20 2a 2a 20 69 6e 69 74 61 6c 20 76 61 6c  .  ** inital val
14620 75 65 20 6f 66 20 6c 6f 77 65 73 74 43 6f 73 74  ue of lowestCost
14630 20 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2e 20 49   in this loop. I
14640 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 74 68  f it is, then th
14650 65 0a 20 20 2a 2a 20 28 63 6f 73 74 3c 6c 6f 77  e.  ** (cost<low
14660 65 73 74 43 6f 73 74 29 20 74 65 73 74 20 62 65  estCost) test be
14670 6c 6f 77 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  low will never b
14680 65 20 74 72 75 65 2e 0a 20 20 2a 2a 20 0a 20 20  e true..  ** .  
14690 2a 2a 20 55 73 65 20 22 28 64 6f 75 62 6c 65 29  ** Use "(double)
146a0 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 32  2" instead of "2
146b0 2e 30 22 20 69 6e 20 63 61 73 65 20 4f 4d 49 54  .0" in case OMIT
146c0 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 20  _FLOATING_POINT 
146d0 0a 20 20 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  .  ** is defined
146e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 53 51  ..  */.  if( (SQ
146f0 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f 28 28 64  LITE_BIG_DBL/((d
14700 6f 75 62 6c 65 29 32 29 29 3c 72 43 6f 73 74 20  ouble)2))<rCost 
14710 29 7b 0a 20 20 20 20 70 43 6f 73 74 2d 3e 72 43  ){.    pCost->rC
14720 6f 73 74 20 3d 20 28 53 51 4c 49 54 45 5f 42 49  ost = (SQLITE_BI
14730 47 5f 44 42 4c 2f 28 28 64 6f 75 62 6c 65 29 32  G_DBL/((double)2
14740 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
14750 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20   pCost->rCost = 
14760 72 43 6f 73 74 3b 0a 20 20 7d 0a 20 20 70 43 6f  rCost;.  }.  pCo
14770 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62  st->plan.u.pVtab
14780 49 64 78 20 3d 20 70 49 64 78 49 6e 66 6f 3b 0a  Idx = pIdxInfo;.
14790 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e    if( pIdxInfo->
147a0 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20  orderByConsumed 
147b0 29 7b 0a 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c  ){.    pCost->pl
147c0 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  an.wsFlags |= WH
147d0 45 52 45 5f 4f 52 44 45 52 42 59 3b 0a 20 20 7d  ERE_ORDERBY;.  }
147e0 0a 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 6e  .  pCost->plan.n
147f0 45 71 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e  Eq = 0;.  pIdxIn
14800 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e  fo->nOrderBy = n
14810 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 54  OrderBy;..  /* T
14820 72 79 20 74 6f 20 66 69 6e 64 20 61 20 6d 6f 72  ry to find a mor
14830 65 20 65 66 66 69 63 69 65 6e 74 20 61 63 63 65  e efficient acce
14840 73 73 20 70 61 74 74 65 72 6e 20 62 79 20 75 73  ss pattern by us
14850 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 69 6e 64  ing multiple ind
14860 65 78 65 73 0a 20 20 2a 2a 20 74 6f 20 6f 70 74  exes.  ** to opt
14870 69 6d 69 7a 65 20 61 6e 20 4f 52 20 65 78 70 72  imize an OR expr
14880 65 73 73 69 6f 6e 20 77 69 74 68 69 6e 20 74 68  ession within th
14890 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
148a0 0a 20 20 2a 2f 0a 20 20 62 65 73 74 4f 72 43 6c  .  */.  bestOrCl
148b0 61 75 73 65 49 6e 64 65 78 28 70 50 61 72 73 65  auseIndex(pParse
148c0 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74  , pWC, pSrc, not
148d0 52 65 61 64 79 2c 20 6e 6f 74 56 61 6c 69 64 2c  Ready, notValid,
148e0 20 70 4f 72 64 65 72 42 79 2c 20 70 43 6f 73 74   pOrderBy, pCost
148f0 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
14900 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
14910 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  ALTABLE */../*.*
14920 2a 20 41 72 67 75 6d 65 6e 74 20 70 49 64 78 20  * Argument pIdx 
14930 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
14940 61 6e 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  an index structu
14950 72 65 20 74 68 61 74 20 68 61 73 20 61 6e 20 61  re that has an a
14960 72 72 61 79 20 6f 66 0a 2a 2a 20 53 51 4c 49 54  rray of.** SQLIT
14970 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 20  E_INDEX_SAMPLES 
14980 65 76 65 6e 6c 79 20 73 70 61 63 65 64 20 73 61  evenly spaced sa
14990 6d 70 6c 65 73 20 6f 66 20 74 68 65 20 66 69 72  mples of the fir
149a0 73 74 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d  st indexed colum
149b0 6e 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 49  n.** stored in I
149c0 6e 64 65 78 2e 61 53 61 6d 70 6c 65 2e 20 54 68  ndex.aSample. Th
149d0 65 73 65 20 73 61 6d 70 6c 65 73 20 64 69 76 69  ese samples divi
149e0 64 65 20 74 68 65 20 64 6f 6d 61 69 6e 20 6f 66  de the domain of
149f0 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 0a 2a   values stored.*
14a00 2a 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f  * the index into
14a10 20 28 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53   (SQLITE_INDEX_S
14a20 41 4d 50 4c 45 53 2b 31 29 20 72 65 67 69 6f 6e  AMPLES+1) region
14a30 73 2e 0a 2a 2a 20 52 65 67 69 6f 6e 20 30 20 63  s..** Region 0 c
14a40 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 76 61 6c 75  ontains all valu
14a50 65 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  es less than the
14a60 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20 76 61   first sample va
14a70 6c 75 65 2e 20 52 65 67 69 6f 6e 0a 2a 2a 20 31  lue. Region.** 1
14a80 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 75 65 73   contains values
14a90 20 62 65 74 77 65 65 6e 20 74 68 65 20 66 69 72   between the fir
14aa0 73 74 20 61 6e 64 20 73 65 63 6f 6e 64 20 73 61  st and second sa
14ab0 6d 70 6c 65 73 2e 20 20 52 65 67 69 6f 6e 20 32  mples.  Region 2
14ac0 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 76 61 6c   contains.** val
14ad0 75 65 73 20 62 65 74 77 65 65 6e 20 73 61 6d 70  ues between samp
14ae0 6c 65 73 20 32 20 61 6e 64 20 33 2e 20 20 41 6e  les 2 and 3.  An
14af0 64 20 73 6f 20 6f 6e 2e 20 20 52 65 67 69 6f 6e  d so on.  Region
14b00 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41   SQLITE_INDEX_SA
14b10 4d 50 4c 45 53 0a 2a 2a 20 63 6f 6e 74 61 69 6e  MPLES.** contain
14b20 73 20 76 61 6c 75 65 73 20 6c 61 72 67 65 72 20  s values larger 
14b30 74 68 61 6e 20 74 68 65 20 6c 61 73 74 20 73 61  than the last sa
14b40 6d 70 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  mple..**.** If t
14b50 68 65 20 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e  he index contain
14b60 73 20 6d 61 6e 79 20 64 75 70 6c 69 63 61 74 65  s many duplicate
14b70 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 76 61  s of a single va
14b80 6c 75 65 2c 20 74 68 65 6e 20 69 74 20 69 73 0a  lue, then it is.
14b90 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  ** possible that
14ba0 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 61 64 6a   two or more adj
14bb0 61 63 65 6e 74 20 73 61 6d 70 6c 65 73 20 63 61  acent samples ca
14bc0 6e 20 68 6f 6c 64 20 74 68 65 20 73 61 6d 65 20  n hold the same 
14bd0 76 61 6c 75 65 2e 0a 2a 2a 20 57 68 65 6e 20 74  value..** When t
14be0 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c  hat is the case,
14bf0 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 70 6f   the smallest po
14c00 73 73 69 62 6c 65 20 72 65 67 69 6f 6e 20 63 6f  ssible region co
14c10 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  de is returned.*
14c20 2a 20 77 68 65 6e 20 72 6f 75 6e 64 55 70 20 69  * when roundUp i
14c30 73 20 66 61 6c 73 65 20 61 6e 64 20 74 68 65 20  s false and the 
14c40 6c 61 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65  largest possible
14c50 20 72 65 67 69 6f 6e 20 63 6f 64 65 20 69 73 20   region code is 
14c60 72 65 74 75 72 6e 65 64 0a 2a 2a 20 77 68 65 6e  returned.** when
14c70 20 72 6f 75 6e 64 55 70 20 69 73 20 74 72 75 65   roundUp is true
14c80 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
14c90 73 73 66 75 6c 2c 20 74 68 69 73 20 66 75 6e 63  ssful, this func
14ca0 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20  tion determines 
14cb0 77 68 69 63 68 20 6f 66 20 74 68 65 20 72 65 67  which of the reg
14cc0 69 6f 6e 73 20 76 61 6c 75 65 20 0a 2a 2a 20 70  ions value .** p
14cd0 56 61 6c 20 6c 69 65 73 20 69 6e 2c 20 73 65 74  Val lies in, set
14ce0 73 20 2a 70 69 52 65 67 69 6f 6e 20 74 6f 20 74  s *piRegion to t
14cf0 68 65 20 72 65 67 69 6f 6e 20 69 6e 64 65 78 20  he region index 
14d00 28 61 20 76 61 6c 75 65 20 62 65 74 77 65 65 6e  (a value between
14d10 20 30 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45   0.** and SQLITE
14d20 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 2b 31  _INDEX_SAMPLES+1
14d30 2c 20 69 6e 63 6c 75 73 69 76 65 29 20 61 6e 64  , inclusive) and
14d40 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
14d50 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 61 6e  OK..** Or, if an
14d60 20 4f 4f 4d 20 6f 63 63 75 72 73 20 77 68 69 6c   OOM occurs whil
14d70 65 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 65 78  e converting tex
14d80 74 20 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e  t values between
14d90 20 65 6e 63 6f 64 69 6e 67 73 2c 0a 2a 2a 20 53   encodings,.** S
14da0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
14db0 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 69 52  eturned and *piR
14dc0 65 67 69 6f 6e 20 69 73 20 75 6e 64 65 66 69 6e  egion is undefin
14dd0 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ed..*/.#ifdef SQ
14de0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
14df0 32 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  2.static int whe
14e00 72 65 52 61 6e 67 65 52 65 67 69 6f 6e 28 0a 20  reRangeRegion(. 
14e10 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
14e20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14e30 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
14e40 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ion */.  Index *
14e50 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  pIdx,           
14e60 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
14e70 20 63 6f 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e   consider domain
14e80 20 6f 66 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33   of */.  sqlite3
14e90 5f 76 61 6c 75 65 20 2a 70 56 61 6c 2c 20 20 20  _value *pVal,   
14ea0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
14eb0 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20 69   consider */.  i
14ec0 6e 74 20 72 6f 75 6e 64 55 70 2c 20 20 20 20 20  nt roundUp,     
14ed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
14ee0 74 75 72 6e 20 6c 61 72 67 65 73 74 20 76 61 6c  turn largest val
14ef0 69 64 20 72 65 67 69 6f 6e 20 69 66 20 74 72 75  id region if tru
14f00 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 52 65  e */.  int *piRe
14f10 67 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  gion            
14f20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 67 69 6f     /* OUT: Regio
14f30 6e 20 6f 66 20 64 6f 6d 61 69 6e 20 69 6e 20 77  n of domain in w
14f40 68 69 63 68 20 76 61 6c 75 65 20 6c 69 65 73 20  hich value lies 
14f50 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
14f60 72 6f 75 6e 64 55 70 3d 3d 30 20 7c 7c 20 72 6f  roundUp==0 || ro
14f70 75 6e 64 55 70 3d 3d 31 20 29 3b 0a 20 20 69 66  undUp==1 );.  if
14f80 28 20 41 4c 57 41 59 53 28 70 56 61 6c 29 20 29  ( ALWAYS(pVal) )
14f90 7b 0a 20 20 20 20 49 6e 64 65 78 53 61 6d 70 6c  {.    IndexSampl
14fa0 65 20 2a 61 53 61 6d 70 6c 65 20 3d 20 70 49 64  e *aSample = pId
14fb0 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 20 20  x->aSample;.    
14fc0 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 69  int i = 0;.    i
14fd0 6e 74 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74  nt eType = sqlit
14fe0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 56  e3_value_type(pV
14ff0 61 6c 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 54  al);..    if( eT
15000 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  ype==SQLITE_INTE
15010 47 45 52 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  GER || eType==SQ
15020 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20  LITE_FLOAT ){.  
15030 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73      double r = s
15040 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
15050 62 6c 65 28 70 56 61 6c 29 3b 0a 20 20 20 20 20  ble(pVal);.     
15060 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53 51 4c 49   for(i=0; i<SQLI
15070 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53  TE_INDEX_SAMPLES
15080 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
15090 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65  if( aSample[i].e
150a0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  Type==SQLITE_NUL
150b0 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  L ) continue;.  
150c0 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c        if( aSampl
150d0 65 5b 69 5d 2e 65 54 79 70 65 3e 3d 53 51 4c 49  e[i].eType>=SQLI
150e0 54 45 5f 54 45 58 54 20 29 20 62 72 65 61 6b 3b  TE_TEXT ) break;
150f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 6f 75  .        if( rou
15100 6e 64 55 70 20 29 7b 0a 20 20 20 20 20 20 20 20  ndUp ){.        
15110 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d    if( aSample[i]
15120 2e 75 2e 72 3e 72 20 29 20 62 72 65 61 6b 3b 0a  .u.r>r ) break;.
15130 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
15140 20 20 20 20 20 20 20 20 20 69 66 28 20 61 53 61           if( aSa
15150 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3e 3d 72 20 29  mple[i].u.r>=r )
15160 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
15170 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
15180 6c 73 65 20 69 66 28 20 65 54 79 70 65 3d 3d 53  lse if( eType==S
15190 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20  QLITE_NULL ){.  
151a0 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20 20      i = 0;.     
151b0 20 69 66 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a   if( roundUp ){.
151c0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69          while( i
151d0 3c 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41  <SQLITE_INDEX_SA
151e0 4d 50 4c 45 53 20 26 26 20 61 53 61 6d 70 6c 65  MPLES && aSample
151f0 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54  [i].eType==SQLIT
15200 45 5f 4e 55 4c 4c 20 29 20 69 2b 2b 3b 0a 20 20  E_NULL ) i++;.  
15210 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
15220 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20   .      sqlite3 
15230 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
15240 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  ;.      CollSeq 
15250 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 63 6f  *pColl;.      co
15260 6e 73 74 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20  nst u8 *z;.     
15270 20 69 6e 74 20 6e 3b 0a 0a 20 20 20 20 20 20 2f   int n;..      /
15280 2a 20 70 56 61 6c 20 63 6f 6d 65 73 20 66 72 6f  * pVal comes fro
15290 6d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72  m sqlite3ValueFr
152a0 6f 6d 45 78 70 72 28 29 20 73 6f 20 74 68 65 20  omExpr() so the 
152b0 74 79 70 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e  type cannot be N
152c0 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ULL */.      ass
152d0 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49  ert( eType==SQLI
152e0 54 45 5f 54 45 58 54 20 7c 7c 20 65 54 79 70 65  TE_TEXT || eType
152f0 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 3b  ==SQLITE_BLOB );
15300 0a 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ..      if( eTyp
15310 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29  e==SQLITE_BLOB )
15320 7b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 28 63  {.        z = (c
15330 6f 6e 73 74 20 75 38 20 2a 29 73 71 6c 69 74 65  onst u8 *)sqlite
15340 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70 56 61  3_value_blob(pVa
15350 6c 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  l);.        pCol
15360 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
15370 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  l;.        asser
15380 74 28 20 70 43 6f 6c 6c 2d 3e 65 6e 63 3d 3d 53  t( pColl->enc==S
15390 51 4c 49 54 45 5f 55 54 46 38 20 29 3b 0a 20 20  QLITE_UTF8 );.  
153a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
153b0 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
153c0 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 64 62 2c  e3GetCollSeq(db,
153d0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
153e0 20 2a 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 29 3b   *pIdx->azColl);
153f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
15400 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ll==0 ){.       
15410 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
15420 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
15430 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  uch collation se
15440 71 75 65 6e 63 65 3a 20 25 73 22 2c 0a 20 20 20  quence: %s",.   
15450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15460 20 20 20 20 20 20 20 2a 70 49 64 78 2d 3e 61 7a         *pIdx->az
15470 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  Coll);.         
15480 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
15490 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
154a0 20 20 20 20 20 20 20 20 7a 20 3d 20 28 63 6f 6e          z = (con
154b0 73 74 20 75 38 20 2a 29 73 71 6c 69 74 65 33 56  st u8 *)sqlite3V
154c0 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20 70  alueText(pVal, p
154d0 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20  Coll->enc);.    
154e0 20 20 20 20 69 66 28 20 21 7a 20 29 7b 0a 20 20      if( !z ){.  
154f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
15500 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
15510 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
15520 73 73 65 72 74 28 20 7a 20 26 26 20 70 43 6f 6c  ssert( z && pCol
15530 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  l && pColl->xCmp
15540 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
15550 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 56 61 6c    n = sqlite3Val
15560 75 65 42 79 74 65 73 28 70 56 61 6c 2c 20 70 43  ueBytes(pVal, pC
15570 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 0a 20 20 20 20  oll->enc);..    
15580 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53 51 4c    for(i=0; i<SQL
15590 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45  ITE_INDEX_SAMPLE
155a0 53 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  S; i++){.       
155b0 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20   int c;.        
155c0 69 6e 74 20 65 53 61 6d 70 6c 65 74 79 70 65 20  int eSampletype 
155d0 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79  = aSample[i].eTy
155e0 70 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pe;.        if( 
155f0 65 53 61 6d 70 6c 65 74 79 70 65 3d 3d 53 51 4c  eSampletype==SQL
15600 49 54 45 5f 4e 55 4c 4c 20 7c 7c 20 65 53 61 6d  ITE_NULL || eSam
15610 70 6c 65 74 79 70 65 3c 65 54 79 70 65 20 29 20  pletype<eType ) 
15620 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
15630 20 20 69 66 28 20 28 65 53 61 6d 70 6c 65 74 79    if( (eSamplety
15640 70 65 21 3d 65 54 79 70 65 29 20 29 20 62 72 65  pe!=eType) ) bre
15650 61 6b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ak;.#ifndef SQLI
15660 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
15670 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 2d        if( pColl-
15680 3e 65 6e 63 21 3d 53 51 4c 49 54 45 5f 55 54 46  >enc!=SQLITE_UTF
15690 38 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  8 ){.          i
156a0 6e 74 20 6e 53 61 6d 70 6c 65 3b 0a 20 20 20 20  nt nSample;.    
156b0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 61 6d        char *zSam
156c0 70 6c 65 20 3d 20 73 71 6c 69 74 65 33 55 74 66  ple = sqlite3Utf
156d0 38 74 6f 31 36 28 0a 20 20 20 20 20 20 20 20 20  8to16(.         
156e0 20 20 20 20 20 64 62 2c 20 70 43 6f 6c 6c 2d 3e       db, pColl->
156f0 65 6e 63 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  enc, aSample[i].
15700 75 2e 7a 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  u.z, aSample[i].
15710 6e 42 79 74 65 2c 20 26 6e 53 61 6d 70 6c 65 0a  nByte, &nSample.
15720 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
15730 20 20 20 20 20 20 20 69 66 28 20 21 7a 53 61 6d         if( !zSam
15740 70 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ple ){.         
15750 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
15760 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
15770 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
15780 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
15790 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
157a0 20 20 20 20 20 20 63 20 3d 20 70 43 6f 6c 6c 2d        c = pColl-
157b0 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73  >xCmp(pColl->pUs
157c0 65 72 2c 20 6e 53 61 6d 70 6c 65 2c 20 7a 53 61  er, nSample, zSa
157d0 6d 70 6c 65 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20  mple, n, z);.   
157e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
157f0 46 72 65 65 28 64 62 2c 20 7a 53 61 6d 70 6c 65  Free(db, zSample
15800 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
15810 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
15820 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  {.          c = 
15830 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c  pColl->xCmp(pCol
15840 6c 2d 3e 70 55 73 65 72 2c 20 61 53 61 6d 70 6c  l->pUser, aSampl
15850 65 5b 69 5d 2e 6e 42 79 74 65 2c 20 61 53 61 6d  e[i].nByte, aSam
15860 70 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 6e 2c 20 7a  ple[i].u.z, n, z
15870 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
15880 20 20 20 20 20 69 66 28 20 63 2d 72 6f 75 6e 64       if( c-round
15890 55 70 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  Up>=0 ) break;. 
158a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
158b0 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
158c0 26 20 69 3c 3d 53 51 4c 49 54 45 5f 49 4e 44 45  & i<=SQLITE_INDE
158d0 58 5f 53 41 4d 50 4c 45 53 20 29 3b 0a 20 20 20  X_SAMPLES );.   
158e0 20 2a 70 69 52 65 67 69 6f 6e 20 3d 20 69 3b 0a   *piRegion = i;.
158f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
15900 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
15910 20 20 20 2f 2a 20 23 69 66 64 65 66 20 53 51 4c     /* #ifdef SQL
15920 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32  ITE_ENABLE_STAT2
15930 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78   */../*.** If ex
15940 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 72  pression pExpr r
15950 65 70 72 65 73 65 6e 74 73 20 61 20 6c 69 74 65  epresents a lite
15960 72 61 6c 20 76 61 6c 75 65 2c 20 73 65 74 20 2a  ral value, set *
15970 70 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a  pp to point to.*
15980 2a 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c  * an sqlite3_val
15990 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ue structure con
159a0 74 61 69 6e 69 6e 67 20 74 68 65 20 73 61 6d 65  taining the same
159b0 20 76 61 6c 75 65 2c 20 77 69 74 68 20 61 66 66   value, with aff
159c0 69 6e 69 74 79 0a 2a 2a 20 61 66 66 20 61 70 70  inity.** aff app
159d0 6c 69 65 64 20 74 6f 20 69 74 2c 20 62 65 66 6f  lied to it, befo
159e0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 49 74  re returning. It
159f0 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
15a00 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 0a 2a  bility of the .*
15a10 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  * caller to even
15a20 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74  tually release t
15a30 68 69 73 20 73 74 72 75 63 74 75 72 65 20 62 79  his structure by
15a40 20 70 61 73 73 69 6e 67 20 69 74 20 74 6f 20 0a   passing it to .
15a50 2a 2a 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  ** sqlite3ValueF
15a60 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ree()..**.** If 
15a70 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 72 73  the current pars
15a80 65 20 69 73 20 61 20 72 65 63 6f 6d 70 69 6c 65  e is a recompile
15a90 20 28 73 71 6c 69 74 65 33 52 65 70 72 65 70 61   (sqlite3Reprepa
15aa0 72 65 28 29 29 20 61 6e 64 20 70 45 78 70 72 0a  re()) and pExpr.
15ab0 2a 2a 20 69 73 20 61 6e 20 53 51 4c 20 76 61 72  ** is an SQL var
15ac0 69 61 62 6c 65 20 74 68 61 74 20 63 75 72 72 65  iable that curre
15ad0 6e 74 6c 79 20 68 61 73 20 61 20 6e 6f 6e 2d 4e  ntly has a non-N
15ae0 55 4c 4c 20 76 61 6c 75 65 20 62 6f 75 6e 64 20  ULL value bound 
15af0 74 6f 20 69 74 2c 0a 2a 2a 20 63 72 65 61 74 65  to it,.** create
15b00 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   an sqlite3_valu
15b10 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  e structure cont
15b20 61 69 6e 69 6e 67 20 74 68 69 73 20 76 61 6c 75  aining this valu
15b30 65 2c 20 61 67 61 69 6e 20 77 69 74 68 0a 2a 2a  e, again with.**
15b40 20 61 66 66 69 6e 69 74 79 20 61 66 66 20 61 70   affinity aff ap
15b50 70 6c 69 65 64 20 74 6f 20 69 74 2c 20 69 6e 73  plied to it, ins
15b60 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  tead..**.** If n
15b70 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 61 62  either of the ab
15b80 6f 76 65 20 61 70 70 6c 79 2c 20 73 65 74 20 2a  ove apply, set *
15b90 70 70 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  pp to NULL..**.*
15ba0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
15bb0 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20  curs, return an 
15bc0 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65  error code. Othe
15bd0 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
15be0 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
15bf0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a  TE_ENABLE_STAT2.
15c00 73 74 61 74 69 63 20 69 6e 74 20 76 61 6c 75 65  static int value
15c10 46 72 6f 6d 45 78 70 72 28 0a 20 20 50 61 72 73  FromExpr(.  Pars
15c20 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45 78  e *pParse, .  Ex
15c30 70 72 20 2a 70 45 78 70 72 2c 20 0a 20 20 75 38  pr *pExpr, .  u8
15c40 20 61 66 66 2c 20 0a 20 20 73 71 6c 69 74 65 33   aff, .  sqlite3
15c50 5f 76 61 6c 75 65 20 2a 2a 70 70 0a 29 7b 0a 20  _value **pp.){. 
15c60 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
15c70 54 4b 5f 56 41 52 49 41 42 4c 45 0a 20 20 20 7c  TK_VARIABLE.   |
15c80 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  | (pExpr->op==TK
15c90 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 45 78  _REGISTER && pEx
15ca0 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 56 41 52 49  pr->op2==TK_VARI
15cb0 41 42 4c 45 29 0a 20 20 29 7b 0a 20 20 20 20 69  ABLE).  ){.    i
15cc0 6e 74 20 69 56 61 72 20 3d 20 70 45 78 70 72 2d  nt iVar = pExpr-
15cd0 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71  >iColumn;.    sq
15ce0 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d  lite3VdbeSetVarm
15cf0 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62  ask(pParse->pVdb
15d00 65 2c 20 69 56 61 72 29 3b 20 2f 2a 20 49 4d 50  e, iVar); /* IMP
15d10 3a 20 52 2d 32 33 32 35 37 2d 30 32 37 37 38 20  : R-23257-02778 
15d20 2a 2f 0a 20 20 20 20 2a 70 70 20 3d 20 73 71 6c  */.    *pp = sql
15d30 69 74 65 33 56 64 62 65 47 65 74 56 61 6c 75 65  ite3VdbeGetValue
15d40 28 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70  (pParse->pReprep
15d50 61 72 65 2c 20 69 56 61 72 2c 20 61 66 66 29 3b  are, iVar, aff);
15d60 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
15d70 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74  TE_OK;.  }.  ret
15d80 75 72 6e 20 73 71 6c 69 74 65 33 56 61 6c 75 65  urn sqlite3Value
15d90 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2d  FromExpr(pParse-
15da0 3e 64 62 2c 20 70 45 78 70 72 2c 20 53 51 4c 49  >db, pExpr, SQLI
15db0 54 45 5f 55 54 46 38 2c 20 61 66 66 2c 20 70 70  TE_UTF8, aff, pp
15dc0 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
15dd0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
15de0 20 69 73 20 75 73 65 64 20 74 6f 20 65 73 74 69   is used to esti
15df0 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
15e00 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
15e10 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20  l be visited.** 
15e20 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69  by scanning an i
15e30 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65  ndex for a range
15e40 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20   of values. The 
15e50 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61  range may have a
15e60 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64  n upper.** bound
15e70 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c  , a lower bound,
15e80 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48   or both. The WH
15e90 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
15ea0 20 74 68 61 74 20 73 65 74 20 74 68 65 20 75 70   that set the up
15eb0 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72  per.** and lower
15ec0 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72   bounds are repr
15ed0 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65  esented by pLowe
15ee0 72 20 61 6e 64 20 70 55 70 70 65 72 20 72 65 73  r and pUpper res
15ef0 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a  pectively. For.*
15f00 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d  * example, assum
15f10 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20 70  ing that index p
15f20 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a   is on t1(a):.**
15f30 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
15f40 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e  1 WHERE a > ? AN
15f50 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20  D a < ? ....**  
15f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f70 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f    |_____|   |___
15f80 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  __|.**          
15f90 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
15fa0 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
15fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fc0 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70 65 72  pLower    pUpper
15fd0 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  .**.** If either
15fe0 20 6f 66 20 74 68 65 20 75 70 70 65 72 20 6f 72   of the upper or
15ff0 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20   lower bound is 
16000 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65  not present, the
16010 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64  n NULL is passed
16020 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20   in.** place of 
16030 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
16040 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a  g WhereTerm..**.
16050 2a 2a 20 54 68 65 20 6e 45 71 20 70 61 72 61 6d  ** The nEq param
16060 65 74 65 72 20 69 73 20 70 61 73 73 65 64 20 74  eter is passed t
16070 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
16080 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 73 75 62  index column sub
16090 6a 65 63 74 20 74 6f 20 74 68 65 0a 2a 2a 20 72  ject to the.** r
160a0 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e  ange constraint.
160b0 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c   Or, equivalentl
160c0 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  y, the number of
160d0 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
160e0 61 69 6e 74 73 0a 2a 2a 20 6f 70 74 69 6d 69 7a  aints.** optimiz
160f0 65 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f 73  ed by the propos
16100 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46  ed index scan. F
16110 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75  or example, assu
16120 6d 69 6e 67 20 69 6e 64 65 78 20 70 20 69 73 0a  ming index p is.
16130 2a 2a 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20  ** on t1(a, b), 
16140 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65 72  and the SQL quer
16150 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  y is:.**.**   ..
16160 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
16170 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20  a = ? AND b > ? 
16180 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND b < ? ....**
16190 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 73 68 6f  .** then nEq sho
161a0 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 74 68  uld be passed th
161b0 65 20 76 61 6c 75 65 20 31 20 28 61 73 20 74 68  e value 1 (as th
161c0 65 20 72 61 6e 67 65 20 72 65 73 74 72 69 63 74  e range restrict
161d0 65 64 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 62 2c  ed column,.** b,
161e0 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 6c   is the second l
161f0 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  eft-most column 
16200 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20 4f  of the index). O
16210 72 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 20  r, if the query 
16220 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20  is:.**.**   ... 
16230 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
16240 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e  > ? AND a < ? ..
16250 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71  ..**.** then nEq
16260 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65   should be passe
16270 64 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  d 0..**.** The r
16280 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73  eturned value is
16290 20 61 6e 20 69 6e 74 65 67 65 72 20 62 65 74 77   an integer betw
162a0 65 65 6e 20 31 20 61 6e 64 20 31 30 30 2c 20 69  een 1 and 100, i
162b0 6e 63 6c 75 73 69 76 65 2e 20 41 20 72 65 74 75  nclusive. A retu
162c0 72 6e 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 31  rn.** value of 1
162d0 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
162e0 74 68 65 20 70 72 6f 70 6f 73 65 64 20 72 61 6e  the proposed ran
162f0 67 65 20 73 63 61 6e 20 69 73 20 65 78 70 65 63  ge scan is expec
16300 74 65 64 20 74 6f 20 76 69 73 69 74 0a 2a 2a 20  ted to visit.** 
16310 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 20 31 2f  approximately 1/
16320 31 30 30 74 68 20 28 31 25 29 20 6f 66 20 74 68  100th (1%) of th
16330 65 20 72 6f 77 73 20 73 65 6c 65 63 74 65 64 20  e rows selected 
16340 62 79 20 74 68 65 20 6e 45 71 20 65 71 75 61 6c  by the nEq equal
16350 69 74 79 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e  ity.** constrain
16360 74 73 20 28 69 66 20 61 6e 79 29 2e 20 41 20 72  ts (if any). A r
16370 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 31  eturn value of 1
16380 30 30 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  00 indicates tha
16390 74 20 69 74 20 69 73 20 65 78 70 65 63 74 65 64  t it is expected
163a0 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 72 61 6e  .** that the ran
163b0 67 65 20 73 63 61 6e 20 77 69 6c 6c 20 76 69 73  ge scan will vis
163c0 69 74 20 65 76 65 72 79 20 72 6f 77 20 28 31 30  it every row (10
163d0 30 25 29 20 73 65 6c 65 63 74 65 64 20 62 79 20  0%) selected by 
163e0 74 68 65 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20  the equality.** 
163f0 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 2a 2a 0a  constraints..**.
16400 2a 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63  ** In the absenc
16410 65 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74  e of sqlite_stat
16420 32 20 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20  2 ANALYZE data, 
16430 65 61 63 68 20 72 61 6e 67 65 20 69 6e 65 71 75  each range inequ
16440 61 6c 69 74 79 0a 2a 2a 20 72 65 64 75 63 65 73  ality.** reduces
16450 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
16460 65 20 62 79 20 32 2f 33 72 64 73 2e 20 20 48 65  e by 2/3rds.  He
16470 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 63 6f 6e  nce a single con
16480 73 74 72 61 69 6e 74 20 28 78 3e 3f 29 0a 2a 2a  straint (x>?).**
16490 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 72 65   results in a re
164a0 74 75 72 6e 20 6f 66 20 33 33 20 61 6e 64 20 61  turn of 33 and a
164b0 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
164c0 74 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20  t (x>? AND x<?) 
164d0 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 20 61 20  results.** in a 
164e0 72 65 74 75 72 6e 20 6f 66 20 31 31 2e 0a 2a 2f  return of 11..*/
164f0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
16500 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 0a 20  eRangeScanEst(. 
16510 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
16520 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
16530 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
16540 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
16550 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
16560 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
16570 78 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  x containing the
16580 20 72 61 6e 67 65 2d 63 6f 6d 70 61 72 65 64 20   range-compared 
16590 63 6f 6c 75 6d 6e 3b 20 22 78 22 20 2a 2f 0a 20  column; "x" */. 
165a0 20 69 6e 74 20 6e 45 71 2c 20 20 20 20 20 20 20   int nEq,       
165b0 20 20 20 20 20 20 2f 2a 20 69 6e 64 65 78 20 69        /* index i
165c0 6e 74 6f 20 70 2d 3e 61 43 6f 6c 5b 5d 20 6f 66  nto p->aCol[] of
165d0 20 74 68 65 20 72 61 6e 67 65 2d 63 6f 6d 70 61   the range-compa
165e0 72 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  red column */.  
165f0 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65  WhereTerm *pLowe
16600 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f  r,   /* Lower bo
16610 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65  und on the range
16620 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69  . ex: "x>123" Mi
16630 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
16640 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70   WhereTerm *pUpp
16650 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62  er,   /* Upper b
16660 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67  ound on the rang
16670 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d  e. ex: "x<455" M
16680 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
16690 20 20 69 6e 74 20 2a 70 69 45 73 74 20 20 20 20    int *piEst    
166a0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
166b0 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 29  eturn value */.)
166c0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
166d0 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66 20  ITE_OK;..#ifdef 
166e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
166f0 41 54 32 0a 0a 20 20 69 66 28 20 6e 45 71 3d 3d  AT2..  if( nEq==
16700 30 20 26 26 20 70 2d 3e 61 53 61 6d 70 6c 65 20  0 && p->aSample 
16710 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
16720 61 6c 75 65 20 2a 70 4c 6f 77 65 72 56 61 6c 20  alue *pLowerVal 
16730 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
16740 5f 76 61 6c 75 65 20 2a 70 55 70 70 65 72 56 61  _value *pUpperVa
16750 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  l = 0;.    int i
16760 45 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 4c 6f  Est;.    int iLo
16770 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  wer = 0;.    int
16780 20 69 55 70 70 65 72 20 3d 20 53 51 4c 49 54 45   iUpper = SQLITE
16790 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 3b 0a  _INDEX_SAMPLES;.
167a0 20 20 20 20 69 6e 74 20 72 6f 75 6e 64 55 70 55      int roundUpU
167b0 70 70 65 72 3b 0a 20 20 20 20 69 6e 74 20 72 6f  pper;.    int ro
167c0 75 6e 64 55 70 4c 6f 77 65 72 3b 0a 20 20 20 20  undUpLower;.    
167d0 75 38 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62  u8 aff = p->pTab
167e0 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f  le->aCol[p->aiCo
167f0 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e 69 74  lumn[0]].affinit
16800 79 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c 6f 77  y;..    if( pLow
16810 65 72 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  er ){.      Expr
16820 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77 65 72   *pExpr = pLower
16830 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
16840 0a 20 20 20 20 20 20 72 63 20 3d 20 76 61 6c 75  .      rc = valu
16850 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65  eFromExpr(pParse
16860 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 26 70  , pExpr, aff, &p
16870 4c 6f 77 65 72 56 61 6c 29 3b 0a 20 20 20 20 20  LowerVal);.     
16880 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72 2d   assert( pLower-
16890 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 47  >eOperator==WO_G
168a0 54 20 7c 7c 20 70 4c 6f 77 65 72 2d 3e 65 4f 70  T || pLower->eOp
168b0 65 72 61 74 6f 72 3d 3d 57 4f 5f 47 45 20 29 3b  erator==WO_GE );
168c0 0a 20 20 20 20 20 20 72 6f 75 6e 64 55 70 4c 6f  .      roundUpLo
168d0 77 65 72 20 3d 20 28 70 4c 6f 77 65 72 2d 3e 65  wer = (pLower->e
168e0 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 47 54 29  Operator==WO_GT)
168f0 20 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a 20 20 20   ?1:0;.    }.   
16900 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16910 4f 4b 20 26 26 20 70 55 70 70 65 72 20 29 7b 0a  OK && pUpper ){.
16920 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
16930 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45 78 70  r = pUpper->pExp
16940 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
16950 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45   rc = valueFromE
16960 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78 70  xpr(pParse, pExp
16970 72 2c 20 61 66 66 2c 20 26 70 55 70 70 65 72 56  r, aff, &pUpperV
16980 61 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  al);.      asser
16990 74 28 20 70 55 70 70 65 72 2d 3e 65 4f 70 65 72  t( pUpper->eOper
169a0 61 74 6f 72 3d 3d 57 4f 5f 4c 54 20 7c 7c 20 70  ator==WO_LT || p
169b0 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Upper->eOperator
169c0 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20  ==WO_LE );.     
169d0 20 72 6f 75 6e 64 55 70 55 70 70 65 72 20 3d 20   roundUpUpper = 
169e0 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74  (pUpper->eOperat
169f0 6f 72 3d 3d 57 4f 5f 4c 45 29 20 3f 31 3a 30 3b  or==WO_LE) ?1:0;
16a00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
16a10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
16a20 20 28 70 4c 6f 77 65 72 56 61 6c 3d 3d 30 20 26   (pLowerVal==0 &
16a30 26 20 70 55 70 70 65 72 56 61 6c 3d 3d 30 29 20  & pUpperVal==0) 
16a40 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16a50 56 61 6c 75 65 46 72 65 65 28 70 4c 6f 77 65 72  ValueFree(pLower
16a60 56 61 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Val);.      sqli
16a70 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 55 70  te3ValueFree(pUp
16a80 70 65 72 56 61 6c 29 3b 0a 20 20 20 20 20 20 67  perVal);.      g
16a90 6f 74 6f 20 72 61 6e 67 65 5f 65 73 74 5f 66 61  oto range_est_fa
16aa0 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 7d 65 6c 73  llback;.    }els
16ab0 65 20 69 66 28 20 70 4c 6f 77 65 72 56 61 6c 3d  e if( pLowerVal=
16ac0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
16ad0 20 77 68 65 72 65 52 61 6e 67 65 52 65 67 69 6f   whereRangeRegio
16ae0 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70 55 70  n(pParse, p, pUp
16af0 70 65 72 56 61 6c 2c 20 72 6f 75 6e 64 55 70 55  perVal, roundUpU
16b00 70 70 65 72 2c 20 26 69 55 70 70 65 72 29 3b 0a  pper, &iUpper);.
16b10 20 20 20 20 20 20 69 66 28 20 70 4c 6f 77 65 72        if( pLower
16b20 20 29 20 69 4c 6f 77 65 72 20 3d 20 69 55 70 70   ) iLower = iUpp
16b30 65 72 2f 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20  er/2;.    }else 
16b40 69 66 28 20 70 55 70 70 65 72 56 61 6c 3d 3d 30  if( pUpperVal==0
16b50 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
16b60 68 65 72 65 52 61 6e 67 65 52 65 67 69 6f 6e 28  hereRangeRegion(
16b70 70 50 61 72 73 65 2c 20 70 2c 20 70 4c 6f 77 65  pParse, p, pLowe
16b80 72 56 61 6c 2c 20 72 6f 75 6e 64 55 70 4c 6f 77  rVal, roundUpLow
16b90 65 72 2c 20 26 69 4c 6f 77 65 72 29 3b 0a 20 20  er, &iLower);.  
16ba0 20 20 20 20 69 66 28 20 70 55 70 70 65 72 20 29      if( pUpper )
16bb0 20 69 55 70 70 65 72 20 3d 20 28 69 4c 6f 77 65   iUpper = (iLowe
16bc0 72 20 2b 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  r + SQLITE_INDEX
16bd0 5f 53 41 4d 50 4c 45 53 20 2b 20 31 29 2f 32 3b  _SAMPLES + 1)/2;
16be0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16bf0 20 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e 67    rc = whereRang
16c00 65 52 65 67 69 6f 6e 28 70 50 61 72 73 65 2c 20  eRegion(pParse, 
16c10 70 2c 20 70 55 70 70 65 72 56 61 6c 2c 20 72 6f  p, pUpperVal, ro
16c20 75 6e 64 55 70 55 70 70 65 72 2c 20 26 69 55 70  undUpUpper, &iUp
16c30 70 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  per);.      if( 
16c40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
16c50 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68  .        rc = wh
16c60 65 72 65 52 61 6e 67 65 52 65 67 69 6f 6e 28 70  ereRangeRegion(p
16c70 50 61 72 73 65 2c 20 70 2c 20 70 4c 6f 77 65 72  Parse, p, pLower
16c80 56 61 6c 2c 20 72 6f 75 6e 64 55 70 4c 6f 77 65  Val, roundUpLowe
16c90 72 2c 20 26 69 4c 6f 77 65 72 29 3b 0a 20 20 20  r, &iLower);.   
16ca0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 57     }.    }.    W
16cb0 48 45 52 45 54 52 41 43 45 28 28 22 72 61 6e 67  HERETRACE(("rang
16cc0 65 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20  e scan regions: 
16cd0 25 64 2e 2e 25 64 5c 6e 22 2c 20 69 4c 6f 77 65  %d..%d\n", iLowe
16ce0 72 2c 20 69 55 70 70 65 72 29 29 3b 0a 0a 20 20  r, iUpper));..  
16cf0 20 20 69 45 73 74 20 3d 20 69 55 70 70 65 72 20    iEst = iUpper 
16d00 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20 74 65  - iLower;.    te
16d10 73 74 63 61 73 65 28 20 69 45 73 74 3d 3d 53 51  stcase( iEst==SQ
16d20 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c  LITE_INDEX_SAMPL
16d30 45 53 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ES );.    assert
16d40 28 20 69 45 73 74 3c 3d 53 51 4c 49 54 45 5f 49  ( iEst<=SQLITE_I
16d50 4e 44 45 58 5f 53 41 4d 50 4c 45 53 20 29 3b 0a  NDEX_SAMPLES );.
16d60 20 20 20 20 69 66 28 20 69 45 73 74 3c 31 20 29      if( iEst<1 )
16d70 7b 0a 20 20 20 20 20 20 2a 70 69 45 73 74 20 3d  {.      *piEst =
16d80 20 35 30 2f 53 51 4c 49 54 45 5f 49 4e 44 45 58   50/SQLITE_INDEX
16d90 5f 53 41 4d 50 4c 45 53 3b 0a 20 20 20 20 7d 65  _SAMPLES;.    }e
16da0 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 69 45 73  lse{.      *piEs
16db0 74 20 3d 20 28 69 45 73 74 2a 31 30 30 29 2f 53  t = (iEst*100)/S
16dc0 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50  QLITE_INDEX_SAMP
16dd0 4c 45 53 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  LES;.    }.    s
16de0 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
16df0 70 4c 6f 77 65 72 56 61 6c 29 3b 0a 20 20 20 20  pLowerVal);.    
16e00 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
16e10 28 70 55 70 70 65 72 56 61 6c 29 3b 0a 20 20 20  (pUpperVal);.   
16e20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
16e30 72 61 6e 67 65 5f 65 73 74 5f 66 61 6c 6c 62 61  range_est_fallba
16e40 63 6b 3a 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53  ck:.#else.  UNUS
16e50 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61  ED_PARAMETER(pPa
16e60 72 73 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  rse);.  UNUSED_P
16e70 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 55  ARAMETER(p);.  U
16e80 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
16e90 6e 45 71 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  nEq);.#endif.  a
16ea0 73 73 65 72 74 28 20 70 4c 6f 77 65 72 20 7c 7c  ssert( pLower ||
16eb0 20 70 55 70 70 65 72 20 29 3b 0a 20 20 2a 70 69   pUpper );.  *pi
16ec0 45 73 74 20 3d 20 31 30 30 3b 0a 20 20 69 66 28  Est = 100;.  if(
16ed0 20 70 4c 6f 77 65 72 20 26 26 20 28 70 4c 6f 77   pLower && (pLow
16ee0 65 72 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  er->wtFlags & TE
16ef0 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 20 2a  RM_VNULL)==0 ) *
16f00 70 69 45 73 74 20 2f 3d 20 33 3b 0a 20 20 69 66  piEst /= 3;.  if
16f10 28 20 70 55 70 70 65 72 20 29 20 2a 70 69 45 73  ( pUpper ) *piEs
16f20 74 20 2f 3d 20 33 3b 0a 20 20 72 65 74 75 72 6e  t /= 3;.  return
16f30 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
16f40 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
16f50 54 32 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  T2./*.** Estimat
16f60 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
16f70 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62  rows that will b
16f80 65 20 72 65 74 75 72 6e 65 64 20 62 61 73 65 64  e returned based
16f90 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69   on.** an equali
16fa0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d  ty constraint x=
16fb0 56 41 4c 55 45 20 61 6e 64 20 77 68 65 72 65 20  VALUE and where 
16fc0 74 68 61 74 20 56 41 4c 55 45 20 6f 63 63 75 72  that VALUE occur
16fd0 73 20 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74  s in.** the hist
16fe0 6f 67 72 61 6d 20 64 61 74 61 2e 20 20 54 68 69  ogram data.  Thi
16ff0 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65  s only works whe
17000 6e 20 78 20 69 73 20 74 68 65 20 6c 65 66 74 2d  n x is the left-
17010 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f  most.** column o
17020 66 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 73  f an index and s
17030 71 6c 69 74 65 5f 73 74 61 74 32 20 68 69 73 74  qlite_stat2 hist
17040 6f 67 72 61 6d 20 64 61 74 61 20 69 73 20 61 76  ogram data is av
17050 61 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74  ailable.** for t
17060 68 61 74 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  hat index..**.**
17070 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69 6d   Write the estim
17080 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69  ated row count i
17090 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72  nto *pnRow and r
170a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
170b0 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74   .** If unable t
170c0 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61  o make an estima
170d0 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77  te, leave *pnRow
170e0 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72   unchanged and r
170f0 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
17100 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  o..**.** This ro
17110 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69  utine can fail i
17120 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74  f it is unable t
17130 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69  o load a collati
17140 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72  ng sequence.** r
17150 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72 69  equired for stri
17160 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f  ng comparison, o
17170 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61  r if unable to a
17180 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a  llocate memory.*
17190 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76  * for a UTF conv
171a0 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ersion required 
171b0 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  for comparison. 
171c0 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73 74   The error is st
171d0 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70  ored.** in the p
171e0 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
171f0 0a 2a 2f 0a 69 6e 74 20 77 68 65 72 65 45 71 75  .*/.int whereEqu
17200 61 6c 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  alScanEst(.  Par
17210 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
17220 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
17230 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
17240 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65  ontext */.  Inde
17250 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
17260 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 68   /* The index wh
17270 6f 73 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f  ose left-most co
17280 6c 75 6d 6e 20 69 73 20 70 54 65 72 6d 20 2a 2f  lumn is pTerm */
17290 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
172a0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
172b0 73 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20  ssion for VALUE 
172c0 69 6e 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63  in the x=VALUE c
172d0 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 64  onstraint */.  d
172e0 6f 75 62 6c 65 20 2a 70 6e 52 6f 77 20 20 20 20  ouble *pnRow    
172f0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
17300 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74   revised row est
17310 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b  imate here */.){
17320 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
17330 20 2a 70 52 68 73 20 3d 20 30 3b 20 20 2f 2a 20   *pRhs = 0;  /* 
17340 56 41 4c 55 45 20 6f 6e 20 72 69 67 68 74 2d 68  VALUE on right-h
17350 61 6e 64 20 73 69 64 65 20 6f 66 20 70 54 65 72  and side of pTer
17360 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 77 65  m */.  int iLowe
17370 72 2c 20 69 55 70 70 65 72 3b 20 20 20 20 20 20  r, iUpper;      
17380 20 2f 2a 20 52 61 6e 67 65 20 6f 66 20 68 69 73   /* Range of his
17390 74 6f 67 72 61 6d 20 72 65 67 69 6f 6e 73 20 63  togram regions c
173a0 6f 6e 74 61 69 6e 69 6e 67 20 70 52 68 73 20 2a  ontaining pRhs *
173b0 2f 0a 20 20 75 38 20 61 66 66 3b 20 20 20 20 20  /.  u8 aff;     
173c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
173d0 20 43 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79   Column affinity
173e0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
173f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17400 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72  /* Subfunction r
17410 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
17420 64 6f 75 62 6c 65 20 6e 52 6f 77 45 73 74 3b 20  double nRowEst; 
17430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
17440 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
17450 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
17460 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  */..  assert( p-
17470 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20  >aSample!=0 );. 
17480 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65   aff = p->pTable
17490 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75  ->aCol[p->aiColu
174a0 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e 69 74 79 3b  mn[0]].affinity;
174b0 0a 20 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f  .  rc = valueFro
174c0 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45  mExpr(pParse, pE
174d0 78 70 72 2c 20 61 66 66 2c 20 26 70 52 68 73 29  xpr, aff, &pRhs)
174e0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
174f0 6f 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e  o whereEqualScan
17500 45 73 74 5f 63 61 6e 63 65 6c 3b 0a 20 20 69 66  Est_cancel;.  if
17510 28 20 70 52 68 73 3d 3d 30 20 29 20 72 65 74 75  ( pRhs==0 ) retu
17520 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
17530 4e 44 3b 0a 20 20 72 63 20 3d 20 77 68 65 72 65  ND;.  rc = where
17540 52 61 6e 67 65 52 65 67 69 6f 6e 28 70 50 61 72  RangeRegion(pPar
17550 73 65 2c 20 70 2c 20 70 52 68 73 2c 20 30 2c 20  se, p, pRhs, 0, 
17560 26 69 4c 6f 77 65 72 29 3b 0a 20 20 69 66 28 20  &iLower);.  if( 
17570 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 45  rc ) goto whereE
17580 71 75 61 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63  qualScanEst_canc
17590 65 6c 3b 0a 20 20 72 63 20 3d 20 77 68 65 72 65  el;.  rc = where
175a0 52 61 6e 67 65 52 65 67 69 6f 6e 28 70 50 61 72  RangeRegion(pPar
175b0 73 65 2c 20 70 2c 20 70 52 68 73 2c 20 31 2c 20  se, p, pRhs, 1, 
175c0 26 69 55 70 70 65 72 29 3b 0a 20 20 69 66 28 20  &iUpper);.  if( 
175d0 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 45  rc ) goto whereE
175e0 71 75 61 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63  qualScanEst_canc
175f0 65 6c 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45  el;.  WHERETRACE
17600 28 28 22 65 71 75 61 6c 69 74 79 20 73 63 61 6e  (("equality scan
17610 20 72 65 67 69 6f 6e 73 3a 20 25 64 2e 2e 25 64   regions: %d..%d
17620 5c 6e 22 2c 20 69 4c 6f 77 65 72 2c 20 69 55 70  \n", iLower, iUp
17630 70 65 72 29 29 3b 0a 20 20 69 66 28 20 69 4c 6f  per));.  if( iLo
17640 77 65 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20  wer>=iUpper ){. 
17650 20 20 20 6e 52 6f 77 45 73 74 20 3d 20 70 2d 3e     nRowEst = p->
17660 61 69 52 6f 77 45 73 74 5b 30 5d 2f 28 53 51 4c  aiRowEst[0]/(SQL
17670 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45  ITE_INDEX_SAMPLE
17680 53 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 6e 52  S*2);.    if( nR
17690 6f 77 45 73 74 3c 2a 70 6e 52 6f 77 20 29 20 2a  owEst<*pnRow ) *
176a0 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b  pnRow = nRowEst;
176b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 52  .  }else{.    nR
176c0 6f 77 45 73 74 20 3d 20 28 69 55 70 70 65 72 2d  owEst = (iUpper-
176d0 69 4c 6f 77 65 72 29 2a 70 2d 3e 61 69 52 6f 77  iLower)*p->aiRow
176e0 45 73 74 5b 30 5d 2f 53 51 4c 49 54 45 5f 49 4e  Est[0]/SQLITE_IN
176f0 44 45 58 5f 53 41 4d 50 4c 45 53 3b 0a 20 20 20  DEX_SAMPLES;.   
17700 20 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73   *pnRow = nRowEs
17710 74 3b 0a 20 20 7d 0a 0a 77 68 65 72 65 45 71 75  t;.  }..whereEqu
17720 61 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63 65 6c  alScanEst_cancel
17730 3a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  :.  sqlite3Value
17740 46 72 65 65 28 70 52 68 73 29 3b 0a 20 20 72 65  Free(pRhs);.  re
17750 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
17760 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c  f /* defined(SQL
17770 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32  ITE_ENABLE_STAT2
17780 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  ) */..#ifdef SQL
17790 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32  ITE_ENABLE_STAT2
177a0 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
177b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
177c0 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
177d0 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f  returned based o
177e0 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74  n.** an IN const
177f0 72 61 69 6e 74 20 77 68 65 72 65 20 74 68 65 20  raint where the 
17800 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
17810 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
17820 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74 20  or.** is a list 
17830 6f 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61 6d  of values.  Exam
17840 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ple:.**.**      
17850 20 20 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c    WHERE x IN (1,
17860 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69  2,3,4).**.** Wri
17870 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  te the estimated
17880 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20   row count into 
17890 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72  *pnRow and retur
178a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a  n SQLITE_OK. .**
178b0 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61   If unable to ma
178c0 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20  ke an estimate, 
178d0 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63  leave *pnRow unc
178e0 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72  hanged and retur
178f0 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  n.** non-zero..*
17900 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
17910 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74  e can fail if it
17920 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f   is unable to lo
17930 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ad a collating s
17940 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69  equence.** requi
17950 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63  red for string c
17960 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66  omparison, or if
17970 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63   unable to alloc
17980 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  ate memory.** fo
17990 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69  r a UTF conversi
179a0 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  on required for 
179b0 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65  comparison.  The
179c0 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64   error is stored
179d0 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73  .** in the pPars
179e0 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
179f0 69 6e 74 20 77 68 65 72 65 49 6e 53 63 61 6e 45  int whereInScanE
17a00 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
17a10 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
17a20 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
17a30 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
17a40 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c 20 20  */.  Index *p,  
17a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
17a60 20 69 6e 64 65 78 20 77 68 6f 73 65 20 6c 65 66   index whose lef
17a70 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 69 73  t-most column is
17a80 20 70 54 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72   pTerm */.  Expr
17a90 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
17aa0 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6c 69   /* The value li
17ab0 73 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66  st on the RHS of
17ac0 20 22 78 20 49 4e 20 28 76 31 2c 76 32 2c 76 33   "x IN (v1,v2,v3
17ad0 2c 2e 2e 2e 29 22 20 2a 2f 0a 20 20 64 6f 75 62  ,...)" */.  doub
17ae0 6c 65 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20  le *pnRow       
17af0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65   /* Write the re
17b00 76 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61  vised row estima
17b10 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  te here */.){.  
17b20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
17b30 56 61 6c 20 3d 20 30 3b 20 20 2f 2a 20 4f 6e 65  Val = 0;  /* One
17b40 20 76 61 6c 75 65 20 66 72 6f 6d 20 6c 69 73 74   value from list
17b50 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 77 65 72   */.  int iLower
17b60 2c 20 69 55 70 70 65 72 3b 20 20 20 20 20 20 20  , iUpper;       
17b70 2f 2a 20 52 61 6e 67 65 20 6f 66 20 68 69 73 74  /* Range of hist
17b80 6f 67 72 61 6d 20 72 65 67 69 6f 6e 73 20 63 6f  ogram regions co
17b90 6e 74 61 69 6e 69 6e 67 20 70 52 68 73 20 2a 2f  ntaining pRhs */
17ba0 0a 20 20 75 38 20 61 66 66 3b 20 20 20 20 20 20  .  u8 aff;      
17bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17bc0 43 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20  Column affinity 
17bd0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
17be0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f  LITE_OK;       /
17bf0 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65  * Subfunction re
17c00 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 64  turn code */.  d
17c10 6f 75 62 6c 65 20 6e 52 6f 77 45 73 74 3b 20 20  ouble nRowEst;  
17c20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
17c30 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
17c40 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a  number of rows *
17c50 2f 0a 20 20 69 6e 74 20 6e 53 70 61 6e 20 3d 20  /.  int nSpan = 
17c60 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
17c70 20 4e 75 6d 62 65 72 20 6f 66 20 68 69 73 74 6f   Number of histo
17c80 67 72 61 6d 20 72 65 67 69 6f 6e 73 20 73 70 61  gram regions spa
17c90 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  nned */.  int nS
17ca0 69 6e 67 6c 65 20 3d 20 30 3b 20 20 20 20 20 20  ingle = 0;      
17cb0 20 20 20 20 2f 2a 20 48 69 73 74 6f 67 72 61 6d      /* Histogram
17cc0 20 72 65 67 69 6f 6e 73 20 68 69 74 20 62 79 20   regions hit by 
17cd0 61 20 73 69 6e 67 6c 65 20 76 61 6c 75 65 20 2a  a single value *
17ce0 2f 0a 20 20 69 6e 74 20 6e 4e 6f 74 46 6f 75 6e  /.  int nNotFoun
17cf0 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  d = 0;        /*
17d00 20 43 6f 75 6e 74 20 6f 66 20 76 61 6c 75 65 73   Count of values
17d10 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 63 6f   that are not co
17d20 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  nstants */.  int
17d30 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
17d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d50 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
17d60 72 20 2a 2f 0a 20 20 75 38 20 61 53 70 61 6e 5b  r */.  u8 aSpan[
17d70 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d  SQLITE_INDEX_SAM
17d80 50 4c 45 53 2b 31 5d 3b 20 20 20 20 2f 2a 20 48  PLES+1];    /* H
17d90 69 73 74 6f 67 72 61 6d 20 72 65 67 69 6f 6e 73  istogram regions
17da0 20 74 68 61 74 20 61 72 65 20 73 70 61 6e 6e 65   that are spanne
17db0 64 20 2a 2f 0a 20 20 75 38 20 61 53 69 6e 67 6c  d */.  u8 aSingl
17dc0 65 5b 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53  e[SQLITE_INDEX_S
17dd0 41 4d 50 4c 45 53 2b 31 5d 3b 20 20 2f 2a 20 48  AMPLES+1];  /* H
17de0 69 73 74 6f 67 72 61 6d 20 72 65 67 69 6f 6e 73  istogram regions
17df0 20 68 69 74 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20   hit once */..  
17e00 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70  assert( p->aSamp
17e10 6c 65 21 3d 30 20 29 3b 0a 20 20 61 66 66 20 3d  le!=0 );.  aff =
17e20 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c   p->pTable->aCol
17e30 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 5d  [p->aiColumn[0]]
17e40 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 6d 65 6d  .affinity;.  mem
17e50 73 65 74 28 61 53 70 61 6e 2c 20 30 2c 20 73 69  set(aSpan, 0, si
17e60 7a 65 6f 66 28 61 53 70 61 6e 29 29 3b 0a 20 20  zeof(aSpan));.  
17e70 6d 65 6d 73 65 74 28 61 53 69 6e 67 6c 65 2c 20  memset(aSingle, 
17e80 30 2c 20 73 69 7a 65 6f 66 28 61 53 69 6e 67 6c  0, sizeof(aSingl
17e90 65 29 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  e));.  for(i=0; 
17ea0 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
17eb0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
17ec0 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
17ed0 3b 0a 20 20 20 20 72 63 20 3d 20 76 61 6c 75 65  ;.    rc = value
17ee0 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c  FromExpr(pParse,
17ef0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
17f00 70 72 2c 20 61 66 66 2c 20 26 70 56 61 6c 29 3b  pr, aff, &pVal);
17f10 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72  .    if( rc ) br
17f20 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 56 61  eak;.    if( pVa
17f30 6c 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f  l==0 || sqlite3_
17f40 76 61 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29  value_type(pVal)
17f50 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b  ==SQLITE_NULL ){
17f60 0a 20 20 20 20 20 20 6e 4e 6f 74 46 6f 75 6e 64  .      nNotFound
17f70 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  ++;.      contin
17f80 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ue;.    }.    rc
17f90 20 3d 20 77 68 65 72 65 52 61 6e 67 65 52 65 67   = whereRangeReg
17fa0 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ion(pParse, p, p
17fb0 56 61 6c 2c 20 30 2c 20 26 69 4c 6f 77 65 72 29  Val, 0, &iLower)
17fc0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 62  ;.    if( rc ) b
17fd0 72 65 61 6b 3b 0a 20 20 20 20 72 63 20 3d 20 77  reak;.    rc = w
17fe0 68 65 72 65 52 61 6e 67 65 52 65 67 69 6f 6e 28  hereRangeRegion(
17ff0 70 50 61 72 73 65 2c 20 70 2c 20 70 56 61 6c 2c  pParse, p, pVal,
18000 20 31 2c 20 26 69 55 70 70 65 72 29 3b 0a 20 20   1, &iUpper);.  
18010 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
18020 3b 0a 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72  ;.    if( iLower
18030 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20  >=iUpper ){.    
18040 20 20 61 53 69 6e 67 6c 65 5b 69 4c 6f 77 65 72    aSingle[iLower
18050 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  ] = 1;.    }else
18060 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
18070 69 4c 6f 77 65 72 3e 3d 30 20 26 26 20 69 55 70  iLower>=0 && iUp
18080 70 65 72 3c 3d 53 51 4c 49 54 45 5f 49 4e 44 45  per<=SQLITE_INDE
18090 58 5f 53 41 4d 50 4c 45 53 20 29 3b 0a 20 20 20  X_SAMPLES );.   
180a0 20 20 20 77 68 69 6c 65 28 20 69 4c 6f 77 65 72     while( iLower
180b0 3c 69 55 70 70 65 72 20 29 20 61 53 70 61 6e 5b  <iUpper ) aSpan[
180c0 69 4c 6f 77 65 72 2b 2b 5d 20 3d 20 31 3b 0a 20  iLower++] = 1;. 
180d0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
180e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
180f0 20 20 20 20 66 6f 72 28 69 3d 6e 53 70 61 6e 3d      for(i=nSpan=
18100 30 3b 20 69 3c 3d 53 51 4c 49 54 45 5f 49 4e 44  0; i<=SQLITE_IND
18110 45 58 5f 53 41 4d 50 4c 45 53 3b 20 69 2b 2b 29  EX_SAMPLES; i++)
18120 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53 70 61  {.      if( aSpa
18130 6e 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  n[i] ){.        
18140 6e 53 70 61 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d  nSpan++;.      }
18150 65 6c 73 65 20 69 66 28 20 61 53 69 6e 67 6c 65  else if( aSingle
18160 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  [i] ){.        n
18170 53 69 6e 67 6c 65 2b 2b 3b 0a 20 20 20 20 20 20  Single++;.      
18180 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 52 6f 77  }.    }.    nRow
18190 45 73 74 20 3d 20 28 6e 53 70 61 6e 2a 32 2b 6e  Est = (nSpan*2+n
181a0 53 69 6e 67 6c 65 29 2a 70 2d 3e 61 69 52 6f 77  Single)*p->aiRow
181b0 45 73 74 5b 30 5d 2f 28 32 2a 53 51 4c 49 54 45  Est[0]/(2*SQLITE
181c0 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 29 0a  _INDEX_SAMPLES).
181d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
181e0 20 6e 4e 6f 74 46 6f 75 6e 64 2a 70 2d 3e 61 69   nNotFound*p->ai
181f0 52 6f 77 45 73 74 5b 31 5d 3b 0a 20 20 20 20 69  RowEst[1];.    i
18200 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 70 2d 3e  f( nRowEst > p->
18210 61 69 52 6f 77 45 73 74 5b 30 5d 20 29 20 6e 52  aiRowEst[0] ) nR
18220 6f 77 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f 77  owEst = p->aiRow
18230 45 73 74 5b 30 5d 3b 0a 20 20 20 20 2a 70 6e 52  Est[0];.    *pnR
18240 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20  ow = nRowEst;.  
18250 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 49    WHERETRACE(("I
18260 4e 20 72 6f 77 20 65 73 74 69 6d 61 74 65 3a 20  N row estimate: 
18270 6e 53 70 61 6e 3d 25 64 2c 20 6e 53 69 6e 67 6c  nSpan=%d, nSingl
18280 65 3d 25 64 2c 20 6e 4e 6f 74 46 6f 75 6e 64 3d  e=%d, nNotFound=
18290 25 64 2c 20 65 73 74 3d 25 67 5c 6e 22 2c 0a 20  %d, est=%g\n",. 
182a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182b0 6e 53 70 61 6e 2c 20 6e 53 69 6e 67 6c 65 2c 20  nSpan, nSingle, 
182c0 6e 4e 6f 74 46 6f 75 6e 64 2c 20 6e 52 6f 77 45  nNotFound, nRowE
182d0 73 74 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  st));.  }.  sqli
182e0 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
182f0 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  l);.  return rc;
18300 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  .}.#endif /* def
18310 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
18320 4c 45 5f 53 54 41 54 32 29 20 2a 2f 0a 0a 0a 2f  LE_STAT2) */.../
18330 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 71 75  *.** Find the qu
18340 65 72 79 20 70 6c 61 6e 20 66 6f 72 20 61 63 63  ery plan for acc
18350 65 73 73 69 6e 67 20 61 20 70 61 72 74 69 63 75  essing a particu
18360 6c 61 72 20 74 61 62 6c 65 2e 20 20 57 72 69 74  lar table.  Writ
18370 65 20 74 68 65 0a 2a 2a 20 62 65 73 74 20 71 75  e the.** best qu
18380 65 72 79 20 70 6c 61 6e 20 61 6e 64 20 69 74 73  ery plan and its
18390 20 63 6f 73 74 20 69 6e 74 6f 20 74 68 65 20 57   cost into the W
183a0 68 65 72 65 43 6f 73 74 20 6f 62 6a 65 63 74 20  hereCost object 
183b0 73 75 70 70 6c 69 65 64 20 61 73 20 74 68 65 0a  supplied as the.
183c0 2a 2a 20 6c 61 73 74 20 70 61 72 61 6d 65 74 65  ** last paramete
183d0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 6f 77  r..**.** The low
183e0 65 73 74 20 63 6f 73 74 20 70 6c 61 6e 20 77 69  est cost plan wi
183f0 6e 73 2e 20 20 54 68 65 20 63 6f 73 74 20 69 73  ns.  The cost is
18400 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20   an estimate of 
18410 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 0a 2a 2a  the amount of.**
18420 20 43 50 55 20 61 6e 64 20 64 69 73 6b 20 49 2f   CPU and disk I/
18430 4f 20 6e 65 65 64 20 74 6f 20 70 72 6f 63 65 73  O need to proces
18440 73 20 74 68 65 20 72 65 71 75 65 73 74 20 75 73  s the request us
18450 69 6e 67 20 74 68 65 20 73 65 6c 65 63 74 65 64  ing the selected
18460 20 70 6c 61 6e 2e 0a 2a 2a 20 46 61 63 74 6f 72   plan..** Factor
18470 73 20 74 68 61 74 20 69 6e 66 6c 75 65 6e 63 65  s that influence
18480 20 63 6f 73 74 20 69 6e 63 6c 75 64 65 3a 0a 2a   cost include:.*
18490 2a 0a 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 65  *.**    *  The e
184a0 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20  stimated number 
184b0 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
184c0 6c 20 62 65 20 72 65 74 72 69 65 76 65 64 2e 20  l be retrieved. 
184d0 20 28 54 68 65 0a 2a 2a 20 20 20 20 20 20 20 66   (The.**       f
184e0 65 77 65 72 20 74 68 65 20 62 65 74 74 65 72 2e  ewer the better.
184f0 29 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68  ).**.**    *  Wh
18500 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 73 6f 72  ether or not sor
18510 74 69 6e 67 20 6d 75 73 74 20 6f 63 63 75 72 2e  ting must occur.
18520 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65  .**.**    *  Whe
18530 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 72  ther or not ther
18540 65 20 6d 75 73 74 20 62 65 20 73 65 70 61 72 61  e must be separa
18550 74 65 20 6c 6f 6f 6b 75 70 73 20 69 6e 20 74 68  te lookups in th
18560 65 0a 2a 2a 20 20 20 20 20 20 20 69 6e 64 65 78  e.**       index
18570 20 61 6e 64 20 69 6e 20 74 68 65 20 6d 61 69 6e   and in the main
18580 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
18590 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e   there was an IN
185a0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20  DEXED BY clause 
185b0 28 70 53 72 63 2d 3e 70 49 6e 64 65 78 29 20 61  (pSrc->pIndex) a
185c0 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74  ttached to the t
185d0 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 53  able in.** the S
185e0 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  QL statement, th
185f0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
18600 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 73 20   only considers 
18610 70 6c 61 6e 73 20 75 73 69 6e 67 20 74 68 65 20  plans using the 
18620 0a 2a 2a 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e  .** named index.
18630 20 49 66 20 6e 6f 20 73 75 63 68 20 70 6c 61 6e   If no such plan
18640 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20   is found, then 
18650 74 68 65 20 72 65 74 75 72 6e 65 64 20 63 6f 73  the returned cos
18660 74 20 69 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  t is.** SQLITE_B
18670 49 47 5f 44 42 4c 2e 20 49 66 20 61 20 70 6c 61  IG_DBL. If a pla
18680 6e 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74 20  n is found that 
18690 75 73 65 73 20 74 68 65 20 6e 61 6d 65 64 20 69  uses the named i
186a0 6e 64 65 78 2c 20 0a 2a 2a 20 74 68 65 6e 20 74  ndex, .** then t
186b0 68 65 20 63 6f 73 74 20 69 73 20 63 61 6c 63 75  he cost is calcu
186c0 6c 61 74 65 64 20 69 6e 20 74 68 65 20 75 73 75  lated in the usu
186d0 61 6c 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  al way..**.** If
186e0 20 61 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63   a NOT INDEXED c
186f0 6c 61 75 73 65 20 28 70 53 72 63 2d 3e 6e 6f 74  lause (pSrc->not
18700 49 6e 64 65 78 65 64 21 3d 30 29 20 77 61 73 20  Indexed!=0) was 
18710 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
18720 74 61 62 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65  table .** in the
18730 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
18740 74 2c 20 74 68 65 6e 20 6e 6f 20 69 6e 64 65 78  t, then no index
18750 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  es are considere
18760 64 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20  d. However, the 
18770 0a 2a 2a 20 73 65 6c 65 63 74 65 64 20 70 6c 61  .** selected pla
18780 6e 20 6d 61 79 20 73 74 69 6c 6c 20 74 61 6b 65  n may still take
18790 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68   advantage of th
187a0 65 20 74 61 62 6c 65 73 20 62 75 69 6c 74 2d 69  e tables built-i
187b0 6e 20 72 6f 77 69 64 0a 2a 2a 20 69 6e 64 65 78  n rowid.** index
187c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
187d0 20 62 65 73 74 42 74 72 65 65 49 6e 64 65 78 28   bestBtreeIndex(
187e0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
187f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
18800 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
18810 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
18820 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
18830 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
18840 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
18850 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
18860 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54  tem *pSrc,  /* T
18870 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
18880 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  erm to search */
18890 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
188a0 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ady,           /
188b0 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72  * Mask of cursor
188c0 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  s not available 
188d0 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a  for indexing */.
188e0 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 56 61 6c    Bitmask notVal
188f0 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  id,           /*
18900 20 43 75 72 73 6f 72 73 20 6e 6f 74 20 61 76 61   Cursors not ava
18910 69 6c 61 62 6c 65 20 66 6f 72 20 61 6e 79 20 70  ilable for any p
18920 75 72 70 6f 73 65 20 2a 2f 0a 20 20 45 78 70 72  urpose */.  Expr
18930 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
18940 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f          /* The O
18950 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
18960 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 2a 70  /.  WhereCost *p
18970 43 6f 73 74 20 20 20 20 20 20 20 20 20 20 20 20  Cost            
18980 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74 20 71  /* Lowest cost q
18990 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a  uery plan */.){.
189a0 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 53 72    int iCur = pSr
189b0 63 2d 3e 69 43 75 72 73 6f 72 3b 20 20 20 2f 2a  c->iCursor;   /*
189c0 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74   The cursor of t
189d0 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 61  he table to be a
189e0 63 63 65 73 73 65 64 20 2a 2f 0a 20 20 49 6e 64  ccessed */.  Ind
189f0 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20  ex *pProbe;     
18a00 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
18a10 6e 64 65 78 20 77 65 20 61 72 65 20 65 76 61 6c  ndex we are eval
18a20 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65  uating */.  Inde
18a30 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
18a40 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
18a50 6f 66 20 70 50 72 6f 62 65 2c 20 6f 72 20 7a 65  of pProbe, or ze
18a60 72 6f 20 66 6f 72 20 49 50 4b 20 69 6e 64 65 78  ro for IPK index
18a70 20 2a 2f 0a 20 20 69 6e 74 20 65 71 54 65 72 6d   */.  int eqTerm
18a80 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
18a90 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6d 61 73    /* Current mas
18aa0 6b 20 6f 66 20 76 61 6c 69 64 20 65 71 75 61 6c  k of valid equal
18ab0 69 74 79 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f  ity operators */
18ac0 0a 20 20 69 6e 74 20 69 64 78 45 71 54 65 72 6d  .  int idxEqTerm
18ad0 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 2f  Mask;          /
18ae0 2a 20 49 6e 64 65 78 20 6d 61 73 6b 20 6f 66 20  * Index mask of 
18af0 76 61 6c 69 64 20 65 71 75 61 6c 69 74 79 20 6f  valid equality o
18b00 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 49 6e  perators */.  In
18b10 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20  dex sPk;        
18b20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66            /* A f
18b30 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74  ake index object
18b40 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79   for the primary
18b50 20 6b 65 79 20 2a 2f 0a 20 20 75 6e 73 69 67 6e   key */.  unsign
18b60 65 64 20 69 6e 74 20 61 69 52 6f 77 45 73 74 50  ed int aiRowEstP
18b70 6b 5b 32 5d 3b 20 2f 2a 20 54 68 65 20 61 69 52  k[2]; /* The aiR
18b80 6f 77 45 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f  owEst[] value fo
18b90 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20  r the sPk index 
18ba0 2a 2f 0a 20 20 69 6e 74 20 61 69 43 6f 6c 75 6d  */.  int aiColum
18bb0 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  nPk = -1;       
18bc0 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b   /* The aColumn[
18bd0 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  ] value for the 
18be0 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  sPk index */.  i
18bf0 6e 74 20 77 73 46 6c 61 67 4d 61 73 6b 3b 20 20  nt wsFlagMask;  
18c00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
18c10 6c 6f 77 65 64 20 66 6c 61 67 73 20 69 6e 20 70  lowed flags in p
18c20 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  Cost->plan.wsFla
18c30 67 20 2a 2f 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  g */..  /* Initi
18c40 61 6c 69 7a 65 20 74 68 65 20 63 6f 73 74 20 74  alize the cost t
18c50 6f 20 61 20 77 6f 72 73 74 2d 63 61 73 65 20 76  o a worst-case v
18c60 61 6c 75 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  alue */.  memset
18c70 28 70 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f  (pCost, 0, sizeo
18c80 66 28 2a 70 43 6f 73 74 29 29 3b 0a 20 20 70 43  f(*pCost));.  pC
18c90 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20 53 51 4c  ost->rCost = SQL
18ca0 49 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 0a 20 20  ITE_BIG_DBL;..  
18cb0 2f 2a 20 49 66 20 74 68 65 20 70 53 72 63 20 74  /* If the pSrc t
18cc0 61 62 6c 65 20 69 73 20 74 68 65 20 72 69 67 68  able is the righ
18cd0 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46  t table of a LEF
18ce0 54 20 4a 4f 49 4e 20 74 68 65 6e 20 77 65 20 6d  T JOIN then we m
18cf0 61 79 20 6e 6f 74 0a 20 20 2a 2a 20 75 73 65 20  ay not.  ** use 
18d00 61 6e 20 69 6e 64 65 78 20 74 6f 20 73 61 74 69  an index to sati
18d10 73 66 79 20 49 53 20 4e 55 4c 4c 20 63 6f 6e 73  sfy IS NULL cons
18d20 74 72 61 69 6e 74 73 20 6f 6e 20 74 68 61 74 20  traints on that 
18d30 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 0a  table.  This is.
18d40 20 20 2a 2a 20 62 65 63 61 75 73 65 20 63 6f 6c    ** because col
18d50 75 6d 6e 73 20 6d 69 67 68 74 20 65 6e 64 20 75  umns might end u
18d60 70 20 62 65 69 6e 67 20 4e 55 4c 4c 20 69 66 20  p being NULL if 
18d70 74 68 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e  the table does n
18d80 6f 74 20 6d 61 74 63 68 20 2d 0a 20 20 2a 2a 20  ot match -.  ** 
18d90 61 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 77  a circumstance w
18da0 68 69 63 68 20 74 68 65 20 69 6e 64 65 78 20 63  hich the index c
18db0 61 6e 6e 6f 74 20 68 65 6c 70 20 75 73 20 64 69  annot help us di
18dc0 73 63 6f 76 65 72 2e 20 20 54 69 63 6b 65 74 20  scover.  Ticket 
18dd0 23 32 31 37 37 2e 0a 20 20 2a 2f 0a 20 20 69 66  #2177..  */.  if
18de0 28 20 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65  ( pSrc->jointype
18df0 20 26 20 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20   & JT_LEFT ){.  
18e00 20 20 69 64 78 45 71 54 65 72 6d 4d 61 73 6b 20    idxEqTermMask 
18e10 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a 20  = WO_EQ|WO_IN;. 
18e20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 45   }else{.    idxE
18e30 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45  qTermMask = WO_E
18e40 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c  Q|WO_IN|WO_ISNUL
18e50 4c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53  L;.  }..  if( pS
18e60 72 63 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20  rc->pIndex ){.  
18e70 20 20 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44 20    /* An INDEXED 
18e80 42 59 20 63 6c 61 75 73 65 20 73 70 65 63 69 66  BY clause specif
18e90 69 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72  ies a particular
18ea0 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 2a 2f   index to use */
18eb0 0a 20 20 20 20 70 49 64 78 20 3d 20 70 50 72 6f  .    pIdx = pPro
18ec0 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64 65  be = pSrc->pInde
18ed0 78 3b 0a 20 20 20 20 77 73 46 6c 61 67 4d 61 73  x;.    wsFlagMas
18ee0 6b 20 3d 20 7e 28 57 48 45 52 45 5f 52 4f 57 49  k = ~(WHERE_ROWI
18ef0 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44  D_EQ|WHERE_ROWID
18f00 5f 52 41 4e 47 45 29 3b 0a 20 20 20 20 65 71 54  _RANGE);.    eqT
18f10 65 72 6d 4d 61 73 6b 20 3d 20 69 64 78 45 71 54  ermMask = idxEqT
18f20 65 72 6d 4d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65  ermMask;.  }else
18f30 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69  {.    /* There i
18f40 73 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20  s no INDEXED BY 
18f50 63 6c 61 75 73 65 2e 20 20 43 72 65 61 74 65 20  clause.  Create 
18f60 61 20 66 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a  a fake Index obj
18f70 65 63 74 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65  ect to.    ** re
18f80 70 72 65 73 65 6e 74 20 74 68 65 20 70 72 69 6d  present the prim
18f90 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 20 20 49  ary key */.    I
18fa0 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20  ndex *pFirst;   
18fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18fc0 41 6e 79 20 6f 74 68 65 72 20 69 6e 64 65 78 20  Any other index 
18fd0 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  on the table */.
18fe0 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50 6b 2c      memset(&sPk,
18ff0 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64 65 78   0, sizeof(Index
19000 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 43 6f 6c  ));.    sPk.nCol
19010 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b  umn = 1;.    sPk
19020 2e 61 69 43 6f 6c 75 6d 6e 20 3d 20 26 61 69 43  .aiColumn = &aiC
19030 6f 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20 73 50 6b  olumnPk;.    sPk
19040 2e 61 69 52 6f 77 45 73 74 20 3d 20 61 69 52 6f  .aiRowEst = aiRo
19050 77 45 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e  wEstPk;.    sPk.
19060 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70  onError = OE_Rep
19070 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54  lace;.    sPk.pT
19080 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61  able = pSrc->pTa
19090 62 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50  b;.    aiRowEstP
190a0 6b 5b 30 5d 20 3d 20 70 53 72 63 2d 3e 70 54 61  k[0] = pSrc->pTa
190b0 62 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20  b->nRowEst;.    
190c0 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20 3d 20  aiRowEstPk[1] = 
190d0 31 3b 0a 20 20 20 20 70 46 69 72 73 74 20 3d 20  1;.    pFirst = 
190e0 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64  pSrc->pTab->pInd
190f0 65 78 3b 0a 20 20 20 20 69 66 28 20 70 53 72 63  ex;.    if( pSrc
19100 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20  ->notIndexed==0 
19110 29 7b 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65  ){.      sPk.pNe
19120 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20  xt = pFirst;.   
19130 20 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20   }.    pProbe = 
19140 26 73 50 6b 3b 0a 20 20 20 20 77 73 46 6c 61 67  &sPk;.    wsFlag
19150 4d 61 73 6b 20 3d 20 7e 28 0a 20 20 20 20 20 20  Mask = ~(.      
19160 20 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49    WHERE_COLUMN_I
19170 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  N|WHERE_COLUMN_E
19180 51 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e  Q|WHERE_COLUMN_N
19190 55 4c 4c 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  ULL|WHERE_COLUMN
191a0 5f 52 41 4e 47 45 0a 20 20 20 20 29 3b 0a 20 20  _RANGE.    );.  
191b0 20 20 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57    eqTermMask = W
191c0 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20 20 20  O_EQ|WO_IN;.    
191d0 70 49 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  pIdx = 0;.  }.. 
191e0 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c   /* Loop over al
191f0 6c 20 69 6e 64 69 63 65 73 20 6c 6f 6f 6b 69 6e  l indices lookin
19200 67 20 66 6f 72 20 74 68 65 20 62 65 73 74 20 6f  g for the best o
19210 6e 65 20 74 6f 20 75 73 65 0a 20 20 2a 2f 0a 20  ne to use.  */. 
19220 20 66 6f 72 28 3b 20 70 50 72 6f 62 65 3b 20 70   for(; pProbe; p
19230 49 64 78 3d 70 50 72 6f 62 65 3d 70 50 72 6f 62  Idx=pProbe=pProb
19240 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 63  e->pNext){.    c
19250 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 69 6e  onst unsigned in
19260 74 20 2a 20 63 6f 6e 73 74 20 61 69 52 6f 77 45  t * const aiRowE
19270 73 74 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52  st = pProbe->aiR
19280 6f 77 45 73 74 3b 0a 20 20 20 20 64 6f 75 62 6c  owEst;.    doubl
19290 65 20 63 6f 73 74 3b 20 20 20 20 20 20 20 20 20  e cost;         
192a0 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f         /* Cost o
192b0 66 20 75 73 69 6e 67 20 70 50 72 6f 62 65 20 2a  f using pProbe *
192c0 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 6e 52 6f  /.    double nRo
192d0 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
192e0 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e    /* Estimated n
192f0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
19300 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
19310 20 20 20 69 6e 74 20 72 65 76 3b 20 20 20 20 20     int rev;     
19320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19330 2a 20 54 72 75 65 20 74 6f 20 73 63 61 6e 20 69  * True to scan i
19340 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
19350 2a 2f 0a 20 20 20 20 69 6e 74 20 77 73 46 6c 61  */.    int wsFla
19360 67 73 20 3d 20 30 3b 0a 20 20 20 20 42 69 74 6d  gs = 0;.    Bitm
19370 61 73 6b 20 75 73 65 64 20 3d 20 30 3b 0a 0a 20  ask used = 0;.. 
19380 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
19390 69 6e 67 20 76 61 72 69 61 62 6c 65 73 20 61 72  ing variables ar
193a0 65 20 70 6f 70 75 6c 61 74 65 64 20 62 61 73 65  e populated base
193b0 64 20 6f 6e 20 74 68 65 20 70 72 6f 70 65 72 74  d on the propert
193c0 69 65 73 20 6f 66 0a 20 20 20 20 2a 2a 20 73 63  ies of.    ** sc
193d0 61 6e 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74  an being evaluat
193e0 65 64 2e 20 54 68 65 79 20 61 72 65 20 74 68 65  ed. They are the
193f0 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  n used to determ
19400 69 6e 65 20 74 68 65 20 65 78 70 65 63 74 65 64  ine the expected
19410 0a 20 20 20 20 2a 2a 20 63 6f 73 74 20 61 6e 64  .    ** cost and
19420 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
19430 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 2a 2a  returned..    **
19440 0a 20 20 20 20 2a 2a 20 20 6e 45 71 3a 20 0a 20  .    **  nEq: . 
19450 20 20 20 2a 2a 20 20 20 20 4e 75 6d 62 65 72 20     **    Number 
19460 6f 66 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d  of equality term
19470 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 69 6d  s that can be im
19480 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20  plemented using 
19490 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a  the index..    *
194a0 2a 0a 20 20 20 20 2a 2a 20 20 6e 49 6e 4d 75 6c  *.    **  nInMul
194b0 3a 20 20 0a 20 20 20 20 2a 2a 20 20 20 20 54 68  :  .    **    Th
194c0 65 20 22 69 6e 2d 6d 75 6c 74 69 70 6c 69 65 72  e "in-multiplier
194d0 22 2e 20 54 68 69 73 20 69 73 20 61 6e 20 65 73  ". This is an es
194e0 74 69 6d 61 74 65 20 6f 66 20 68 6f 77 20 6d 61  timate of how ma
194f0 6e 79 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f  ny seek operatio
19500 6e 73 20 0a 20 20 20 20 2a 2a 20 20 20 20 53 51  ns .    **    SQ
19510 4c 69 74 65 20 6d 75 73 74 20 70 65 72 66 6f 72  Lite must perfor
19520 6d 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 20 69  m on the index i
19530 6e 20 71 75 65 73 74 69 6f 6e 2e 20 46 6f 72 20  n question. For 
19540 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
19550 0a 20 20 20 20 2a 2a 20 20 20 20 57 48 45 52 45  .    **    WHERE
19560 20 63 6c 61 75 73 65 20 69 73 3a 0a 20 20 20 20   clause is:.    
19570 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 57  **.    **      W
19580 48 45 52 45 20 61 20 49 4e 20 28 31 2c 20 32 2c  HERE a IN (1, 2,
19590 20 33 29 20 41 4e 44 20 62 20 49 4e 20 28 34 2c   3) AND b IN (4,
195a0 20 35 2c 20 36 29 0a 20 20 20 20 2a 2a 0a 20 20   5, 6).    **.  
195b0 20 20 2a 2a 20 20 20 20 53 51 4c 69 74 65 20 6d    **    SQLite m
195c0 75 73 74 20 70 65 72 66 6f 72 6d 20 39 20 6c 6f  ust perform 9 lo
195d0 6f 6b 75 70 73 20 6f 6e 20 61 6e 20 69 6e 64 65  okups on an inde
195e0 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 73 6f 20  x on (a, b), so 
195f0 6e 49 6e 4d 75 6c 20 69 73 20 0a 20 20 20 20 2a  nInMul is .    *
19600 2a 20 20 20 20 73 65 74 20 74 6f 20 39 2e 20 47  *    set to 9. G
19610 69 76 65 6e 20 74 68 65 20 73 61 6d 65 20 73 63  iven the same sc
19620 68 65 6d 61 20 61 6e 64 20 65 69 74 68 65 72 20  hema and either 
19630 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
19640 20 57 48 45 52 45 20 0a 20 20 20 20 2a 2a 20 20   WHERE .    **  
19650 20 20 63 6c 61 75 73 65 73 3a 0a 20 20 20 20 2a    clauses:.    *
19660 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 57 48  *.    **      WH
19670 45 52 45 20 61 20 3d 20 20 31 0a 20 20 20 20 2a  ERE a =  1.    *
19680 2a 20 20 20 20 20 20 57 48 45 52 45 20 61 20 3e  *      WHERE a >
19690 3d 20 32 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  = 2.    **.    *
196a0 2a 20 20 20 20 6e 49 6e 4d 75 6c 20 69 73 20 73  *    nInMul is s
196b0 65 74 20 74 6f 20 31 2e 0a 20 20 20 20 2a 2a 0a  et to 1..    **.
196c0 20 20 20 20 2a 2a 20 20 20 20 49 66 20 74 68 65      **    If the
196d0 72 65 20 65 78 69 73 74 73 20 61 20 57 48 45 52  re exists a WHER
196e0 45 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f  E term of the fo
196f0 72 6d 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54  rm "x IN (SELECT
19700 20 2e 2e 2e 29 22 2c 20 74 68 65 6e 20 0a 20 20   ...)", then .  
19710 20 20 2a 2a 20 20 20 20 74 68 65 20 73 75 62 2d    **    the sub-
19720 73 65 6c 65 63 74 20 69 73 20 61 73 73 75 6d 65  select is assume
19730 64 20 74 6f 20 72 65 74 75 72 6e 20 32 35 20 72  d to return 25 r
19740 6f 77 73 20 66 6f 72 20 74 68 65 20 70 75 72 70  ows for the purp
19750 6f 73 65 73 20 6f 66 20 0a 20 20 20 20 2a 2a 20  oses of .    ** 
19760 20 20 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 6e     determining n
19770 49 6e 4d 75 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20  InMul..    **.  
19780 20 20 2a 2a 20 20 62 49 6e 45 73 74 3a 20 20 0a    **  bInEst:  .
19790 20 20 20 20 2a 2a 20 20 20 20 53 65 74 20 74 6f      **    Set to
197a0 20 74 72 75 65 20 69 66 20 74 68 65 72 65 20 77   true if there w
197b0 61 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  as at least one 
197c0 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  "x IN (SELECT ..
197d0 2e 29 22 20 74 65 72 6d 20 75 73 65 64 20 0a 20  .)" term used . 
197e0 20 20 20 2a 2a 20 20 20 20 69 6e 20 64 65 74 65     **    in dete
197f0 72 6d 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75  rmining the valu
19800 65 20 6f 66 20 6e 49 6e 4d 75 6c 2e 0a 20 20 20  e of nInMul..   
19810 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 65 73 74 42   **.    **  estB
19820 6f 75 6e 64 3a 0a 20 20 20 20 2a 2a 20 20 20 20  ound:.    **    
19830 41 6e 20 65 73 74 69 6d 61 74 65 20 6f 6e 20 74  An estimate on t
19840 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65  he amount of the
19850 20 74 61 62 6c 65 20 74 68 61 74 20 6d 75 73 74   table that must
19860 20 62 65 20 73 65 61 72 63 68 65 64 2e 20 20 41   be searched.  A
19870 0a 20 20 20 20 2a 2a 20 20 20 20 76 61 6c 75 65  .    **    value
19880 20 6f 66 20 31 30 30 20 6d 65 61 6e 73 20 74 68   of 100 means th
19890 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65 20 69  e entire table i
198a0 73 20 73 65 61 72 63 68 65 64 2e 20 20 52 61 6e  s searched.  Ran
198b0 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  ge constraints. 
198c0 20 20 20 2a 2a 20 20 20 20 6d 69 67 68 74 20 72     **    might r
198d0 65 64 75 63 65 20 74 68 69 73 20 74 6f 20 61 20  educe this to a 
198e0 76 61 6c 75 65 20 6c 65 73 73 20 74 68 61 6e 20  value less than 
198f0 31 30 30 20 74 6f 20 69 6e 64 69 63 61 74 65 20  100 to indicate 
19900 74 68 61 74 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a  that only.    **
19910 20 20 20 20 61 20 66 72 61 63 74 69 6f 6e 20 6f      a fraction o
19920 66 20 74 68 65 20 74 61 62 6c 65 20 6e 65 65 64  f the table need
19930 73 20 73 65 61 72 63 68 69 6e 67 2e 20 20 49 6e  s searching.  In
19940 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 0a   the absence of.
19950 20 20 20 20 2a 2a 20 20 20 20 73 71 6c 69 74 65      **    sqlite
19960 5f 73 74 61 74 32 20 41 4e 41 4c 59 5a 45 20 64  _stat2 ANALYZE d
19970 61 74 61 2c 20 61 20 73 69 6e 67 6c 65 20 69 6e  ata, a single in
19980 65 71 75 61 6c 69 74 79 20 72 65 64 75 63 65 73  equality reduces
19990 20 74 68 65 20 73 65 61 72 63 68 0a 20 20 20 20   the search.    
199a0 2a 2a 20 20 20 20 73 70 61 63 65 20 74 6f 20 31  **    space to 1
199b0 2f 33 72 64 20 69 74 73 20 6f 72 69 67 69 6e 61  /3rd its origina
199c0 6c 20 73 69 7a 65 2e 20 20 53 6f 20 61 6e 20 78  l size.  So an x
199d0 3e 3f 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 65  >? constraint re
199e0 64 75 63 65 73 0a 20 20 20 20 2a 2a 20 20 20 20  duces.    **    
199f0 65 73 74 42 6f 75 6e 64 20 74 6f 20 33 33 2e 20  estBound to 33. 
19a00 20 54 77 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73   Two constraints
19a10 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72   (x>? AND x<?) r
19a20 65 64 75 63 65 20 65 73 74 42 6f 75 6e 64 20 74  educe estBound t
19a30 6f 20 31 31 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  o 11..    **.   
19a40 20 2a 2a 20 20 62 53 6f 72 74 3a 20 20 20 0a 20   **  bSort:   . 
19a50 20 20 20 2a 2a 20 20 20 20 42 6f 6f 6c 65 61 6e     **    Boolean
19a60 2e 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20  . True if there 
19a70 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
19a80 6c 61 75 73 65 20 74 68 61 74 20 77 69 6c 6c 20  lause that will 
19a90 72 65 71 75 69 72 65 20 61 6e 20 0a 20 20 20 20  require an .    
19aa0 2a 2a 20 20 20 20 65 78 74 65 72 6e 61 6c 20 73  **    external s
19ab0 6f 72 74 20 28 69 2e 65 2e 20 73 63 61 6e 6e 69  ort (i.e. scanni
19ac0 6e 67 20 74 68 65 20 69 6e 64 65 78 20 62 65 69  ng the index bei
19ad0 6e 67 20 65 76 61 6c 75 61 74 65 64 20 77 69 6c  ng evaluated wil
19ae0 6c 20 6e 6f 74 20 0a 20 20 20 20 2a 2a 20 20 20  l not .    **   
19af0 20 63 6f 72 72 65 63 74 6c 79 20 6f 72 64 65 72   correctly order
19b00 20 72 65 63 6f 72 64 73 29 2e 0a 20 20 20 20 2a   records)..    *
19b10 2a 0a 20 20 20 20 2a 2a 20 20 62 4c 6f 6f 6b 75  *.    **  bLooku
19b20 70 3a 20 0a 20 20 20 20 2a 2a 20 20 20 20 42 6f  p: .    **    Bo
19b30 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 66  olean. True if f
19b40 6f 72 20 65 61 63 68 20 69 6e 64 65 78 20 65 6e  or each index en
19b50 74 72 79 20 76 69 73 69 74 65 64 20 61 20 6c 6f  try visited a lo
19b60 6f 6b 75 70 20 6f 6e 20 74 68 65 20 0a 20 20 20  okup on the .   
19b70 20 2a 2a 20 20 20 20 63 6f 72 72 65 73 70 6f 6e   **    correspon
19b80 64 69 6e 67 20 74 61 62 6c 65 20 62 2d 74 72 65  ding table b-tre
19b90 65 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 54  e is required. T
19ba0 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 66 61  his is always fa
19bb0 6c 73 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 66  lse .    **    f
19bc0 6f 72 20 74 68 65 20 72 6f 77 69 64 20 69 6e 64  or the rowid ind
19bd0 65 78 2e 20 46 6f 72 20 6f 74 68 65 72 20 69 6e  ex. For other in
19be0 64 65 78 65 73 2c 20 69 74 20 69 73 20 74 72 75  dexes, it is tru
19bf0 65 20 75 6e 6c 65 73 73 20 61 6c 6c 20 74 68 65  e unless all the
19c00 20 0a 20 20 20 20 2a 2a 20 20 20 20 63 6f 6c 75   .    **    colu
19c10 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  mns of the table
19c20 20 75 73 65 64 20 62 79 20 74 68 65 20 53 45 4c   used by the SEL
19c30 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 72  ECT statement ar
19c40 65 20 70 72 65 73 65 6e 74 20 69 6e 20 0a 20 20  e present in .  
19c50 20 20 2a 2a 20 20 20 20 74 68 65 20 69 6e 64 65    **    the inde
19c60 78 20 28 73 75 63 68 20 61 6e 20 69 6e 64 65 78  x (such an index
19c70 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 64 65   is sometimes de
19c80 73 63 72 69 62 65 64 20 61 73 20 61 20 63 6f 76  scribed as a cov
19c90 65 72 69 6e 67 20 69 6e 64 65 78 29 2e 0a 20 20  ering index)..  
19ca0 20 20 2a 2a 20 20 20 20 46 6f 72 20 65 78 61 6d    **    For exam
19cb0 70 6c 65 2c 20 67 69 76 65 6e 20 74 68 65 20 69  ple, given the i
19cc0 6e 64 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20  ndex on (a, b), 
19cd0 74 68 65 20 73 65 63 6f 6e 64 20 6f 66 20 74 68  the second of th
19ce0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 20 20 20  e following .   
19cf0 20 2a 2a 20 20 20 20 74 77 6f 20 71 75 65 72 69   **    two queri
19d00 65 73 20 72 65 71 75 69 72 65 73 20 74 61 62 6c  es requires tabl
19d10 65 20 62 2d 74 72 65 65 20 6c 6f 6f 6b 75 70 73  e b-tree lookups
19d20 2c 20 62 75 74 20 74 68 65 20 66 69 72 73 74 20  , but the first 
19d30 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2a  does not..    **
19d40 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
19d50 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 20      SELECT a, b 
19d60 20 20 20 46 52 4f 4d 20 74 62 6c 20 57 48 45 52     FROM tbl WHER
19d70 45 20 61 20 3d 20 31 3b 0a 20 20 20 20 2a 2a 20  E a = 1;.    ** 
19d80 20 20 20 20 20 20 20 20 20 20 20 20 53 45 4c 45              SELE
19d90 43 54 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20  CT a, b, c FROM 
19da0 74 62 6c 20 57 48 45 52 45 20 61 20 3d 20 31 3b  tbl WHERE a = 1;
19db0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
19dc0 6e 45 71 3b 0a 20 20 20 20 69 6e 74 20 62 49 6e  nEq;.    int bIn
19dd0 45 73 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  Est = 0;.    int
19de0 20 6e 49 6e 4d 75 6c 20 3d 20 31 3b 0a 20 20 20   nInMul = 1;.   
19df0 20 69 6e 74 20 65 73 74 42 6f 75 6e 64 20 3d 20   int estBound = 
19e00 31 30 30 3b 0a 20 20 20 20 69 6e 74 20 6e 42 6f  100;.    int nBo
19e10 75 6e 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  und = 0;        
19e20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
19e30 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72   of range constr
19e40 61 69 6e 74 73 20 73 65 65 6e 20 2a 2f 0a 20 20  aints seen */.  
19e50 20 20 69 6e 74 20 62 53 6f 72 74 20 3d 20 30 3b    int bSort = 0;
19e60 0a 20 20 20 20 69 6e 74 20 62 4c 6f 6f 6b 75 70  .    int bLookup
19e70 20 3d 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54   = 0;.    WhereT
19e80 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
19e90 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
19ea0 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20  gle term of the 
19eb0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
19ec0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
19ed0 41 42 4c 45 5f 53 54 41 54 32 0a 20 20 20 20 57  ABLE_STAT2.    W
19ee0 68 65 72 65 54 65 72 6d 20 2a 70 46 69 72 73 74  hereTerm *pFirst
19ef0 54 65 72 6d 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Term = 0;    /* 
19f00 46 69 72 73 74 20 74 65 72 6d 20 6d 61 74 63 68  First term match
19f10 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 2a 2f  ing the index */
19f20 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
19f30 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61  Determine the va
19f40 6c 75 65 73 20 6f 66 20 6e 45 71 20 61 6e 64 20  lues of nEq and 
19f50 6e 49 6e 4d 75 6c 20 2a 2f 0a 20 20 20 20 66 6f  nInMul */.    fo
19f60 72 28 6e 45 71 3d 30 3b 20 6e 45 71 3c 70 50 72  r(nEq=0; nEq<pPr
19f70 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6e 45  obe->nColumn; nE
19f80 71 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  q++){.      int 
19f90 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f  j = pProbe->aiCo
19fa0 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 20 20 20  lumn[nEq];.     
19fb0 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
19fc0 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20  m(pWC, iCur, j, 
19fd0 6e 6f 74 52 65 61 64 79 2c 20 65 71 54 65 72 6d  notReady, eqTerm
19fe0 4d 61 73 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20  Mask, pIdx);.   
19ff0 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20     if( pTerm==0 
1a000 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 77  ) break;.      w
1a010 73 46 6c 61 67 73 20 7c 3d 20 28 57 48 45 52 45  sFlags |= (WHERE
1a020 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45  _COLUMN_EQ|WHERE
1a030 5f 52 4f 57 49 44 5f 45 51 29 3b 0a 20 20 20 20  _ROWID_EQ);.    
1a040 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
1a050 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
1a060 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
1a070 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
1a080 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 77 73  Expr;.        ws
1a090 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
1a0a0 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20  OLUMN_IN;.      
1a0b0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
1a0c0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1a0d0 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
1a0e0 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e          /* "x IN
1a0f0 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20   (SELECT ...)": 
1a100 20 41 73 73 75 6d 65 20 74 68 65 20 53 45 4c 45   Assume the SELE
1a110 43 54 20 72 65 74 75 72 6e 73 20 32 35 20 72 6f  CT returns 25 ro
1a120 77 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ws */.          
1a130 6e 49 6e 4d 75 6c 20 2a 3d 20 32 35 3b 0a 20 20  nInMul *= 25;.  
1a140 20 20 20 20 20 20 20 20 62 49 6e 45 73 74 20 3d          bInEst =
1a150 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   1;.        }els
1a160 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78  e if( ALWAYS(pEx
1a170 70 72 2d 3e 78 2e 70 4c 69 73 74 29 20 29 7b 0a  pr->x.pList) ){.
1a180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20            /* "x 
1a190 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65  IN (value, value
1a1a0 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20  , ...)" */.     
1a1b0 20 20 20 20 20 6e 49 6e 4d 75 6c 20 2a 3d 20 70       nInMul *= p
1a1c0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
1a1d0 45 78 70 72 20 2b 20 31 3b 0a 20 20 20 20 20 20  Expr + 1;.      
1a1e0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
1a1f0 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
1a200 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  ator & WO_ISNULL
1a210 20 29 7b 0a 20 20 20 20 20 20 20 20 77 73 46 6c   ){.        wsFl
1a220 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
1a230 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  UMN_NULL;.      
1a240 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
1a250 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a 20 20 20  ENABLE_STAT2.   
1a260 20 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 26 26     if( nEq==0 &&
1a270 20 70 50 72 6f 62 65 2d 3e 61 53 61 6d 70 6c 65   pProbe->aSample
1a280 20 29 20 70 46 69 72 73 74 54 65 72 6d 20 3d 20   ) pFirstTerm = 
1a290 70 54 65 72 6d 3b 0a 23 65 6e 64 69 66 0a 20 20  pTerm;.#endif.  
1a2a0 20 20 20 20 75 73 65 64 20 7c 3d 20 70 54 65 72      used |= pTer
1a2b0 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  m->prereqRight;.
1a2c0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
1a2d0 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75  termine the valu
1a2e0 65 20 6f 66 20 65 73 74 42 6f 75 6e 64 2e 20 2a  e of estBound. *
1a2f0 2f 0a 20 20 20 20 69 66 28 20 6e 45 71 3c 70 50  /.    if( nEq<pP
1a300 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b  robe->nColumn ){
1a310 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70  .      int j = p
1a320 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Probe->aiColumn[
1a330 6e 45 71 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  nEq];.      if( 
1a340 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
1a350 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c  ur, j, notReady,
1a360 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f   WO_LT|WO_LE|WO_
1a370 47 54 7c 57 4f 5f 47 45 2c 20 70 49 64 78 29 20  GT|WO_GE, pIdx) 
1a380 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  ){.        Where
1a390 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20 66 69 6e  Term *pTop = fin
1a3a0 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
1a3b0 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f   j, notReady, WO
1a3c0 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 70 49 64 78 29  _LT|WO_LE, pIdx)
1a3d0 3b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 54  ;.        WhereT
1a3e0 65 72 6d 20 2a 70 42 74 6d 20 3d 20 66 69 6e 64  erm *pBtm = find
1a3f0 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
1a400 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  j, notReady, WO_
1a410 47 54 7c 57 4f 5f 47 45 2c 20 70 49 64 78 29 3b  GT|WO_GE, pIdx);
1a420 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 52 61  .        whereRa
1a430 6e 67 65 53 63 61 6e 45 73 74 28 70 50 61 72 73  ngeScanEst(pPars
1a440 65 2c 20 70 50 72 6f 62 65 2c 20 6e 45 71 2c 20  e, pProbe, nEq, 
1a450 70 42 74 6d 2c 20 70 54 6f 70 2c 20 26 65 73 74  pBtm, pTop, &est
1a460 42 6f 75 6e 64 29 3b 0a 20 20 20 20 20 20 20 20  Bound);.        
1a470 69 66 28 20 70 54 6f 70 20 29 7b 0a 20 20 20 20  if( pTop ){.    
1a480 20 20 20 20 20 20 6e 42 6f 75 6e 64 20 3d 20 31        nBound = 1
1a490 3b 0a 20 20 20 20 20 20 20 20 20 20 77 73 46 6c  ;.          wsFl
1a4a0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50  ags |= WHERE_TOP
1a4b0 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20  _LIMIT;.        
1a4c0 20 20 75 73 65 64 20 7c 3d 20 70 54 6f 70 2d 3e    used |= pTop->
1a4d0 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20  prereqRight;.   
1a4e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1a4f0 66 28 20 70 42 74 6d 20 29 7b 0a 20 20 20 20 20  f( pBtm ){.     
1a500 20 20 20 20 20 6e 42 6f 75 6e 64 2b 2b 3b 0a 20       nBound++;. 
1a510 20 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73           wsFlags
1a520 20 7c 3d 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49   |= WHERE_BTM_LI
1a530 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 20 20 75  MIT;.          u
1a540 73 65 64 20 7c 3d 20 70 42 74 6d 2d 3e 70 72 65  sed |= pBtm->pre
1a550 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20  reqRight;.      
1a560 20 20 7d 0a 20 20 20 20 20 20 20 20 77 73 46 6c    }.        wsFl
1a570 61 67 73 20 7c 3d 20 28 57 48 45 52 45 5f 43 4f  ags |= (WHERE_CO
1a580 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45  LUMN_RANGE|WHERE
1a590 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 3b 0a 20  _ROWID_RANGE);. 
1a5a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
1a5b0 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 6f 6e 45   if( pProbe->onE
1a5c0 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b  rror!=OE_None ){
1a5d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1a5e0 20 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45   wsFlags & WHERE
1a5f0 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 3b 0a 20 20  _COLUMN_IN );.  
1a600 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77 73      testcase( ws
1a610 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
1a620 4c 55 4d 4e 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20  LUMN_NULL );.   
1a630 20 20 20 69 66 28 20 28 77 73 46 6c 61 67 73 20     if( (wsFlags 
1a640 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  & (WHERE_COLUMN_
1a650 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  IN|WHERE_COLUMN_
1a660 4e 55 4c 4c 29 29 3d 3d 30 20 29 7b 0a 20 20 20  NULL))==0 ){.   
1a670 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20       wsFlags |= 
1a680 57 48 45 52 45 5f 55 4e 49 51 55 45 3b 0a 20 20  WHERE_UNIQUE;.  
1a690 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1a6a0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
1a6b0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
1a6c0 73 65 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  se and the index
1a6d0 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65   being considere
1a6e0 64 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 6e 61  d will.    ** na
1a6f0 74 75 72 61 6c 6c 79 20 73 63 61 6e 20 72 6f 77  turally scan row
1a700 73 20 69 6e 20 74 68 65 20 72 65 71 75 69 72 65  s in the require
1a710 64 20 6f 72 64 65 72 2c 20 73 65 74 20 74 68 65  d order, set the
1a720 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6c 61   appropriate fla
1a730 67 73 0a 20 20 20 20 2a 2a 20 69 6e 20 77 73 46  gs.    ** in wsF
1a740 6c 61 67 73 2e 20 4f 74 68 65 72 77 69 73 65 2c  lags. Otherwise,
1a750 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
1a760 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1a770 62 75 74 20 74 68 65 20 69 6e 64 65 78 0a 20 20  but the index.  
1a780 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 72    ** will scan r
1a790 6f 77 73 20 69 6e 20 61 20 64 69 66 66 65 72 65  ows in a differe
1a7a0 6e 74 20 6f 72 64 65 72 2c 20 73 65 74 20 74 68  nt order, set th
1a7b0 65 20 62 53 6f 72 74 20 76 61 72 69 61 62 6c 65  e bSort variable
1a7c0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f  .  */.    if( pO
1a7d0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
1a7e0 69 66 28 20 28 77 73 46 6c 61 67 73 20 26 20 28  if( (wsFlags & (
1a7f0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c  WHERE_COLUMN_IN|
1a800 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c  WHERE_COLUMN_NUL
1a810 4c 29 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26  L))==0.        &
1a820 26 20 69 73 53 6f 72 74 69 6e 67 49 6e 64 65 78  & isSortingIndex
1a830 28 70 50 61 72 73 65 2c 70 57 43 2d 3e 70 4d 61  (pParse,pWC->pMa
1a840 73 6b 53 65 74 2c 70 50 72 6f 62 65 2c 69 43 75  skSet,pProbe,iCu
1a850 72 2c 70 4f 72 64 65 72 42 79 2c 6e 45 71 2c 26  r,pOrderBy,nEq,&
1a860 72 65 76 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  rev).      ){.  
1a870 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d        wsFlags |=
1a880 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e   WHERE_ROWID_RAN
1a890 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  GE|WHERE_COLUMN_
1a8a0 52 41 4e 47 45 7c 57 48 45 52 45 5f 4f 52 44 45  RANGE|WHERE_ORDE
1a8b0 52 42 59 3b 0a 20 20 20 20 20 20 20 20 77 73 46  RBY;.        wsF
1a8c0 6c 61 67 73 20 7c 3d 20 28 72 65 76 20 3f 20 57  lags |= (rev ? W
1a8d0 48 45 52 45 5f 52 45 56 45 52 53 45 20 3a 20 30  HERE_REVERSE : 0
1a8e0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1a8f0 20 20 20 20 20 20 20 20 62 53 6f 72 74 20 3d 20          bSort = 
1a900 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
1a910 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 75 72 72  ..    /* If curr
1a920 65 6e 74 6c 79 20 63 61 6c 63 75 6c 61 74 69 6e  ently calculatin
1a930 67 20 74 68 65 20 63 6f 73 74 20 6f 66 20 75 73  g the cost of us
1a940 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 28 6e 6f  ing an index (no
1a950 74 20 74 68 65 20 49 50 4b 0a 20 20 20 20 2a 2a  t the IPK.    **
1a960 20 69 6e 64 65 78 29 2c 20 64 65 74 65 72 6d 69   index), determi
1a970 6e 65 20 69 66 20 61 6c 6c 20 72 65 71 75 69 72  ne if all requir
1a980 65 64 20 63 6f 6c 75 6d 6e 20 64 61 74 61 20 6d  ed column data m
1a990 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 77  ay be obtained w
1a9a0 69 74 68 6f 75 74 20 0a 20 20 20 20 2a 2a 20 75  ithout .    ** u
1a9b0 73 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 74 61  sing the main ta
1a9c0 62 6c 65 20 28 69 2e 65 2e 20 69 66 20 74 68 65  ble (i.e. if the
1a9d0 20 69 6e 64 65 78 20 69 73 20 61 20 63 6f 76 65   index is a cove
1a9e0 72 69 6e 67 0a 20 20 20 20 2a 2a 20 69 6e 64 65  ring.    ** inde
1a9f0 78 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79  x for this query
1aa00 29 2e 20 49 66 20 69 74 20 69 73 2c 20 73 65 74  ). If it is, set
1aa10 20 74 68 65 20 57 48 45 52 45 5f 49 44 58 5f 4f   the WHERE_IDX_O
1aa20 4e 4c 59 20 66 6c 61 67 20 69 6e 0a 20 20 20 20  NLY flag in.    
1aa30 2a 2a 20 77 73 46 6c 61 67 73 2e 20 4f 74 68 65  ** wsFlags. Othe
1aa40 72 77 69 73 65 2c 20 73 65 74 20 74 68 65 20 62  rwise, set the b
1aa50 4c 6f 6f 6b 75 70 20 76 61 72 69 61 62 6c 65 20  Lookup variable 
1aa60 74 6f 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20 20  to true.  */.   
1aa70 20 69 66 28 20 70 49 64 78 20 26 26 20 77 73 46   if( pIdx && wsF
1aa80 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 42 69  lags ){.      Bi
1aa90 74 6d 61 73 6b 20 6d 20 3d 20 70 53 72 63 2d 3e  tmask m = pSrc->
1aaa0 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 69  colUsed;.      i
1aab0 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
1aac0 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f  j=0; j<pIdx->nCo
1aad0 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  lumn; j++){.    
1aae0 20 20 20 20 69 6e 74 20 78 20 3d 20 70 49 64 78      int x = pIdx
1aaf0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
1ab00 20 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53         if( x<BMS
1ab10 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
1ab20 6d 20 26 3d 20 7e 28 28 28 42 69 74 6d 61 73 6b  m &= ~(((Bitmask
1ab30 29 31 29 3c 3c 78 29 3b 0a 20 20 20 20 20 20 20  )1)<<x);.       
1ab40 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1ab50 20 69 66 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20   if( m==0 ){.   
1ab60 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20       wsFlags |= 
1ab70 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a  WHERE_IDX_ONLY;.
1ab80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ab90 20 20 20 20 20 62 4c 6f 6f 6b 75 70 20 3d 20 31       bLookup = 1
1aba0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1abb0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 45  .    /*.    ** E
1abc0 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
1abd0 65 72 20 6f 66 20 72 6f 77 73 20 6f 66 20 6f 75  er of rows of ou
1abe0 74 70 75 74 2e 20 20 46 6f 72 20 61 6e 20 22 78  tput.  For an "x
1abf0 20 49 4e 20 28 53 45 4c 45 43 54 2e 2e 2e 29 22   IN (SELECT...)"
1ac00 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69  .    ** constrai
1ac10 6e 74 2c 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74  nt, do not let t
1ac20 68 65 20 65 73 74 69 6d 61 74 65 20 65 78 63 65  he estimate exce
1ac30 65 64 20 68 61 6c 66 20 74 68 65 20 72 6f 77 73  ed half the rows
1ac40 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 20   in the table.. 
1ac50 20 20 20 2a 2f 0a 20 20 20 20 6e 52 6f 77 20 3d     */.    nRow =
1ac60 20 28 64 6f 75 62 6c 65 29 28 61 69 52 6f 77 45   (double)(aiRowE
1ac70 73 74 5b 6e 45 71 5d 20 2a 20 6e 49 6e 4d 75 6c  st[nEq] * nInMul
1ac80 29 3b 0a 20 20 20 20 69 66 28 20 62 49 6e 45 73  );.    if( bInEs
1ac90 74 20 26 26 20 6e 52 6f 77 2a 32 3e 61 69 52 6f  t && nRow*2>aiRo
1aca0 77 45 73 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20  wEst[0] ){.     
1acb0 20 6e 52 6f 77 20 3d 20 61 69 52 6f 77 45 73 74   nRow = aiRowEst
1acc0 5b 30 5d 2f 32 3b 0a 20 20 20 20 20 20 6e 49 6e  [0]/2;.      nIn
1acd0 4d 75 6c 20 3d 20 28 69 6e 74 29 28 6e 52 6f 77  Mul = (int)(nRow
1ace0 20 2f 20 61 69 52 6f 77 45 73 74 5b 6e 45 71 5d   / aiRowEst[nEq]
1acf0 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66  );.    }..#ifdef
1ad00 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
1ad10 54 41 54 32 0a 20 20 20 20 2f 2a 20 49 66 20 74  TAT2.    /* If t
1ad20 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  he constraint is
1ad30 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 78 3d 56   of the form x=V
1ad40 41 4c 55 45 20 61 6e 64 20 68 69 73 74 6f 67 72  ALUE and histogr
1ad50 61 6d 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 69  am.    ** data i
1ad60 73 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  s available for 
1ad70 63 6f 6c 75 6d 6e 20 78 2c 20 74 68 65 6e 20 69  column x, then i
1ad80 74 20 6d 69 67 68 74 20 62 65 20 70 6f 73 73 69  t might be possi
1ad90 62 6c 65 0a 20 20 20 20 2a 2a 20 74 6f 20 67 65  ble.    ** to ge
1ada0 74 20 61 20 62 65 74 74 65 72 20 65 73 74 69 6d  t a better estim
1adb0 61 74 65 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65  ate on the numbe
1adc0 72 20 6f 66 20 72 6f 77 73 20 62 61 73 65 64 20  r of rows based 
1add0 6f 6e 0a 20 20 20 20 2a 2a 20 56 41 4c 55 45 20  on.    ** VALUE 
1ade0 61 6e 64 20 68 6f 77 20 63 6f 6d 6d 6f 6e 20 74  and how common t
1adf0 68 61 74 20 76 61 6c 75 65 20 69 73 20 61 63 63  hat value is acc
1ae00 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 68 69  ording to the hi
1ae10 73 74 6f 67 72 61 6d 2e 0a 20 20 20 20 2a 2f 0a  stogram..    */.
1ae20 20 20 20 20 69 66 28 20 6e 52 6f 77 3e 28 64 6f      if( nRow>(do
1ae30 75 62 6c 65 29 31 20 26 26 20 6e 45 71 3d 3d 31  uble)1 && nEq==1
1ae40 20 26 26 20 70 46 69 72 73 74 54 65 72 6d 21 3d   && pFirstTerm!=
1ae50 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
1ae60 46 69 72 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72  FirstTerm->eOper
1ae70 61 74 6f 72 3d 3d 57 4f 5f 45 51 20 29 7b 0a 20  ator==WO_EQ ){. 
1ae80 20 20 20 20 20 20 20 77 68 65 72 65 45 71 75 61         whereEqua
1ae90 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  lScanEst(pParse,
1aea0 20 70 50 72 6f 62 65 2c 20 70 46 69 72 73 74 54   pProbe, pFirstT
1aeb0 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
1aec0 68 74 2c 20 26 6e 52 6f 77 29 3b 0a 20 20 20 20  ht, &nRow);.    
1aed0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 46 69 72    }else if( pFir
1aee0 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  stTerm->eOperato
1aef0 72 3d 3d 57 4f 5f 49 4e 20 26 26 20 62 49 6e 45  r==WO_IN && bInE
1af00 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  st==0 ){.       
1af10 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28   whereInScanEst(
1af20 70 50 61 72 73 65 2c 20 70 50 72 6f 62 65 2c 20  pParse, pProbe, 
1af30 70 46 69 72 73 74 54 65 72 6d 2d 3e 70 45 78 70  pFirstTerm->pExp
1af40 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 52 6f  r->x.pList, &nRo
1af50 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  w);.      }.    
1af60 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1af70 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 20  TE_ENABLE_STAT2 
1af80 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41 64 6a 75 73  */..    /* Adjus
1af90 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
1afa0 72 6f 77 73 20 61 6e 64 20 74 68 65 20 63 6f 73  rows and the cos
1afb0 74 20 64 6f 77 6e 77 61 72 64 20 74 6f 20 72 65  t downward to re
1afc0 66 6c 65 63 74 20 72 6f 77 73 0a 20 20 20 20 2a  flect rows.    *
1afd0 2a 20 74 68 61 74 20 61 72 65 20 65 78 63 6c 75  * that are exclu
1afe0 64 65 64 20 62 79 20 72 61 6e 67 65 20 63 6f 6e  ded by range con
1aff0 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2f  straints..    */
1b000 0a 20 20 20 20 6e 52 6f 77 20 3d 20 28 6e 52 6f  .    nRow = (nRo
1b010 77 20 2a 20 28 64 6f 75 62 6c 65 29 65 73 74 42  w * (double)estB
1b020 6f 75 6e 64 29 20 2f 20 28 64 6f 75 62 6c 65 29  ound) / (double)
1b030 31 30 30 3b 0a 0a 20 20 20 20 2f 2a 20 41 73 73  100;..    /* Ass
1b040 75 6d 65 20 63 6f 6e 73 74 61 6e 74 20 63 6f 73  ume constant cos
1b050 74 20 74 6f 20 61 63 63 65 73 73 20 61 20 72 6f  t to access a ro
1b060 77 20 61 6e 64 20 6c 6f 67 61 72 69 74 68 6d 69  w and logarithmi
1b070 63 20 63 6f 73 74 20 74 6f 0a 20 20 20 20 2a 2a  c cost to.    **
1b080 20 64 6f 20 61 20 62 69 6e 61 72 79 20 73 65 61   do a binary sea
1b090 72 63 68 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  rch.  Hence, the
1b0a0 20 69 6e 69 74 69 61 6c 20 63 6f 73 74 20 69 73   initial cost is
1b0b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
1b0c0 75 74 70 75 74 0a 20 20 20 20 2a 2a 20 72 6f 77  utput.    ** row
1b0d0 73 20 70 6c 75 73 20 6c 6f 67 32 28 74 61 62 6c  s plus log2(tabl
1b0e0 65 2d 73 69 7a 65 29 20 74 69 6d 65 73 20 74 68  e-size) times th
1b0f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 6e 61  e number of bina
1b100 72 79 20 73 65 61 72 63 68 65 73 2e 0a 20 20 20  ry searches..   
1b110 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 64 78   */.    if( pIdx
1b120 20 26 26 20 62 4c 6f 6f 6b 75 70 20 29 7b 0a 20   && bLookup ){. 
1b130 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77       cost = nRow
1b140 20 2b 20 28 6e 49 6e 4d 75 6c 2b 6e 52 6f 77 29   + (nInMul+nRow)
1b150 2a 65 73 74 4c 6f 67 28 61 69 52 6f 77 45 73 74  *estLog(aiRowEst
1b160 5b 30 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  [0]);.    }else{
1b170 0a 20 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52  .      cost = nR
1b180 6f 77 20 2b 20 6e 49 6e 4d 75 6c 2a 65 73 74 4c  ow + nInMul*estL
1b190 6f 67 28 61 69 52 6f 77 45 73 74 5b 30 5d 29 3b  og(aiRowEst[0]);
1b1a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
1b1b0 64 64 20 69 6e 20 74 68 65 20 65 73 74 69 6d 61  dd in the estima
1b1c0 74 65 64 20 63 6f 73 74 20 6f 66 20 73 6f 72 74  ted cost of sort
1b1d0 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 2e 20  ing the result. 
1b1e0 20 54 68 69 73 20 63 6f 73 74 20 69 73 20 65 78   This cost is ex
1b1f0 70 61 6e 64 65 64 0a 20 20 20 20 2a 2a 20 62 79  panded.    ** by
1b200 20 61 20 66 75 64 67 65 20 66 61 63 74 6f 72 20   a fudge factor 
1b210 6f 66 20 33 2e 30 20 74 6f 20 61 63 63 6f 75 6e  of 3.0 to accoun
1b220 74 20 66 6f 72 20 74 68 65 20 66 61 63 74 20 74  t for the fact t
1b230 68 61 74 20 61 20 73 6f 72 74 69 6e 67 20 73 74  hat a sorting st
1b240 65 70 20 0a 20 20 20 20 2a 2a 20 69 6e 76 6f 6c  ep .    ** invol
1b250 76 65 73 20 61 20 77 72 69 74 65 20 61 6e 64 20  ves a write and 
1b260 69 73 20 74 68 75 73 20 6d 6f 72 65 20 65 78 70  is thus more exp
1b270 65 6e 73 69 76 65 20 74 68 61 6e 20 61 20 6c 6f  ensive than a lo
1b280 6f 6b 75 70 20 73 74 65 70 2e 0a 20 20 20 20 2a  okup step..    *
1b290 2f 0a 20 20 20 20 69 66 28 20 62 53 6f 72 74 20  /.    if( bSort 
1b2a0 29 7b 0a 20 20 20 20 20 20 63 6f 73 74 20 2b 3d  ){.      cost +=
1b2b0 20 6e 52 6f 77 2a 65 73 74 4c 6f 67 28 6e 52 6f   nRow*estLog(nRo
1b2c0 77 29 2a 28 64 6f 75 62 6c 65 29 33 3b 0a 20 20  w)*(double)3;.  
1b2d0 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 2a 2a 20 43    }..    /**** C
1b2e0 6f 73 74 20 6f 66 20 75 73 69 6e 67 20 74 68 69  ost of using thi
1b2f0 73 20 69 6e 64 65 78 20 68 61 73 20 6e 6f 77 20  s index has now 
1b300 62 65 65 6e 20 63 6f 6d 70 75 74 65 64 20 2a 2a  been computed **
1b310 2a 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  **/..    /* If t
1b320 68 65 72 65 20 61 72 65 20 61 64 64 69 74 69 6f  here are additio
1b330 6e 61 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  nal constraints 
1b340 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68  on this table th
1b350 61 74 20 63 61 6e 6e 6f 74 0a 20 20 20 20 2a 2a  at cannot.    **
1b360 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68   be used with th
1b370 65 20 63 75 72 72 65 6e 74 20 69 6e 64 65 78 2c  e current index,
1b380 20 62 75 74 20 77 68 69 63 68 20 6d 69 67 68 74   but which might
1b390 20 6c 6f 77 65 72 20 74 68 65 20 6e 75 6d 62 65   lower the numbe
1b3a0 72 0a 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70  r.    ** of outp
1b3b0 75 74 20 72 6f 77 73 2c 20 61 64 6a 75 73 74 20  ut rows, adjust 
1b3c0 74 68 65 20 6e 52 6f 77 20 76 61 6c 75 65 20 61  the nRow value a
1b3d0 63 63 6f 72 64 69 6e 67 6c 79 2e 20 20 54 68 69  ccordingly.  Thi
1b3e0 73 20 6f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 6d  s only .    ** m
1b3f0 61 74 74 65 72 73 20 69 66 20 74 68 65 20 63 75  atters if the cu
1b400 72 72 65 6e 74 20 69 6e 64 65 78 20 69 73 20 74  rrent index is t
1b410 68 65 20 6c 65 61 73 74 20 63 6f 73 74 6c 79 2c  he least costly,
1b420 20 73 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65   so do not bothe
1b430 72 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68  r.    ** with th
1b440 69 73 20 73 74 65 70 20 69 66 20 77 65 20 61 6c  is step if we al
1b450 72 65 61 64 79 20 6b 6e 6f 77 20 74 68 69 73 20  ready know this 
1b460 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62  index will not b
1b470 65 20 63 68 6f 73 65 6e 2e 0a 20 20 20 20 2a 2a  e chosen..    **
1b480 20 41 6c 73 6f 2c 20 6e 65 76 65 72 20 72 65 64   Also, never red
1b490 75 63 65 20 74 68 65 20 6f 75 74 70 75 74 20 72  uce the output r
1b4a0 6f 77 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 32  ow count below 2
1b4b0 20 75 73 69 6e 67 20 74 68 69 73 20 73 74 65 70   using this step
1b4c0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1b4d0 49 74 20 69 73 20 63 72 69 74 69 63 61 6c 20 74  It is critical t
1b4e0 68 61 74 20 74 68 65 20 6e 6f 74 56 61 6c 69 64  hat the notValid
1b4f0 20 6d 61 73 6b 20 62 65 20 75 73 65 64 20 68 65   mask be used he
1b500 72 65 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20  re instead of.  
1b510 20 20 2a 2a 20 74 68 65 20 6e 6f 74 52 65 61 64    ** the notRead
1b520 79 20 6d 61 73 6b 2e 20 20 57 68 65 6e 20 63 6f  y mask.  When co
1b530 6d 70 75 74 69 6e 67 20 61 6e 20 22 6f 70 74 69  mputing an "opti
1b540 6d 61 6c 22 20 69 6e 64 65 78 2c 20 74 68 65 20  mal" index, the 
1b550 6e 6f 74 52 65 61 64 79 0a 20 20 20 20 2a 2a 20  notReady.    ** 
1b560 6d 61 73 6b 20 77 69 6c 6c 20 6f 6e 6c 79 20 68  mask will only h
1b570 61 76 65 20 6f 6e 65 20 62 69 74 20 73 65 74 20  ave one bit set 
1b580 2d 20 74 68 65 20 62 69 74 20 66 6f 72 20 74 68  - the bit for th
1b590 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 2e  e current table.
1b5a0 0a 20 20 20 20 2a 2a 20 54 68 65 20 6e 6f 74 56  .    ** The notV
1b5b0 61 6c 69 64 20 6d 61 73 6b 2c 20 6f 6e 20 74 68  alid mask, on th
1b5c0 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 61 6c  e other hand, al
1b5d0 77 61 79 73 20 68 61 73 20 61 6c 6c 20 62 69 74  ways has all bit
1b5e0 73 20 73 65 74 20 66 6f 72 0a 20 20 20 20 2a 2a  s set for.    **
1b5f0 20 74 61 62 6c 65 73 20 74 68 61 74 20 61 72 65   tables that are
1b600 20 6e 6f 74 20 69 6e 20 6f 75 74 65 72 20 6c 6f   not in outer lo
1b610 6f 70 73 2e 20 20 49 66 20 6e 6f 74 52 65 61 64  ops.  If notRead
1b620 79 20 69 73 20 75 73 65 64 20 68 65 72 65 20 69  y is used here i
1b630 6e 73 74 65 61 64 0a 20 20 20 20 2a 2a 20 6f 66  nstead.    ** of
1b640 20 6e 6f 74 56 61 6c 69 64 2c 20 74 68 65 6e 20   notValid, then 
1b650 61 20 6f 70 74 69 6d 61 6c 20 69 6e 64 65 78 20  a optimal index 
1b660 74 68 61 74 20 64 65 70 65 6e 64 73 20 6f 6e 20  that depends on 
1b670 69 6e 6e 65 72 20 6a 6f 69 6e 73 20 6c 6f 6f 70  inner joins loop
1b680 73 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 62  s.    ** might b
1b690 65 20 73 65 6c 65 63 74 65 64 20 65 76 65 6e 20  e selected even 
1b6a0 77 68 65 6e 20 74 68 65 72 65 20 65 78 69 73 74  when there exist
1b6b0 73 20 61 6e 20 6f 70 74 69 6d 61 6c 20 69 6e 64  s an optimal ind
1b6c0 65 78 20 74 68 61 74 20 68 61 73 0a 20 20 20 20  ex that has.    
1b6d0 2a 2a 20 6e 6f 20 73 75 63 68 20 64 65 70 65 6e  ** no such depen
1b6e0 64 65 6e 63 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  dency..    */.  
1b6f0 20 20 69 66 28 20 6e 52 6f 77 3e 32 20 26 26 20    if( nRow>2 && 
1b700 63 6f 73 74 3c 3d 70 43 6f 73 74 2d 3e 72 43 6f  cost<=pCost->rCo
1b710 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  st ){.      int 
1b720 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
1b730 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1b740 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
1b750 20 20 69 6e 74 20 6e 53 6b 69 70 45 71 20 3d 20    int nSkipEq = 
1b760 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 2f  nEq;           /
1b770 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 63  * Number of == c
1b780 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 73 6b  onstraints to sk
1b790 69 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ip */.      int 
1b7a0 6e 53 6b 69 70 52 61 6e 67 65 20 3d 20 6e 42 6f  nSkipRange = nBo
1b7b0 75 6e 64 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  und;     /* Numb
1b7c0 65 72 20 6f 66 20 3c 20 63 6f 6e 73 74 72 61 69  er of < constrai
1b7d0 6e 74 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20  nts to skip */. 
1b7e0 20 20 20 20 20 42 69 74 6d 61 73 6b 20 74 68 69       Bitmask thi
1b7f0 73 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  sTab;           
1b800 20 20 2f 2a 20 42 69 74 6d 61 70 20 66 6f 72 20    /* Bitmap for 
1b810 70 53 72 63 20 2a 2f 0a 0a 20 20 20 20 20 20 74  pSrc */..      t
1b820 68 69 73 54 61 62 20 3d 20 67 65 74 4d 61 73 6b  hisTab = getMask
1b830 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20  (pWC->pMaskSet, 
1b840 69 43 75 72 29 3b 0a 20 20 20 20 20 20 66 6f 72  iCur);.      for
1b850 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6b  (pTerm=pWC->a, k
1b860 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6e 52 6f  =pWC->nTerm; nRo
1b870 77 3e 32 20 26 26 20 6b 3b 20 6b 2d 2d 2c 20 70  w>2 && k; k--, p
1b880 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
1b890 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
1b8a0 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
1b8b0 41 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  AL ) continue;. 
1b8c0 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
1b8d0 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e  m->prereqAll & n
1b8e0 6f 74 56 61 6c 69 64 29 21 3d 74 68 69 73 54 61  otValid)!=thisTa
1b8f0 62 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  b ) continue;.  
1b900 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
1b910 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
1b920 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e  _EQ|WO_IN|WO_ISN
1b930 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ULL) ){.        
1b940 20 20 69 66 28 20 6e 53 6b 69 70 45 71 20 29 7b    if( nSkipEq ){
1b950 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
1b960 49 67 6e 6f 72 65 20 74 68 65 20 66 69 72 73 74  Ignore the first
1b970 20 6e 45 71 20 65 71 75 61 6c 69 74 79 20 6d 61   nEq equality ma
1b980 74 63 68 65 73 20 73 69 6e 63 65 20 74 68 65 20  tches since the 
1b990 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 20 20  index.          
1b9a0 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79    ** has already
1b9b0 20 61 63 63 6f 75 6e 74 65 64 20 66 6f 72 20 74   accounted for t
1b9c0 68 65 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  hese */.        
1b9d0 20 20 20 20 6e 53 6b 69 70 45 71 2d 2d 3b 0a 20      nSkipEq--;. 
1b9e0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1b9f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1ba00 73 73 75 6d 65 20 65 61 63 68 20 61 64 64 69 74  ssume each addit
1ba10 69 6f 6e 61 6c 20 65 71 75 61 6c 69 74 79 20 6d  ional equality m
1ba20 61 74 63 68 20 72 65 64 75 63 65 73 20 74 68 65  atch reduces the
1ba30 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 20 20   result.        
1ba40 20 20 20 20 2a 2a 20 73 65 74 20 73 69 7a 65 20      ** set size 
1ba50 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 31  by a factor of 1
1ba60 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  0 */.           
1ba70 20 6e 52 6f 77 20 2f 3d 20 31 30 3b 0a 20 20 20   nRow /= 10;.   
1ba80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ba90 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d   }else if( pTerm
1baa0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
1bab0 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54  O_LT|WO_LE|WO_GT
1bac0 7c 57 4f 5f 47 45 29 20 29 7b 0a 20 20 20 20 20  |WO_GE) ){.     
1bad0 20 20 20 20 20 69 66 28 20 6e 53 6b 69 70 52 61       if( nSkipRa
1bae0 6e 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nge ){.         
1baf0 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65     /* Ignore the
1bb00 20 66 69 72 73 74 20 6e 53 6b 69 70 52 61 6e 67   first nSkipRang
1bb10 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  e range constrai
1bb20 6e 74 73 20 73 69 6e 63 65 20 74 68 65 20 69 6e  nts since the in
1bb30 64 65 78 0a 20 20 20 20 20 20 20 20 20 20 20 20  dex.            
1bb40 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 61  ** has already a
1bb50 63 63 6f 75 6e 74 65 64 20 66 6f 72 20 74 68 65  ccounted for the
1bb60 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  se */.          
1bb70 20 20 6e 53 6b 69 70 52 61 6e 67 65 2d 2d 3b 0a    nSkipRange--;.
1bb80 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1bb90 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
1bba0 41 73 73 75 6d 65 20 65 61 63 68 20 61 64 64 69  Assume each addi
1bbb0 74 69 6f 6e 61 6c 20 72 61 6e 67 65 20 63 6f 6e  tional range con
1bbc0 73 74 72 61 69 6e 74 20 72 65 64 75 63 65 73 20  straint reduces 
1bbd0 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20  the result.     
1bbe0 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 73 69         ** set si
1bbf0 7a 65 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f  ze by a factor o
1bc00 66 20 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  f 3 */.         
1bc10 20 20 20 6e 52 6f 77 20 2f 3d 20 33 3b 0a 20 20     nRow /= 3;.  
1bc20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1bc30 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72    }else if( pTer
1bc40 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57 4f  m->eOperator!=WO
1bc50 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20 20  _NOOP ){.       
1bc60 20 20 20 2f 2a 20 41 6e 79 20 6f 74 68 65 72 20     /* Any other 
1bc70 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 77 65 72  expression lower
1bc80 73 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f 77  s the output row
1bc90 20 63 6f 75 6e 74 20 62 79 20 68 61 6c 66 20 2a   count by half *
1bca0 2f 0a 20 20 20 20 20 20 20 20 20 20 6e 52 6f 77  /.          nRow
1bcb0 20 2f 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 7d   /= 2;.        }
1bcc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1bcd0 66 28 20 6e 52 6f 77 3c 32 20 29 20 6e 52 6f 77  f( nRow<2 ) nRow
1bce0 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20   = 2;.    }...  
1bcf0 20 20 57 48 45 52 45 54 52 41 43 45 28 28 0a 20    WHERETRACE((. 
1bd00 20 20 20 20 20 22 25 73 28 25 73 29 3a 20 6e 45       "%s(%s): nE
1bd10 71 3d 25 64 20 6e 49 6e 4d 75 6c 3d 25 64 20 65  q=%d nInMul=%d e
1bd20 73 74 42 6f 75 6e 64 3d 25 64 20 62 53 6f 72 74  stBound=%d bSort
1bd30 3d 25 64 20 62 4c 6f 6f 6b 75 70 3d 25 64 20 77  =%d bLookup=%d w
1bd40 73 46 6c 61 67 73 3d 30 78 25 78 5c 6e 22 0a 20  sFlags=0x%x\n". 
1bd50 20 20 20 20 20 22 20 20 20 20 20 20 20 20 20 6e       "         n
1bd60 6f 74 52 65 61 64 79 3d 30 78 25 6c 6c 78 20 6e  otReady=0x%llx n
1bd70 52 6f 77 3d 25 2e 32 66 20 63 6f 73 74 3d 25 2e  Row=%.2f cost=%.
1bd80 32 66 20 75 73 65 64 3d 30 78 25 6c 6c 78 5c 6e  2f used=0x%llx\n
1bd90 22 2c 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 70  ",.      pSrc->p
1bda0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 28 70 49 64  Tab->zName, (pId
1bdb0 78 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20  x ? pIdx->zName 
1bdc0 3a 20 22 69 70 6b 22 29 2c 20 0a 20 20 20 20 20  : "ipk"), .     
1bdd0 20 6e 45 71 2c 20 6e 49 6e 4d 75 6c 2c 20 65 73   nEq, nInMul, es
1bde0 74 42 6f 75 6e 64 2c 20 62 53 6f 72 74 2c 20 62  tBound, bSort, b
1bdf0 4c 6f 6f 6b 75 70 2c 20 77 73 46 6c 61 67 73 2c  Lookup, wsFlags,
1be00 0a 20 20 20 20 20 20 6e 6f 74 52 65 61 64 79 2c  .      notReady,
1be10 20 6e 52 6f 77 2c 20 63 6f 73 74 2c 20 75 73 65   nRow, cost, use
1be20 64 0a 20 20 20 20 29 29 3b 0a 0a 20 20 20 20 2f  d.    ));..    /
1be30 2a 20 49 66 20 74 68 69 73 20 69 6e 64 65 78 20  * If this index 
1be40 69 73 20 74 68 65 20 62 65 73 74 20 77 65 20 68  is the best we h
1be50 61 76 65 20 73 65 65 6e 20 73 6f 20 66 61 72 2c  ave seen so far,
1be60 20 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68 69   then record thi
1be70 73 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 61  s.    ** index a
1be80 6e 64 20 69 74 73 20 63 6f 73 74 20 69 6e 20 74  nd its cost in t
1be90 68 65 20 70 43 6f 73 74 20 73 74 72 75 63 74 75  he pCost structu
1bea0 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  re..    */.    i
1beb0 66 28 20 28 21 70 49 64 78 20 7c 7c 20 77 73 46  f( (!pIdx || wsF
1bec0 6c 61 67 73 29 0a 20 20 20 20 20 26 26 20 28 63  lags).     && (c
1bed0 6f 73 74 3c 70 43 6f 73 74 2d 3e 72 43 6f 73 74  ost<pCost->rCost
1bee0 20 7c 7c 20 28 63 6f 73 74 3c 3d 70 43 6f 73 74   || (cost<=pCost
1bef0 2d 3e 72 43 6f 73 74 20 26 26 20 6e 52 6f 77 3c  ->rCost && nRow<
1bf00 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 52 6f 77  pCost->plan.nRow
1bf10 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
1bf20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20 63  pCost->rCost = c
1bf30 6f 73 74 3b 0a 20 20 20 20 20 20 70 43 6f 73 74  ost;.      pCost
1bf40 2d 3e 75 73 65 64 20 3d 20 75 73 65 64 3b 0a 20  ->used = used;. 
1bf50 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e       pCost->plan
1bf60 2e 6e 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20  .nRow = nRow;.  
1bf70 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e      pCost->plan.
1bf80 77 73 46 6c 61 67 73 20 3d 20 28 77 73 46 6c 61  wsFlags = (wsFla
1bf90 67 73 26 77 73 46 6c 61 67 4d 61 73 6b 29 3b 0a  gs&wsFlagMask);.
1bfa0 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61        pCost->pla
1bfb0 6e 2e 6e 45 71 20 3d 20 6e 45 71 3b 0a 20 20 20  n.nEq = nEq;.   
1bfc0 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75     pCost->plan.u
1bfd0 2e 70 49 64 78 20 3d 20 70 49 64 78 3b 0a 20 20  .pIdx = pIdx;.  
1bfe0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
1bff0 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45  here was an INDE
1c000 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74  XED BY clause, t
1c010 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e  hen only that on
1c020 65 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 2a  e index is.    *
1c030 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f  * considered. */
1c040 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 70  .    if( pSrc->p
1c050 49 6e 64 65 78 20 29 20 62 72 65 61 6b 3b 0a 0a  Index ) break;..
1c060 20 20 20 20 2f 2a 20 52 65 73 65 74 20 6d 61 73      /* Reset mas
1c070 6b 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  ks for the next 
1c080 69 6e 64 65 78 20 69 6e 20 74 68 65 20 6c 6f 6f  index in the loo
1c090 70 20 2a 2f 0a 20 20 20 20 77 73 46 6c 61 67 4d  p */.    wsFlagM
1c0a0 61 73 6b 20 3d 20 7e 28 57 48 45 52 45 5f 52 4f  ask = ~(WHERE_RO
1c0b0 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57  WID_EQ|WHERE_ROW
1c0c0 49 44 5f 52 41 4e 47 45 29 3b 0a 20 20 20 20 65  ID_RANGE);.    e
1c0d0 71 54 65 72 6d 4d 61 73 6b 20 3d 20 69 64 78 45  qTermMask = idxE
1c0e0 71 54 65 72 6d 4d 61 73 6b 3b 0a 20 20 7d 0a 0a  qTermMask;.  }..
1c0f0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
1c100 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61   no ORDER BY cla
1c110 75 73 65 20 61 6e 64 20 74 68 65 20 53 51 4c 49  use and the SQLI
1c120 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72 20  TE_ReverseOrder 
1c130 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 73 65 74  flag.  ** is set
1c140 2c 20 74 68 65 6e 20 72 65 76 65 72 73 65 20 74  , then reverse t
1c150 68 65 20 6f 72 64 65 72 20 74 68 61 74 20 74 68  he order that th
1c160 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 62 65 20  e index will be 
1c170 73 63 61 6e 6e 65 64 0a 20 20 2a 2a 20 69 6e 2e  scanned.  ** in.
1c180 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
1c190 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 74 65  r application te
1c1a0 73 74 69 6e 67 2c 20 74 6f 20 68 65 6c 70 20 66  sting, to help f
1c1b0 69 6e 64 20 63 61 73 65 73 0a 20 20 2a 2a 20 77  ind cases.  ** w
1c1c0 68 65 72 65 20 61 70 70 6c 69 63 61 74 69 6f 6e  here application
1c1d0 20 62 65 68 61 76 69 6f 75 72 20 64 65 70 65 6e   behaviour depen
1c1e0 64 73 20 6f 6e 20 74 68 65 20 28 75 6e 64 65 66  ds on the (undef
1c1f0 69 6e 65 64 29 20 6f 72 64 65 72 20 74 68 61 74  ined) order that
1c200 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20 6f 75 74  .  ** SQLite out
1c210 70 75 74 73 20 72 6f 77 73 20 69 6e 20 69 6e 20  puts rows in in 
1c220 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 61  the absence of a
1c230 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
1c240 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4f  e.  */.  if( !pO
1c250 72 64 65 72 42 79 20 26 26 20 70 50 61 72 73 65  rderBy && pParse
1c260 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1c270 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65  LITE_ReverseOrde
1c280 72 20 29 7b 0a 20 20 20 20 70 43 6f 73 74 2d 3e  r ){.    pCost->
1c290 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20  plan.wsFlags |= 
1c2a0 57 48 45 52 45 5f 52 45 56 45 52 53 45 3b 0a 20  WHERE_REVERSE;. 
1c2b0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f   }..  assert( pO
1c2c0 72 64 65 72 42 79 20 7c 7c 20 28 70 43 6f 73 74  rderBy || (pCost
1c2d0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 26 57  ->plan.wsFlags&W
1c2e0 48 45 52 45 5f 4f 52 44 45 52 42 59 29 3d 3d 30  HERE_ORDERBY)==0
1c2f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1c300 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  ost->plan.u.pIdx
1c310 3d 3d 30 20 7c 7c 20 28 70 43 6f 73 74 2d 3e 70  ==0 || (pCost->p
1c320 6c 61 6e 2e 77 73 46 6c 61 67 73 26 57 48 45 52  lan.wsFlags&WHER
1c330 45 5f 52 4f 57 49 44 5f 45 51 29 3d 3d 30 20 29  E_ROWID_EQ)==0 )
1c340 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
1c350 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 0a 20 20 20  ->pIndex==0 .   
1c360 20 20 20 20 7c 7c 20 70 43 6f 73 74 2d 3e 70 6c      || pCost->pl
1c370 61 6e 2e 75 2e 70 49 64 78 3d 3d 30 20 0a 20 20  an.u.pIdx==0 .  
1c380 20 20 20 20 20 7c 7c 20 70 43 6f 73 74 2d 3e 70       || pCost->p
1c390 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 70 53 72 63  lan.u.pIdx==pSrc
1c3a0 2d 3e 70 49 6e 64 65 78 20 0a 20 20 29 3b 0a 0a  ->pIndex .  );..
1c3b0 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 62    WHERETRACE(("b
1c3c0 65 73 74 20 69 6e 64 65 78 20 69 73 3a 20 25 73  est index is: %s
1c3d0 5c 6e 22 2c 20 0a 20 20 20 20 28 28 70 43 6f 73  \n", .    ((pCos
1c3e0 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  t->plan.wsFlags 
1c3f0 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c  & WHERE_NOT_FULL
1c400 53 43 41 4e 29 3d 3d 30 20 3f 20 22 6e 6f 6e 65  SCAN)==0 ? "none
1c410 22 20 3a 20 0a 20 20 20 20 20 20 20 20 20 70 43  " : .         pC
1c420 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  ost->plan.u.pIdx
1c430 20 3f 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75   ? pCost->plan.u
1c440 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22  .pIdx->zName : "
1c450 69 70 6b 22 29 0a 20 20 29 29 3b 0a 20 20 0a 20  ipk").  ));.  . 
1c460 20 62 65 73 74 4f 72 43 6c 61 75 73 65 49 6e 64   bestOrClauseInd
1c470 65 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20  ex(pParse, pWC, 
1c480 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20  pSrc, notReady, 
1c490 6e 6f 74 56 61 6c 69 64 2c 20 70 4f 72 64 65 72  notValid, pOrder
1c4a0 42 79 2c 20 70 43 6f 73 74 29 3b 0a 20 20 62 65  By, pCost);.  be
1c4b0 73 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78  stAutomaticIndex
1c4c0 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53  (pParse, pWC, pS
1c4d0 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 43  rc, notReady, pC
1c4e0 6f 73 74 29 3b 0a 20 20 70 43 6f 73 74 2d 3e 70  ost);.  pCost->p
1c4f0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 65  lan.wsFlags |= e
1c500 71 54 65 72 6d 4d 61 73 6b 3b 0a 7d 0a 0a 2f 2a  qTermMask;.}../*
1c510 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 71 75 65  .** Find the que
1c520 72 79 20 70 6c 61 6e 20 66 6f 72 20 61 63 63 65  ry plan for acce
1c530 73 73 69 6e 67 20 74 61 62 6c 65 20 70 53 72 63  ssing table pSrc
1c540 2d 3e 70 54 61 62 2e 20 57 72 69 74 65 20 74 68  ->pTab. Write th
1c550 65 0a 2a 2a 20 62 65 73 74 20 71 75 65 72 79 20  e.** best query 
1c560 70 6c 61 6e 20 61 6e 64 20 69 74 73 20 63 6f 73  plan and its cos
1c570 74 20 69 6e 74 6f 20 74 68 65 20 57 68 65 72 65  t into the Where
1c580 43 6f 73 74 20 6f 62 6a 65 63 74 20 73 75 70 70  Cost object supp
1c590 6c 69 65 64 20 0a 2a 2a 20 61 73 20 74 68 65 20  lied .** as the 
1c5a0 6c 61 73 74 20 70 61 72 61 6d 65 74 65 72 2e 20  last parameter. 
1c5b0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1c5c0 79 20 63 61 6c 63 75 6c 61 74 65 20 74 68 65 20  y calculate the 
1c5d0 63 6f 73 74 20 6f 66 0a 2a 2a 20 62 6f 74 68 20  cost of.** both 
1c5e0 72 65 61 6c 20 61 6e 64 20 76 69 72 74 75 61 6c  real and virtual
1c5f0 20 74 61 62 6c 65 20 73 63 61 6e 73 2e 0a 2a 2f   table scans..*/
1c600 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65 73  .static void bes
1c610 74 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  tIndex(.  Parse 
1c620 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
1c630 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
1c640 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1c650 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
1c660 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  WC,           /*
1c670 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
1c680 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
1c690 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
1c6a0 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63  ,  /* The FROM c
1c6b0 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65  lause term to se
1c6c0 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73  arch */.  Bitmas
1c6d0 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20  k notReady,     
1c6e0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
1c6f0 20 63 75 72 73 6f 72 73 20 6e 6f 74 20 61 76 61   cursors not ava
1c700 69 6c 61 62 6c 65 20 66 6f 72 20 69 6e 64 65 78  ilable for index
1c710 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ing */.  Bitmask
1c720 20 6e 6f 74 56 61 6c 69 64 2c 20 20 20 20 20 20   notValid,      
1c730 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20       /* Cursors 
1c740 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  not available fo
1c750 72 20 61 6e 79 20 70 75 72 70 6f 73 65 20 2a 2f  r any purpose */
1c760 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
1c770 64 65 72 42 79 2c 20 20 20 20 20 20 20 20 20 2f  derBy,         /
1c780 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
1c790 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
1c7a0 43 6f 73 74 20 2a 70 43 6f 73 74 20 20 20 20 20  Cost *pCost     
1c7b0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 65 73 74         /* Lowest
1c7c0 20 63 6f 73 74 20 71 75 65 72 79 20 70 6c 61 6e   cost query plan
1c7d0 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
1c7e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1c7f0 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73  ALTABLE.  if( Is
1c800 56 69 72 74 75 61 6c 28 70 53 72 63 2d 3e 70 54  Virtual(pSrc->pT
1c810 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ab) ){.    sqlit
1c820 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
1c830 20 3d 20 30 3b 0a 20 20 20 20 62 65 73 74 56 69   = 0;.    bestVi
1c840 72 74 75 61 6c 49 6e 64 65 78 28 70 50 61 72 73  rtualIndex(pPars
1c850 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f  e, pWC, pSrc, no
1c860 74 52 65 61 64 79 2c 20 6e 6f 74 56 61 6c 69 64  tReady, notValid
1c870 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 43 6f 73  , pOrderBy, pCos
1c880 74 2c 26 70 29 3b 0a 20 20 20 20 69 66 28 20 70  t,&p);.    if( p
1c890 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
1c8a0 74 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  tr ){.      sqli
1c8b0 74 65 33 5f 66 72 65 65 28 70 2d 3e 69 64 78 53  te3_free(p->idxS
1c8c0 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  tr);.    }.    s
1c8d0 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
1c8e0 72 73 65 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d  rse->db, p);.  }
1c8f0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a  else.#endif.  {.
1c900 20 20 20 20 62 65 73 74 42 74 72 65 65 49 6e 64      bestBtreeInd
1c910 65 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20  ex(pParse, pWC, 
1c920 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20  pSrc, notReady, 
1c930 6e 6f 74 56 61 6c 69 64 2c 20 70 4f 72 64 65 72  notValid, pOrder
1c940 42 79 2c 20 70 43 6f 73 74 29 3b 0a 20 20 7d 0a  By, pCost);.  }.
1c950 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65  }../*.** Disable
1c960 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57   a term in the W
1c970 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45 78  HERE clause.  Ex
1c980 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73  cept, do not dis
1c990 61 62 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a  able the term.**
1c9a0 20 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20   if it controls 
1c9b0 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
1c9c0 4e 20 61 6e 64 20 69 74 20 64 69 64 20 6e 6f 74  N and it did not
1c9d0 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68   originate in th
1c9e0 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47  e ON.** or USING
1c9f0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20   clause of that 
1ca00 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73  join..**.** Cons
1ca10 69 64 65 72 20 74 68 65 20 74 65 72 6d 20 74 32  ider the term t2
1ca20 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20 66  .z='ok' in the f
1ca30 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69 65 73  ollowing queries
1ca40 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53  :.**.**   (1)  S
1ca50 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1ca60 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  LEFT JOIN t2 ON 
1ca70 74 31 2e 61 3d 74 32 2e 78 20 57 48 45 52 45 20  t1.a=t2.x WHERE 
1ca80 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28  t2.z='ok'.**   (
1ca90 32 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  2)  SELECT * FRO
1caa0 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74  M t1 LEFT JOIN t
1cab0 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41  2 ON t1.a=t2.x A
1cac0 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20  ND t2.z='ok'.** 
1cad0 20 20 28 33 29 20 20 53 45 4c 45 43 54 20 2a 20    (3)  SELECT * 
1cae0 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52  FROM t1, t2 WHER
1caf0 45 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20  E t1.a=t2.x AND 
1cb00 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20  t2.z='ok'.**.** 
1cb10 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73  The t2.z='ok' is
1cb20 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68 65   disabled in the
1cb30 20 69 6e 20 28 32 29 20 62 65 63 61 75 73 65 20   in (2) because 
1cb40 69 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a  it originates.**
1cb50 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73   in the ON claus
1cb60 65 2e 20 20 54 68 65 20 74 65 72 6d 20 69 73 20  e.  The term is 
1cb70 64 69 73 61 62 6c 65 64 20 69 6e 20 28 33 29 20  disabled in (3) 
1cb80 62 65 63 61 75 73 65 20 69 74 20 69 73 20 6e 6f  because it is no
1cb90 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c  t part.** of a L
1cba0 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20  EFT OUTER JOIN. 
1cbb0 20 49 6e 20 28 31 29 2c 20 74 68 65 20 74 65 72   In (1), the ter
1cbc0 6d 20 69 73 20 6e 6f 74 20 64 69 73 61 62 6c 65  m is not disable
1cbd0 64 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45  d..**.** IMPLEME
1cbe0 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 34  NTATION-OF: R-24
1cbf0 35 39 37 2d 35 38 36 35 35 20 4e 6f 20 74 65 73  597-58655 No tes
1cc00 74 73 20 61 72 65 20 64 6f 6e 65 20 66 6f 72 20  ts are done for 
1cc10 74 65 72 6d 73 20 74 68 61 74 20 61 72 65 0a 2a  terms that are.*
1cc20 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 73 61 74  * completely sat
1cc30 69 73 66 69 65 64 20 62 79 20 69 6e 64 69 63 65  isfied by indice
1cc40 73 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69  s..**.** Disabli
1cc50 6e 67 20 61 20 74 65 72 6d 20 63 61 75 73 65 73  ng a term causes
1cc60 20 74 68 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f   that term to no
1cc70 74 20 62 65 20 74 65 73 74 65 64 20 69 6e 20 74  t be tested in t
1cc80 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a  he inner loop.**
1cc90 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44   of the join.  D
1cca0 69 73 61 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f  isabling is an o
1ccb0 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68  ptimization.  Wh
1ccc0 65 6e 20 74 65 72 6d 73 20 61 72 65 20 73 61 74  en terms are sat
1ccd0 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64  isfied.** by ind
1cce0 69 63 65 73 2c 20 77 65 20 64 69 73 61 62 6c 65  ices, we disable
1ccf0 20 74 68 65 6d 20 74 6f 20 70 72 65 76 65 6e 74   them to prevent
1cd00 20 72 65 64 75 6e 64 61 6e 74 20 74 65 73 74 73   redundant tests
1cd10 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a   in the inner.**
1cd20 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64   loop.  We would
1cd30 20 67 65 74 20 74 68 65 20 63 6f 72 72 65 63 74   get the correct
1cd40 20 72 65 73 75 6c 74 73 20 69 66 20 6e 6f 74 68   results if noth
1cd50 69 6e 67 20 77 65 72 65 20 65 76 65 72 20 64 69  ing were ever di
1cd60 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a  sabled,.** but j
1cd70 6f 69 6e 73 20 6d 69 67 68 74 20 72 75 6e 20 61  oins might run a
1cd80 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20   little slower. 
1cd90 20 54 68 65 20 74 72 69 63 6b 20 69 73 20 74 6f   The trick is to
1cda0 20 64 69 73 61 62 6c 65 20 61 73 20 6d 75 63 68   disable as much
1cdb0 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e 20 77 69  .** as we can wi
1cdc0 74 68 6f 75 74 20 64 69 73 61 62 6c 69 6e 67 20  thout disabling 
1cdd0 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20 77 65  too much.  If we
1cde0 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 31 29   disabled in (1)
1cdf0 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a 20 74 68  , we'd get.** th
1ce00 65 20 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20  e wrong answer. 
1ce10 20 53 65 65 20 74 69 63 6b 65 74 20 23 38 31 33   See ticket #813
1ce20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1ce30 20 64 69 73 61 62 6c 65 54 65 72 6d 28 57 68 65   disableTerm(Whe
1ce40 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
1ce50 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
1ce60 6d 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 0a  m){.  if( pTerm.
1ce70 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d        && (pTerm-
1ce80 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1ce90 43 4f 44 45 44 29 3d 3d 30 0a 20 20 20 20 20 20  CODED)==0.      
1cea0 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  && (pLevel->iLef
1ceb0 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72  tJoin==0 || Expr
1cec0 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72  HasProperty(pTer
1ced0 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  m->pExpr, EP_Fro
1cee0 6d 4a 6f 69 6e 29 29 0a 20 20 29 7b 0a 20 20 20  mJoin)).  ){.   
1cef0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
1cf00 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20  |= TERM_CODED;. 
1cf10 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 50     if( pTerm->iP
1cf20 61 72 65 6e 74 3e 3d 30 20 29 7b 0a 20 20 20 20  arent>=0 ){.    
1cf30 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74    WhereTerm *pOt
1cf40 68 65 72 20 3d 20 26 70 54 65 72 6d 2d 3e 70 57  her = &pTerm->pW
1cf50 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69 50 61 72  C->a[pTerm->iPar
1cf60 65 6e 74 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  ent];.      if( 
1cf70 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43 68 69 6c  (--pOther->nChil
1cf80 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  d)==0 ){.       
1cf90 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
1cfa0 76 65 6c 2c 20 70 4f 74 68 65 72 29 3b 0a 20 20  vel, pOther);.  
1cfb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1cfc0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  }../*.** Code an
1cfd0 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63   OP_Affinity opc
1cfe0 6f 64 65 20 74 6f 20 61 70 70 6c 79 20 74 68 65  ode to apply the
1cff0 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79   column affinity
1d000 20 73 74 72 69 6e 67 20 7a 41 66 66 0a 2a 2a 20   string zAff.** 
1d010 74 6f 20 74 68 65 20 6e 20 72 65 67 69 73 74 65  to the n registe
1d020 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 62  rs starting at b
1d030 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 41 73 20 61  ase. .**.** As a
1d040 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20  n optimization, 
1d050 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
1d060 65 6e 74 72 69 65 73 20 28 77 68 69 63 68 20 61  entries (which a
1d070 72 65 20 6e 6f 2d 6f 70 73 29 20 61 74 20 74 68  re no-ops) at th
1d080 65 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 61  e.** beginning a
1d090 6e 64 20 65 6e 64 20 6f 66 20 7a 41 66 66 20 61  nd end of zAff a
1d0a0 72 65 20 69 67 6e 6f 72 65 64 2e 20 20 49 66 20  re ignored.  If 
1d0b0 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 20 7a  all entries in z
1d0c0 41 66 66 20 61 72 65 0a 2a 2a 20 53 51 4c 49 54  Aff are.** SQLIT
1d0d0 45 5f 41 46 46 5f 4e 4f 4e 45 2c 20 74 68 65 6e  E_AFF_NONE, then
1d0e0 20 6e 6f 20 63 6f 64 65 20 67 65 74 73 20 67 65   no code gets ge
1d0f0 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  nerated..**.** T
1d100 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  his routine make
1d110 73 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f  s its own copy o
1d120 66 20 7a 41 66 66 20 73 6f 20 74 68 61 74 20 74  f zAff so that t
1d130 68 65 20 63 61 6c 6c 65 72 20 69 73 20 66 72 65  he caller is fre
1d140 65 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66 79 20 7a  e.** to modify z
1d150 41 66 66 20 61 66 74 65 72 20 74 68 69 73 20 72  Aff after this r
1d160 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a  outine returns..
1d170 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
1d180 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  odeApplyAffinity
1d190 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1d1a0 69 6e 74 20 62 61 73 65 2c 20 69 6e 74 20 6e 2c  int base, int n,
1d1b0 20 63 68 61 72 20 2a 7a 41 66 66 29 7b 0a 20 20   char *zAff){.  
1d1c0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1d1d0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 7a  ->pVdbe;.  if( z
1d1e0 41 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  Aff==0 ){.    as
1d1f0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
1d200 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1d210 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
1d220 7d 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  }.  assert( v!=0
1d230 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 6a 75 73 74   );..  /* Adjust
1d240 20 62 61 73 65 20 61 6e 64 20 6e 20 74 6f 20 73   base and n to s
1d250 6b 69 70 20 6f 76 65 72 20 53 51 4c 49 54 45 5f  kip over SQLITE_
1d260 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73  AFF_NONE entries
1d270 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
1d280 67 0a 20 20 2a 2a 20 61 6e 64 20 65 6e 64 20 6f  g.  ** and end o
1d290 66 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73  f the affinity s
1d2a0 74 72 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 77 68  tring..  */.  wh
1d2b0 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 41 66 66  ile( n>0 && zAff
1d2c0 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  [0]==SQLITE_AFF_
1d2d0 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b  NONE ){.    n--;
1d2e0 0a 20 20 20 20 62 61 73 65 2b 2b 3b 0a 20 20 20  .    base++;.   
1d2f0 20 7a 41 66 66 2b 2b 3b 0a 20 20 7d 0a 20 20 77   zAff++;.  }.  w
1d300 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 41 66  hile( n>1 && zAf
1d310 66 5b 6e 2d 31 5d 3d 3d 53 51 4c 49 54 45 5f 41  f[n-1]==SQLITE_A
1d320 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e  FF_NONE ){.    n
1d330 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  --;.  }..  /* Co
1d340 64 65 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69  de the OP_Affini
1d350 74 79 20 6f 70 63 6f 64 65 20 69 66 20 74 68 65  ty opcode if the
1d360 72 65 20 69 73 20 61 6e 79 74 68 69 6e 67 20 6c  re is anything l
1d370 65 66 74 20 74 6f 20 64 6f 2e 20 2a 2f 0a 20 20  eft to do. */.  
1d380 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 73  if( n>0 ){.    s
1d390 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1d3a0 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c  (v, OP_Affinity,
1d3b0 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 20 20 73   base, n);.    s
1d3c0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1d3d0 50 34 28 76 2c 20 2d 31 2c 20 7a 41 66 66 2c 20  P4(v, -1, zAff, 
1d3e0 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  n);.    sqlite3E
1d3f0 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
1d400 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 62  Change(pParse, b
1d410 61 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a  ase, n);.  }.}..
1d420 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1d430 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c  code for a singl
1d440 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20  e equality term 
1d450 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
1d460 75 73 65 2e 20 20 41 6e 20 65 71 75 61 6c 69 74  use.  An equalit
1d470 79 0a 2a 2a 20 74 65 72 6d 20 63 61 6e 20 62 65  y.** term can be
1d480 20 65 69 74 68 65 72 20 58 3d 65 78 70 72 20 6f   either X=expr o
1d490 72 20 58 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20  r X IN (...).   
1d4a0 70 54 65 72 6d 20 69 73 20 74 68 65 20 74 65 72  pTerm is the ter
1d4b0 6d 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65  m to be .** code
1d4c0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72  d..**.** The cur
1d4d0 72 65 6e 74 20 76 61 6c 75 65 20 66 6f 72 20 74  rent value for t
1d4e0 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  he constraint is
1d4f0 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74 65   left in registe
1d500 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f  r iReg..**.** Fo
1d510 72 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  r a constraint o
1d520 66 20 74 68 65 20 66 6f 72 6d 20 58 3d 65 78 70  f the form X=exp
1d530 72 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  r, the expressio
1d540 6e 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 61  n is evaluated a
1d550 6e 64 20 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74  nd its.** result
1d560 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20   is left on the 
1d570 73 74 61 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73  stack.  For cons
1d580 74 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20 66  traints of the f
1d590 6f 72 6d 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a  orm X IN (...).*
1d5a0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * this routine s
1d5b0 65 74 73 20 75 70 20 61 20 6c 6f 6f 70 20 74 68  ets up a loop th
1d5c0 61 74 20 77 69 6c 6c 20 69 74 65 72 61 74 65 20  at will iterate 
1d5d0 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20  over all values 
1d5e0 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  of X..*/.static 
1d5f0 69 6e 74 20 63 6f 64 65 45 71 75 61 6c 69 74 79  int codeEquality
1d600 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70  Term(.  Parse *p
1d610 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54  Parse,      /* T
1d620 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
1d630 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  xt */.  WhereTer
1d640 6d 20 2a 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54  m *pTerm,   /* T
1d650 68 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  he term of the W
1d660 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62  HERE clause to b
1d670 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65  e coded */.  Whe
1d680 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
1d690 20 2f 2a 20 57 68 65 6e 20 6c 65 76 65 6c 20 6f   /* When level o
1d6a0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
1d6b0 65 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67  e we are working
1d6c0 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61   on */.  int iTa
1d6d0 72 67 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20  rget         /* 
1d6e0 41 74 74 65 6d 70 74 20 74 6f 20 6c 65 61 76 65  Attempt to leave
1d6f0 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 69 73   results in this
1d700 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a   register */.){.
1d710 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65    Expr *pX = pTe
1d720 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62  rm->pExpr;.  Vdb
1d730 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1d740 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 52 65 67  Vdbe;.  int iReg
1d750 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d760 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
1d770 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 73 20 2a  olding results *
1d780 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 54 61  /..  assert( iTa
1d790 72 67 65 74 3e 30 20 29 3b 0a 20 20 69 66 28 20  rget>0 );.  if( 
1d7a0 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b  pX->op==TK_EQ ){
1d7b0 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69  .    iReg = sqli
1d7c0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
1d7d0 74 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  t(pParse, pX->pR
1d7e0 69 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a  ight, iTarget);.
1d7f0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e    }else if( pX->
1d800 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b  op==TK_ISNULL ){
1d810 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72  .    iReg = iTar
1d820 67 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  get;.    sqlite3
1d830 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d840 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b  _Null, 0, iReg);
1d850 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1d860 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
1d870 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 65  }else{.    int e
1d880 54 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 69 54  Type;.    int iT
1d890 61 62 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49  ab;.    struct I
1d8a0 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 0a 20 20 20  nLoop *pIn;..   
1d8b0 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d   assert( pX->op=
1d8c0 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 69 52  =TK_IN );.    iR
1d8d0 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20  eg = iTarget;.  
1d8e0 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65    eType = sqlite
1d8f0 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61  3FindInIndex(pPa
1d900 72 73 65 2c 20 70 58 2c 20 30 29 3b 0a 20 20 20  rse, pX, 0);.   
1d910 20 69 54 61 62 20 3d 20 70 58 2d 3e 69 54 61 62   iTab = pX->iTab
1d920 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  le;.    sqlite3V
1d930 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1d940 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29  Rewind, iTab, 0)
1d950 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
1d960 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
1d970 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42  gs & WHERE_IN_AB
1d980 4c 45 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  LE );.    if( pL
1d990 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d  evel->u.in.nIn==
1d9a0 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  0 ){.      pLeve
1d9b0 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c  l->addrNxt = sql
1d9c0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1d9d0 6c 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  l(v);.    }.    
1d9e0 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
1d9f0 2b 2b 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ++;.    pLevel->
1da00 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20  u.in.aInLoop =. 
1da10 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52        sqlite3DbR
1da20 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50 61  eallocOrFree(pPa
1da30 72 73 65 2d 3e 64 62 2c 20 70 4c 65 76 65 6c 2d  rse->db, pLevel-
1da40 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 20  >u.in.aInLoop,. 
1da50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da60 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
1da70 65 6f 66 28 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  eof(pLevel->u.in
1da80 2e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65  .aInLoop[0])*pLe
1da90 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a  vel->u.in.nIn);.
1daa0 20 20 20 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c      pIn = pLevel
1dab0 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a  ->u.in.aInLoop;.
1dac0 20 20 20 20 69 66 28 20 70 49 6e 20 29 7b 0a 20      if( pIn ){. 
1dad0 20 20 20 20 20 70 49 6e 20 2b 3d 20 70 4c 65 76       pIn += pLev
1dae0 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20 31  el->u.in.nIn - 1
1daf0 3b 0a 20 20 20 20 20 20 70 49 6e 2d 3e 69 43 75  ;.      pIn->iCu
1db00 72 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20  r = iTab;.      
1db10 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e  if( eType==IN_IN
1db20 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  DEX_ROWID ){.   
1db30 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e       pIn->addrIn
1db40 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
1db50 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
1db60 77 69 64 2c 20 69 54 61 62 2c 20 69 52 65 67 29  wid, iTab, iReg)
1db70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1db80 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72         pIn->addr
1db90 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  InTop = sqlite3V
1dba0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1dbb0 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30 2c  Column, iTab, 0,
1dbc0 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a   iReg);.      }.
1dbd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1dbe0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73  eAddOp1(v, OP_Is
1dbf0 4e 75 6c 6c 2c 20 69 52 65 67 29 3b 0a 20 20 20  Null, iReg);.   
1dc00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
1dc10 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d  evel->u.in.nIn =
1dc20 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   0;.    }.#endif
1dc30 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c 65 54 65  .  }.  disableTe
1dc40 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d  rm(pLevel, pTerm
1dc50 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67  );.  return iReg
1dc60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
1dc70 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
1dc80 6c 6c 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20  ll evaluate all 
1dc90 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72  == and IN constr
1dca0 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20  aints for an.** 
1dcb0 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  index..**.** For
1dcc0 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64   example, consid
1dcd0 65 72 20 74 61 62 6c 65 20 74 31 28 61 2c 62 2c  er table t1(a,b,
1dce0 63 2c 64 2c 65 2c 66 29 20 77 69 74 68 20 69 6e  c,d,e,f) with in
1dcf0 64 65 78 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a  dex i1(a,b,c)..*
1dd00 2a 20 53 75 70 70 6f 73 65 20 74 68 65 20 57 48  * Suppose the WH
1dd10 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 74 68  ERE clause is th
1dd20 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44 20 62 20  is:  a==5 AND b 
1dd30 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e 44 20 63  IN (1,2,3) AND c
1dd40 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54  >5 AND c<10.** T
1dd50 68 65 20 69 6e 64 65 78 20 68 61 73 20 61 73 20  he index has as 
1dd60 6d 61 6e 79 20 61 73 20 74 68 72 65 65 20 65 71  many as three eq
1dd70 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1dd80 74 73 2c 20 62 75 74 20 69 6e 20 74 68 69 73 0a  ts, but in this.
1dd90 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20  ** example, the 
1dda0 74 68 69 72 64 20 22 63 22 20 76 61 6c 75 65 20  third "c" value 
1ddb0 69 73 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  is an inequality
1ddc0 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a  .  So only two .
1ddd0 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  ** constraints a
1dde0 72 65 20 63 6f 64 65 64 2e 20 20 54 68 69 73 20  re coded.  This 
1ddf0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e  routine will gen
1de00 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76  erate code to ev
1de10 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61  aluate.** a==5 a
1de20 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e  nd b IN (1,2,3).
1de30 20 20 54 68 65 20 63 75 72 72 65 6e 74 20 76 61    The current va
1de40 6c 75 65 73 20 66 6f 72 20 61 20 61 6e 64 20 62  lues for a and b
1de50 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 0a   will be stored.
1de60 2a 2a 20 69 6e 20 63 6f 6e 73 65 63 75 74 69 76  ** in consecutiv
1de70 65 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20  e registers and 
1de80 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
1de90 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
1dea0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
1deb0 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c  ** In the exampl
1dec0 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d 32 2e 20  e above nEq==2. 
1ded0 20 42 75 74 20 74 68 69 73 20 73 75 62 72 6f 75   But this subrou
1dee0 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61  tine works for a
1def0 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e  ny value.** of n
1df00 45 71 20 69 6e 63 6c 75 64 69 6e 67 20 30 2e 20  Eq including 0. 
1df10 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74 68 69 73   If nEq==0, this
1df20 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 61 72   routine is near
1df30 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54  ly a no-op..** T
1df40 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 69 74  he only thing it
1df50 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f 63 61 74   does is allocat
1df60 65 20 74 68 65 20 70 4c 65 76 65 6c 2d 3e 69 4d  e the pLevel->iM
1df70 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  em memory cell a
1df80 6e 64 0a 2a 2a 20 63 6f 6d 70 75 74 65 20 74 68  nd.** compute th
1df90 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  e affinity strin
1dfa0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  g..**.** This ro
1dfb0 75 74 69 6e 65 20 61 6c 77 61 79 73 20 61 6c 6c  utine always all
1dfc0 6f 63 61 74 65 73 20 61 74 20 6c 65 61 73 74 20  ocates at least 
1dfd0 6f 6e 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  one memory cell 
1dfe0 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74  and returns.** t
1dff0 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74  he index of that
1e000 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 54 68   memory cell. Th
1e010 65 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63  e code that.** c
1e020 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
1e030 65 20 77 69 6c 6c 20 75 73 65 20 74 68 61 74 20  e will use that 
1e040 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 73  memory cell to s
1e050 74 6f 72 65 20 74 68 65 20 74 65 72 6d 69 6e 61  tore the termina
1e060 74 69 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75  tion.** key valu
1e070 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20  e of the loop.  
1e080 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49  If one or more I
1e090 4e 20 6f 70 65 72 61 74 6f 72 73 20 61 70 70 65  N operators appe
1e0a0 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  ar, then.** this
1e0b0 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74   routine allocat
1e0c0 65 73 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c  es an additional
1e0d0 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   nEq memory cell
1e0e0 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a  s for internal.*
1e0f0 2a 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66  * use..**.** Bef
1e100 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a  ore returning, *
1e110 70 7a 41 66 66 20 69 73 20 73 65 74 20 74 6f 20  pzAff is set to 
1e120 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
1e130 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a  r containing a.*
1e140 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f  * copy of the co
1e150 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74  lumn affinity st
1e160 72 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 64 65  ring of the inde
1e170 78 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e  x allocated usin
1e180 67 0a 2a 2a 20 73 71 6c 69 74 65 33 44 62 4d 61  g.** sqlite3DbMa
1e190 6c 6c 6f 63 28 29 2e 20 45 78 63 65 70 74 2c 20  lloc(). Except, 
1e1a0 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 63  entries in the c
1e1b0 6f 70 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e  opy of the strin
1e1c0 67 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  g associated.** 
1e1d0 77 69 74 68 20 65 71 75 61 6c 69 74 79 20 63 6f  with equality co
1e1e0 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 75  nstraints that u
1e1f0 73 65 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79  se NONE affinity
1e200 20 61 72 65 20 73 65 74 20 74 6f 0a 2a 2a 20 53   are set to.** S
1e210 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20  QLITE_AFF_NONE. 
1e220 54 68 69 73 20 69 73 20 74 6f 20 64 65 61 6c 20  This is to deal 
1e230 77 69 74 68 20 53 51 4c 20 73 75 63 68 20 61 73  with SQL such as
1e240 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
1e250 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54  **.**   CREATE T
1e260 41 42 4c 45 20 74 31 28 61 20 54 45 58 54 20 50  ABLE t1(a TEXT P
1e270 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a  RIMARY KEY, b);.
1e280 2a 2a 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20  **   SELECT ... 
1e290 46 52 4f 4d 20 74 31 20 41 53 20 74 32 2c 20 74  FROM t1 AS t2, t
1e2a0 31 20 57 48 45 52 45 20 74 31 2e 61 20 3d 20 74  1 WHERE t1.a = t
1e2b0 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  2.b;.**.** In th
1e2c0 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c  e example above,
1e2d0 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 74 31   the index on t1
1e2e0 28 61 29 20 68 61 73 20 54 45 58 54 20 61 66 66  (a) has TEXT aff
1e2f0 69 6e 69 74 79 2e 20 42 75 74 20 73 69 6e 63 65  inity. But since
1e300 0a 2a 2a 20 74 68 65 20 72 69 67 68 74 20 68 61  .** the right ha
1e310 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 65  nd side of the e
1e320 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1e330 6e 74 20 28 74 32 2e 62 29 20 68 61 73 20 4e 4f  nt (t2.b) has NO
1e340 4e 45 20 61 66 66 69 6e 69 74 79 2c 0a 2a 2a 20  NE affinity,.** 
1e350 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 20 73 68  no conversion sh
1e360 6f 75 6c 64 20 62 65 20 61 74 74 65 6d 70 74 65  ould be attempte
1e370 64 20 62 65 66 6f 72 65 20 75 73 69 6e 67 20 61  d before using a
1e380 20 74 32 2e 62 20 76 61 6c 75 65 20 61 73 20 70   t2.b value as p
1e390 61 72 74 20 6f 66 0a 2a 2a 20 61 20 6b 65 79 20  art of.** a key 
1e3a0 74 6f 20 73 65 61 72 63 68 20 74 68 65 20 69 6e  to search the in
1e3b0 64 65 78 2e 20 48 65 6e 63 65 20 74 68 65 20 66  dex. Hence the f
1e3c0 69 72 73 74 20 62 79 74 65 20 69 6e 20 74 68 65  irst byte in the
1e3d0 20 72 65 74 75 72 6e 65 64 20 61 66 66 69 6e 69   returned affini
1e3e0 74 79 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e 20  ty.** string in 
1e3f0 74 68 69 73 20 65 78 61 6d 70 6c 65 20 77 6f 75  this example wou
1e400 6c 64 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c  ld be set to SQL
1e410 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f  ITE_AFF_NONE..*/
1e420 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
1e430 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73  AllEqualityTerms
1e440 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1e450 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
1e460 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1e470 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
1e480 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68  evel,   /* Which
1e490 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20   nested loop of 
1e4a0 74 68 65 20 46 52 4f 4d 20 77 65 20 61 72 65 20  the FROM we are 
1e4b0 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 57 68 65 72  coding */.  Wher
1e4c0 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
1e4d0 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
1e4e0 6c 61 75 73 65 20 2a 2f 0a 20 20 42 69 74 6d 61  lause */.  Bitma
1e4f0 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
1e500 20 2f 2a 20 57 68 69 63 68 20 70 61 72 74 73 20   /* Which parts 
1e510 6f 66 20 46 52 4f 4d 20 68 61 76 65 20 6e 6f 74  of FROM have not
1e520 20 79 65 74 20 62 65 65 6e 20 63 6f 64 65 64 20   yet been coded 
1e530 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 52  */.  int nExtraR
1e540 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  eg,        /* Nu
1e550 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65  mber of extra re
1e560 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63  gisters to alloc
1e570 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ate */.  char **
1e580 70 7a 41 66 66 20 20 20 20 20 20 20 20 20 20 2f  pzAff          /
1e590 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20 70 6f  * OUT: Set to po
1e5a0 69 6e 74 20 74 6f 20 61 66 66 69 6e 69 74 79 20  int to affinity 
1e5b0 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69  string */.){.  i
1e5c0 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d  nt nEq = pLevel-
1e5d0 3e 70 6c 61 6e 2e 6e 45 71 3b 20 20 20 2f 2a 20  >plan.nEq;   /* 
1e5e0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d  The number of ==
1e5f0 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   or IN constrain
1e600 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20  ts to code */.  
1e610 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1e620 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a  ->pVdbe;      /*
1e630 20 54 68 65 20 76 6d 20 75 6e 64 65 72 20 63 6f   The vm under co
1e640 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
1e650 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
1e660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e670 20 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   The index being
1e680 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20 6c   used for this l
1e690 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  oop */.  int iCu
1e6a0 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  r = pLevel->iTab
1e6b0 43 75 72 3b 20 20 20 2f 2a 20 54 68 65 20 63 75  Cur;   /* The cu
1e6c0 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c  rsor of the tabl
1e6d0 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
1e6e0 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
1e6f0 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
1e700 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d   constraint term
1e710 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20   */.  int j;    
1e720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e730 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
1e740 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ter */.  int reg
1e750 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  Base;           
1e760 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72         /* Base r
1e770 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
1e780 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20 20   nReg;          
1e790 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1e7a0 6d 62 65 72 20 6f 66 20 72 65 67 69 73 74 65 72  mber of register
1e7b0 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
1e7c0 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 3b 20 20  .  char *zAff;  
1e7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7e0 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72   /* Affinity str
1e7f0 69 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ing to return */
1e800 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75  ..  /* This modu
1e810 6c 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  le is only calle
1e820 64 20 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e 73  d on query plans
1e830 20 74 68 61 74 20 75 73 65 20 61 6e 20 69 6e 64   that use an ind
1e840 65 78 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ex. */.  assert(
1e850 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
1e860 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
1e870 44 45 58 45 44 20 29 3b 0a 20 20 70 49 64 78 20  DEXED );.  pIdx 
1e880 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75  = pLevel->plan.u
1e890 2e 70 49 64 78 3b 0a 0a 20 20 2f 2a 20 46 69 67  .pIdx;..  /* Fig
1e8a0 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
1e8b0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65   memory cells we
1e8c0 20 77 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20   will need then 
1e8d0 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20  allocate them.. 
1e8e0 20 2a 2f 0a 20 20 72 65 67 42 61 73 65 20 3d 20   */.  regBase = 
1e8f0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
1e900 3b 0a 20 20 6e 52 65 67 20 3d 20 70 4c 65 76 65  ;.  nReg = pLeve
1e910 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20 2b 20 6e 45  l->plan.nEq + nE
1e920 78 74 72 61 52 65 67 3b 0a 20 20 70 50 61 72 73  xtraReg;.  pPars
1e930 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b  e->nMem += nReg;
1e940 0a 0a 20 20 7a 41 66 66 20 3d 20 73 71 6c 69 74  ..  zAff = sqlit
1e950 65 33 44 62 53 74 72 44 75 70 28 70 50 61 72 73  e3DbStrDup(pPars
1e960 65 2d 3e 64 62 2c 20 73 71 6c 69 74 65 33 49 6e  e->db, sqlite3In
1e970 64 65 78 41 66 66 69 6e 69 74 79 53 74 72 28 76  dexAffinityStr(v
1e980 2c 20 70 49 64 78 29 29 3b 0a 20 20 69 66 28 20  , pIdx));.  if( 
1e990 21 7a 41 66 66 20 29 7b 0a 20 20 20 20 70 50 61  !zAff ){.    pPa
1e9a0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
1e9b0 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a  ailed = 1;.  }..
1e9c0 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
1e9d0 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  e equality const
1e9e0 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73  raints.  */.  as
1e9f0 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  sert( pIdx->nCol
1ea00 75 6d 6e 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f  umn>=nEq );.  fo
1ea10 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b  r(j=0; j<nEq; j+
1ea20 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a  +){.    int r1;.
1ea30 20 20 20 20 69 6e 74 20 6b 20 3d 20 70 49 64 78      int k = pIdx
1ea40 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
1ea50 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
1ea60 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6b  erm(pWC, iCur, k
1ea70 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76  , notReady, pLev
1ea80 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
1ea90 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 69 66 28  , pIdx);.    if(
1eaa0 20 4e 45 56 45 52 28 70 54 65 72 6d 3d 3d 30 29   NEVER(pTerm==0)
1eab0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 2f 2a   ) break;.    /*
1eac0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
1ead0 72 75 65 20 66 6f 72 20 69 6e 64 69 63 65 73 20  rue for indices 
1eae0 77 69 74 68 20 72 65 64 75 6e 64 61 6e 74 20 63  with redundant c
1eaf0 6f 6c 75 6d 6e 73 2e 20 0a 20 20 20 20 2a 2a 20  olumns. .    ** 
1eb00 45 78 3a 20 43 52 45 41 54 45 20 49 4e 44 45 58  Ex: CREATE INDEX
1eb10 20 69 31 20 4f 4e 20 74 31 28 61 2c 62 2c 61 29   i1 ON t1(a,b,a)
1eb20 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ; SELECT * FROM 
1eb30 74 31 20 57 48 45 52 45 20 61 3d 30 20 41 4e 44  t1 WHERE a=0 AND
1eb40 20 62 3d 30 3b 20 2a 2f 0a 20 20 20 20 74 65 73   b=0; */.    tes
1eb50 74 63 61 73 65 28 20 28 70 54 65 72 6d 2d 3e 77  tcase( (pTerm->w
1eb60 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  tFlags & TERM_CO
1eb70 44 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 74  DED)!=0 );.    t
1eb80 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
1eb90 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
1eba0 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a  IRTUAL ); /* EV:
1ebb0 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a   R-30575-11662 *
1ebc0 2f 0a 20 20 20 20 72 31 20 3d 20 63 6f 64 65 45  /.    r1 = codeE
1ebd0 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72  qualityTerm(pPar
1ebe0 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65  se, pTerm, pLeve
1ebf0 6c 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20  l, regBase+j);. 
1ec00 20 20 20 69 66 28 20 72 31 21 3d 72 65 67 42 61     if( r1!=regBa
1ec10 73 65 2b 6a 20 29 7b 0a 20 20 20 20 20 20 69 66  se+j ){.      if
1ec20 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20  ( nReg==1 ){.   
1ec30 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
1ec40 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1ec50 65 2c 20 72 65 67 42 61 73 65 29 3b 0a 20 20 20  e, regBase);.   
1ec60 20 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 72       regBase = r
1ec70 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
1ec80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1ec90 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1eca0 53 43 6f 70 79 2c 20 72 31 2c 20 72 65 67 42 61  SCopy, r1, regBa
1ecb0 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20  se+j);.      }. 
1ecc0 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73     }.    testcas
1ecd0 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
1ece0 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  tor & WO_ISNULL 
1ecf0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1ed00 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
1ed10 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  r & WO_IN );.   
1ed20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
1ed30 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e  erator & (WO_ISN
1ed40 55 4c 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20 29  ULL|WO_IN))==0 )
1ed50 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  {.      Expr *pR
1ed60 69 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45  ight = pTerm->pE
1ed70 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
1ed80 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1ed90 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20  deIsNullJump(v, 
1eda0 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b  pRight, regBase+
1edb0 6a 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42  j, pLevel->addrB
1edc0 72 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  rk);.      if( z
1edd0 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Aff ){.        i
1ede0 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  f( sqlite3Compar
1edf0 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74  eAffinity(pRight
1ee00 2c 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49  , zAff[j])==SQLI
1ee10 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20  TE_AFF_NONE ){. 
1ee20 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d           zAff[j]
1ee30 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
1ee40 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
1ee50 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1ee60 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69  3ExprNeedsNoAffi
1ee70 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68  nityChange(pRigh
1ee80 74 2c 20 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a 20  t, zAff[j]) ){. 
1ee90 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d           zAff[j]
1eea0 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
1eeb0 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
1eec0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1eed0 20 20 2a 70 7a 41 66 66 20 3d 20 7a 41 66 66 3b    *pzAff = zAff;
1eee0 0a 20 20 72 65 74 75 72 6e 20 72 65 67 42 61 73  .  return regBas
1eef0 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  e;.}..#ifndef SQ
1ef00 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
1ef10 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  N./*.** This rou
1ef20 74 69 6e 65 20 69 73 20 61 20 68 65 6c 70 65 72  tine is a helper
1ef30 20 66 6f 72 20 65 78 70 6c 61 69 6e 49 6e 64 65   for explainInde
1ef40 78 52 61 6e 67 65 28 29 20 62 65 6c 6f 77 0a 2a  xRange() below.*
1ef50 2a 0a 2a 2a 20 70 53 74 72 20 68 6f 6c 64 73 20  *.** pStr holds 
1ef60 74 68 65 20 74 65 78 74 20 6f 66 20 61 6e 20 65  the text of an e
1ef70 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 77  xpression that w
1ef80 65 20 61 72 65 20 62 75 69 6c 64 69 6e 67 20 75  e are building u
1ef90 70 20 6f 6e 65 20 74 65 72 6d 0a 2a 2a 20 61 74  p one term.** at
1efa0 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72   a time.  This r
1efb0 6f 75 74 69 6e 65 20 61 64 64 73 20 61 20 6e 65  outine adds a ne
1efc0 77 20 74 65 72 6d 20 74 6f 20 74 68 65 20 65 6e  w term to the en
1efd0 64 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  d of the express
1efe0 69 6f 6e 2e 0a 2a 2a 20 54 65 72 6d 73 20 61 72  ion..** Terms ar
1eff0 65 20 73 65 70 61 72 61 74 65 64 20 62 79 20 41  e separated by A
1f000 4e 44 20 73 6f 20 61 64 64 20 74 68 65 20 22 41  ND so add the "A
1f010 4e 44 22 20 74 65 78 74 20 66 6f 72 20 73 65 63  ND" text for sec
1f020 6f 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  ond and subseque
1f030 6e 74 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79  nt.** terms only
1f040 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1f050 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65   explainAppendTe
1f060 72 6d 28 0a 20 20 53 74 72 41 63 63 75 6d 20 2a  rm(.  StrAccum *
1f070 70 53 74 72 2c 20 20 20 20 20 20 20 20 20 20 20  pStr,           
1f080 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 78    /* The text ex
1f090 70 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 62  pression being b
1f0a0 75 69 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54  uilt */.  int iT
1f0b0 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
1f0c0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
1f0d0 66 20 74 68 69 73 20 74 65 72 6d 2e 20 20 46 69  f this term.  Fi
1f0e0 72 73 74 20 69 73 20 7a 65 72 6f 20 2a 2f 0a 20  rst is zero */. 
1f0f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
1f100 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20  lumn,        /* 
1f110 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  Name of the colu
1f120 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  mn */.  const ch
1f130 61 72 20 2a 7a 4f 70 20 20 20 20 20 20 20 20 20  ar *zOp         
1f140 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1f150 68 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 29  he operator */.)
1f160 7b 0a 20 20 69 66 28 20 69 54 65 72 6d 20 29 20  {.  if( iTerm ) 
1f170 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
1f180 70 70 65 6e 64 28 70 53 74 72 2c 20 22 20 41 4e  ppend(pStr, " AN
1f190 44 20 22 2c 20 35 29 3b 0a 20 20 73 71 6c 69 74  D ", 5);.  sqlit
1f1a0 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
1f1b0 28 70 53 74 72 2c 20 7a 43 6f 6c 75 6d 6e 2c 20  (pStr, zColumn, 
1f1c0 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74  -1);.  sqlite3St
1f1d0 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74  rAccumAppend(pSt
1f1e0 72 2c 20 7a 4f 70 2c 20 31 29 3b 0a 20 20 73 71  r, zOp, 1);.  sq
1f1f0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
1f200 65 6e 64 28 70 53 74 72 2c 20 22 3f 22 2c 20 31  end(pStr, "?", 1
1f210 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75  );.}../*.** Argu
1f220 6d 65 6e 74 20 70 4c 65 76 65 6c 20 64 65 73 63  ment pLevel desc
1f230 72 69 62 65 73 20 61 20 73 74 72 61 74 65 67 79  ribes a strategy
1f240 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 61   for scanning ta
1f250 62 6c 65 20 70 54 61 62 2e 20 54 68 69 73 20 0a  ble pTab. This .
1f260 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
1f270 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
1f280 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72   a string buffer
1f290 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 64 65   containing a de
1f2a0 73 63 72 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20  scription.** of 
1f2b0 74 68 65 20 73 75 62 73 65 74 20 6f 66 20 74 61  the subset of ta
1f2c0 62 6c 65 20 72 6f 77 73 20 73 63 61 6e 6e 65 64  ble rows scanned
1f2d0 20 62 79 20 74 68 65 20 73 74 72 61 74 65 67 79   by the strategy
1f2e0 20 69 6e 20 74 68 65 20 66 6f 72 6d 20 6f 66 20   in the form of 
1f2f0 61 6e 0a 2a 2a 20 53 51 4c 20 65 78 70 72 65 73  an.** SQL expres
1f300 73 69 6f 6e 2e 20 4f 72 2c 20 69 66 20 61 6c 6c  sion. Or, if all
1f310 20 72 6f 77 73 20 61 72 65 20 73 63 61 6e 6e 65   rows are scanne
1f320 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  d, NULL is retur
1f330 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  ned..**.** For e
1f340 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71  xample, if the q
1f350 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45  uery:.**.**   SE
1f360 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
1f370 48 45 52 45 20 61 3d 31 20 41 4e 44 20 62 3e 32  HERE a=1 AND b>2
1f380 3b 0a 2a 2a 0a 2a 2a 20 69 73 20 72 75 6e 20 61  ;.**.** is run a
1f390 6e 64 20 74 68 65 72 65 20 69 73 20 61 6e 20 69  nd there is an i
1f3a0 6e 64 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20  ndex on (a, b), 
1f3b0 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
1f3c0 6f 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20  on returns a.** 
1f3d0 73 74 72 69 6e 67 20 73 69 6d 69 6c 61 72 20 74  string similar t
1f3e0 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20  o:.**.**   "a=? 
1f3f0 41 4e 44 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54  AND b>?".**.** T
1f400 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e  he returned poin
1f410 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 6d 65  ter points to me
1f420 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
1f430 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  om sqlite3DbMall
1f440 6f 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74  oc()..** It is t
1f450 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
1f460 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
1f470 74 6f 20 66 72 65 65 20 74 68 65 20 62 75 66 66  to free the buff
1f480 65 72 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a  er when it is.**
1f490 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69   no longer requi
1f4a0 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  red..*/.static c
1f4b0 68 61 72 20 2a 65 78 70 6c 61 69 6e 49 6e 64 65  har *explainInde
1f4c0 78 52 61 6e 67 65 28 73 71 6c 69 74 65 33 20 2a  xRange(sqlite3 *
1f4d0 64 62 2c 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  db, WhereLevel *
1f4e0 70 4c 65 76 65 6c 2c 20 54 61 62 6c 65 20 2a 70  pLevel, Table *p
1f4f0 54 61 62 29 7b 0a 20 20 57 68 65 72 65 50 6c 61  Tab){.  WherePla
1f500 6e 20 2a 70 50 6c 61 6e 20 3d 20 26 70 4c 65 76  n *pPlan = &pLev
1f510 65 6c 2d 3e 70 6c 61 6e 3b 0a 20 20 49 6e 64 65  el->plan;.  Inde
1f520 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 50 6c 61  x *pIndex = pPla
1f530 6e 2d 3e 75 2e 70 49 64 78 3b 0a 20 20 69 6e 74  n->u.pIdx;.  int
1f540 20 6e 45 71 20 3d 20 70 50 6c 61 6e 2d 3e 6e 45   nEq = pPlan->nE
1f550 71 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  q;.  int i, j;. 
1f560 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20   Column *aCol = 
1f570 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 69 6e  pTab->aCol;.  in
1f580 74 20 2a 61 69 43 6f 6c 75 6d 6e 20 3d 20 70 49  t *aiColumn = pI
1f590 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 3b 0a  ndex->aiColumn;.
1f5a0 20 20 53 74 72 41 63 63 75 6d 20 74 78 74 3b 0a    StrAccum txt;.
1f5b0 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 26 26  .  if( nEq==0 &&
1f5c0 20 28 70 50 6c 61 6e 2d 3e 77 73 46 6c 61 67 73   (pPlan->wsFlags
1f5d0 20 26 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49   & (WHERE_BTM_LI
1f5e0 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49  MIT|WHERE_TOP_LI
1f5f0 4d 49 54 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  MIT))==0 ){.    
1f600 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1f610 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49  sqlite3StrAccumI
1f620 6e 69 74 28 26 74 78 74 2c 20 30 2c 20 30 2c 20  nit(&txt, 0, 0, 
1f630 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
1f640 48 29 3b 0a 20 20 74 78 74 2e 64 62 20 3d 20 64  H);.  txt.db = d
1f650 62 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41  b;.  sqlite3StrA
1f660 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c  ccumAppend(&txt,
1f670 20 22 20 28 22 2c 20 32 29 3b 0a 20 20 66 6f 72   " (", 2);.  for
1f680 28 69 3d 30 3b 20 69 3c 6e 45 71 3b 20 69 2b 2b  (i=0; i<nEq; i++
1f690 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70  ){.    explainAp
1f6a0 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69  pendTerm(&txt, i
1f6b0 2c 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b  , aCol[aiColumn[
1f6c0 69 5d 5d 2e 7a 4e 61 6d 65 2c 20 22 3d 22 29 3b  i]].zName, "=");
1f6d0 0a 20 20 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20  .  }..  j = i;. 
1f6e0 20 69 66 28 20 70 50 6c 61 6e 2d 3e 77 73 46 6c   if( pPlan->wsFl
1f6f0 61 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49  ags&WHERE_BTM_LI
1f700 4d 49 54 20 29 7b 0a 20 20 20 20 65 78 70 6c 61  MIT ){.    expla
1f710 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78  inAppendTerm(&tx
1f720 74 2c 20 69 2b 2b 2c 20 61 43 6f 6c 5b 61 69 43  t, i++, aCol[aiC
1f730 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 2c  olumn[j]].zName,
1f740 20 22 3e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28   ">");.  }.  if(
1f750 20 70 50 6c 61 6e 2d 3e 77 73 46 6c 61 67 73 26   pPlan->wsFlags&
1f760 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
1f770 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70  ){.    explainAp
1f780 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69  pendTerm(&txt, i
1f790 2c 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b  , aCol[aiColumn[
1f7a0 6a 5d 5d 2e 7a 4e 61 6d 65 2c 20 22 3c 22 29 3b  j]].zName, "<");
1f7b0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74  .  }.  sqlite3St
1f7c0 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78  rAccumAppend(&tx
1f7d0 74 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 72 65  t, ")", 1);.  re
1f7e0 74 75 72 6e 20 73 71 6c 69 74 65 33 53 74 72 41  turn sqlite3StrA
1f7f0 63 63 75 6d 46 69 6e 69 73 68 28 26 74 78 74 29  ccumFinish(&txt)
1f800 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1f810 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
1f820 2d 6f 70 20 75 6e 6c 65 73 73 20 63 75 72 72 65  -op unless curre
1f830 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20  ntly processing 
1f840 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  an EXPLAIN QUERY
1f850 20 50 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64   PLAN.** command
1f860 2e 20 49 66 20 74 68 65 20 71 75 65 72 79 20 62  . If the query b
1f870 65 69 6e 67 20 63 6f 6d 70 69 6c 65 64 20 69 73  eing compiled is
1f880 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52   an EXPLAIN QUER
1f890 59 20 50 4c 41 4e 2c 20 61 20 73 69 6e 67 6c 65  Y PLAN, a single
1f8a0 0a 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 61 64  .** record is ad
1f8b0 64 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75  ded to the outpu
1f8c0 74 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68  t to describe th
1f8d0 65 20 74 61 62 6c 65 20 73 63 61 6e 20 73 74 72  e table scan str
1f8e0 61 74 65 67 79 20 69 6e 20 0a 2a 2a 20 70 4c 65  ategy in .** pLe
1f8f0 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  vel..*/.static v
1f900 6f 69 64 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63  oid explainOneSc
1f910 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  an(.  Parse *pPa
1f920 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
1f930 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
1f940 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
1f950 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
1f960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1f970 61 62 6c 65 20 6c 69 73 74 20 74 68 69 73 20 6c  able list this l
1f980 6f 6f 70 20 72 65 66 65 72 73 20 74 6f 20 2a 2f  oop refers to */
1f990 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
1f9a0 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
1f9b0 20 20 20 2f 2a 20 53 63 61 6e 20 74 6f 20 77 72     /* Scan to wr
1f9c0 69 74 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f  ite OP_Explain o
1f9d0 70 63 6f 64 65 20 66 6f 72 20 2a 2f 0a 20 20 69  pcode for */.  i
1f9e0 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20  nt iLevel,      
1f9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fa00 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 6c 65 76  * Value for "lev
1fa10 65 6c 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75  el" column of ou
1fa20 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46  tput */.  int iF
1fa30 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  rom,            
1fa40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
1fa50 75 65 20 66 6f 72 20 22 66 72 6f 6d 22 20 63 6f  ue for "from" co
1fa60 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a  lumn of output *
1fa70 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61  /.  u16 wctrlFla
1fa80 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
1fa90 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
1faa0 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68  sed to sqlite3Wh
1fab0 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 29 7b  ereBegin() */.){
1fac0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
1fad0 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20  xplain==2 ){.   
1fae0 20 75 33 32 20 66 6c 61 67 73 20 3d 20 70 4c 65   u32 flags = pLe
1faf0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
1fb00 73 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  s;.    struct Sr
1fb10 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1fb20 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
1fb30 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
1fb40 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70  .    Vdbe *v = p
1fb50 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
1fb60 20 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67 20 63     /* VM being c
1fb70 6f 6e 73 74 72 75 63 74 65 64 20 2a 2f 0a 20 20  onstructed */.  
1fb80 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1fb90 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
1fba0 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
1fbb0 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  le */.    char *
1fbc0 7a 4d 73 67 3b 20 20 20 20 20 20 20 20 20 20 20  zMsg;           
1fbd0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
1fbe0 74 6f 20 61 64 64 20 74 6f 20 45 51 50 20 6f 75  to add to EQP ou
1fbf0 74 70 75 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69  tput */.    sqli
1fc00 74 65 33 5f 69 6e 74 36 34 20 6e 52 6f 77 3b 20  te3_int64 nRow; 
1fc10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
1fc20 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  ected number of 
1fc30 72 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20  rows visited by 
1fc40 73 63 61 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  scan */.    int 
1fc50 69 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53  iId = pParse->iS
1fc60 65 6c 65 63 74 49 64 3b 20 20 2f 2a 20 53 65 6c  electId;  /* Sel
1fc70 65 63 74 20 69 64 20 28 6c 65 66 74 2d 6d 6f 73  ect id (left-mos
1fc80 74 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 29  t output column)
1fc90 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 53 65   */.    int isSe
1fca0 61 72 63 68 3b 20 20 20 20 20 20 20 20 20 20 20  arch;           
1fcb0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
1fcc0 72 20 61 20 53 45 41 52 43 48 2e 20 46 61 6c 73  r a SEARCH. Fals
1fcd0 65 20 66 6f 72 20 53 43 41 4e 2e 20 2a 2f 0a 0a  e for SCAN. */..
1fce0 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 26 57      if( (flags&W
1fcf0 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c  HERE_MULTI_OR) |
1fd00 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48  | (wctrlFlags&WH
1fd10 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
1fd20 59 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  Y) ) return;..  
1fd30 20 20 69 73 53 65 61 72 63 68 20 3d 20 28 70 4c    isSearch = (pL
1fd40 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3e 30  evel->plan.nEq>0
1fd50 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  ).             |
1fd60 7c 20 28 66 6c 61 67 73 26 28 57 48 45 52 45 5f  | (flags&(WHERE_
1fd70 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f  BTM_LIMIT|WHERE_
1fd80 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30 0a 20  TOP_LIMIT))!=0. 
1fd90 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
1fda0 77 63 74 72 6c 46 6c 61 67 73 26 28 57 48 45 52  wctrlFlags&(WHER
1fdb0 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 7c 57 48  E_ORDERBY_MIN|WH
1fdc0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 29  ERE_ORDERBY_MAX)
1fdd0 29 3b 0a 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73  );..    zMsg = s
1fde0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
1fdf0 2c 20 22 25 73 22 2c 20 69 73 53 65 61 72 63 68  , "%s", isSearch
1fe00 3f 22 53 45 41 52 43 48 22 3a 22 53 43 41 4e 22  ?"SEARCH":"SCAN"
1fe10 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  );.    if( pItem
1fe20 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
1fe30 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
1fe40 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
1fe50 73 67 2c 20 22 25 73 20 53 55 42 51 55 45 52 59  sg, "%s SUBQUERY
1fe60 20 25 64 22 2c 20 7a 4d 73 67 2c 70 49 74 65 6d   %d", zMsg,pItem
1fe70 2d 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  ->iSelectId);.  
1fe80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
1fe90 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
1fea0 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
1feb0 22 25 73 20 54 41 42 4c 45 20 25 73 22 2c 20 7a  "%s TABLE %s", z
1fec0 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  Msg, pItem->zNam
1fed0 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  e);.    }..    i
1fee0 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  f( pItem->zAlias
1fef0 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d   ){.      zMsg =
1ff00 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
1ff10 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 41  (db, zMsg, "%s A
1ff20 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74  S %s", zMsg, pIt
1ff30 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
1ff40 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67   }.    if( (flag
1ff50 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
1ff60 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  D)!=0 ){.      c
1ff70 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 65 78  har *zWhere = ex
1ff80 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28  plainIndexRange(
1ff90 64 62 2c 20 70 4c 65 76 65 6c 2c 20 70 49 74 65  db, pLevel, pIte
1ffa0 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 20 20  m->pTab);.      
1ffb0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
1ffc0 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
1ffd0 20 22 25 73 20 55 53 49 4e 47 20 25 73 25 73 49   "%s USING %s%sI
1ffe0 4e 44 45 58 25 73 25 73 25 73 22 2c 20 7a 4d 73  NDEX%s%s%s", zMs
1fff0 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28 28  g, .          ((
20000 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 45  flags & WHERE_TE
20010 4d 50 5f 49 4e 44 45 58 29 3f 22 41 55 54 4f 4d  MP_INDEX)?"AUTOM
20020 41 54 49 43 20 22 3a 22 22 29 2c 0a 20 20 20 20  ATIC ":""),.    
20030 20 20 20 20 20 20 28 28 66 6c 61 67 73 20 26 20        ((flags & 
20040 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3f  WHERE_IDX_ONLY)?
20050 22 43 4f 56 45 52 49 4e 47 20 22 3a 22 22 29 2c  "COVERING ":""),
20060 0a 20 20 20 20 20 20 20 20 20 20 28 28 66 6c 61  .          ((fla
20070 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f  gs & WHERE_TEMP_
20080 49 4e 44 45 58 29 3f 22 22 3a 22 20 22 29 2c 0a  INDEX)?"":" "),.
20090 20 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67            ((flag
200a0 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49  s & WHERE_TEMP_I
200b0 4e 44 45 58 29 3f 22 22 3a 20 70 4c 65 76 65 6c  NDEX)?"": pLevel
200c0 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a  ->plan.u.pIdx->z
200d0 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20  Name),.         
200e0 20 7a 57 68 65 72 65 0a 20 20 20 20 20 20 29 3b   zWhere.      );
200f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
20100 46 72 65 65 28 64 62 2c 20 7a 57 68 65 72 65 29  Free(db, zWhere)
20110 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
20120 66 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 52  flags & (WHERE_R
20130 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f  OWID_EQ|WHERE_RO
20140 57 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20  WID_RANGE) ){.  
20150 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
20160 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
20170 4d 73 67 2c 20 22 25 73 20 55 53 49 4e 47 20 49  Msg, "%s USING I
20180 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
20190 45 59 22 2c 20 7a 4d 73 67 29 3b 0a 0a 20 20 20  EY", zMsg);..   
201a0 20 20 20 69 66 28 20 66 6c 61 67 73 26 57 48 45     if( flags&WHE
201b0 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 7b 0a 20  RE_ROWID_EQ ){. 
201c0 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
201d0 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
201e0 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77  , zMsg, "%s (row
201f0 69 64 3d 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20  id=?)", zMsg);. 
20200 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
20210 66 6c 61 67 73 26 57 48 45 52 45 5f 42 4f 54 48  flags&WHERE_BOTH
20220 5f 4c 49 4d 49 54 29 3d 3d 57 48 45 52 45 5f 42  _LIMIT)==WHERE_B
20230 4f 54 48 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  OTH_LIMIT ){.   
20240 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
20250 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
20260 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64  zMsg, "%s (rowid
20270 3e 3f 20 41 4e 44 20 72 6f 77 69 64 3c 3f 29 22  >? AND rowid<?)"
20280 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d  , zMsg);.      }
20290 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 26 57  else if( flags&W
202a0 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29  HERE_BTM_LIMIT )
202b0 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d  {.        zMsg =
202c0 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
202d0 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28  (db, zMsg, "%s (
202e0 72 6f 77 69 64 3e 3f 29 22 2c 20 7a 4d 73 67 29  rowid>?)", zMsg)
202f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
20300 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f 54 4f  ( flags&WHERE_TO
20310 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20  P_LIMIT ){.     
20320 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
20330 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
20340 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3c 3f  sg, "%s (rowid<?
20350 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20  )", zMsg);.     
20360 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66   }.    }.#ifndef
20370 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
20380 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 65 6c  TUALTABLE.    el
20390 73 65 20 69 66 28 20 28 66 6c 61 67 73 20 26 20  se if( (flags & 
203a0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
203b0 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  LE)!=0 ){.      
203c0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
203d0 66 6f 20 2a 70 56 74 61 62 49 64 78 20 3d 20 70  fo *pVtabIdx = p
203e0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 56  Level->plan.u.pV
203f0 74 61 62 49 64 78 3b 0a 20 20 20 20 20 20 7a 4d  tabIdx;.      zM
20400 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
20410 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
20420 25 73 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  %s VIRTUAL TABLE
20430 20 49 4e 44 45 58 20 25 64 3a 25 73 22 2c 20 7a   INDEX %d:%s", z
20440 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Msg,.           
20450 20 20 20 20 20 20 20 70 56 74 61 62 49 64 78 2d         pVtabIdx-
20460 3e 69 64 78 4e 75 6d 2c 20 70 56 74 61 62 49 64  >idxNum, pVtabId
20470 78 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  x->idxStr);.    
20480 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  }.#endif.    if(
20490 20 77 63 74 72 6c 46 6c 61 67 73 26 28 57 48 45   wctrlFlags&(WHE
204a0 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 7c 57  RE_ORDERBY_MIN|W
204b0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58  HERE_ORDERBY_MAX
204c0 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  ) ){.      testc
204d0 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20  ase( wctrlFlags 
204e0 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  & WHERE_ORDERBY_
204f0 4d 49 4e 20 29 3b 0a 20 20 20 20 20 20 6e 52 6f  MIN );.      nRo
20500 77 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  w = 1;.    }else
20510 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 3d 20 28  {.      nRow = (
20520 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 4c  sqlite3_int64)pL
20530 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 3b  evel->plan.nRow;
20540 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d 73 67 20  .    }.    zMsg 
20550 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
20560 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
20570 28 7e 25 6c 6c 64 20 72 6f 77 73 29 22 2c 20 7a  (~%lld rows)", z
20580 4d 73 67 2c 20 6e 52 6f 77 29 3b 0a 20 20 20 20  Msg, nRow);.    
20590 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
205a0 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  4(v, OP_Explain,
205b0 20 69 49 64 2c 20 69 4c 65 76 65 6c 2c 20 69 46   iId, iLevel, iF
205c0 72 6f 6d 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59  rom, zMsg, P4_DY
205d0 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  NAMIC);.  }.}.#e
205e0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70  lse.# define exp
205f0 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 75 2c 76 2c  lainOneScan(u,v,
20600 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20  w,x,y,z).#endif 
20610 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
20620 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  XPLAIN */.../*.*
20630 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
20640 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66  for the start of
20650 20 74 68 65 20 69 4c 65 76 65 6c 2d 74 68 20 6c   the iLevel-th l
20660 6f 6f 70 20 69 6e 20 74 68 65 20 57 48 45 52 45  oop in the WHERE
20670 20 63 6c 61 75 73 65 0a 2a 2a 20 69 6d 70 6c 65   clause.** imple
20680 6d 65 6e 74 61 74 69 6f 6e 20 64 65 73 63 72 69  mentation descri
20690 62 65 64 20 62 79 20 70 57 49 6e 66 6f 2e 0a 2a  bed by pWInfo..*
206a0 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  /.static Bitmask
206b0 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72   codeOneLoopStar
206c0 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  t(.  WhereInfo *
206d0 70 57 49 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d  pWInfo,   /* Com
206e0 70 6c 65 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f  plete informatio
206f0 6e 20 61 62 6f 75 74 20 74 68 65 20 57 48 45 52  n about the WHER
20700 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  E clause */.  in
20710 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20  t iLevel,       
20720 20 20 20 2f 2a 20 57 68 69 63 68 20 6c 65 76 65     /* Which leve
20730 6c 20 6f 66 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  l of pWInfo->a[]
20740 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 64 65 64   should be coded
20750 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46   */.  u16 wctrlF
20760 6c 61 67 73 2c 20 20 20 20 20 20 2f 2a 20 4f 6e  lags,      /* On
20770 65 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 2a  e of the WHERE_*
20780 20 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20 69   flags defined i
20790 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f  n sqliteInt.h */
207a0 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
207b0 61 64 79 20 20 20 20 20 2f 2a 20 57 68 69 63 68  ady     /* Which
207c0 20 74 61 62 6c 65 73 20 61 72 65 20 63 75 72 72   tables are curr
207d0 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 20  ently available 
207e0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b  */.){.  int j, k
207f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
20800 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
20810 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20  .  int iCur;    
20820 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
20830 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
20840 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
20850 74 20 61 64 64 72 4e 78 74 3b 20 20 20 20 20 20  t addrNxt;      
20860 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a     /* Where to j
20870 75 6d 70 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ump to continue 
20880 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e  with the next IN
20890 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f   case */.  int o
208a0 6d 69 74 54 61 62 6c 65 3b 20 20 20 20 20 20 20  mitTable;       
208b0 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 75 73  /* True if we us
208c0 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79  e the index only
208d0 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b 20   */.  int bRev; 
208e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
208f0 75 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  ue if we need to
20900 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65   scan in reverse
20910 20 6f 72 64 65 72 20 2a 2f 0a 20 20 57 68 65 72   order */.  Wher
20920 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20  eLevel *pLevel; 
20930 20 2f 2a 20 54 68 65 20 77 68 65 72 65 20 6c 65   /* The where le
20940 76 65 6c 20 74 6f 20 62 65 20 63 6f 64 65 64 20  vel to be coded 
20950 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
20960 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 44 65 63   *pWC;    /* Dec
20970 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68  omposition of th
20980 65 20 65 6e 74 69 72 65 20 57 48 45 52 45 20 63  e entire WHERE c
20990 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
209a0 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
209b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
209c0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
209d0 6d 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  m */.  Parse *pP
209e0 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
209f0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
20a00 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 56  g context */.  V
20a10 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
20a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20a30 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
20a40 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tmt under constr
20a50 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 74 72  uctions */.  str
20a60 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
20a70 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20   *pTabItem;  /* 
20a80 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
20a90 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
20aa0 20 20 69 6e 74 20 61 64 64 72 42 72 6b 3b 20 20    int addrBrk;  
20ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ac0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
20ad0 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  o break out of t
20ae0 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  he loop */.  int
20af0 20 61 64 64 72 43 6f 6e 74 3b 20 20 20 20 20 20   addrCont;      
20b00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20b10 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e  Jump here to con
20b20 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20  tinue with next 
20b30 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  cycle */.  int i
20b40 52 6f 77 69 64 52 65 67 20 3d 20 30 3b 20 20 20  RowidReg = 0;   
20b50 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 69 73       /* Rowid is
20b60 20 73 74 6f 72 65 64 20 69 6e 20 74 68 69 73 20   stored in this 
20b70 72 65 67 69 73 74 65 72 2c 20 69 66 20 6e 6f 74  register, if not
20b80 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69   zero */.  int i
20b90 52 65 6c 65 61 73 65 52 65 67 20 3d 20 30 3b 20  ReleaseReg = 0; 
20ba0 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67       /* Temp reg
20bb0 69 73 74 65 72 20 74 6f 20 66 72 65 65 20 62 65  ister to free be
20bc0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 2a  fore returning *
20bd0 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57  /..  pParse = pW
20be0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20  Info->pParse;.  
20bf0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
20c00 65 3b 0a 20 20 70 57 43 20 3d 20 70 57 49 6e 66  e;.  pWC = pWInf
20c10 6f 2d 3e 70 57 43 3b 0a 20 20 70 4c 65 76 65 6c  o->pWC;.  pLevel
20c20 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c   = &pWInfo->a[iL
20c30 65 76 65 6c 5d 3b 0a 20 20 70 54 61 62 49 74 65  evel];.  pTabIte
20c40 6d 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61  m = &pWInfo->pTa
20c50 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
20c60 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 43 75 72 20  >iFrom];.  iCur 
20c70 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  = pTabItem->iCur
20c80 73 6f 72 3b 0a 20 20 62 52 65 76 20 3d 20 28 70  sor;.  bRev = (p
20c90 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
20ca0 61 67 73 20 26 20 57 48 45 52 45 5f 52 45 56 45  ags & WHERE_REVE
20cb0 52 53 45 29 21 3d 30 3b 0a 20 20 6f 6d 69 74 54  RSE)!=0;.  omitT
20cc0 61 62 6c 65 20 3d 20 28 70 4c 65 76 65 6c 2d 3e  able = (pLevel->
20cd0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
20ce0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d  HERE_IDX_ONLY)!=
20cf0 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  0 .           &&
20d00 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
20d10 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45  HERE_FORCE_TABLE
20d20 29 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 43 72 65 61  )==0;..  /* Crea
20d30 74 65 20 6c 61 62 65 6c 73 20 66 6f 72 20 74 68  te labels for th
20d40 65 20 22 62 72 65 61 6b 22 20 61 6e 64 20 22 63  e "break" and "c
20d50 6f 6e 74 69 6e 75 65 22 20 69 6e 73 74 72 75 63  ontinue" instruc
20d60 74 69 6f 6e 73 0a 20 20 2a 2a 20 66 6f 72 20 74  tions.  ** for t
20d70 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e  he current loop.
20d80 20 20 4a 75 6d 70 20 74 6f 20 61 64 64 72 42 72    Jump to addrBr
20d90 6b 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  k to break out o
20da0 66 20 61 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a  f a loop..  ** J
20db0 75 6d 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67  ump to cont to g
20dc0 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  o immediately to
20dd0 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74   the next iterat
20de0 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ion of the.  ** 
20df0 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  loop..  **.  ** 
20e00 57 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6e  When there is an
20e10 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 65   IN operator, we
20e20 20 61 6c 73 6f 20 68 61 76 65 20 61 20 22 61 64   also have a "ad
20e30 64 72 4e 78 74 22 20 6c 61 62 65 6c 20 74 68 61  drNxt" label tha
20e40 74 0a 20 20 2a 2a 20 6d 65 61 6e 73 20 74 6f 20  t.  ** means to 
20e50 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68  continue with th
20e60 65 20 6e 65 78 74 20 49 4e 20 76 61 6c 75 65 20  e next IN value 
20e70 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 20 57 68  combination.  Wh
20e80 65 6e 0a 20 20 2a 2a 20 74 68 65 72 65 20 61 72  en.  ** there ar
20e90 65 20 6e 6f 20 49 4e 20 6f 70 65 72 61 74 6f 72  e no IN operator
20ea0 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 61  s in the constra
20eb0 69 6e 74 73 2c 20 74 68 65 20 22 61 64 64 72 4e  ints, the "addrN
20ec0 78 74 22 20 6c 61 62 65 6c 0a 20 20 2a 2a 20 69  xt" label.  ** i
20ed0 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 22 61  s the same as "a
20ee0 64 64 72 42 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20  ddrBrk"..  */.  
20ef0 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c  addrBrk = pLevel
20f00 2d 3e 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76  ->addrBrk = pLev
20f10 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71  el->addrNxt = sq
20f20 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
20f30 65 6c 28 76 29 3b 0a 20 20 61 64 64 72 43 6f 6e  el(v);.  addrCon
20f40 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  t = pLevel->addr
20f50 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
20f60 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
20f70 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
20f80 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
20f90 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52   of a LEFT OUTER
20fa0 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20   JOIN, allocate 
20fb0 61 6e 64 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c  and.  ** initial
20fc0 69 7a 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c  ize a memory cel
20fd0 6c 20 74 68 61 74 20 72 65 63 6f 72 64 73 20 69  l that records i
20fe0 66 20 74 68 69 73 20 74 61 62 6c 65 20 6d 61 74  f this table mat
20ff0 63 68 65 73 20 61 6e 79 0a 20 20 2a 2a 20 72 6f  ches any.  ** ro
21000 77 20 6f 66 20 74 68 65 20 6c 65 66 74 20 74 61  w of the left ta
21010 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  ble of the join.
21020 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76  .  */.  if( pLev
21030 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28  el->iFrom>0 && (
21040 70 54 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e  pTabItem[0].join
21050 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21  type & JT_LEFT)!
21060 3d 30 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c  =0 ){.    pLevel
21070 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b  ->iLeftJoin = ++
21080 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
21090 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
210a0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
210b0 72 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c  r, 0, pLevel->iL
210c0 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64  eftJoin);.    Vd
210d0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
210e0 6e 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f  nit LEFT JOIN no
210f0 2d 6d 61 74 63 68 20 66 6c 61 67 22 29 29 3b 0a  -match flag"));.
21100 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
21110 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
21120 54 41 42 4c 45 0a 20 20 69 66 28 20 20 28 70 4c  TABLE.  if(  (pL
21130 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
21140 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
21150 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20  ALTABLE)!=0 ){. 
21160 20 20 20 2f 2a 20 43 61 73 65 20 30 3a 20 20 54     /* Case 0:  T
21170 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 76 69  he table is a vi
21180 72 74 75 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73  rtual-table.  Us
21190 65 20 74 68 65 20 56 46 69 6c 74 65 72 20 61 6e  e the VFilter an
211a0 64 20 56 4e 65 78 74 0a 20 20 20 20 2a 2a 20 20  d VNext.    **  
211b0 20 20 20 20 20 20 20 20 74 6f 20 61 63 63 65 73          to acces
211c0 73 20 74 68 65 20 64 61 74 61 2e 0a 20 20 20 20  s the data..    
211d0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 67 3b  */.    int iReg;
211e0 20 20 20 2f 2a 20 50 33 20 56 61 6c 75 65 20 66     /* P3 Value f
211f0 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 2a 2f  or OP_VFilter */
21200 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  .    sqlite3_ind
21210 65 78 5f 69 6e 66 6f 20 2a 70 56 74 61 62 49 64  ex_info *pVtabId
21220 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  x = pLevel->plan
21230 2e 75 2e 70 56 74 61 62 49 64 78 3b 0a 20 20 20  .u.pVtabIdx;.   
21240 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74   int nConstraint
21250 20 3d 20 70 56 74 61 62 49 64 78 2d 3e 6e 43 6f   = pVtabIdx->nCo
21260 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 73 74  nstraint;.    st
21270 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
21280 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
21290 61 67 65 20 2a 61 55 73 61 67 65 20 3d 0a 20 20  age *aUsage =.  
212a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56                pV
212d0 74 61 62 49 64 78 2d 3e 61 43 6f 6e 73 74 72 61  tabIdx->aConstra
212e0 69 6e 74 55 73 61 67 65 3b 0a 20 20 20 20 63 6f  intUsage;.    co
212f0 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c 69 74  nst struct sqlit
21300 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
21310 69 6e 74 20 2a 61 43 6f 6e 73 74 72 61 69 6e 74  int *aConstraint
21320 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   =.             
21330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21350 20 20 20 70 56 74 61 62 49 64 78 2d 3e 61 43 6f     pVtabIdx->aCo
21360 6e 73 74 72 61 69 6e 74 3b 0a 0a 20 20 20 20 73  nstraint;..    s
21370 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
21380 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
21390 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47   iReg = sqlite3G
213a0 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
213b0 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b  se, nConstraint+
213c0 32 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b  2);.    for(j=1;
213d0 20 6a 3c 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 3b   j<=nConstraint;
213e0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72   j++){.      for
213f0 28 6b 3d 30 3b 20 6b 3c 6e 43 6f 6e 73 74 72 61  (k=0; k<nConstra
21400 69 6e 74 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  int; k++){.     
21410 20 20 20 69 66 28 20 61 55 73 61 67 65 5b 6b 5d     if( aUsage[k]
21420 2e 61 72 67 76 49 6e 64 65 78 3d 3d 6a 20 29 7b  .argvIndex==j ){
21430 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
21440 54 65 72 6d 20 3d 20 61 43 6f 6e 73 74 72 61 69  Term = aConstrai
21450 6e 74 5b 6b 5d 2e 69 54 65 72 6d 4f 66 66 73 65  nt[k].iTermOffse
21460 74 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  t;.          sql
21470 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
21480 72 73 65 2c 20 70 57 43 2d 3e 61 5b 69 54 65 72  rse, pWC->a[iTer
21490 6d 5d 2e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m].pExpr->pRight
214a0 2c 20 69 52 65 67 2b 6a 2b 31 29 3b 0a 20 20 20  , iReg+j+1);.   
214b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
214c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
214d0 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 6e 43 6f        if( k==nCo
214e0 6e 73 74 72 61 69 6e 74 20 29 20 62 72 65 61 6b  nstraint ) break
214f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
21500 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
21510 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 56 74   OP_Integer, pVt
21520 61 62 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20 69  abIdx->idxNum, i
21530 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Reg);.    sqlite
21540 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
21550 50 5f 49 6e 74 65 67 65 72 2c 20 6a 2d 31 2c 20  P_Integer, j-1, 
21560 69 52 65 67 2b 31 29 3b 0a 20 20 20 20 73 71 6c  iReg+1);.    sql
21570 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
21580 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69 43  , OP_VFilter, iC
21590 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 69 52 65  ur, addrBrk, iRe
215a0 67 2c 20 70 56 74 61 62 49 64 78 2d 3e 69 64 78  g, pVtabIdx->idx
215b0 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Str,.           
215c0 20 20 20 20 20 20 20 20 20 20 20 70 56 74 61 62             pVtab
215d0 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  Idx->needToFreeI
215e0 64 78 53 74 72 20 3f 20 50 34 5f 4d 50 52 49 4e  dxStr ? P4_MPRIN
215f0 54 46 20 3a 20 50 34 5f 53 54 41 54 49 43 29 3b  TF : P4_STATIC);
21600 0a 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e 6e  .    pVtabIdx->n
21610 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
21620 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  = 0;.    for(j=0
21630 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; j<nConstraint;
21640 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
21650 20 61 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20   aUsage[j].omit 
21660 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
21670 54 65 72 6d 20 3d 20 61 43 6f 6e 73 74 72 61 69  Term = aConstrai
21680 6e 74 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65  nt[j].iTermOffse
21690 74 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62  t;.        disab
216a0 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 26  leTerm(pLevel, &
216b0 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 29 3b 0a  pWC->a[iTerm]);.
216c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
216d0 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
216e0 50 5f 56 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65  P_VNext;.    pLe
216f0 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a  vel->p1 = iCur;.
21700 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
21710 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
21720 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
21730 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
21740 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
21750 69 52 65 67 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  iReg, nConstrain
21760 74 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  t+2);.    sqlite
21770 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
21780 61 72 73 65 2c 20 31 29 3b 0a 20 20 7d 65 6c 73  arse, 1);.  }els
21790 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
217a0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
217b0 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28 20 70  ABLE */..  if( p
217c0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
217d0 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49  ags & WHERE_ROWI
217e0 44 5f 45 51 20 29 7b 0a 20 20 20 20 2f 2a 20 43  D_EQ ){.    /* C
217f0 61 73 65 20 31 3a 20 20 57 65 20 63 61 6e 20 64  ase 1:  We can d
21800 69 72 65 63 74 6c 79 20 72 65 66 65 72 65 6e 63  irectly referenc
21810 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 75  e a single row u
21820 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20  sing an.    **  
21830 20 20 20 20 20 20 20 20 65 71 75 61 6c 69 74 79          equality
21840 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69   comparison agai
21850 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69  nst the ROWID fi
21860 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20  eld.  Or.    ** 
21870 20 20 20 20 20 20 20 20 20 77 65 20 72 65 66 65           we refe
21880 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72  rence multiple r
21890 6f 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77  ows using a "row
218a0 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20  id IN (...)".   
218b0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e   **          con
218c0 73 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  struct..    */. 
218d0 20 20 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d     iReleaseReg =
218e0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
218f0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
21900 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
21910 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (pWC, iCur, -1, 
21920 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c  notReady, WO_EQ|
21930 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20 61  WO_IN, 0);.    a
21940 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20  ssert( pTerm!=0 
21950 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
21960 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29  Term->pExpr!=0 )
21970 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
21980 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
21990 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 61 73 73  =iCur );.    ass
219a0 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d  ert( omitTable==
219b0 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
219c0 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  e( pTerm->wtFlag
219d0 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
219e0 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35   ); /* EV: R-305
219f0 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20  75-11662 */.    
21a00 69 52 6f 77 69 64 52 65 67 20 3d 20 63 6f 64 65  iRowidReg = code
21a10 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61  EqualityTerm(pPa
21a20 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76  rse, pTerm, pLev
21a30 65 6c 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29  el, iReleaseReg)
21a40 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20  ;.    addrNxt = 
21a50 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b  pLevel->addrNxt;
21a60 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
21a70 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73  AddOp2(v, OP_Mus
21a80 74 42 65 49 6e 74 2c 20 69 52 6f 77 69 64 52 65  tBeInt, iRowidRe
21a90 67 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20  g, addrNxt);.   
21aa0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21ab0 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73  p3(v, OP_NotExis
21ac0 74 73 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 78  ts, iCur, addrNx
21ad0 74 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  t, iRowidReg);. 
21ae0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
21af0 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c  cheStore(pParse,
21b00 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69   iCur, -1, iRowi
21b10 64 52 65 67 29 3b 0a 20 20 20 20 56 64 62 65 43  dReg);.    VdbeC
21b20 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29  omment((v, "pk")
21b30 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  );.    pLevel->o
21b40 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d  p = OP_Noop;.  }
21b50 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d  else if( pLevel-
21b60 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
21b70 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47  WHERE_ROWID_RANG
21b80 45 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65  E ){.    /* Case
21b90 20 32 3a 20 20 57 65 20 68 61 76 65 20 61 6e 20   2:  We have an 
21ba0 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61  inequality compa
21bb0 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68  rison against th
21bc0 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20  e ROWID field.. 
21bd0 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65     */.    int te
21be0 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  stOp = OP_Noop;.
21bf0 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20      int start;. 
21c00 20 20 20 69 6e 74 20 6d 65 6d 45 6e 64 56 61 6c     int memEndVal
21c10 75 65 20 3d 20 30 3b 0a 20 20 20 20 57 68 65 72  ue = 0;.    Wher
21c20 65 54 65 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a  eTerm *pStart, *
21c30 70 45 6e 64 3b 0a 0a 20 20 20 20 61 73 73 65 72  pEnd;..    asser
21c40 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20  t( omitTable==0 
21c50 29 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20  );.    pStart = 
21c60 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
21c70 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79  ur, -1, notReady
21c80 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30  , WO_GT|WO_GE, 0
21c90 29 3b 0a 20 20 20 20 70 45 6e 64 20 3d 20 66 69  );.    pEnd = fi
21ca0 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
21cb0 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20  , -1, notReady, 
21cc0 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29 3b  WO_LT|WO_LE, 0);
21cd0 0a 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b  .    if( bRev ){
21ce0 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70  .      pTerm = p
21cf0 53 74 61 72 74 3b 0a 20 20 20 20 20 20 70 53 74  Start;.      pSt
21d00 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20  art = pEnd;.    
21d10 20 20 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a    pEnd = pTerm;.
21d20 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53      }.    if( pS
21d30 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78  tart ){.      Ex
21d40 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  pr *pX;         
21d50 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
21d60 73 73 69 6f 6e 20 74 68 61 74 20 64 65 66 69 6e  ssion that defin
21d70 65 73 20 74 68 65 20 73 74 61 72 74 20 62 6f 75  es the start bou
21d80 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  nd */.      int 
21d90 72 31 2c 20 72 54 65 6d 70 3b 20 20 20 20 20 20  r1, rTemp;      
21da0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 66    /* Registers f
21db0 6f 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  or holding the s
21dc0 74 61 72 74 20 62 6f 75 6e 64 61 72 79 20 2a 2f  tart boundary */
21dd0 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66  ..      /* The f
21de0 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61 6e  ollowing constan
21df0 74 20 6d 61 70 73 20 54 4b 5f 78 78 20 63 6f 64  t maps TK_xx cod
21e00 65 73 20 69 6e 74 6f 20 63 6f 72 72 65 73 70 6f  es into correspo
21e10 6e 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20  nding .      ** 
21e20 73 65 65 6b 20 6f 70 63 6f 64 65 73 2e 20 20 49  seek opcodes.  I
21e30 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 61 20 70  t depends on a p
21e40 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72 69  articular orderi
21e50 6e 67 20 6f 66 20 54 4b 5f 78 78 0a 20 20 20 20  ng of TK_xx.    
21e60 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74    */.      const
21e70 20 75 38 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20   u8 aMoveOp[] = 
21e80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  {.           /* 
21e90 54 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f 53 65 65  TK_GT */  OP_See
21ea0 6b 47 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  kGt,.           
21eb0 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f  /* TK_LE */  OP_
21ec0 53 65 65 6b 4c 65 2c 0a 20 20 20 20 20 20 20 20  SeekLe,.        
21ed0 20 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20     /* TK_LT */  
21ee0 4f 50 5f 53 65 65 6b 4c 74 2c 0a 20 20 20 20 20  OP_SeekLt,.     
21ef0 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 45 20 2a        /* TK_GE *
21f00 2f 20 20 4f 50 5f 53 65 65 6b 47 65 0a 20 20 20  /  OP_SeekGe.   
21f10 20 20 20 7d 3b 0a 20 20 20 20 20 20 61 73 73 65     };.      asse
21f20 72 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54  rt( TK_LE==TK_GT
21f30 2b 31 20 29 3b 20 20 20 20 20 20 2f 2a 20 4d 61  +1 );      /* Ma
21f40 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72 64 65  ke sure the orde
21f50 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20 20 20  ring.. */.      
21f60 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54  assert( TK_LT==T
21f70 4b 5f 47 54 2b 32 20 29 3b 20 20 20 20 20 20 2f  K_GT+2 );      /
21f80 2a 20 20 2e 2e 2e 20 6f 66 20 74 68 65 20 54 4b  *  ... of the TK
21f90 5f 78 78 20 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f  _xx values... */
21fa0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
21fb0 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b  K_GE==TK_GT+3 );
21fc0 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 69 73        /*  ... is
21fd0 20 63 6f 72 72 65 63 63 74 2e 20 2a 2f 0a 0a 20   correcct. */.. 
21fe0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
21ff0 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26  Start->wtFlags &
22000 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
22010 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d   /* EV: R-30575-
22020 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 20 20 70  11662 */.      p
22030 58 20 3d 20 70 53 74 61 72 74 2d 3e 70 45 78 70  X = pStart->pExp
22040 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
22050 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20   pX!=0 );.      
22060 61 73 73 65 72 74 28 20 70 53 74 61 72 74 2d 3e  assert( pStart->
22070 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
22080 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
22090 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
220a0 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  mp(pParse, pX->p
220b0 52 69 67 68 74 2c 20 26 72 54 65 6d 70 29 3b 0a  Right, &rTemp);.
220c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
220d0 65 41 64 64 4f 70 33 28 76 2c 20 61 4d 6f 76 65  eAddOp3(v, aMove
220e0 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d  Op[pX->op-TK_GT]
220f0 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 2c  , iCur, addrBrk,
22100 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65   r1);.      Vdbe
22110 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22  Comment((v, "pk"
22120 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
22130 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
22140 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
22150 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 73   r1, 1);.      s
22160 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
22170 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 54 65  pReg(pParse, rTe
22180 6d 70 29 3b 0a 20 20 20 20 20 20 64 69 73 61 62  mp);.      disab
22190 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
221a0 53 74 61 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73  Start);.    }els
221b0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
221c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52  VdbeAddOp2(v, bR
221d0 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f  ev ? OP_Last : O
221e0 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20  P_Rewind, iCur, 
221f0 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 7d 0a  addrBrk);.    }.
22200 20 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a      if( pEnd ){.
22210 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a        Expr *pX;.
22220 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64 2d        pX = pEnd-
22230 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  >pExpr;.      as
22240 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20  sert( pX!=0 );. 
22250 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 6e       assert( pEn
22260 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  d->leftCursor==i
22270 43 75 72 20 29 3b 0a 20 20 20 20 20 20 74 65 73  Cur );.      tes
22280 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 77 74 46  tcase( pEnd->wtF
22290 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
222a0 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d  UAL ); /* EV: R-
222b0 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20  30575-11662 */. 
222c0 20 20 20 20 20 6d 65 6d 45 6e 64 56 61 6c 75 65       memEndValue
222d0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
222e0 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
222f0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
22300 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 6d 65 6d   pX->pRight, mem
22310 45 6e 64 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  EndValue);.     
22320 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   if( pX->op==TK_
22330 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b  LT || pX->op==TK
22340 5f 47 54 20 29 7b 0a 20 20 20 20 20 20 20 20 74  _GT ){.        t
22350 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f  estOp = bRev ? O
22360 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20  P_Le : OP_Ge;.  
22370 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22380 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76     testOp = bRev
22390 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74   ? OP_Lt : OP_Gt
223a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
223b0 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
223c0 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20 7d  el, pEnd);.    }
223d0 0a 20 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c  .    start = sql
223e0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
223f0 64 64 72 28 76 29 3b 0a 20 20 20 20 70 4c 65 76  ddr(v);.    pLev
22400 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20  el->op = bRev ? 
22410 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78  OP_Prev : OP_Nex
22420 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  t;.    pLevel->p
22430 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c  1 = iCur;.    pL
22440 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74  evel->p2 = start
22450 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74  ;.    if( pStart
22460 3d 3d 30 20 26 26 20 70 45 6e 64 3d 3d 30 20 29  ==0 && pEnd==0 )
22470 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
22480 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54  p5 = SQLITE_STMT
22490 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f  STATUS_FULLSCAN_
224a0 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  STEP;.    }else{
224b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
224c0 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a  Level->p5==0 );.
224d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74 65      }.    if( te
224e0 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  stOp!=OP_Noop ){
224f0 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67  .      iRowidReg
22500 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d   = iReleaseReg =
22510 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
22520 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
22530 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22540 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
22550 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67   iCur, iRowidReg
22560 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22570 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70  ExprCacheStore(p
22580 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c  Parse, iCur, -1,
22590 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
225a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
225b0 64 4f 70 33 28 76 2c 20 74 65 73 74 4f 70 2c 20  dOp3(v, testOp, 
225c0 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20 61 64 64  memEndValue, add
225d0 72 42 72 6b 2c 20 69 52 6f 77 69 64 52 65 67 29  rBrk, iRowidReg)
225e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
225f0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
22600 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
22610 43 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  C | SQLITE_JUMPI
22620 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  FNULL);.    }.  
22630 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c  }else if( pLevel
22640 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
22650 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52   (WHERE_COLUMN_R
22660 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  ANGE|WHERE_COLUM
22670 4e 5f 45 51 29 20 29 7b 0a 20 20 20 20 2f 2a 20  N_EQ) ){.    /* 
22680 43 61 73 65 20 33 3a 20 41 20 73 63 61 6e 20 75  Case 3: A scan u
22690 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2e 0a 20  sing an index.. 
226a0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
226b0 20 20 20 20 20 54 68 65 20 57 48 45 52 45 20 63       The WHERE c
226c0 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e 74 61 69  lause may contai
226d0 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 65  n zero or more e
226e0 71 75 61 6c 69 74 79 20 0a 20 20 20 20 2a 2a 20  quality .    ** 
226f0 20 20 20 20 20 20 20 20 74 65 72 6d 73 20 28 22          terms ("
22700 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70 65 72  ==" or "IN" oper
22710 61 74 6f 72 73 29 20 74 68 61 74 20 72 65 66 65  ators) that refe
22720 72 20 74 6f 20 74 68 65 20 4e 0a 20 20 20 20 2a  r to the N.    *
22730 2a 20 20 20 20 20 20 20 20 20 6c 65 66 74 2d 6d  *         left-m
22740 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  ost columns of t
22750 68 65 20 69 6e 64 65 78 2e 20 49 74 20 6d 61 79  he index. It may
22760 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a 20 20   also contain.  
22770 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 65    **         ine
22780 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
22790 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72  nts (>, <, >= or
227a0 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69 6e 64 65   <=) on the inde
227b0 78 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  xed.    **      
227c0 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69     column that i
227d0 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
227e0 77 73 20 74 68 65 20 4e 20 65 71 75 61 6c 69 74  ws the N equalit
227f0 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20 20 20 2a  ies. Only .    *
22800 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69  *         the ri
22810 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  ght-most column 
22820 63 61 6e 20 62 65 20 61 6e 20 69 6e 65 71 75 61  can be an inequa
22830 6c 69 74 79 20 2d 20 74 68 65 20 72 65 73 74 20  lity - the rest 
22840 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20 20 20 20  must.    **     
22850 20 20 20 20 75 73 65 20 74 68 65 20 22 3d 3d 22      use the "=="
22860 20 61 6e 64 20 22 49 4e 22 20 6f 70 65 72 61 74   and "IN" operat
22870 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ors. For example
22880 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20 2a 2a  , if the .    **
22890 20 20 20 20 20 20 20 20 20 69 6e 64 65 78 20 69           index i
228a0 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20 74 68  s on (x,y,z), th
228b0 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  en the following
228c0 20 63 6c 61 75 73 65 73 20 61 72 65 20 61 6c 6c   clauses are all
228d0 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20   .    **        
228e0 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20 20 20 20   optimized:.    
228f0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
22900 20 20 20 20 20 78 3d 35 0a 20 20 20 20 2a 2a 20       x=5.    ** 
22910 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
22920 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a 2a 20 20  ND y=10.    **  
22930 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
22940 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20  D y<10.    **   
22950 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44           x=5 AND
22960 20 79 3e 35 20 41 4e 44 20 79 3c 31 30 0a 20 20   y>5 AND y<10.  
22970 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
22980 78 3d 35 20 41 4e 44 20 79 3d 35 20 41 4e 44 20  x=5 AND y=5 AND 
22990 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20  z<=10.    **.   
229a0 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65 20   **         The 
229b0 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20 74 68 65  z<10 term of the
229c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f   following canno
229d0 74 20 62 65 20 75 73 65 64 2c 20 6f 6e 6c 79 0a  t be used, only.
229e0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74      **         t
229f0 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a 20 20 20  he x=5 term:.   
22a00 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
22a10 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 7a 3c        x=5 AND z<
22a20 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  10.    **.    **
22a30 20 20 20 20 20 20 20 20 20 4e 20 6d 61 79 20 62           N may b
22a40 65 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20  e zero if there 
22a50 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63  are inequality c
22a60 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20  onstraints..    
22a70 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 74 68  **         If th
22a80 65 72 65 20 61 72 65 20 6e 6f 20 69 6e 65 71 75  ere are no inequ
22a90 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
22aa0 73 2c 20 74 68 65 6e 20 4e 20 69 73 20 61 74 0a  s, then N is at.
22ab0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c      **         l
22ac0 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a  east one..    **
22ad0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
22ae0 54 68 69 73 20 63 61 73 65 20 69 73 20 61 6c 73  This case is als
22af0 6f 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 72  o used when ther
22b00 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63  e are no WHERE c
22b10 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 20 20 20  lause.    **    
22b20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 73       constraints
22b30 20 62 75 74 20 61 6e 20 69 6e 64 65 78 20 69 73   but an index is
22b40 20 73 65 6c 65 63 74 65 64 20 61 6e 79 77 61 79   selected anyway
22b50 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a  , in order.    *
22b60 2a 20 20 20 20 20 20 20 20 20 74 6f 20 66 6f 72  *         to for
22b70 63 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 72  ce the output or
22b80 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74  der to conform t
22b90 6f 20 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20  o an ORDER BY.. 
22ba0 20 20 20 2a 2f 20 20 0a 20 20 20 20 73 74 61 74     */  .    stat
22bb0 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 61  ic const u8 aSta
22bc0 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  rtOp[] = {.     
22bd0 20 30 2c 0a 20 20 20 20 20 20 30 2c 0a 20 20 20   0,.      0,.   
22be0 20 20 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20     OP_Rewind,   
22bf0 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 21          /* 2: (!
22c00 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
22c10 73 20 26 26 20 73 74 61 72 74 45 71 20 26 26 20  s && startEq && 
22c20 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20   !bRev) */.     
22c30 20 4f 50 5f 4c 61 73 74 2c 20 20 20 20 20 20 20   OP_Last,       
22c40 20 20 20 20 20 20 2f 2a 20 33 3a 20 28 21 73 74        /* 3: (!st
22c50 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
22c60 26 26 20 73 74 61 72 74 45 71 20 26 26 20 20 20  && startEq &&   
22c70 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f  bRev) */.      O
22c80 50 5f 53 65 65 6b 47 74 2c 20 20 20 20 20 20 20  P_SeekGt,       
22c90 20 20 20 20 2f 2a 20 34 3a 20 28 73 74 61 72 74      /* 4: (start
22ca0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26  _constraints  &&
22cb0 20 21 73 74 61 72 74 45 71 20 26 26 20 21 62 52   !startEq && !bR
22cc0 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
22cd0 53 65 65 6b 4c 74 2c 20 20 20 20 20 20 20 20 20  SeekLt,         
22ce0 20 20 2f 2a 20 35 3a 20 28 73 74 61 72 74 5f 63    /* 5: (start_c
22cf0 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 21  onstraints  && !
22d00 73 74 61 72 74 45 71 20 26 26 20 20 62 52 65 76  startEq &&  bRev
22d10 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65  ) */.      OP_Se
22d20 65 6b 47 65 2c 20 20 20 20 20 20 20 20 20 20 20  ekGe,           
22d30 2f 2a 20 36 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 6: (start_con
22d40 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74  straints  &&  st
22d50 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20  artEq && !bRev) 
22d60 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b  */.      OP_Seek
22d70 4c 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Le            /*
22d80 20 37 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74   7: (start_const
22d90 72 61 69 6e 74 73 20 20 26 26 20 20 73 74 61 72  raints  &&  star
22da0 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f  tEq &&  bRev) */
22db0 0a 20 20 20 20 7d 3b 0a 20 20 20 20 73 74 61 74  .    };.    stat
22dc0 69 63 20 63 6f 6e 73 74 20 75 38 20 61 45 6e 64  ic const u8 aEnd
22dd0 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 4f  Op[] = {.      O
22de0 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20 20 20 20  P_Noop,         
22df0 20 20 20 20 2f 2a 20 30 3a 20 28 21 65 6e 64 5f      /* 0: (!end_
22e00 63 6f 6e 73 74 72 61 69 6e 74 73 29 20 2a 2f 0a  constraints) */.
22e10 20 20 20 20 20 20 4f 50 5f 49 64 78 47 45 2c 20        OP_IdxGE, 
22e20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 3a             /* 1:
22e30 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74   (end_constraint
22e40 73 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20  s && !bRev) */. 
22e50 20 20 20 20 20 4f 50 5f 49 64 78 4c 54 20 20 20       OP_IdxLT   
22e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20            /* 2: 
22e70 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73  (end_constraints
22e80 20 26 26 20 62 52 65 76 29 20 2a 2f 0a 20 20 20   && bRev) */.   
22e90 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6e 45 71 20   };.    int nEq 
22ea0 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e  = pLevel->plan.n
22eb0 45 71 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  Eq;  /* Number o
22ec0 66 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72 6d 73  f == or IN terms
22ed0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 4d 69   */.    int isMi
22ee0 6e 51 75 65 72 79 20 3d 20 30 3b 20 20 20 20 20  nQuery = 0;     
22ef0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
22f00 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20  is an optimized 
22f10 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 2e 2e 20  SELECT min(x).. 
22f20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 42 61  */.    int regBa
22f30 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
22f40 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69      /* Base regi
22f50 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6e  ster holding con
22f60 73 74 72 61 69 6e 74 20 76 61 6c 75 65 73 20 2a  straint values *
22f70 2f 0a 20 20 20 20 69 6e 74 20 72 31 3b 20 20 20  /.    int r1;   
22f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f90 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73     /* Temp regis
22fa0 74 65 72 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  ter */.    Where
22fb0 54 65 72 6d 20 2a 70 52 61 6e 67 65 53 74 61 72  Term *pRangeStar
22fc0 74 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 65 71 75  t = 0;  /* Inequ
22fd0 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
22fe0 20 61 74 20 72 61 6e 67 65 20 73 74 61 72 74 20   at range start 
22ff0 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  */.    WhereTerm
23000 20 2a 70 52 61 6e 67 65 45 6e 64 20 3d 20 30 3b   *pRangeEnd = 0;
23010 20 20 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74      /* Inequalit
23020 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20  y constraint at 
23030 72 61 6e 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20  range end */.   
23040 20 69 6e 74 20 73 74 61 72 74 45 71 3b 20 20 20   int startEq;   
23050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23060 20 54 72 75 65 20 69 66 20 72 61 6e 67 65 20 73   True if range s
23070 74 61 72 74 20 75 73 65 73 20 3d 3d 2c 20 3e 3d  tart uses ==, >=
23080 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e   or <= */.    in
23090 74 20 65 6e 64 45 71 3b 20 20 20 20 20 20 20 20  t endEq;        
230a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
230b0 75 65 20 69 66 20 72 61 6e 67 65 20 65 6e 64 20  ue if range end 
230c0 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c  uses ==, >= or <
230d0 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61  = */.    int sta
230e0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3b 20  rt_constraints; 
230f0 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
23100 66 20 72 61 6e 67 65 20 69 73 20 63 6f 6e 73 74  f range is const
23110 72 61 69 6e 65 64 20 2a 2f 0a 20 20 20 20 69 6e  rained */.    in
23120 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20  t nConstraint;  
23130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
23140 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74 72 61 69  mber of constrai
23150 6e 74 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  nt terms */.    
23160 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
23170 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23180 54 68 65 20 69 6e 64 65 78 20 77 65 20 77 69 6c  The index we wil
23190 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20  l be using */.  
231a0 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20    int iIdxCur;  
231b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
231c0 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f  * The VDBE curso
231d0 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20  r for the index 
231e0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 78 74 72  */.    int nExtr
231f0 61 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20  aReg = 0;       
23200 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
23210 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73   extra registers
23220 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 20 20 69   needed */.    i
23230 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
23240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
23250 6e 73 74 72 75 63 74 69 6f 6e 20 6f 70 63 6f 64  nstruction opcod
23260 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  e */.    char *z
23270 53 74 61 72 74 41 66 66 3b 20 20 20 20 20 20 20  StartAff;       
23280 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74        /* Affinit
23290 79 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20 72  y for start of r
232a0 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ange constraint 
232b0 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 6e  */.    char *zEn
232c0 64 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  dAff;           
232d0 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
232e0 66 6f 72 20 65 6e 64 20 6f 66 20 72 61 6e 67 65  for end of range
232f0 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 0a   constraint */..
23300 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65      pIdx = pLeve
23310 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a  l->plan.u.pIdx;.
23320 20 20 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c      iIdxCur = pL
23330 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
23340 20 20 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43     k = pIdx->aiC
23350 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 20 20 20 20 20  olumn[nEq];     
23360 2f 2a 20 43 6f 6c 75 6d 6e 20 66 6f 72 20 69 6e  /* Column for in
23370 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
23380 69 6e 74 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  ints */..    /* 
23390 49 66 20 74 68 69 73 20 6c 6f 6f 70 20 73 61 74  If this loop sat
233a0 69 73 66 69 65 73 20 61 20 73 6f 72 74 20 6f 72  isfies a sort or
233b0 64 65 72 20 28 70 4f 72 64 65 72 42 79 29 20 72  der (pOrderBy) r
233c0 65 71 75 65 73 74 20 74 68 61 74 20 0a 20 20 20  equest that .   
233d0 20 2a 2a 20 77 61 73 20 70 61 73 73 65 64 20 74   ** was passed t
233e0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
233f0 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 22  to implement a "
23400 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 2e 2e  SELECT min(x) ..
23410 2e 22 20 0a 20 20 20 20 2a 2a 20 71 75 65 72 79  ." .    ** query
23420 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
23430 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f  r will only allo
23440 77 20 74 68 65 20 6c 6f 6f 70 20 74 6f 20 72 75  w the loop to ru
23450 6e 20 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20 73  n for.    ** a s
23460 69 6e 67 6c 65 20 69 74 65 72 61 74 69 6f 6e 2e  ingle iteration.
23470 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
23480 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 72   the first row r
23490 65 74 75 72 6e 65 64 0a 20 20 20 20 2a 2a 20 73  eturned.    ** s
234a0 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 61  hould not have a
234b0 20 4e 55 4c 4c 20 76 61 6c 75 65 20 73 74 6f 72   NULL value stor
234c0 65 64 20 69 6e 20 27 78 27 2e 20 49 66 20 63 6f  ed in 'x'. If co
234d0 6c 75 6d 6e 20 27 78 27 20 69 73 0a 20 20 20 20  lumn 'x' is.    
234e0 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65  ** the first one
234f0 20 61 66 74 65 72 20 74 68 65 20 6e 45 71 20 65   after the nEq e
23500 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
23510 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  nts in the index
23520 2c 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 72 65  ,.    ** this re
23530 71 75 69 72 65 73 20 73 6f 6d 65 20 73 70 65 63  quires some spec
23540 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20  ial handling..  
23550 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 63    */.    if( (wc
23560 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f  trlFlags&WHERE_O
23570 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20  RDERBY_MIN)!=0. 
23580 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e      && (pLevel->
23590 70 6c 61 6e 2e 77 73 46 6c 61 67 73 26 57 48 45  plan.wsFlags&WHE
235a0 52 45 5f 4f 52 44 45 52 42 59 29 0a 20 20 20 20  RE_ORDERBY).    
235b0 20 26 26 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75   && (pIdx->nColu
235c0 6d 6e 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20  mn>nEq).    ){. 
235d0 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20       /* assert( 
235e0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d  pOrderBy->nExpr=
235f0 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 2f  =1 ); */.      /
23600 2a 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72  * assert( pOrder
23610 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  By->a[0].pExpr->
23620 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61  iColumn==pIdx->a
23630 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 20 29 3b 20  iColumn[nEq] ); 
23640 2a 2f 0a 20 20 20 20 20 20 69 73 4d 69 6e 51 75  */.      isMinQu
23650 65 72 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e  ery = 1;.      n
23660 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20  ExtraReg = 1;.  
23670 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64    }..    /* Find
23680 20 61 6e 79 20 69 6e 65 71 75 61 6c 69 74 79 20   any inequality 
23690 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73  constraint terms
236a0 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 61   for the start a
236b0 6e 64 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f  nd end .    ** o
236c0 66 20 74 68 65 20 72 61 6e 67 65 2e 20 0a 20 20  f the range. .  
236d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65    */.    if( pLe
236e0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
236f0 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  s & WHERE_TOP_LI
23700 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61  MIT ){.      pRa
23710 6e 67 65 45 6e 64 20 3d 20 66 69 6e 64 54 65 72  ngeEnd = findTer
23720 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20  m(pWC, iCur, k, 
23730 6e 6f 74 52 65 61 64 79 2c 20 28 57 4f 5f 4c 54  notReady, (WO_LT
23740 7c 57 4f 5f 4c 45 29 2c 20 70 49 64 78 29 3b 0a  |WO_LE), pIdx);.
23750 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20        nExtraReg 
23760 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
23770 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  f( pLevel->plan.
23780 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
23790 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  BTM_LIMIT ){.   
237a0 20 20 20 70 52 61 6e 67 65 53 74 61 72 74 20 3d     pRangeStart =
237b0 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
237c0 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79  Cur, k, notReady
237d0 2c 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 2c  , (WO_GT|WO_GE),
237e0 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 6e 45   pIdx);.      nE
237f0 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20  xtraReg = 1;.   
23800 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72   }..    /* Gener
23810 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c  ate code to eval
23820 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61  uate all constra
23830 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67 20  int terms using 
23840 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 2a 2a 20  == or IN.    ** 
23850 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 76 61  and store the va
23860 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65  lues of those te
23870 72 6d 73 20 69 6e 20 61 6e 20 61 72 72 61 79 20  rms in an array 
23880 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20 20  of registers.   
23890 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20   ** starting at 
238a0 72 65 67 42 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  regBase..    */.
238b0 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 63 6f      regBase = co
238c0 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72  deAllEqualityTer
238d0 6d 73 28 0a 20 20 20 20 20 20 20 20 70 50 61 72  ms(.        pPar
238e0 73 65 2c 20 70 4c 65 76 65 6c 2c 20 70 57 43 2c  se, pLevel, pWC,
238f0 20 6e 6f 74 52 65 61 64 79 2c 20 6e 45 78 74 72   notReady, nExtr
23900 61 52 65 67 2c 20 26 7a 53 74 61 72 74 41 66 66  aReg, &zStartAff
23910 0a 20 20 20 20 29 3b 0a 20 20 20 20 7a 45 6e 64  .    );.    zEnd
23920 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62 53  Aff = sqlite3DbS
23930 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  trDup(pParse->db
23940 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20  , zStartAff);.  
23950 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76    addrNxt = pLev
23960 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20 20  el->addrNxt;..  
23970 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64    /* If we are d
23980 6f 69 6e 67 20 61 20 72 65 76 65 72 73 65 20 6f  oing a reverse o
23990 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20  rder scan on an 
239a0 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c  ascending index,
239b0 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72   or.    ** a for
239c0 77 61 72 64 20 6f 72 64 65 72 20 73 63 61 6e 20  ward order scan 
239d0 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20  on a descending 
239e0 69 6e 64 65 78 2c 20 69 6e 74 65 72 63 68 61 6e  index, interchan
239f0 67 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73  ge the .    ** s
23a00 74 61 72 74 20 61 6e 64 20 65 6e 64 20 74 65 72  tart and end ter
23a10 6d 73 20 28 70 52 61 6e 67 65 53 74 61 72 74 20  ms (pRangeStart 
23a20 61 6e 64 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a  and pRangeEnd)..
23a30 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
23a40 45 71 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  Eq<pIdx->nColumn
23a50 20 26 26 20 62 52 65 76 3d 3d 28 70 49 64 78 2d   && bRev==(pIdx-
23a60 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d  >aSortOrder[nEq]
23a70 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29  ==SQLITE_SO_ASC)
23a80 20 29 7b 0a 20 20 20 20 20 20 53 57 41 50 28 57   ){.      SWAP(W
23a90 68 65 72 65 54 65 72 6d 20 2a 2c 20 70 52 61 6e  hereTerm *, pRan
23aa0 67 65 45 6e 64 2c 20 70 52 61 6e 67 65 53 74 61  geEnd, pRangeSta
23ab0 72 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  rt);.    }..    
23ac0 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65  testcase( pRange
23ad0 53 74 61 72 74 20 26 26 20 70 52 61 6e 67 65 53  Start && pRangeS
23ae0 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20  tart->eOperator 
23af0 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 74  & WO_LE );.    t
23b00 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53  estcase( pRangeS
23b10 74 61 72 74 20 26 26 20 70 52 61 6e 67 65 53 74  tart && pRangeSt
23b20 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  art->eOperator &
23b30 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 74 65   WO_GE );.    te
23b40 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e  stcase( pRangeEn
23b50 64 20 26 26 20 70 52 61 6e 67 65 45 6e 64 2d 3e  d && pRangeEnd->
23b60 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c  eOperator & WO_L
23b70 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  E );.    testcas
23b80 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20  e( pRangeEnd && 
23b90 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72  pRangeEnd->eOper
23ba0 61 74 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b 0a  ator & WO_GE );.
23bb0 20 20 20 20 73 74 61 72 74 45 71 20 3d 20 21 70      startEq = !p
23bc0 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 70 52  RangeStart || pR
23bd0 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72  angeStart->eOper
23be0 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f  ator & (WO_LE|WO
23bf0 5f 47 45 29 3b 0a 20 20 20 20 65 6e 64 45 71 20  _GE);.    endEq 
23c00 3d 20 20 20 21 70 52 61 6e 67 65 45 6e 64 20 7c  =   !pRangeEnd |
23c10 7c 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70  | pRangeEnd->eOp
23c20 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c  erator & (WO_LE|
23c30 57 4f 5f 47 45 29 3b 0a 20 20 20 20 73 74 61 72  WO_GE);.    star
23c40 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20  t_constraints = 
23c50 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e  pRangeStart || n
23c60 45 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  Eq>0;..    /* Se
23c70 65 6b 20 74 68 65 20 69 6e 64 65 78 20 63 75 72  ek the index cur
23c80 73 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  sor to the start
23c90 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a   of the range. *
23ca0 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e  /.    nConstrain
23cb0 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28  t = nEq;.    if(
23cc0 20 70 52 61 6e 67 65 53 74 61 72 74 20 29 7b 0a   pRangeStart ){.
23cd0 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
23ce0 68 74 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74  ht = pRangeStart
23cf0 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
23d00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
23d10 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
23d20 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e  Right, regBase+n
23d30 45 71 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  Eq);.      if( (
23d40 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46  pRangeStart->wtF
23d50 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
23d60 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  L)==0 ){.       
23d70 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
23d80 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52  IsNullJump(v, pR
23d90 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45  ight, regBase+nE
23da0 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20  q, addrNxt);.   
23db0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a     }.      if( z
23dc0 53 74 61 72 74 41 66 66 20 29 7b 0a 20 20 20 20  StartAff ){.    
23dd0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43      if( sqlite3C
23de0 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
23df0 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41 66 66  Right, zStartAff
23e00 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41  [nEq])==SQLITE_A
23e10 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20  FF_NONE){.      
23e20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65      /* Since the
23e30 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74   comparison is t
23e40 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77  o be performed w
23e50 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f  ith no conversio
23e60 6e 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ns.          ** 
23e70 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f  applied to the o
23e80 70 65 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65  perands, set the
23e90 20 61 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70   affinity to app
23ea0 6c 79 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20  ly to pRight to 
23eb0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51  .          ** SQ
23ec0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20  LITE_AFF_NONE.  
23ed0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74  */.          zSt
23ee0 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51  artAff[nEq] = SQ
23ef0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
23f00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23f10 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
23f20 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
23f30 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 53  hange(pRight, zS
23f40 74 61 72 74 41 66 66 5b 6e 45 71 5d 29 20 29 7b  tartAff[nEq]) ){
23f50 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74 61 72  .          zStar
23f60 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49  tAff[nEq] = SQLI
23f70 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
23f80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 20       }.      }  
23f90 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  .      nConstrai
23fa0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74  nt++;.      test
23fb0 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72  case( pRangeStar
23fc0 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  t->wtFlags & TER
23fd0 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20  M_VIRTUAL ); /* 
23fe0 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36  EV: R-30575-1166
23ff0 32 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69  2 */.    }else i
24000 66 28 20 69 73 4d 69 6e 51 75 65 72 79 20 29 7b  f( isMinQuery ){
24010 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
24020 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
24030 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73 65 2b  ull, 0, regBase+
24040 6e 45 71 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e  nEq);.      nCon
24050 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20  straint++;.     
24060 20 73 74 61 72 74 45 71 20 3d 20 30 3b 0a 20 20   startEq = 0;.  
24070 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72      start_constr
24080 61 69 6e 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d  aints = 1;.    }
24090 0a 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66  .    codeApplyAf
240a0 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72  finity(pParse, r
240b0 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61  egBase, nConstra
240c0 69 6e 74 2c 20 7a 53 74 61 72 74 41 66 66 29 3b  int, zStartAff);
240d0 0a 20 20 20 20 6f 70 20 3d 20 61 53 74 61 72 74  .    op = aStart
240e0 4f 70 5b 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  Op[(start_constr
240f0 61 69 6e 74 73 3c 3c 32 29 20 2b 20 28 73 74 61  aints<<2) + (sta
24100 72 74 45 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d  rtEq<<1) + bRev]
24110 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70  ;.    assert( op
24120 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  !=0 );.    testc
24130 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69  ase( op==OP_Rewi
24140 6e 64 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  nd );.    testca
24150 73 65 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20  se( op==OP_Last 
24160 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
24170 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29   op==OP_SeekGt )
24180 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
24190 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 65 20 29 3b  op==OP_SeekGe );
241a0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
241b0 70 3d 3d 4f 50 5f 53 65 65 6b 4c 65 20 29 3b 0a  p==OP_SeekLe );.
241c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
241d0 3d 3d 4f 50 5f 53 65 65 6b 4c 74 20 29 3b 0a 20  ==OP_SeekLt );. 
241e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
241f0 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69  dOp4Int(v, op, i
24200 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c  IdxCur, addrNxt,
24210 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74   regBase, nConst
24220 72 61 69 6e 74 29 3b 0a 0a 20 20 20 20 2f 2a 20  raint);..    /* 
24230 4c 6f 61 64 20 74 68 65 20 76 61 6c 75 65 20 66  Load the value f
24240 6f 72 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74  or the inequalit
24250 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20  y constraint at 
24260 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
24270 20 20 20 2a 2a 20 72 61 6e 67 65 20 28 69 66 20     ** range (if 
24280 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  any)..    */.   
24290 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e   nConstraint = n
242a0 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e  Eq;.    if( pRan
242b0 67 65 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45  geEnd ){.      E
242c0 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52  xpr *pRight = pR
242d0 61 6e 67 65 45 6e 64 2d 3e 70 45 78 70 72 2d 3e  angeEnd->pExpr->
242e0 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71  pRight;.      sq
242f0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
24300 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67  move(pParse, reg
24310 42 61 73 65 2b 6e 45 71 2c 20 31 29 3b 0a 20 20  Base+nEq, 1);.  
24320 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
24330 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67  ode(pParse, pRig
24340 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29  ht, regBase+nEq)
24350 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 61  ;.      if( (pRa
24360 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20  ngeEnd->wtFlags 
24370 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
24380 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
24390 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c  te3ExprCodeIsNul
243a0 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c  lJump(v, pRight,
243b0 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64   regBase+nEq, ad
243c0 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a  drNxt);.      }.
243d0 20 20 20 20 20 20 69 66 28 20 7a 45 6e 64 41 66        if( zEndAf
243e0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  f ){.        if(
243f0 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
24400 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20  ffinity(pRight, 
24410 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 29 3d 3d 53  zEndAff[nEq])==S
24420 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b  QLITE_AFF_NONE){
24430 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69  .          /* Si
24440 6e 63 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  nce the comparis
24450 6f 6e 20 69 73 20 74 6f 20 62 65 20 70 65 72 66  on is to be perf
24460 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f 20 63 6f  ormed with no co
24470 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20 20 20 20  nversions.      
24480 20 20 20 20 2a 2a 20 61 70 70 6c 69 65 64 20 74      ** applied t
24490 6f 20 74 68 65 20 6f 70 65 72 61 6e 64 73 2c 20  o the operands, 
244a0 73 65 74 20 74 68 65 20 61 66 66 69 6e 69 74 79  set the affinity
244b0 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 52 69   to apply to pRi
244c0 67 68 74 20 74 6f 20 0a 20 20 20 20 20 20 20 20  ght to .        
244d0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f    ** SQLITE_AFF_
244e0 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20  NONE.  */.      
244f0 20 20 20 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d      zEndAff[nEq]
24500 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
24510 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
24520 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
24530 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69  3ExprNeedsNoAffi
24540 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68  nityChange(pRigh
24550 74 2c 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 29  t, zEndAff[nEq])
24560 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 45   ){.          zE
24570 6e 64 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c  ndAff[nEq] = SQL
24580 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
24590 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20        }.      } 
245a0 20 0a 20 20 20 20 20 20 63 6f 64 65 41 70 70 6c   .      codeAppl
245b0 79 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65  yAffinity(pParse
245c0 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 71 2b 31  , regBase, nEq+1
245d0 2c 20 7a 45 6e 64 41 66 66 29 3b 0a 20 20 20 20  , zEndAff);.    
245e0 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b    nConstraint++;
245f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
24600 20 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c   pRangeEnd->wtFl
24610 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
24620 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33  AL ); /* EV: R-3
24630 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20  0575-11662 */.  
24640 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
24650 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
24660 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20  , zStartAff);.  
24670 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
24680 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 45 6e 64  pParse->db, zEnd
24690 41 66 66 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f  Aff);..    /* To
246a0 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f  p of the loop bo
246b0 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c  dy */.    pLevel
246c0 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ->p2 = sqlite3Vd
246d0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
246e0 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
246f0 69 66 20 74 68 65 20 69 6e 64 65 78 20 63 75 72  if the index cur
24700 73 6f 72 20 69 73 20 70 61 73 74 20 74 68 65 20  sor is past the 
24710 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65  end of the range
24720 2e 20 2a 2f 0a 20 20 20 20 6f 70 20 3d 20 61 45  . */.    op = aE
24730 6e 64 4f 70 5b 28 70 52 61 6e 67 65 45 6e 64 20  ndOp[(pRangeEnd 
24740 7c 7c 20 6e 45 71 29 20 2a 20 28 31 20 2b 20 62  || nEq) * (1 + b
24750 52 65 76 29 5d 3b 0a 20 20 20 20 74 65 73 74 63  Rev)];.    testc
24760 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70  ase( op==OP_Noop
24770 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
24780 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29  ( op==OP_IdxGE )
24790 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
247a0 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a  op==OP_IdxLT );.
247b0 20 20 20 20 69 66 28 20 6f 70 21 3d 4f 50 5f 4e      if( op!=OP_N
247c0 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  oop ){.      sql
247d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
247e0 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72  t(v, op, iIdxCur
247f0 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61  , addrNxt, regBa
24800 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29  se, nConstraint)
24810 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
24820 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 65  dbeChangeP5(v, e
24830 6e 64 45 71 21 3d 62 52 65 76 20 3f 31 3a 30 29  ndEq!=bRev ?1:0)
24840 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
24850 49 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 65  If there are ine
24860 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
24870 6e 74 73 2c 20 63 68 65 63 6b 20 74 68 61 74 20  nts, check that 
24880 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a  the value.    **
24890 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f   of the table co
248a0 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20 69 6e  lumn that the in
248b0 65 71 75 61 6c 69 74 79 20 63 6f 6e 74 72 61 69  equality contrai
248c0 6e 73 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a  ns is not NULL..
248d0 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c      ** If it is,
248e0 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78   jump to the nex
248f0 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
24900 68 65 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  he loop..    */.
24910 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
24920 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
24930 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  e);.    testcase
24940 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
24950 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42  sFlags & WHERE_B
24960 54 4d 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20  TM_LIMIT );.    
24970 74 65 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c  testcase( pLevel
24980 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
24990 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
249a0 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 65   );.    if( (pLe
249b0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
249c0 73 20 26 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c  s & (WHERE_BTM_L
249d0 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c  IMIT|WHERE_TOP_L
249e0 49 4d 49 54 29 29 21 3d 30 20 29 7b 0a 20 20 20  IMIT))!=0 ){.   
249f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
24a00 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
24a10 6e 2c 20 69 49 64 78 43 75 72 2c 20 6e 45 71 2c  n, iIdxCur, nEq,
24a20 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
24a30 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
24a40 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20   OP_IsNull, r1, 
24a50 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 7d  addrCont);.    }
24a60 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
24a70 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
24a80 65 2c 20 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  e, r1);..    /* 
24a90 53 65 65 6b 20 74 68 65 20 74 61 62 6c 65 20 63  Seek the table c
24aa0 75 72 73 6f 72 2c 20 69 66 20 72 65 71 75 69 72  ursor, if requir
24ab0 65 64 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c  ed */.    disabl
24ac0 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52  eTerm(pLevel, pR
24ad0 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20  angeStart);.    
24ae0 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
24af0 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a  el, pRangeEnd);.
24b00 20 20 20 20 69 66 28 20 21 6f 6d 69 74 54 61 62      if( !omitTab
24b10 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77  le ){.      iRow
24b20 69 64 52 65 67 20 3d 20 69 52 65 6c 65 61 73 65  idReg = iRelease
24b30 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Reg = sqlite3Get
24b40 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
24b50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
24b60 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
24b70 64 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72  dxRowid, iIdxCur
24b80 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
24b90 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
24ba0 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65  acheStore(pParse
24bb0 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77  , iCur, -1, iRow
24bc0 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71  idReg);.      sq
24bd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
24be0 76 2c 20 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72  v, OP_Seek, iCur
24bf0 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 20 20 2f  , iRowidReg);  /
24c00 2a 20 44 65 66 65 72 72 65 64 20 73 65 65 6b 20  * Deferred seek 
24c10 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  */.    }..    /*
24c20 20 52 65 63 6f 72 64 20 74 68 65 20 69 6e 73 74   Record the inst
24c30 72 75 63 74 69 6f 6e 20 75 73 65 64 20 74 6f 20  ruction used to 
24c40 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
24c50 6f 70 2e 20 44 69 73 61 62 6c 65 20 0a 20 20 20  op. Disable .   
24c60 20 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   ** WHERE clause
24c70 20 74 65 72 6d 73 20 6d 61 64 65 20 72 65 64 75   terms made redu
24c80 6e 64 61 6e 74 20 62 79 20 74 68 65 20 69 6e 64  ndant by the ind
24c90 65 78 20 72 61 6e 67 65 20 73 63 61 6e 2e 0a 20  ex range scan.. 
24ca0 20 20 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c     */.    pLevel
24cb0 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  ->op = bRev ? OP
24cc0 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b  _Prev : OP_Next;
24cd0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20  .    pLevel->p1 
24ce0 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 7d 65 6c  = iIdxCur;.  }el
24cf0 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  se..#ifndef SQLI
24d00 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
24d10 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 70 4c  IZATION.  if( pL
24d20 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
24d30 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49  gs & WHERE_MULTI
24d40 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  _OR ){.    /* Ca
24d50 73 65 20 34 3a 20 20 54 77 6f 20 6f 72 20 6d 6f  se 4:  Two or mo
24d60 72 65 20 73 65 70 61 72 61 74 65 6c 79 20 69 6e  re separately in
24d70 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e  dexed terms conn
24d80 65 63 74 65 64 20 62 79 20 4f 52 0a 20 20 20 20  ected by OR.    
24d90 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c  **.    ** Exampl
24da0 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
24db0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
24dc0 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20  t1(a,b,c,d);.   
24dd0 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44   **   CREATE IND
24de0 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a  EX i1 ON t1(a);.
24df0 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
24e00 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 31 28 62  INDEX i2 ON t1(b
24e10 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41  );.    **   CREA
24e20 54 45 20 49 4e 44 45 58 20 69 33 20 4f 4e 20 74  TE INDEX i3 ON t
24e30 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  1(c);.    **.   
24e40 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46   **   SELECT * F
24e50 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35  ROM t1 WHERE a=5
24e60 20 4f 52 20 62 3d 37 20 4f 52 20 28 63 3d 31 31   OR b=7 OR (c=11
24e70 20 41 4e 44 20 64 3d 31 33 29 0a 20 20 20 20 2a   AND d=13).    *
24e80 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 65 20  *.    ** In the 
24e90 65 78 61 6d 70 6c 65 2c 20 74 68 65 72 65 20 61  example, there a
24ea0 72 65 20 74 68 72 65 65 20 69 6e 64 65 78 65 64  re three indexed
24eb0 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64   terms connected
24ec0 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a 2a 20 54   by OR..    ** T
24ed0 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f  he top of the lo
24ee0 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68  op looks like th
24ef0 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  is:.    **.    *
24f00 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 20  *          Null 
24f10 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
24f20 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74 68         # Zero th
24f30 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67 20  e rowset in reg 
24f40 31 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  1.    **.    ** 
24f50 54 68 65 6e 2c 20 66 6f 72 20 65 61 63 68 20 69  Then, for each i
24f60 6e 64 65 78 65 64 20 74 65 72 6d 2c 20 74 68 65  ndexed term, the
24f70 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68 65 20   following. The 
24f80 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20  arguments to.   
24f90 20 2a 2a 20 52 6f 77 53 65 74 54 65 73 74 20 61   ** RowSetTest a
24fa0 72 65 20 73 75 63 68 20 74 68 61 74 20 74 68 65  re such that the
24fb0 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 63 75   rowid of the cu
24fc0 72 72 65 6e 74 20 72 6f 77 20 69 73 20 69 6e 73  rrent row is ins
24fd0 65 72 74 65 64 0a 20 20 20 20 2a 2a 20 69 6e 74  erted.    ** int
24fe0 6f 20 74 68 65 20 52 6f 77 53 65 74 2e 20 49 66  o the RowSet. If
24ff0 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 70   it is already p
25000 72 65 73 65 6e 74 2c 20 63 6f 6e 74 72 6f 6c 20  resent, control 
25010 73 6b 69 70 73 20 74 68 65 0a 20 20 20 20 2a 2a  skips the.    **
25020 20 47 6f 73 75 62 20 6f 70 63 6f 64 65 20 61 6e   Gosub opcode an
25030 64 20 6a 75 6d 70 73 20 73 74 72 61 69 67 68 74  d jumps straight
25040 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e   to the code gen
25050 65 72 61 74 65 64 20 62 79 20 57 68 65 72 65 45  erated by WhereE
25060 6e 64 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  nd()..    **.   
25070 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74   **        sqlit
25080 65 33 57 68 65 72 65 42 65 67 69 6e 28 3c 74 65  e3WhereBegin(<te
25090 72 6d 3e 29 0a 20 20 20 20 2a 2a 20 20 20 20 20  rm>).    **     
250a0 20 20 20 20 20 52 6f 77 53 65 74 54 65 73 74 20       RowSetTest 
250b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250c0 20 23 20 49 6e 73 65 72 74 20 72 6f 77 69 64 20   # Insert rowid 
250d0 69 6e 74 6f 20 72 6f 77 73 65 74 0a 20 20 20 20  into rowset.    
250e0 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f 73 75  **          Gosu
250f0 62 20 20 20 20 20 20 32 20 41 0a 20 20 20 20 2a  b      2 A.    *
25100 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  *        sqlite3
25110 57 68 65 72 65 45 6e 64 28 29 0a 20 20 20 20 2a  WhereEnd().    *
25120 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f 77 69  *.    ** Followi
25130 6e 67 20 74 68 65 20 61 62 6f 76 65 2c 20 63 6f  ng the above, co
25140 64 65 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  de to terminate 
25150 74 68 65 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20  the loop. Label 
25160 41 2c 20 74 68 65 20 74 61 72 67 65 74 0a 20 20  A, the target.  
25170 20 20 2a 2a 20 6f 66 20 74 68 65 20 47 6f 73 75    ** of the Gosu
25180 62 20 61 62 6f 76 65 2c 20 6a 75 6d 70 73 20 74  b above, jumps t
25190 6f 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  o the instructio
251a0 6e 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68  n right after th
251b0 65 20 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20  e Goto..    **. 
251c0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e     **          N
251d0 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20 20  ull       1     
251e0 20 20 20 20 20 20 20 20 20 20 20 23 20 5a 65 72             # Zer
251f0 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20  o the rowset in 
25200 72 65 67 20 31 0a 20 20 20 20 2a 2a 20 20 20 20  reg 1.    **    
25210 20 20 20 20 20 20 47 6f 74 6f 20 20 20 20 20 20        Goto      
25220 20 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20   B              
25230 20 20 23 20 54 68 65 20 6c 6f 6f 70 20 69 73 20    # The loop is 
25240 66 69 6e 69 73 68 65 64 2e 0a 20 20 20 20 2a 2a  finished..    **
25250 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41 3a  .    **       A:
25260 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20 20 20 20   <loop body>    
25270 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 52               # R
25280 65 74 75 72 6e 20 64 61 74 61 2c 20 77 68 61 74  eturn data, what
25290 65 76 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ever..    **.   
252a0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 65 74   **          Ret
252b0 75 72 6e 20 20 20 20 20 32 20 20 20 20 20 20 20  urn     2       
252c0 20 20 20 20 20 20 20 20 20 23 20 4a 75 6d 70 20           # Jump 
252d0 62 61 63 6b 20 74 6f 20 74 68 65 20 47 6f 73 75  back to the Gosu
252e0 62 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  b.    **.    ** 
252f0 20 20 20 20 20 20 42 3a 20 3c 61 66 74 65 72 20        B: <after 
25300 74 68 65 20 6c 6f 6f 70 3e 0a 20 20 20 20 2a 2a  the loop>.    **
25310 0a 20 20 20 20 2a 2f 0a 20 20 20 20 57 68 65 72  .    */.    Wher
25320 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20  eClause *pOrWc; 
25330 20 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63 6c 61     /* The OR-cla
25340 75 73 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69  use broken out i
25350 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a  nto subterms */.
25360 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
25370 46 69 6e 61 6c 3b 20 20 20 20 20 2f 2a 20 46 69  Final;     /* Fi
25380 6e 61 6c 20 73 75 62 74 65 72 6d 20 77 69 74 68  nal subterm with
25390 69 6e 20 74 68 65 20 4f 52 2d 63 6c 61 75 73 65  in the OR-clause
253a0 2e 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74  . */.    SrcList
253b0 20 2a 70 4f 72 54 61 62 3b 20 20 20 20 20 20 20   *pOrTab;       
253c0 2f 2a 20 53 68 6f 72 74 65 6e 65 64 20 74 61 62  /* Shortened tab
253d0 6c 65 20 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c  le list or OR-cl
253e0 61 75 73 65 20 67 65 6e 65 72 61 74 69 6f 6e 20  ause generation 
253f0 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 72 65 67 52  */..    int regR
25400 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65  eturn = ++pParse
25410 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20  ->nMem;         
25420 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 75 73    /* Register us
25430 65 64 20 77 69 74 68 20 4f 50 5f 47 6f 73 75 62  ed with OP_Gosub
25440 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52   */.    int regR
25450 6f 77 73 65 74 20 3d 20 30 3b 20 20 20 20 20 20  owset = 0;      
25460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25470 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f    /* Register fo
25480 72 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 20  r RowSet object 
25490 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f  */.    int regRo
254a0 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  wid = 0;        
254b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254c0 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
254d0 64 69 6e 67 20 72 6f 77 69 64 20 2a 2f 0a 20 20  ding rowid */.  
254e0 20 20 69 6e 74 20 69 4c 6f 6f 70 42 6f 64 79 20    int iLoopBody 
254f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
25500 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20 53  eLabel(v);  /* S
25510 74 61 72 74 20 6f 66 20 6c 6f 6f 70 20 62 6f 64  tart of loop bod
25520 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 65  y */.    int iRe
25530 74 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20  tInit;          
25540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25550 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
25560 20 72 65 67 52 65 74 75 72 6e 20 69 6e 69 74 20   regReturn init 
25570 2a 2f 0a 20 20 20 20 69 6e 74 20 75 6e 74 65 73  */.    int untes
25580 74 65 64 54 65 72 6d 73 20 3d 20 30 3b 20 20 20  tedTerms = 0;   
25590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 6d            /* Som
255a0 65 20 74 65 72 6d 73 20 6e 6f 74 20 63 6f 6d 70  e terms not comp
255b0 6c 65 74 65 6c 79 20 74 65 73 74 65 64 20 2a 2f  letely tested */
255c0 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20  .    int ii;.   
255d0 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 65  .    pTerm = pLe
255e0 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 54 65 72  vel->plan.u.pTer
255f0 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  m;.    assert( p
25600 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61  Term!=0 );.    a
25610 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f  ssert( pTerm->eO
25620 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 29  perator==WO_OR )
25630 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
25640 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
25650 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20  TERM_ORINFO)!=0 
25660 29 3b 0a 20 20 20 20 70 4f 72 57 63 20 3d 20 26  );.    pOrWc = &
25670 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
25680 2d 3e 77 63 3b 0a 20 20 20 20 70 46 69 6e 61 6c  ->wc;.    pFinal
25690 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 70 4f 72   = &pOrWc->a[pOr
256a0 57 63 2d 3e 6e 54 65 72 6d 2d 31 5d 3b 0a 20 20  Wc->nTerm-1];.  
256b0 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
256c0 50 5f 52 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c  P_Return;.    pL
256d0 65 76 65 6c 2d 3e 70 31 20 3d 20 72 65 67 52 65  evel->p1 = regRe
256e0 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  turn;..    /* Se
256f0 74 20 75 70 20 61 20 6e 65 77 20 53 72 63 4c 69  t up a new SrcLi
25700 73 74 20 6e 69 20 70 4f 72 54 61 62 20 63 6f 6e  st ni pOrTab con
25710 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c  taining the tabl
25720 65 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 0a  e being scanned.
25730 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20 6c      ** by this l
25740 6f 6f 70 20 69 6e 20 74 68 65 20 61 5b 30 5d 20  oop in the a[0] 
25750 73 6c 6f 74 20 61 6e 64 20 61 6c 6c 20 6e 6f 74  slot and all not
25760 52 65 61 64 79 20 74 61 62 6c 65 73 20 69 6e 20  Ready tables in 
25770 61 5b 31 2e 2e 5d 20 73 6c 6f 74 73 2e 0a 20 20  a[1..] slots..  
25780 20 20 2a 2a 20 54 68 69 73 20 62 65 63 6f 6d 65    ** This become
25790 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 69 6e  s the SrcList in
257a0 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 63   the recursive c
257b0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68  all to sqlite3Wh
257c0 65 72 65 42 65 67 69 6e 28 29 2e 0a 20 20 20 20  ereBegin()..    
257d0 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  */.    if( pWInf
257e0 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 7b 0a 20  o->nLevel>1 ){. 
257f0 20 20 20 20 20 69 6e 74 20 6e 4e 6f 74 52 65 61       int nNotRea
25800 64 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dy;             
25810 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65      /* The numbe
25820 72 20 6f 66 20 6e 6f 74 52 65 61 64 79 20 74 61  r of notReady ta
25830 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 73 74  bles */.      st
25840 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
25850 6d 20 2a 6f 72 69 67 53 72 63 3b 20 20 20 20 20  m *origSrc;     
25860 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 69 73 74  /* Original list
25870 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
25880 20 20 20 20 6e 4e 6f 74 52 65 61 64 79 20 3d 20      nNotReady = 
25890 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 2d  pWInfo->nLevel -
258a0 20 69 4c 65 76 65 6c 20 2d 20 31 3b 0a 20 20 20   iLevel - 1;.   
258b0 20 20 20 70 4f 72 54 61 62 20 3d 20 73 71 6c 69     pOrTab = sqli
258c0 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77  te3StackAllocRaw
258d0 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20  (pParse->db,.   
258e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258f0 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
25900 2a 70 4f 72 54 61 62 29 2b 20 6e 4e 6f 74 52 65  *pOrTab)+ nNotRe
25910 61 64 79 2a 73 69 7a 65 6f 66 28 70 4f 72 54 61  ady*sizeof(pOrTa
25920 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20  b->a[0]));.     
25930 20 69 66 28 20 70 4f 72 54 61 62 3d 3d 30 20 29   if( pOrTab==0 )
25940 20 72 65 74 75 72 6e 20 6e 6f 74 52 65 61 64 79   return notReady
25950 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e  ;.      pOrTab->
25960 6e 41 6c 6c 6f 63 20 3d 20 28 69 31 36 29 28 6e  nAlloc = (i16)(n
25970 4e 6f 74 52 65 61 64 79 20 2b 20 31 29 3b 0a 20  NotReady + 1);. 
25980 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 53 72       pOrTab->nSr
25990 63 20 3d 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c  c = pOrTab->nAll
259a0 6f 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  oc;.      memcpy
259b0 28 70 4f 72 54 61 62 2d 3e 61 2c 20 70 54 61 62  (pOrTab->a, pTab
259c0 49 74 65 6d 2c 20 73 69 7a 65 6f 66 28 2a 70 54  Item, sizeof(*pT
259d0 61 62 49 74 65 6d 29 29 3b 0a 20 20 20 20 20 20  abItem));.      
259e0 6f 72 69 67 53 72 63 20 3d 20 70 57 49 6e 66 6f  origSrc = pWInfo
259f0 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20  ->pTabList->a;. 
25a00 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c       for(k=1; k<
25a10 3d 6e 4e 6f 74 52 65 61 64 79 3b 20 6b 2b 2b 29  =nNotReady; k++)
25a20 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
25a30 28 26 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 2c 20  (&pOrTab->a[k], 
25a40 26 6f 72 69 67 53 72 63 5b 70 4c 65 76 65 6c 5b  &origSrc[pLevel[
25a50 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a 65 6f  k].iFrom], sizeo
25a60 66 28 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 29 29  f(pOrTab->a[k]))
25a70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
25a80 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 72 54 61  lse{.      pOrTa
25a90 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  b = pWInfo->pTab
25aa0 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  List;.    }..   
25ab0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
25ac0 68 65 20 72 6f 77 73 65 74 20 72 65 67 69 73 74  he rowset regist
25ad0 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20 4e 55  er to contain NU
25ae0 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e 55 4c 4c 20  LL. An SQL NULL 
25af0 69 73 20 0a 20 20 20 20 2a 2a 20 65 71 75 69 76  is .    ** equiv
25b00 61 6c 65 6e 74 20 74 6f 20 61 6e 20 65 6d 70 74  alent to an empt
25b10 79 20 72 6f 77 73 65 74 2e 0a 20 20 20 20 2a 2a  y rowset..    **
25b20 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 20 69 6e 69  .    ** Also ini
25b30 74 69 61 6c 69 7a 65 20 72 65 67 52 65 74 75 72  tialize regRetur
25b40 6e 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  n to contain the
25b50 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
25b60 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a 20 20 20  instruction .   
25b70 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   ** immediately 
25b80 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4f 50  following the OP
25b90 5f 52 65 74 75 72 6e 20 61 74 20 74 68 65 20 62  _Return at the b
25ba0 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f  ottom of the loo
25bb0 70 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69  p. This.    ** i
25bc0 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 61 20  s required in a 
25bd0 66 65 77 20 6f 62 73 63 75 72 65 20 4c 45 46 54  few obscure LEFT
25be0 20 4a 4f 49 4e 20 63 61 73 65 73 20 77 68 65 72   JOIN cases wher
25bf0 65 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 0a  e control jumps.
25c00 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 68 65 20      ** over the 
25c10 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  top of the loop 
25c20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66  into the body of
25c30 20 69 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73   it. In this cas
25c40 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f  e the .    ** co
25c50 72 72 65 63 74 20 72 65 73 70 6f 6e 73 65 20 66  rrect response f
25c60 6f 72 20 74 68 65 20 65 6e 64 2d 6f 66 2d 6c 6f  or the end-of-lo
25c70 6f 70 20 63 6f 64 65 20 28 74 68 65 20 4f 50 5f  op code (the OP_
25c80 52 65 74 75 72 6e 29 20 69 73 20 74 6f 20 0a 20  Return) is to . 
25c90 20 20 20 2a 2a 20 66 61 6c 6c 20 74 68 72 6f 75     ** fall throu
25ca0 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  gh to the next i
25cb0 6e 73 74 72 75 63 74 69 6f 6e 2c 20 6a 75 73 74  nstruction, just
25cc0 20 61 73 20 61 6e 20 4f 50 5f 4e 65 78 74 20 64   as an OP_Next d
25cd0 6f 65 73 20 69 66 0a 20 20 20 20 2a 2a 20 63 61  oes if.    ** ca
25ce0 6c 6c 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e 69  lled on an unini
25cf0 74 69 61 6c 69 7a 65 64 20 63 75 72 73 6f 72 2e  tialized cursor.
25d00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
25d10 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
25d20 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f  ERE_DUPLICATES_O
25d30 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  K)==0 ){.      r
25d40 65 67 52 6f 77 73 65 74 20 3d 20 2b 2b 70 50 61  egRowset = ++pPa
25d50 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
25d60 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50   regRowid = ++pP
25d70 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
25d80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
25d90 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
25da0 30 2c 20 72 65 67 52 6f 77 73 65 74 29 3b 0a 20  0, regRowset);. 
25db0 20 20 20 7d 0a 20 20 20 20 69 52 65 74 49 6e 69     }.    iRetIni
25dc0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
25dd0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
25de0 67 65 72 2c 20 30 2c 20 72 65 67 52 65 74 75 72  ger, 0, regRetur
25df0 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d  n);..    for(ii=
25e00 30 3b 20 69 69 3c 70 4f 72 57 63 2d 3e 6e 54 65  0; ii<pOrWc->nTe
25e10 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  rm; ii++){.     
25e20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54   WhereTerm *pOrT
25e30 65 72 6d 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b  erm = &pOrWc->a[
25e40 69 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ii];.      if( p
25e50 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
25e60 6f 72 3d 3d 69 43 75 72 20 7c 7c 20 70 4f 72 54  or==iCur || pOrT
25e70 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
25e80 57 4f 5f 41 4e 44 20 29 7b 0a 20 20 20 20 20 20  WO_AND ){.      
25e90 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 53 75    WhereInfo *pSu
25ea0 62 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  bWInfo;         
25eb0 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 73 69 6e   /* Info for sin
25ec0 67 6c 65 20 4f 52 2d 74 65 72 6d 20 73 63 61 6e  gle OR-term scan
25ed0 20 2a 2f 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c   */.        /* L
25ee0 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c  oop through tabl
25ef0 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d  e entries that m
25f00 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72  atch term pOrTer
25f10 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 53  m. */.        pS
25f20 75 62 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  ubWInfo = sqlite
25f30 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
25f40 73 65 2c 20 70 4f 72 54 61 62 2c 20 70 4f 72 54  se, pOrTab, pOrT
25f50 65 72 6d 2d 3e 70 45 78 70 72 2c 20 30 2c 0a 20  erm->pExpr, 0,. 
25f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f70 20 20 20 20 20 20 20 57 48 45 52 45 5f 4f 4d 49         WHERE_OMI
25f80 54 5f 4f 50 45 4e 20 7c 20 57 48 45 52 45 5f 4f  T_OPEN | WHERE_O
25f90 4d 49 54 5f 43 4c 4f 53 45 20 7c 0a 20 20 20 20  MIT_CLOSE |.    
25fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25fb0 20 20 20 20 57 48 45 52 45 5f 46 4f 52 43 45 5f      WHERE_FORCE_
25fc0 54 41 42 4c 45 20 7c 20 57 48 45 52 45 5f 4f 4e  TABLE | WHERE_ON
25fd0 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 3b 0a 20 20  ETABLE_ONLY);.  
25fe0 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57 49        if( pSubWI
25ff0 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nfo ){.         
26000 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28   explainOneScan(
26010 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
26020 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 26  Parse, pOrTab, &
26030 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c  pSubWInfo->a[0],
26040 20 69 4c 65 76 65 6c 2c 20 70 4c 65 76 65 6c 2d   iLevel, pLevel-
26050 3e 69 46 72 6f 6d 2c 20 30 0a 20 20 20 20 20 20  >iFrom, 0.      
26060 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
26070 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73   if( (wctrlFlags
26080 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41   & WHERE_DUPLICA
26090 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20  TES_OK)==0 ){.  
260a0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 53            int iS
260b0 65 74 20 3d 20 28 28 69 69 3d 3d 70 4f 72 57 63  et = ((ii==pOrWc
260c0 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31 3a 69 69  ->nTerm-1)?-1:ii
260d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
260e0 6e 74 20 72 3b 0a 20 20 20 20 20 20 20 20 20 20  nt r;.          
260f0 20 20 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70    r = sqlite3Exp
26100 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70  rCodeGetColumn(p
26110 50 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d  Parse, pTabItem-
26120 3e 70 54 61 62 2c 20 2d 31 2c 20 69 43 75 72 2c  >pTab, -1, iCur,
26130 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
26140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26150 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52 6f             regRo
26160 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wid);.          
26170 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
26180 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 52 6f 77  Op4Int(v, OP_Row
26190 53 65 74 54 65 73 74 2c 20 72 65 67 52 6f 77 73  SetTest, regRows
261a0 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  et,.            
261b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
261d0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32  CurrentAddr(v)+2
261e0 2c 20 72 2c 20 69 53 65 74 29 3b 0a 20 20 20 20  , r, iSet);.    
261f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26200 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
26210 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
26220 20 72 65 67 52 65 74 75 72 6e 2c 20 69 4c 6f 6f   regReturn, iLoo
26230 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 20 20 20  pBody);..       
26240 20 20 20 2f 2a 20 54 68 65 20 70 53 75 62 57 49     /* The pSubWI
26250 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72  nfo->untestedTer
26260 6d 73 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68  ms flag means th
26270 61 74 20 74 68 69 73 20 4f 52 20 74 65 72 6d 0a  at this OR term.
26280 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
26290 74 61 69 6e 65 64 20 6f 6e 65 20 6f 72 20 6d 6f  tained one or mo
262a0 72 65 20 41 4e 44 20 74 65 72 6d 20 66 72 6f 6d  re AND term from
262b0 20 61 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c   a notReady tabl
262c0 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20  e.  The.        
262d0 20 20 2a 2a 20 74 65 72 6d 73 20 66 72 6f 6d 20    ** terms from 
262e0 74 68 65 20 6e 6f 74 52 65 61 64 79 20 74 61 62  the notReady tab
262f0 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  le could not be 
26300 74 65 73 74 65 64 20 61 6e 64 20 77 69 6c 6c 0a  tested and will.
26310 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65            ** nee
26320 64 20 74 6f 20 62 65 20 74 65 73 74 65 64 20 6c  d to be tested l
26330 61 74 65 72 2e 0a 20 20 20 20 20 20 20 20 20 20  ater..          
26340 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
26350 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65   pSubWInfo->unte
26360 73 74 65 64 54 65 72 6d 73 20 29 20 75 6e 74 65  stedTerms ) unte
26370 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 0a  stedTerms = 1;..
26380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
26390 69 73 68 20 74 68 65 20 6c 6f 6f 70 20 74 68 72  ish the loop thr
263a0 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69  ough table entri
263b0 65 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 65  es that match te
263c0 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20  rm pOrTerm. */. 
263d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
263e0 57 68 65 72 65 45 6e 64 28 70 53 75 62 57 49 6e  WhereEnd(pSubWIn
263f0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  fo);.        }. 
26400 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
26410 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
26420 67 65 50 31 28 76 2c 20 69 52 65 74 49 6e 69 74  geP1(v, iRetInit
26430 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
26440 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20  rentAddr(v));.  
26450 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
26460 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
26470 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42  0, pLevel->addrB
26480 72 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rk);.    sqlite3
26490 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
264a0 28 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a  (v, iLoopBody);.
264b0 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
264c0 3e 6e 4c 65 76 65 6c 3e 31 20 29 20 73 71 6c 69  >nLevel>1 ) sqli
264d0 74 65 33 53 74 61 63 6b 46 72 65 65 28 70 50 61  te3StackFree(pPa
264e0 72 73 65 2d 3e 64 62 2c 20 70 4f 72 54 61 62 29  rse->db, pOrTab)
264f0 3b 0a 20 20 20 20 69 66 28 20 21 75 6e 74 65 73  ;.    if( !untes
26500 74 65 64 54 65 72 6d 73 20 29 20 64 69 73 61 62  tedTerms ) disab
26510 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
26520 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  Term);.  }else.#
26530 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
26540 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
26550 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20  TION */..  {.   
26560 20 2f 2a 20 43 61 73 65 20 35 3a 20 20 54 68 65   /* Case 5:  The
26570 72 65 20 69 73 20 6e 6f 20 75 73 61 62 6c 65 20  re is no usable 
26580 69 6e 64 65 78 2e 20 20 57 65 20 6d 75 73 74 20  index.  We must 
26590 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20  do a complete.  
265a0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63    **          sc
265b0 61 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  an of the entire
265c0 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20   table..    */. 
265d0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
265e0 75 38 20 61 53 74 65 70 5b 5d 20 3d 20 7b 20 4f  u8 aStep[] = { O
265f0 50 5f 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76 20  P_Next, OP_Prev 
26600 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  };.    static co
26610 6e 73 74 20 75 38 20 61 53 74 61 72 74 5b 5d 20  nst u8 aStart[] 
26620 3d 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 4f  = { OP_Rewind, O
26630 50 5f 4c 61 73 74 20 7d 3b 0a 20 20 20 20 61 73  P_Last };.    as
26640 73 65 72 74 28 20 62 52 65 76 3d 3d 30 20 7c 7c  sert( bRev==0 ||
26650 20 62 52 65 76 3d 3d 31 20 29 3b 0a 20 20 20 20   bRev==1 );.    
26660 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c  assert( omitTabl
26670 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 65 76  e==0 );.    pLev
26680 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65 70 5b 62  el->op = aStep[b
26690 52 65 76 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Rev];.    pLevel
266a0 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20  ->p1 = iCur;.   
266b0 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20   pLevel->p2 = 1 
266c0 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
266d0 4f 70 32 28 76 2c 20 61 53 74 61 72 74 5b 62 52  Op2(v, aStart[bR
266e0 65 76 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42  ev], iCur, addrB
266f0 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  rk);.    pLevel-
26700 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d  >p5 = SQLITE_STM
26710 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e  TSTATUS_FULLSCAN
26720 5f 53 54 45 50 3b 0a 20 20 7d 0a 20 20 6e 6f 74  _STEP;.  }.  not
26730 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73  Ready &= ~getMas
26740 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c  k(pWC->pMaskSet,
26750 20 69 43 75 72 29 3b 0a 0a 20 20 2f 2a 20 49 6e   iCur);..  /* In
26760 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73  sert code to tes
26770 74 20 65 76 65 72 79 20 73 75 62 65 78 70 72 65  t every subexpre
26780 73 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62  ssion that can b
26790 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a  e completely.  *
267a0 2a 20 63 6f 6d 70 75 74 65 64 20 75 73 69 6e 67  * computed using
267b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74   the current set
267c0 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a   of tables..  **
267d0 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  .  ** IMPLEMENTA
267e0 54 49 4f 4e 2d 4f 46 3a 20 52 2d 34 39 35 32 35  TION-OF: R-49525
267f0 2d 35 30 39 33 35 20 54 65 72 6d 73 20 74 68 61  -50935 Terms tha
26800 74 20 63 61 6e 6e 6f 74 20 62 65 20 73 61 74 69  t cannot be sati
26810 73 66 69 65 64 20 74 68 72 6f 75 67 68 0a 20 20  sfied through.  
26820 2a 2a 20 74 68 65 20 75 73 65 20 6f 66 20 69 6e  ** the use of in
26830 64 69 63 65 73 20 62 65 63 6f 6d 65 20 74 65 73  dices become tes
26840 74 73 20 74 68 61 74 20 61 72 65 20 65 76 61 6c  ts that are eval
26850 75 61 74 65 64 20 61 67 61 69 6e 73 74 20 65 61  uated against ea
26860 63 68 20 72 6f 77 20 6f 66 0a 20 20 2a 2a 20 74  ch row of.  ** t
26870 68 65 20 72 65 6c 65 76 61 6e 74 20 69 6e 70 75  he relevant inpu
26880 74 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  t tables..  */. 
26890 20 6b 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54   k = 0;.  for(pT
268a0 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57  erm=pWC->a, j=pW
268b0 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a  C->nTerm; j>0; j
268c0 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  --, pTerm++){.  
268d0 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20    Expr *pE;.    
268e0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
268f0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
26900 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 49 4d  VIRTUAL ); /* IM
26910 50 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32  P: R-30575-11662
26920 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73 65   */.    testcase
26930 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
26940 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b   & TERM_CODED );
26950 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
26960 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
26970 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44  VIRTUAL|TERM_COD
26980 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ED) ) continue;.
26990 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
269a0 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52  prereqAll & notR
269b0 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20 20  eady)!=0 ){.    
269c0 20 20 74 65 73 74 63 61 73 65 28 20 70 57 49 6e    testcase( pWIn
269d0 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d  fo->untestedTerm
269e0 73 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  s==0.           
269f0 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e      && (pWInfo->
26a00 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
26a10 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
26a20 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 57  )!=0 );.      pW
26a30 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
26a40 72 6d 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 63  rms = 1;.      c
26a50 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
26a60 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70     pE = pTerm->p
26a70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
26a80 28 20 70 45 21 3d 30 20 29 3b 0a 20 20 20 20 69  ( pE!=0 );.    i
26a90 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  f( pLevel->iLeft
26aa0 4a 6f 69 6e 20 26 26 20 21 45 78 70 72 48 61 73  Join && !ExprHas
26ab0 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f  Property(pE, EP_
26ac0 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
26ad0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
26ae0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
26af0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
26b00 2c 20 70 45 2c 20 61 64 64 72 43 6f 6e 74 2c 20  , pE, addrCont, 
26b10 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
26b20 4c 29 3b 0a 20 20 20 20 6b 20 3d 20 31 3b 0a 20  L);.    k = 1;. 
26b30 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
26b40 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
26b50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61  .  }..  /* For a
26b60 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
26b70 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  , generate code 
26b80 74 68 61 74 20 77 69 6c 6c 20 72 65 63 6f 72 64  that will record
26b90 20 74 68 65 20 66 61 63 74 20 74 68 61 74 0a 20   the fact that. 
26ba0 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   ** at least one
26bb0 20 72 6f 77 20 6f 66 20 74 68 65 20 72 69 67 68   row of the righ
26bc0 74 20 74 61 62 6c 65 20 68 61 73 20 6d 61 74 63  t table has matc
26bd0 68 65 64 20 74 68 65 20 6c 65 66 74 20 74 61 62  hed the left tab
26be0 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28  le.  .  */.  if(
26bf0 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
26c00 69 6e 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c  in ){.    pLevel
26c10 2d 3e 61 64 64 72 46 69 72 73 74 20 3d 20 73 71  ->addrFirst = sq
26c20 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
26c30 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c  Addr(v);.    sql
26c40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
26c50 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
26c60 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
26c70 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  in);.    VdbeCom
26c80 6d 65 6e 74 28 28 76 2c 20 22 72 65 63 6f 72 64  ment((v, "record
26c90 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74 22 29   LEFT JOIN hit")
26ca0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
26cb0 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
26cc0 72 73 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 54  rse);.    for(pT
26cd0 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b  erm=pWC->a, j=0;
26ce0 20 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a   j<pWC->nTerm; j
26cf0 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
26d00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
26d10 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
26d20 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 20  ERM_VIRTUAL );  
26d30 2f 2a 20 49 4d 50 3a 20 52 2d 33 30 35 37 35 2d  /* IMP: R-30575-
26d40 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 20 20 74  11662 */.      t
26d50 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
26d60 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
26d70 4f 44 45 44 20 29 3b 0a 20 20 20 20 20 20 69 66  ODED );.      if
26d80 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
26d90 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c   & (TERM_VIRTUAL
26da0 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63  |TERM_CODED) ) c
26db0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
26dc0 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
26dd0 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64 79 29  qAll & notReady)
26de0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  !=0 ){.        a
26df0 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 75  ssert( pWInfo->u
26e00 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29 3b 0a  ntestedTerms );.
26e10 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
26e20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26e30 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70  assert( pTerm->p
26e40 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 73 71  Expr );.      sq
26e50 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
26e60 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e  (pParse, pTerm->
26e70 70 45 78 70 72 2c 20 61 64 64 72 43 6f 6e 74 2c  pExpr, addrCont,
26e80 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
26e90 4c 4c 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  LL);.      pTerm
26ea0 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
26eb0 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20  M_CODED;.    }. 
26ec0 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
26ed0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
26ee0 65 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b  e, iReleaseReg);
26ef0 0a 0a 20 20 72 65 74 75 72 6e 20 6e 6f 74 52 65  ..  return notRe
26f00 61 64 79 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69  ady;.}..#if defi
26f10 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
26f20 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
26f30 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20 68 6f  wing variable ho
26f40 6c 64 73 20 61 20 74 65 78 74 20 64 65 73 63 72  lds a text descr
26f50 69 70 74 69 6f 6e 20 6f 66 20 71 75 65 72 79 20  iption of query 
26f60 70 6c 61 6e 20 67 65 6e 65 72 61 74 65 64 0a 2a  plan generated.*
26f70 2a 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72 65  * by the most re
26f80 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  cent call to sql
26f90 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
26fa0 2e 20 20 45 61 63 68 20 63 61 6c 6c 20 74 6f 20  .  Each call to 
26fb0 57 68 65 72 65 42 65 67 69 6e 0a 2a 2a 20 6f 76  WhereBegin.** ov
26fc0 65 72 77 72 69 74 65 73 20 74 68 65 20 70 72 65  erwrites the pre
26fd0 76 69 6f 75 73 2e 20 20 54 68 69 73 20 69 6e 66  vious.  This inf
26fe0 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
26ff0 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
27000 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  .** analysis onl
27010 79 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74  y..*/.char sqlit
27020 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 42 4d  e3_query_plan[BM
27030 53 2a 32 2a 34 30 5d 3b 20 20 2f 2a 20 54 65 78  S*2*40];  /* Tex
27040 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  t of the join */
27050 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 51 50 6c  .static int nQPl
27060 61 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  an = 0;         
27070 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 72 65       /* Next fre
27080 65 20 73 6c 6f 77 20 69 6e 20 5f 71 75 65 72 79  e slow in _query
27090 5f 70 6c 61 6e 5b 5d 20 2a 2f 0a 0a 23 65 6e 64  _plan[] */..#end
270a0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53  if /* SQLITE_TES
270b0 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  T */.../*.** Fre
270c0 65 20 61 20 57 68 65 72 65 49 6e 66 6f 20 73 74  e a WhereInfo st
270d0 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69  ructure.*/.stati
270e0 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e 66 6f  c void whereInfo
270f0 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62  Free(sqlite3 *db
27100 2c 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  , WhereInfo *pWI
27110 6e 66 6f 29 7b 0a 20 20 69 66 28 20 41 4c 57 41  nfo){.  if( ALWA
27120 59 53 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20  YS(pWInfo) ){.  
27130 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
27140 28 69 3d 30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e  (i=0; i<pWInfo->
27150 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20  nLevel; i++){.  
27160 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65      sqlite3_inde
27170 78 5f 69 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20  x_info *pInfo = 
27180 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 49 64  pWInfo->a[i].pId
27190 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28  xInfo;.      if(
271a0 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20   pInfo ){.      
271b0 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 49 6e    /* assert( pIn
271c0 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
271d0 78 53 74 72 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d  xStr==0 || db->m
271e0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 20 2a  allocFailed ); *
271f0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  /.        if( pI
27200 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
27210 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20  dxStr ){.       
27220 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
27230 70 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a  pInfo->idxStr);.
27240 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27250 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
27260 64 62 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 20 20  db, pInfo);.    
27270 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 57    }.      if( pW
27280 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 6c 61 6e 2e  Info->a[i].plan.
27290 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
272a0 54 45 4d 50 5f 49 4e 44 45 58 20 29 7b 0a 20 20  TEMP_INDEX ){.  
272b0 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
272c0 78 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d  x = pWInfo->a[i]
272d0 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20  .plan.u.pIdx;.  
272e0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 20 29        if( pIdx )
272f0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
27300 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
27310 64 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20  dx->zColAff);.  
27320 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
27330 62 46 72 65 65 28 64 62 2c 20 70 49 64 78 29 3b  bFree(db, pIdx);
27340 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27350 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 65   }.    }.    whe
27360 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 70 57  reClauseClear(pW
27370 49 6e 66 6f 2d 3e 70 57 43 29 3b 0a 20 20 20 20  Info->pWC);.    
27380 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
27390 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d  , pWInfo);.  }.}
273a0 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
273b0 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  e the beginning 
273c0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65 64  of the loop used
273d0 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73   for WHERE claus
273e0 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
273f0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
27400 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
27410 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74 72 75  o an opaque stru
27420 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61  cture that conta
27430 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  ins.** informati
27440 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74 65 72  on needed to ter
27450 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e  minate the loop.
27460 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63 61 6c    Later, the cal
27470 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  ling routine.** 
27480 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71  should invoke sq
27490 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20  lite3WhereEnd() 
274a0 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20  with the return 
274b0 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75  value of this fu
274c0 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64  nction.** in ord
274d0 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74  er to complete t
274e0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
274f0 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a  processing..**.*
27500 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
27510 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69  curs, this routi
27520 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e  ne returns NULL.
27530 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69 63  .**.** The basic
27540 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f 20 61   idea is to do a
27550 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e   nested loop, on
27560 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68 20  e loop for each 
27570 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20  table in.** the 
27580 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
27590 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53 45 52   select.  (INSER
275a0 54 20 61 6e 64 20 55 50 44 41 54 45 20 73 74 61  T and UPDATE sta
275b0 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65 0a  tements are the.
275c0 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53 45 4c  ** same as a SEL
275d0 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20 61 20  ECT with only a 
275e0 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20  single table in 
275f0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
27600 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c  )  For.** exampl
27610 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20 69 73  e, if the SQL is
27620 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
27630 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
27640 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52   t1, t2, t3 WHER
27650 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  E ...;.**.** The
27660 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  n the code gener
27670 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70 74 75  ated is conceptu
27680 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20 66 6f  ally like the fo
27690 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
276a0 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31      foreach row1
276b0 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20 20 20   in t1 do       
276c0 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61  \    Code genera
276d0 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f  ted.**        fo
276e0 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32  reach row2 in t2
276f0 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79 20   do      |-- by 
27700 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
27710 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  n().**          
27720 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69 6e 20  foreach row3 in 
27730 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20  t3 do   /.**    
27740 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20          ....**  
27750 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20          end     
27760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27770 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61  \    Code genera
27780 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e  ted.**        en
27790 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
277a0 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62 79 20           |-- by 
277b0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
277c0 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20 20 20  ).**      end   
277d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
277e0 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f        /.**.** No
277f0 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f 6f 70  te that the loop
27800 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 6e  s might not be n
27810 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f 72 64  ested in the ord
27820 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65 79  er in which they
27830 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20 74 68  .** appear in th
27840 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 66  e FROM clause if
27850 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64   a different ord
27860 65 72 20 69 73 20 62 65 74 74 65 72 20 61 62 6c  er is better abl
27870 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65  e to make.** use
27880 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f   of indices.  No
27890 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77 68 65  te also that whe
278a0 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  n the IN operato
278b0 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20  r appears in.** 
278c0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
278d0 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73 75 6c  , it might resul
278e0 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20  t in additional 
278f0 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72  nested loops for
27900 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  .** scanning thr
27910 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73 20  ough all values 
27920 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  on the right-han
27930 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e  d side of the IN
27940 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72  ..**.** There ar
27950 65 20 42 74 72 65 65 20 63 75 72 73 6f 72 73 20  e Btree cursors 
27960 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
27970 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74 31 20  each table.  t1 
27980 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e  uses cursor.** n
27990 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74 2d 3e  umber pTabList->
279a0 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74  a[0].iCursor.  t
279b0 32 20 75 73 65 73 20 74 68 65 20 63 75 72 73 6f  2 uses the curso
279c0 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d  r pTabList->a[1]
279d0 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64  .iCursor..** And
279e0 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 69 73   so forth.  This
279f0 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
27a00 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20  es code to open 
27a10 74 68 6f 73 65 20 56 44 42 45 20 63 75 72 73 6f  those VDBE curso
27a20 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  rs.** and sqlite
27a30 33 57 68 65 72 65 45 6e 64 28 29 20 67 65 6e 65  3WhereEnd() gene
27a40 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74  rates the code t
27a50 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a  o close them..**
27a60 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61  .** The code tha
27a70 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  t sqlite3WhereBe
27a80 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65 73 20  gin() generates 
27a90 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f  leaves the curso
27aa0 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70  rs named.** in p
27ab0 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67  TabList pointing
27ac0 20 61 74 20 74 68 65 69 72 20 61 70 70 72 6f 70   at their approp
27ad0 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e 20 20  riate entries.  
27ae0 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a  The [...] code.*
27af0 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c  * can use OP_Col
27b00 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64  umn and OP_Rowid
27b10 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65 73   opcodes on thes
27b20 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65 78 74  e cursors to ext
27b30 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f  ract.** data fro
27b40 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20 74 61  m the various ta
27b50 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70  bles of the loop
27b60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57  ..**.** If the W
27b70 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 65  HERE clause is e
27b80 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65 61 63  mpty, the foreac
27b90 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61 63  h loops must eac
27ba0 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20  h scan their.** 
27bb0 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e 20 20  entire tables.  
27bc0 54 68 75 73 20 61 20 74 68 72 65 65 2d 77 61 79  Thus a three-way
27bd0 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e   join is an O(N^
27be0 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42  3) operation.  B
27bf0 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62  ut if.** the tab
27c00 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63 65 73  les have indices
27c10 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 74   and there are t
27c20 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52  erms in the WHER
27c30 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a  E clause that.**
27c40 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73 65 20   refer to those 
27c50 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c  indices, a compl
27c60 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e 20 63  ete table scan c
27c70 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20 61 6e  an be avoided an
27c80 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69  d the.** code wi
27c90 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61 73 74  ll run much fast
27ca0 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68 65  er.  Most of the
27cb0 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 72 6f   work of this ro
27cc0 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b 69 6e  utine is checkin
27cd0 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74  g.** to see if t
27ce0 68 65 72 65 20 61 72 65 20 69 6e 64 69 63 65 73  here are indices
27cf0 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
27d00 64 20 74 6f 20 73 70 65 65 64 20 75 70 20 74 68  d to speed up th
27d10 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65  e loop..**.** Te
27d20 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
27d30 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 73 6f   clause are also
27d40 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 77   used to limit w
27d50 68 69 63 68 20 72 6f 77 73 20 61 63 74 75 61 6c  hich rows actual
27d60 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f  ly.** make it to
27d70 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68   the "..." in th
27d80 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65 20  e middle of the 
27d90 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65 61 63  loop.  After eac
27da0 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20  h "foreach",.** 
27db0 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
27dc0 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 75  RE clause that u
27dd0 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e  se only terms in
27de0 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f   that loop and o
27df0 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72  uter.** loops ar
27e00 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  e evaluated and 
27e10 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d 70 20  if false a jump 
27e20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64 20 61  is made around a
27e30 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a  ll subsequent.**
27e40 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72   inner loops (or
27e50 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e   around the "...
27e60 22 20 69 66 20 74 68 65 20 74 65 73 74 20 6f 63  " if the test oc
27e70 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
27e80 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c  inner-.** most l
27e90 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52  oop).**.** OUTER
27ea0 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20   JOINS.**.** An 
27eb0 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61  outer join of ta
27ec0 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32 20 69  bles t1 and t2 i
27ed0 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f  s conceptally co
27ee0 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ded as follows:.
27ef0 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63 68  **.**    foreach
27f00 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a   row1 in t1 do.*
27f10 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20 30 0a  *      flag = 0.
27f20 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  **      foreach 
27f30 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a  row2 in t2 do.**
27f40 20 20 20 20 20 20 20 20 73 74 61 72 74 3a 0a 2a          start:.*
27f50 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a  *          ....*
27f60 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20  *          flag 
27f70 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a  = 1.**      end.
27f80 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61 67 3d  **      if flag=
27f90 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20  =0 then.**      
27fa0 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32 20    move the row2 
27fb0 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c  cursor to a null
27fc0 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 67   row.**        g
27fd0 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20 20  oto start.**    
27fe0 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a    fi.**    end.*
27ff0 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 43 4c  *.** ORDER BY CL
28000 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e 47 0a  AUSE PROCESSING.
28010 2a 2a 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79  **.** *ppOrderBy
28020 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
28030 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
28040 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
28050 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 69   statement,.** i
28060 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20  f there is one. 
28070 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
28080 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
28090 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  or if this routi
280a0 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  ne.** is called 
280b0 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45 20 6f  from an UPDATE o
280c0 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
280d0 6e 74 2c 20 74 68 65 6e 20 70 70 4f 72 64 65 72  nt, then ppOrder
280e0 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  By is NULL..**.*
280f0 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63 61  * If an index ca
28100 6e 20 62 65 20 75 73 65 64 20 73 6f 20 74 68 61  n be used so tha
28110 74 20 74 68 65 20 6e 61 74 75 72 61 6c 20 6f 75  t the natural ou
28120 74 70 75 74 20 6f 72 64 65 72 20 6f 66 20 74 68  tput order of th
28130 65 20 74 61 62 6c 65 0a 2a 2a 20 73 63 61 6e 20  e table.** scan 
28140 69 73 20 63 6f 72 72 65 63 74 20 66 6f 72 20 74  is correct for t
28150 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
28160 73 65 2c 20 74 68 65 6e 20 74 68 61 74 20 69 6e  se, then that in
28170 64 65 78 20 69 73 20 75 73 65 64 20 61 6e 64 0a  dex is used and.
28180 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73  ** *ppOrderBy is
28190 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 54   set to NULL.  T
281a0 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  his is an optimi
281b0 7a 61 74 69 6f 6e 20 74 68 61 74 20 70 72 65 76  zation that prev
281c0 65 6e 74 73 20 61 6e 0a 2a 2a 20 75 6e 6e 65 63  ents an.** unnec
281d0 65 73 73 61 72 79 20 73 6f 72 74 20 6f 66 20 74  essary sort of t
281e0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 66  he result set if
281f0 20 61 6e 20 69 6e 64 65 78 20 61 70 70 72 6f 70   an index approp
28200 72 69 61 74 65 20 66 6f 72 20 74 68 65 0a 2a 2a  riate for the.**
28210 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
28220 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e   already exists.
28230 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 68  .**.** If the wh
28240 65 72 65 20 63 6c 61 75 73 65 20 6c 6f 6f 70 73  ere clause loops
28250 20 63 61 6e 6e 6f 74 20 62 65 20 61 72 72 61 6e   cannot be arran
28260 67 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74  ged to provide t
28270 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 6f 75  he correct.** ou
28280 74 70 75 74 20 6f 72 64 65 72 2c 20 74 68 65 6e  tput order, then
28290 20 74 68 65 20 2a 70 70 4f 72 64 65 72 42 79 20   the *ppOrderBy 
282a0 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  is unchanged..*/
282b0 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69  .WhereInfo *sqli
282c0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20  te3WhereBegin(. 
282d0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
282e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
282f0 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
28300 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
28310 69 73 74 2c 20 20 20 20 2f 2a 20 41 20 6c 69 73  ist,    /* A lis
28320 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20  t of all tables 
28330 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f  to be scanned */
28340 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c  .  Expr *pWhere,
28350 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
28360 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
28370 20 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 4f    ExprList **ppO
28380 72 64 65 72 42 79 2c 20 2f 2a 20 41 6e 20 4f 52  rderBy, /* An OR
28390 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 6f  DER BY clause, o
283a0 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 75 31 36 20  r NULL */.  u16 
283b0 77 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20  wctrlFlags      
283c0 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
283d0 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65  WHERE_* flags de
283e0 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49  fined in sqliteI
283f0 6e 74 2e 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  nt.h */.){.  int
28400 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
28410 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
28420 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
28430 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20 20 20   nByteWInfo;    
28440 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20          /* Num. 
28450 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  bytes allocated 
28460 66 6f 72 20 57 68 65 72 65 49 6e 66 6f 20 73 74  for WhereInfo st
28470 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  ruct */.  int nT
28480 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  abList;         
28490 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
284a0 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54  f elements in pT
284b0 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72  abList */.  Wher
284c0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
284d0 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62         /* Will b
284e0 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e  ecome the return
284f0 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
28500 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62  unction */.  Vdb
28510 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
28520 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76  Vdbe;   /* The v
28530 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65 20  irtual database 
28540 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d  engine */.  Bitm
28550 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20  ask notReady;   
28560 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
28570 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79  s that are not y
28580 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f  et positioned */
28590 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  .  WhereMaskSet 
285a0 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a  *pMaskSet;    /*
285b0 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
285c0 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68  mask set */.  Wh
285d0 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
285e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
285f0 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f   Decomposition o
28600 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
28610 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
28620 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61  rcList_item *pTa
28630 62 49 74 65 6d 3b 20 20 2f 2a 20 41 20 73 69 6e  bItem;  /* A sin
28640 67 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 70  gle entry from p
28650 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65  TabList */.  Whe
28660 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b  reLevel *pLevel;
28670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28680 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69  A single level i
28690 6e 20 74 68 65 20 70 57 49 6e 66 6f 20 6c 69 73  n the pWInfo lis
286a0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d  t */.  int iFrom
286b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
286c0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
286d0 75 6e 75 73 65 64 20 46 52 4f 4d 20 63 6c 61 75  unused FROM clau
286e0 73 65 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  se element */.  
286f0 69 6e 74 20 61 6e 64 46 6c 61 67 73 3b 20 20 20  int andFlags;   
28700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 4e             /* AN
28710 44 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  D-ed combination
28720 20 6f 66 20 61 6c 6c 20 70 57 43 2d 3e 61 5b 5d   of all pWC->a[]
28730 2e 77 74 46 6c 61 67 73 20 2a 2f 0a 20 20 73 71  .wtFlags */.  sq
28740 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
28750 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
28760 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
28770 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d  */..  /* The num
28780 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ber of tables in
28790 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
287a0 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74   is limited by t
287b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a  he number of.  *
287c0 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d  * bits in a Bitm
287d0 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74  ask .  */.  test
287e0 63 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d 3e  case( pTabList->
287f0 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69  nSrc==BMS );.  i
28800 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  f( pTabList->nSr
28810 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c  c>BMS ){.    sql
28820 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
28830 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64  rse, "at most %d
28840 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69   tables in a joi
28850 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65  n", BMS);.    re
28860 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
28870 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
28880 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74  normally generat
28890 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70  es a nested loop
288a0 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
288b0 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73  in .  ** pTabLis
288c0 74 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 57  t.  But if the W
288d0 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
288e0 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  LY flag is set, 
288f0 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20  then we should. 
28900 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74   ** only generat
28910 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66  e code for the f
28920 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54  irst table in pT
28930 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d  abList and assum
28940 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20  e that.  ** any 
28950 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74  cursors associat
28960 65 64 20 77 69 74 68 20 73 75 62 73 65 71 75 65  ed with subseque
28970 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e  nt tables are un
28980 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
28990 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28  /.  nTabList = (
289a0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
289b0 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
289c0 29 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74  ) ? 1 : pTabList
289d0 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c  ->nSrc;..  /* Al
289e0 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
289f0 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49  alize the WhereI
28a00 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
28a10 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
28a20 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76  he.  ** return v
28a30 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61  alue. A single a
28a40 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65  llocation is use
28a50 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57  d to store the W
28a60 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74  hereInfo.  ** st
28a70 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e  ruct, the conten
28a80 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e  ts of WhereInfo.
28a90 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c  a[], the WhereCl
28aa0 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 20  ause structure. 
28ab0 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72   ** and the Wher
28ac0 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75  eMaskSet structu
28ad0 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43  re. Since WhereC
28ae0 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61  lause contains a
28af0 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69  n 8-byte.  ** fi
28b00 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61 73  eld (type Bitmas
28b10 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c  k) it must be al
28b20 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79  igned on an 8-by
28b30 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20  te boundary on. 
28b40 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65   ** some archite
28b50 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68  ctures. Hence th
28b60 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77  e ROUND8() below
28b70 2e 0a 20 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50  ..  */.  db = pP
28b80 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 42 79 74  arse->db;.  nByt
28b90 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28  eWInfo = ROUND8(
28ba0 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f  sizeof(WhereInfo
28bb0 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73  )+(nTabList-1)*s
28bc0 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c  izeof(WhereLevel
28bd0 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73  ));.  pWInfo = s
28be0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
28bf0 72 6f 28 64 62 2c 20 0a 20 20 20 20 20 20 6e 42  ro(db, .      nB
28c00 79 74 65 57 49 6e 66 6f 20 2b 20 0a 20 20 20 20  yteWInfo + .    
28c10 20 20 73 69 7a 65 6f 66 28 57 68 65 72 65 43 6c    sizeof(WhereCl
28c20 61 75 73 65 29 20 2b 0a 20 20 20 20 20 20 73 69  ause) +.      si
28c30 7a 65 6f 66 28 57 68 65 72 65 4d 61 73 6b 53 65  zeof(WhereMaskSe
28c40 74 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 64 62  t).  );.  if( db
28c50 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
28c60 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
28c70 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
28c80 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b  .    pWInfo = 0;
28c90 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42  .    goto whereB
28ca0 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20  eginError;.  }. 
28cb0 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20   pWInfo->nLevel 
28cc0 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70 57  = nTabList;.  pW
28cd0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70  Info->pParse = p
28ce0 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d  Parse;.  pWInfo-
28cf0 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62  >pTabList = pTab
28d00 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  List;.  pWInfo->
28d10 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
28d20 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
28d30 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 57 43 20  ;.  pWInfo->pWC 
28d40 3d 20 70 57 43 20 3d 20 28 57 68 65 72 65 43 6c  = pWC = (WhereCl
28d50 61 75 73 65 20 2a 29 26 28 28 75 38 20 2a 29 70  ause *)&((u8 *)p
28d60 57 49 6e 66 6f 29 5b 6e 42 79 74 65 57 49 6e 66  WInfo)[nByteWInf
28d70 6f 5d 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63  o];.  pWInfo->wc
28d80 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74 72 6c  trlFlags = wctrl
28d90 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d  Flags;.  pWInfo-
28da0 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70  >savedNQueryLoop
28db0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72   = pParse->nQuer
28dc0 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61 73 6b 53 65  yLoop;.  pMaskSe
28dd0 74 20 3d 20 28 57 68 65 72 65 4d 61 73 6b 53 65  t = (WhereMaskSe
28de0 74 2a 29 26 70 57 43 5b 31 5d 3b 0a 0a 20 20 2f  t*)&pWC[1];..  /
28df0 2a 20 53 70 6c 69 74 20 74 68 65 20 57 48 45 52  * Split the WHER
28e00 45 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65  E clause into se
28e10 70 61 72 61 74 65 20 73 75 62 65 78 70 72 65 73  parate subexpres
28e20 73 69 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68  sions where each
28e30 0a 20 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73  .  ** subexpress
28e40 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64  ion is separated
28e50 20 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61   by an AND opera
28e60 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74  tor..  */.  init
28e70 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b 53 65 74  MaskSet(pMaskSet
28e80 29 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65  );.  whereClause
28e90 49 6e 69 74 28 70 57 43 2c 20 70 50 61 72 73 65  Init(pWC, pParse
28ea0 2c 20 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 73  , pMaskSet);.  s
28eb0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f  qlite3ExprCodeCo
28ec0 6e 73 74 61 6e 74 73 28 70 50 61 72 73 65 2c 20  nstants(pParse, 
28ed0 70 57 68 65 72 65 29 3b 0a 20 20 77 68 65 72 65  pWhere);.  where
28ee0 53 70 6c 69 74 28 70 57 43 2c 20 70 57 68 65 72  Split(pWC, pWher
28ef0 65 2c 20 54 4b 5f 41 4e 44 29 3b 20 20 20 2f 2a  e, TK_AND);   /*
28f00 20 49 4d 50 3a 20 52 2d 31 35 38 34 32 2d 35 33   IMP: R-15842-53
28f10 32 39 36 20 2a 2f 0a 20 20 20 20 0a 20 20 2f 2a  296 */.    .  /*
28f20 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 61   Special case: a
28f30 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
28f40 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20  at is constant. 
28f50 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20 20   Evaluate the.  
28f60 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ** expression an
28f70 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f 76  d either jump ov
28f80 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f  er all of the co
28f90 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e  de or fall thru.
28fa0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 68 65  .  */.  if( pWhe
28fb0 72 65 20 26 26 20 28 6e 54 61 62 4c 69 73 74 3d  re && (nTabList=
28fc0 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70  =0 || sqlite3Exp
28fd0 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
28fe0 69 6e 28 70 57 68 65 72 65 29 29 20 29 7b 0a 20  in(pWhere)) ){. 
28ff0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
29000 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 57  False(pParse, pW
29010 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  here, pWInfo->iB
29020 72 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  reak, SQLITE_JUM
29030 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 57  PIFNULL);.    pW
29040 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  here = 0;.  }.. 
29050 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74   /* Assign a bit
29060 20 66 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73   from the bitmas
29070 6b 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20  k to every term 
29080 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
29090 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  se..  **.  ** Wh
290a0 65 6e 20 61 73 73 69 67 6e 69 6e 67 20 62 69 74  en assigning bit
290b0 6d 61 73 6b 20 76 61 6c 75 65 73 20 74 6f 20 46  mask values to F
290c0 52 4f 4d 20 63 6c 61 75 73 65 20 63 75 72 73 6f  ROM clause curso
290d0 72 73 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 20  rs, it must be. 
290e0 20 2a 2a 20 74 68 65 20 63 61 73 65 20 74 68 61   ** the case tha
290f0 74 20 69 66 20 58 20 69 73 20 74 68 65 20 62 69  t if X is the bi
29100 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d  tmask for the N-
29110 74 68 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  th FROM clause t
29120 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68  erm then.  ** th
29130 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c  e bitmask for al
29140 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  l FROM clause te
29150 72 6d 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  rms to the left 
29160 6f 66 20 74 68 65 20 4e 2d 74 68 20 74 65 72 6d  of the N-th term
29170 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20  .  ** is (X-1). 
29180 20 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20    An expression 
29190 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75  from the ON clau
291a0 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  se of a LEFT JOI
291b0 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69  N can use.  ** i
291c0 74 73 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f  ts Expr.iRightJo
291d0 69 6e 54 61 62 6c 65 20 76 61 6c 75 65 20 74 6f  inTable value to
291e0 20 66 69 6e 64 20 74 68 65 20 62 69 74 6d 61 73   find the bitmas
291f0 6b 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74  k of the right t
29200 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  able.  ** of the
29210 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61 63 74   join.  Subtract
29220 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65  ing one from the
29230 20 72 69 67 68 74 20 74 61 62 6c 65 20 62 69 74   right table bit
29240 6d 61 73 6b 20 67 69 76 65 73 20 61 0a 20 20 2a  mask gives a.  *
29250 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c  * bitmask for al
29260 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  l tables to the 
29270 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e  left of the join
29280 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62  .  Knowing the b
29290 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20  itmask.  ** for 
292a0 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68  all tables to th
292b0 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66 74  e left of a left
292c0 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72 74 61   join is importa
292d0 6e 74 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31  nt.  Ticket #301
292e0 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e  5..  **.  ** Con
292f0 66 69 67 75 72 65 20 74 68 65 20 57 68 65 72 65  figure the Where
29300 43 6c 61 75 73 65 2e 76 6d 61 73 6b 20 76 61 72  Clause.vmask var
29310 69 61 62 6c 65 20 73 6f 20 74 68 61 74 20 62 69  iable so that bi
29320 74 73 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f  ts that correspo
29330 6e 64 0a 20 20 2a 2a 20 74 6f 20 76 69 72 74 75  nd.  ** to virtu
29340 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72 73  al table cursors
29350 20 61 72 65 20 73 65 74 2e 20 54 68 69 73 20 69   are set. This i
29360 73 20 75 73 65 64 20 74 6f 20 73 65 6c 65 63 74  s used to select
29370 69 76 65 6c 79 20 64 69 73 61 62 6c 65 20 0a 20  ively disable . 
29380 20 2a 2a 20 74 68 65 20 4f 52 2d 74 6f 2d 49 4e   ** the OR-to-IN
29390 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
293a0 69 6e 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72  in exprAnalyzeOr
293b0 54 65 72 6d 28 29 2e 20 49 74 20 69 73 20 6e 6f  Term(). It is no
293c0 74 20 68 65 6c 70 66 75 6c 20 0a 20 20 2a 2a 20  t helpful .  ** 
293d0 77 69 74 68 20 76 69 72 74 75 61 6c 20 74 61 62  with virtual tab
293e0 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  les..  **.  ** N
293f0 6f 74 65 20 74 68 61 74 20 62 69 74 6d 61 73 6b  ote that bitmask
29400 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f  s are created fo
29410 72 20 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e  r all pTabList->
29420 6e 53 72 63 20 74 61 62 6c 65 73 20 69 6e 0a 20  nSrc tables in. 
29430 20 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f   ** pTabList, no
29440 74 20 6a 75 73 74 20 74 68 65 20 66 69 72 73 74  t just the first
29450 20 6e 54 61 62 4c 69 73 74 20 74 61 62 6c 65 73   nTabList tables
29460 2e 20 20 6e 54 61 62 4c 69 73 74 20 69 73 20 6e  .  nTabList is n
29470 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75  ormally.  ** equ
29480 61 6c 20 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e  al to pTabList->
29490 6e 53 72 63 20 62 75 74 20 6d 69 67 68 74 20 62  nSrc but might b
294a0 65 20 73 68 6f 72 74 65 6e 65 64 20 74 6f 20 31  e shortened to 1
294b0 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 57 48 45   if the.  ** WHE
294c0 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
294d0 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 20 20   flag is set..  
294e0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 57 43  */.  assert( pWC
294f0 2d 3e 76 6d 61 73 6b 3d 3d 30 20 26 26 20 70 4d  ->vmask==0 && pM
29500 61 73 6b 53 65 74 2d 3e 6e 3d 3d 30 20 29 3b 0a  askSet->n==0 );.
29510 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
29520 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
29530 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d 61 73  ){.    createMas
29540 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(pMaskSet, pTab
29550 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  List->a[i].iCurs
29560 6f 72 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  or);.#ifndef SQL
29570 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
29580 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 41 4c  TABLE.    if( AL
29590 57 41 59 53 28 70 54 61 62 4c 69 73 74 2d 3e 61  WAYS(pTabList->a
295a0 5b 69 5d 2e 70 54 61 62 29 20 26 26 20 49 73 56  [i].pTab) && IsV
295b0 69 72 74 75 61 6c 28 70 54 61 62 4c 69 73 74 2d  irtual(pTabList-
295c0 3e 61 5b 69 5d 2e 70 54 61 62 29 20 29 7b 0a 20  >a[i].pTab) ){. 
295d0 20 20 20 20 20 70 57 43 2d 3e 76 6d 61 73 6b 20       pWC->vmask 
295e0 7c 3d 20 28 28 42 69 74 6d 61 73 6b 29 31 20 3c  |= ((Bitmask)1 <
295f0 3c 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  < i);.    }.#end
29600 69 66 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e  if.  }.#ifndef N
29610 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 42 69  DEBUG.  {.    Bi
29620 74 6d 61 73 6b 20 74 6f 54 68 65 4c 65 66 74 20  tmask toTheLeft 
29630 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
29640 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
29650 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
29660 42 69 74 6d 61 73 6b 20 6d 20 3d 20 67 65 74 4d  Bitmask m = getM
29670 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54  ask(pMaskSet, pT
29680 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  abList->a[i].iCu
29690 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 61 73 73  rsor);.      ass
296a0 65 72 74 28 20 28 6d 2d 31 29 3d 3d 74 6f 54 68  ert( (m-1)==toTh
296b0 65 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 74  eLeft );.      t
296c0 6f 54 68 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20  oTheLeft |= m;. 
296d0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
296e0 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c  .  /* Analyze al
296f0 6c 20 6f 66 20 74 68 65 20 73 75 62 65 78 70 72  l of the subexpr
29700 65 73 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74  essions.  Note t
29710 68 61 74 20 65 78 70 72 41 6e 61 6c 79 7a 65 28  hat exprAnalyze(
29720 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64 64  ) might.  ** add
29730 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72   new virtual ter
29740 6d 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  ms onto the end 
29750 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
29760 75 73 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a  use.  We do not.
29770 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61    ** want to ana
29780 6c 79 7a 65 20 74 68 65 73 65 20 76 69 72 74 75  lyze these virtu
29790 61 6c 20 74 65 72 6d 73 2c 20 73 6f 20 73 74 61  al terms, so sta
297a0 72 74 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20  rt analyzing at 
297b0 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64  the end.  ** and
297c0 20 77 6f 72 6b 20 66 6f 72 77 61 72 64 20 73 6f   work forward so
297d0 20 74 68 61 74 20 74 68 65 20 61 64 64 65 64 20   that the added 
297e0 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 61 72  virtual terms ar
297f0 65 20 6e 65 76 65 72 20 70 72 6f 63 65 73 73 65  e never processe
29800 64 2e 0a 20 20 2a 2f 0a 20 20 65 78 70 72 41 6e  d..  */.  exprAn
29810 61 6c 79 7a 65 41 6c 6c 28 70 54 61 62 4c 69 73  alyzeAll(pTabLis
29820 74 2c 20 70 57 43 29 3b 0a 20 20 69 66 28 20 64  t, pWC);.  if( d
29830 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
29840 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72  ){.    goto wher
29850 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d  eBeginError;.  }
29860 0a 0a 20 20 2f 2a 20 43 68 6f 73 65 20 74 68 65  ..  /* Chose the
29870 20 62 65 73 74 20 69 6e 64 65 78 20 74 6f 20 75   best index to u
29880 73 65 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c  se for each tabl
29890 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
298a0 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ause..  **.  ** 
298b0 54 68 69 73 20 6c 6f 6f 70 20 66 69 6c 6c 73 20  This loop fills 
298c0 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
298d0 20 66 69 65 6c 64 73 3a 0a 20 20 2a 2a 0a 20 20   fields:.  **.  
298e0 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
298f0 2e 70 49 64 78 20 20 20 20 20 20 54 68 65 20 69  .pIdx      The i
29900 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20  ndex to use for 
29910 74 68 69 73 20 6c 65 76 65 6c 20 6f 66 20 74 68  this level of th
29920 65 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 20 20 70  e loop..  **   p
29930 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 77 73 46 6c 61  WInfo->a[].wsFla
29940 67 73 20 20 20 57 48 45 52 45 5f 78 78 78 20 66  gs   WHERE_xxx f
29950 6c 61 67 73 20 61 73 73 6f 63 69 61 74 65 64 20  lags associated 
29960 77 69 74 68 20 70 49 64 78 0a 20 20 2a 2a 20 20  with pIdx.  **  
29970 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 6e 45 71   pWInfo->a[].nEq
29980 20 20 20 20 20 20 20 54 68 65 20 6e 75 6d 62 65         The numbe
29990 72 20 6f 66 20 3d 3d 20 61 6e 64 20 49 4e 20 63  r of == and IN c
299a0 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20  onstraints.  ** 
299b0 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 46    pWInfo->a[].iF
299c0 72 6f 6d 20 20 20 20 20 57 68 69 63 68 20 74 65  rom     Which te
299d0 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  rm of the FROM c
299e0 6c 61 75 73 65 20 69 73 20 62 65 69 6e 67 20 63  lause is being c
299f0 6f 64 65 64 0a 20 20 2a 2a 20 20 20 70 57 49 6e  oded.  **   pWIn
29a00 66 6f 2d 3e 61 5b 5d 2e 69 54 61 62 43 75 72 20  fo->a[].iTabCur 
29a10 20 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f    The VDBE curso
29a20 72 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  r for the databa
29a30 73 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 20 20  se table.  **   
29a40 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 49 64 78  pWInfo->a[].iIdx
29a50 43 75 72 20 20 20 54 68 65 20 56 44 42 45 20 63  Cur   The VDBE c
29a60 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e  ursor for the in
29a70 64 65 78 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66  dex.  **   pWInf
29a80 6f 2d 3e 61 5b 5d 2e 70 54 65 72 6d 20 20 20 20  o->a[].pTerm    
29a90 20 57 68 65 6e 20 77 73 46 6c 61 67 73 3d 3d 57   When wsFlags==W
29aa0 4f 5f 4f 52 2c 20 74 68 65 20 4f 52 2d 63 6c 61  O_OR, the OR-cla
29ab0 75 73 65 20 74 65 72 6d 0a 20 20 2a 2a 0a 20 20  use term.  **.  
29ac0 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73  ** This loop als
29ad0 6f 20 66 69 67 75 72 65 73 20 6f 75 74 20 74 68  o figures out th
29ae0 65 20 6e 65 73 74 69 6e 67 20 6f 72 64 65 72 20  e nesting order 
29af0 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
29b00 20 46 52 4f 4d 0a 20 20 2a 2a 20 63 6c 61 75 73   FROM.  ** claus
29b10 65 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61  e..  */.  notRea
29b20 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  dy = ~(Bitmask)0
29b30 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20 70  ;.  pTabItem = p
29b40 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 4c  TabList->a;.  pL
29b50 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  evel = pWInfo->a
29b60 3b 0a 20 20 61 6e 64 46 6c 61 67 73 20 3d 20 7e  ;.  andFlags = ~
29b70 30 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  0;.  WHERETRACE(
29b80 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20  ("*** Optimizer 
29b90 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a  Start ***\n"));.
29ba0 20 20 66 6f 72 28 69 3d 69 46 72 6f 6d 3d 30 2c    for(i=iFrom=0,
29bb0 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e   pLevel=pWInfo->
29bc0 61 3b 20 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69  a; i<nTabList; i
29bd0 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20  ++, pLevel++){. 
29be0 20 20 20 57 68 65 72 65 43 6f 73 74 20 62 65 73     WhereCost bes
29bf0 74 50 6c 61 6e 3b 20 20 20 20 20 20 20 20 20 2f  tPlan;         /
29c00 2a 20 4d 6f 73 74 20 65 66 66 69 63 69 65 6e 74  * Most efficient
29c10 20 70 6c 61 6e 20 73 65 65 6e 20 73 6f 20 66 61   plan seen so fa
29c20 72 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  r */.    Index *
29c30 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
29c40 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f       /* Index fo
29c50 72 20 46 52 4f 4d 20 74 61 62 6c 65 20 61 74 20  r FROM table at 
29c60 70 54 61 62 49 74 65 6d 20 2a 2f 0a 20 20 20 20  pTabItem */.    
29c70 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
29c80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
29c90 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
29ca0 46 52 4f 4d 20 74 61 62 6c 65 73 20 2a 2f 0a 20  FROM tables */. 
29cb0 20 20 20 69 6e 74 20 62 65 73 74 4a 20 3d 20 2d     int bestJ = -
29cc0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1;             /
29cd0 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 6a  * The value of j
29ce0 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   */.    Bitmask 
29cf0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
29d00 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 76      /* Bitmask v
29d10 61 6c 75 65 20 66 6f 72 20 6a 20 6f 72 20 62 65  alue for j or be
29d20 73 74 4a 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  stJ */.    int i
29d30 73 4f 70 74 69 6d 61 6c 3b 20 20 20 20 20 20 20  sOptimal;       
29d40 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
29d50 6f 72 20 66 6f 72 20 6f 70 74 69 6d 61 6c 2f 6e  or for optimal/n
29d60 6f 6e 2d 6f 70 74 69 6d 61 6c 20 73 65 61 72 63  on-optimal searc
29d70 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 55 6e  h */.    int nUn
29d80 63 6f 6e 73 74 72 61 69 6e 65 64 3b 20 20 20 20  constrained;    
29d90 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74       /* Number t
29da0 61 62 6c 65 73 20 77 69 74 68 6f 75 74 20 49 4e  ables without IN
29db0 44 45 58 45 44 20 42 59 20 2a 2f 0a 20 20 20 20  DEXED BY */.    
29dc0 42 69 74 6d 61 73 6b 20 6e 6f 74 49 6e 64 65 78  Bitmask notIndex
29dd0 65 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ed;         /* M
29de0 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 74 68  ask of tables th
29df0 61 74 20 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e  at cannot use an
29e00 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 20 20 6d   index */..    m
29e10 65 6d 73 65 74 28 26 62 65 73 74 50 6c 61 6e 2c  emset(&bestPlan,
29e20 20 30 2c 20 73 69 7a 65 6f 66 28 62 65 73 74 50   0, sizeof(bestP
29e30 6c 61 6e 29 29 3b 0a 20 20 20 20 62 65 73 74 50  lan));.    bestP
29e40 6c 61 6e 2e 72 43 6f 73 74 20 3d 20 53 51 4c 49  lan.rCost = SQLI
29e50 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 20 20 20 20  TE_BIG_DBL;.    
29e60 57 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a  WHERETRACE(("***
29e70 20 42 65 67 69 6e 20 73 65 61 72 63 68 20 66 6f   Begin search fo
29e80 72 20 6c 6f 6f 70 20 25 64 20 2a 2a 2a 5c 6e 22  r loop %d ***\n"
29e90 2c 20 69 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c  , i));..    /* L
29ea0 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65 20  oop through the 
29eb0 72 65 6d 61 69 6e 69 6e 67 20 65 6e 74 72 69 65  remaining entrie
29ec0 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
29ed0 61 75 73 65 20 74 6f 20 66 69 6e 64 20 74 68 65  ause to find the
29ee0 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20 6e 65 73  .    ** next nes
29ef0 74 65 64 20 6c 6f 6f 70 2e 20 54 68 65 20 6c 6f  ted loop. The lo
29f00 6f 70 20 74 65 73 74 73 20 61 6c 6c 20 46 52 4f  op tests all FRO
29f10 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 69 65 73  M clause entries
29f20 0a 20 20 20 20 2a 2a 20 65 69 74 68 65 72 20 6f  .    ** either o
29f30 6e 63 65 20 6f 72 20 74 77 69 63 65 2e 20 0a 20  nce or twice. . 
29f40 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
29f50 20 66 69 72 73 74 20 74 65 73 74 20 69 73 20 61   first test is a
29f60 6c 77 61 79 73 20 70 65 72 66 6f 72 6d 65 64 20  lways performed 
29f70 69 66 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  if there are two
29f80 20 6f 72 20 6d 6f 72 65 20 65 6e 74 72 69 65 73   or more entries
29f90 0a 20 20 20 20 2a 2a 20 72 65 6d 61 69 6e 69 6e  .    ** remainin
29fa0 67 20 61 6e 64 20 6e 65 76 65 72 20 70 65 72 66  g and never perf
29fb0 6f 72 6d 65 64 20 69 66 20 74 68 65 72 65 20 69  ormed if there i
29fc0 73 20 6f 6e 6c 79 20 6f 6e 65 20 46 52 4f 4d 20  s only one FROM 
29fd0 63 6c 61 75 73 65 20 65 6e 74 72 79 0a 20 20 20  clause entry.   
29fe0 20 2a 2a 20 74 6f 20 63 68 6f 6f 73 65 20 66 72   ** to choose fr
29ff0 6f 6d 2e 20 20 54 68 65 20 66 69 72 73 74 20 74  om.  The first t
2a000 65 73 74 20 6c 6f 6f 6b 73 20 66 6f 72 20 61 6e  est looks for an
2a010 20 22 6f 70 74 69 6d 61 6c 22 20 73 63 61 6e 2e   "optimal" scan.
2a020 20 20 49 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73    In.    ** this
2a030 20 63 6f 6e 74 65 78 74 20 61 6e 20 6f 70 74 69   context an opti
2a040 6d 61 6c 20 73 63 61 6e 20 69 73 20 6f 6e 65 20  mal scan is one 
2a050 74 68 61 74 20 75 73 65 73 20 74 68 65 20 73 61  that uses the sa
2a060 6d 65 20 73 74 72 61 74 65 67 79 0a 20 20 20 20  me strategy.    
2a070 2a 2a 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ** for the given
2a080 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74   FROM clause ent
2a090 72 79 20 61 73 20 77 6f 75 6c 64 20 62 65 20 73  ry as would be s
2a0a0 65 6c 65 63 74 65 64 20 69 66 20 74 68 65 20 65  elected if the e
2a0b0 6e 74 72 79 0a 20 20 20 20 2a 2a 20 77 65 72 65  ntry.    ** were
2a0c0 20 75 73 65 64 20 61 73 20 74 68 65 20 69 6e 6e   used as the inn
2a0d0 65 72 6d 6f 73 74 20 6e 65 73 74 65 64 20 6c 6f  ermost nested lo
2a0e0 6f 70 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  op.  In other wo
2a0f0 72 64 73 2c 20 61 20 74 61 62 6c 65 0a 20 20 20  rds, a table.   
2a100 20 2a 2a 20 69 73 20 63 68 6f 73 65 6e 20 73 75   ** is chosen su
2a110 63 68 20 74 68 61 74 20 74 68 65 20 63 6f 73 74  ch that the cost
2a120 20 6f 66 20 72 75 6e 6e 69 6e 67 20 74 68 61 74   of running that
2a130 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 65   table cannot be
2a140 20 72 65 64 75 63 65 64 0a 20 20 20 20 2a 2a 20   reduced.    ** 
2a150 62 79 20 77 61 69 74 69 6e 67 20 66 6f 72 20 6f  by waiting for o
2a160 74 68 65 72 20 74 61 62 6c 65 73 20 74 6f 20 72  ther tables to r
2a170 75 6e 20 66 69 72 73 74 2e 20 20 54 68 69 73 20  un first.  This 
2a180 22 6f 70 74 69 6d 61 6c 22 20 74 65 73 74 20 77  "optimal" test w
2a190 6f 72 6b 73 0a 20 20 20 20 2a 2a 20 62 79 20 66  orks.    ** by f
2a1a0 69 72 73 74 20 61 73 73 75 6d 69 6e 67 20 74 68  irst assuming th
2a1b0 61 74 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  at the FROM clau
2a1c0 73 65 20 69 73 20 6f 6e 20 74 68 65 20 69 6e 6e  se is on the inn
2a1d0 65 72 20 6c 6f 6f 70 20 61 6e 64 20 66 69 6e 64  er loop and find
2a1e0 69 6e 67 0a 20 20 20 20 2a 2a 20 69 74 73 20 71  ing.    ** its q
2a1f0 75 65 72 79 20 70 6c 61 6e 2c 20 74 68 65 6e 20  uery plan, then 
2a200 63 68 65 63 6b 69 6e 67 20 74 6f 20 73 65 65 20  checking to see 
2a210 69 66 20 74 68 61 74 20 71 75 65 72 79 20 70 6c  if that query pl
2a220 61 6e 20 75 73 65 73 20 61 6e 79 0a 20 20 20 20  an uses any.    
2a230 2a 2a 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c  ** other FROM cl
2a240 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 74 20  ause terms that 
2a250 61 72 65 20 6e 6f 74 52 65 61 64 79 2e 20 20 49  are notReady.  I
2a260 66 20 6e 6f 20 6e 6f 74 52 65 61 64 79 20 74 65  f no notReady te
2a270 72 6d 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 75  rms are.    ** u
2a280 73 65 64 20 74 68 65 6e 20 74 68 65 20 22 6f 70  sed then the "op
2a290 74 69 6d 61 6c 22 20 71 75 65 72 79 20 70 6c 61  timal" query pla
2a2a0 6e 20 77 6f 72 6b 73 2e 0a 20 20 20 20 2a 2a 0a  n works..    **.
2a2b0 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
2a2c0 20 74 68 65 20 57 68 65 72 65 43 6f 73 74 2e 6e   the WhereCost.n
2a2d0 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20 66 6f  Row parameter fo
2a2e0 72 20 61 6e 20 6f 70 74 69 6d 61 6c 20 73 63 61  r an optimal sca
2a2f0 6e 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20 6e  n might.    ** n
2a300 6f 74 20 62 65 20 61 73 20 73 6d 61 6c 6c 20 61  ot be as small a
2a310 73 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 66  s it would be if
2a320 20 74 68 65 20 74 61 62 6c 65 20 72 65 61 6c 6c   the table reall
2a330 79 20 77 65 72 65 20 74 68 65 20 69 6e 6e 65 72  y were the inner
2a340 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 6a 6f 69 6e  most.    ** join
2a350 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75  .  The nRow valu
2a360 65 20 63 61 6e 20 62 65 20 72 65 64 75 63 65 64  e can be reduced
2a370 20 62 79 20 57 48 45 52 45 20 63 6c 61 75 73 65   by WHERE clause
2a380 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 20   constraints.   
2a390 20 2a 2a 20 74 68 61 74 20 64 6f 20 6e 6f 74 20   ** that do not 
2a3a0 75 73 65 20 69 6e 64 69 63 65 73 2e 20 20 42 75  use indices.  Bu
2a3b0 74 20 74 68 69 73 20 6e 52 6f 77 20 72 65 64 75  t this nRow redu
2a3c0 63 74 69 6f 6e 20 6f 6e 6c 79 20 68 61 70 70 65  ction only happe
2a3d0 6e 73 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a  ns if the.    **
2a3e0 20 74 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73   table really is
2a3f0 20 74 68 65 20 69 6e 6e 65 72 6d 6f 73 74 20 6a   the innermost j
2a400 6f 69 6e 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20  oin.  .    **.  
2a410 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20    ** The second 
2a420 6c 6f 6f 70 20 69 74 65 72 61 74 69 6f 6e 20 69  loop iteration i
2a430 73 20 6f 6e 6c 79 20 70 65 72 66 6f 72 6d 65 64  s only performed
2a440 20 69 66 20 6e 6f 20 6f 70 74 69 6d 61 6c 20 73   if no optimal s
2a450 63 61 6e 0a 20 20 20 20 2a 2a 20 73 74 72 61 74  can.    ** strat
2a460 65 67 69 65 73 20 77 65 72 65 20 66 6f 75 6e 64  egies were found
2a470 20 62 79 20 74 68 65 20 66 69 72 73 74 20 69 74   by the first it
2a480 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 73 65  eration. This se
2a490 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 0a 20  cond iteration. 
2a4a0 20 20 20 2a 2a 20 69 73 20 75 73 65 64 20 74 6f     ** is used to
2a4b0 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   search for the 
2a4c0 6c 6f 77 65 73 74 20 63 6f 73 74 20 73 63 61 6e  lowest cost scan
2a4d0 20 6f 76 65 72 61 6c 6c 2e 0a 20 20 20 20 2a 2a   overall..    **
2a4e0 0a 20 20 20 20 2a 2a 20 50 72 65 76 69 6f 75 73  .    ** Previous
2a4f0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
2a500 69 74 65 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e  ite performed on
2a510 6c 79 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74  ly the second it
2a520 65 72 61 74 69 6f 6e 20 2d 0a 20 20 20 20 2a 2a  eration -.    **
2a530 20 74 68 65 20 6e 65 78 74 20 6f 75 74 65 72 6d   the next outerm
2a540 6f 73 74 20 6c 6f 6f 70 20 77 61 73 20 61 6c 77  ost loop was alw
2a550 61 79 73 20 74 68 61 74 20 77 69 74 68 20 74 68  ays that with th
2a560 65 20 6c 6f 77 65 73 74 20 6f 76 65 72 61 6c 6c  e lowest overall
2a570 0a 20 20 20 20 2a 2a 20 63 6f 73 74 2e 20 48 6f  .    ** cost. Ho
2a580 77 65 76 65 72 2c 20 74 68 69 73 20 6d 65 61 6e  wever, this mean
2a590 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 63 6f  t that SQLite co
2a5a0 75 6c 64 20 73 65 6c 65 63 74 20 74 68 65 20 77  uld select the w
2a5b0 72 6f 6e 67 20 70 6c 61 6e 0a 20 20 20 20 2a 2a  rong plan.    **
2a5c0 20 66 6f 72 20 73 63 72 69 70 74 73 20 73 75 63   for scripts suc
2a5d0 68 20 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  h as the followi
2a5e0 6e 67 3a 0a 20 20 20 20 2a 2a 20 20 20 0a 20 20  ng:.    **   .  
2a5f0 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41    **   CREATE TA
2a600 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 20 0a 20  BLE t1(a, b); . 
2a610 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54     **   CREATE T
2a620 41 42 4c 45 20 74 32 28 63 2c 20 64 29 3b 0a 20  ABLE t2(c, d);. 
2a630 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a     **   SELECT *
2a640 20 46 52 4f 4d 20 74 32 2c 20 74 31 20 57 48 45   FROM t2, t1 WHE
2a650 52 45 20 74 32 2e 72 6f 77 69 64 20 3d 20 74 31  RE t2.rowid = t1
2a660 2e 61 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  .a;.    **.    *
2a670 2a 20 54 68 65 20 62 65 73 74 20 73 74 72 61 74  * The best strat
2a680 65 67 79 20 69 73 20 74 6f 20 69 74 65 72 61 74  egy is to iterat
2a690 65 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20  e through table 
2a6a0 74 31 20 66 69 72 73 74 2e 20 48 6f 77 65 76 65  t1 first. Howeve
2a6b0 72 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e  r it.    ** is n
2a6c0 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  ot possible to d
2a6d0 65 74 65 72 6d 69 6e 65 20 74 68 69 73 20 77 69  etermine this wi
2a6e0 74 68 20 61 20 73 69 6d 70 6c 65 20 67 72 65 65  th a simple gree
2a6f0 64 79 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 20  dy algorithm..  
2a700 20 20 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 63    ** Since the c
2a710 6f 73 74 20 6f 66 20 61 20 6c 69 6e 65 61 72 20  ost of a linear 
2a720 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 61 62  scan through tab
2a730 6c 65 20 74 32 20 69 73 20 74 68 65 20 73 61 6d  le t2 is the sam
2a740 65 20 0a 20 20 20 20 2a 2a 20 61 73 20 74 68 65  e .    ** as the
2a750 20 63 6f 73 74 20 6f 66 20 61 20 6c 69 6e 65 61   cost of a linea
2a760 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74  r scan through t
2a770 61 62 6c 65 20 74 31 2c 20 61 20 73 69 6d 70 6c  able t1, a simpl
2a780 65 20 67 72 65 65 64 79 20 0a 20 20 20 20 2a 2a  e greedy .    **
2a790 20 61 6c 67 6f 72 69 74 68 6d 20 6d 61 79 20 63   algorithm may c
2a7a0 68 6f 6f 73 65 20 74 6f 20 75 73 65 20 74 32 20  hoose to use t2 
2a7b0 66 6f 72 20 74 68 65 20 6f 75 74 65 72 20 6c 6f  for the outer lo
2a7c0 6f 70 2c 20 77 68 69 63 68 20 69 73 20 61 20 6d  op, which is a m
2a7d0 75 63 68 0a 20 20 20 20 2a 2a 20 63 6f 73 74 6c  uch.    ** costl
2a7e0 69 65 72 20 61 70 70 72 6f 61 63 68 2e 0a 20 20  ier approach..  
2a7f0 20 20 2a 2f 0a 20 20 20 20 6e 55 6e 63 6f 6e 73    */.    nUncons
2a800 74 72 61 69 6e 65 64 20 3d 20 30 3b 0a 20 20 20  trained = 0;.   
2a810 20 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 30 3b   notIndexed = 0;
2a820 0a 20 20 20 20 66 6f 72 28 69 73 4f 70 74 69 6d  .    for(isOptim
2a830 61 6c 3d 28 69 46 72 6f 6d 3c 6e 54 61 62 4c 69  al=(iFrom<nTabLi
2a840 73 74 2d 31 29 3b 20 69 73 4f 70 74 69 6d 61 6c  st-1); isOptimal
2a850 3e 3d 30 20 26 26 20 62 65 73 74 4a 3c 30 3b 20  >=0 && bestJ<0; 
2a860 69 73 4f 70 74 69 6d 61 6c 2d 2d 29 7b 0a 20 20  isOptimal--){.  
2a870 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b      Bitmask mask
2a880 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2a890 20 4d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20   Mask of tables 
2a8a0 6e 6f 74 20 79 65 74 20 72 65 61 64 79 20 2a 2f  not yet ready */
2a8b0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 46 72  .      for(j=iFr
2a8c0 6f 6d 2c 20 70 54 61 62 49 74 65 6d 3d 26 70 54  om, pTabItem=&pT
2a8d0 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 3b 20 6a 3c  abList->a[j]; j<
2a8e0 6e 54 61 62 4c 69 73 74 3b 20 6a 2b 2b 2c 20 70  nTabList; j++, p
2a8f0 54 61 62 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  TabItem++){.    
2a900 20 20 20 20 69 6e 74 20 64 6f 4e 6f 74 52 65 6f      int doNotReo
2a910 72 64 65 72 3b 20 20 20 20 2f 2a 20 54 72 75 65  rder;    /* True
2a920 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 73   if this table s
2a930 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 6f  hould not be reo
2a940 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20  rdered */.      
2a950 20 20 57 68 65 72 65 43 6f 73 74 20 73 43 6f 73    WhereCost sCos
2a960 74 3b 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 69  t;     /* Cost i
2a970 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
2a980 62 65 73 74 5b 56 69 72 74 75 61 6c 5d 49 6e 64  best[Virtual]Ind
2a990 65 78 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  ex() */.        
2a9a0 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
2a9b0 42 79 3b 20 20 2f 2a 20 4f 52 44 45 52 20 42 59  By;  /* ORDER BY
2a9c0 20 63 6c 61 75 73 65 20 66 6f 72 20 69 6e 64 65   clause for inde
2a9d0 78 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 2a 2f  x to optimize */
2a9e0 0a 20 20 0a 20 20 20 20 20 20 20 20 64 6f 4e 6f  .  .        doNo
2a9f0 74 52 65 6f 72 64 65 72 20 3d 20 20 28 70 54 61  tReorder =  (pTa
2aa00 62 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20  bItem->jointype 
2aa10 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52  & (JT_LEFT|JT_CR
2aa20 4f 53 53 29 29 21 3d 30 3b 0a 20 20 20 20 20 20  OSS))!=0;.      
2aa30 20 20 69 66 28 20 6a 21 3d 69 46 72 6f 6d 20 26    if( j!=iFrom &
2aa40 26 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29  & doNotReorder )
2aa50 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2aa60 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73  m = getMask(pMas
2aa70 6b 53 65 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e  kSet, pTabItem->
2aa80 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
2aa90 20 20 69 66 28 20 28 6d 20 26 20 6e 6f 74 52 65    if( (m & notRe
2aaa0 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ady)==0 ){.     
2aab0 20 20 20 20 20 69 66 28 20 6a 3d 3d 69 46 72 6f       if( j==iFro
2aac0 6d 20 29 20 69 46 72 6f 6d 2b 2b 3b 0a 20 20 20  m ) iFrom++;.   
2aad0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2aae0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2aaf0 20 20 20 6d 61 73 6b 20 3d 20 28 69 73 4f 70 74     mask = (isOpt
2ab00 69 6d 61 6c 20 3f 20 6d 20 3a 20 6e 6f 74 52 65  imal ? m : notRe
2ab10 61 64 79 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  ady);.        pO
2ab20 72 64 65 72 42 79 20 3d 20 28 28 69 3d 3d 30 20  rderBy = ((i==0 
2ab30 26 26 20 70 70 4f 72 64 65 72 42 79 20 29 3f 2a  && ppOrderBy )?*
2ab40 70 70 4f 72 64 65 72 42 79 3a 30 29 3b 0a 20 20  ppOrderBy:0);.  
2ab50 20 20 20 20 20 20 69 66 28 20 70 54 61 62 49 74        if( pTabIt
2ab60 65 6d 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 29 20  em->pIndex==0 ) 
2ab70 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65 64 2b 2b  nUnconstrained++
2ab80 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 57 48 45  ;.  .        WHE
2ab90 52 45 54 52 41 43 45 28 28 22 3d 3d 3d 20 74 72  RETRACE(("=== tr
2aba0 79 69 6e 67 20 74 61 62 6c 65 20 25 64 20 77 69  ying table %d wi
2abb0 74 68 20 69 73 4f 70 74 69 6d 61 6c 3d 25 64 20  th isOptimal=%d 
2abc0 3d 3d 3d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ===\n",.        
2abd0 20 20 20 20 20 20 20 20 20 20 20 20 6a 2c 20 69              j, i
2abe0 73 4f 70 74 69 6d 61 6c 29 29 3b 0a 20 20 20 20  sOptimal));.    
2abf0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
2ac00 49 74 65 6d 2d 3e 70 54 61 62 20 29 3b 0a 23 69  Item->pTab );.#i
2ac10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2ac20 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
2ac30 20 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72         if( IsVir
2ac40 74 75 61 6c 28 70 54 61 62 49 74 65 6d 2d 3e 70  tual(pTabItem->p
2ac50 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
2ac60 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
2ac70 69 6e 66 6f 20 2a 2a 70 70 20 3d 20 26 70 57 49  info **pp = &pWI
2ac80 6e 66 6f 2d 3e 61 5b 6a 5d 2e 70 49 64 78 49 6e  nfo->a[j].pIdxIn
2ac90 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65  fo;.          be
2aca0 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28 70  stVirtualIndex(p
2acb0 50 61 72 73 65 2c 20 70 57 43 2c 20 70 54 61 62  Parse, pWC, pTab
2acc0 49 74 65 6d 2c 20 6d 61 73 6b 2c 20 6e 6f 74 52  Item, mask, notR
2acd0 65 61 64 79 2c 20 70 4f 72 64 65 72 42 79 2c 0a  eady, pOrderBy,.
2ace0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2acf0 20 20 20 20 20 20 20 20 20 20 20 26 73 43 6f 73             &sCos
2ad00 74 2c 20 70 70 29 3b 0a 20 20 20 20 20 20 20 20  t, pp);.        
2ad10 7d 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20  }else .#endif.  
2ad20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
2ad30 20 20 62 65 73 74 42 74 72 65 65 49 6e 64 65 78    bestBtreeIndex
2ad40 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 54  (pParse, pWC, pT
2ad50 61 62 49 74 65 6d 2c 20 6d 61 73 6b 2c 20 6e 6f  abItem, mask, no
2ad60 74 52 65 61 64 79 2c 20 70 4f 72 64 65 72 42 79  tReady, pOrderBy
2ad70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2ad80 20 20 20 20 20 20 20 20 20 20 20 26 73 43 6f 73             &sCos
2ad90 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
2ada0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
2adb0 4f 70 74 69 6d 61 6c 20 7c 7c 20 28 73 43 6f 73  Optimal || (sCos
2adc0 74 2e 75 73 65 64 26 6e 6f 74 52 65 61 64 79 29  t.used&notReady)
2add0 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 20 20  ==0 );..        
2ade0 2f 2a 20 49 66 20 61 6e 20 49 4e 44 45 58 45 44  /* If an INDEXED
2adf0 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 70 72   BY clause is pr
2ae00 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 20  esent, then the 
2ae10 70 6c 61 6e 20 6d 75 73 74 20 75 73 65 20 74 68  plan must use th
2ae20 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  at.        ** in
2ae30 64 65 78 20 69 66 20 69 74 20 75 73 65 73 20 61  dex if it uses a
2ae40 6e 79 20 69 6e 64 65 78 20 61 74 20 61 6c 6c 20  ny index at all 
2ae50 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
2ae60 74 28 20 70 54 61 62 49 74 65 6d 2d 3e 70 49 6e  t( pTabItem->pIn
2ae70 64 65 78 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  dex==0 .        
2ae80 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 73 43            || (sC
2ae90 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  ost.plan.wsFlags
2aea0 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c   & WHERE_NOT_FUL
2aeb0 4c 53 43 41 4e 29 3d 3d 30 0a 20 20 20 20 20 20  LSCAN)==0.      
2aec0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
2aed0 43 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 49 64 78  Cost.plan.u.pIdx
2aee0 3d 3d 70 54 61 62 49 74 65 6d 2d 3e 70 49 6e 64  ==pTabItem->pInd
2aef0 65 78 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  ex );..        i
2af00 66 28 20 69 73 4f 70 74 69 6d 61 6c 20 26 26 20  f( isOptimal && 
2af10 28 73 43 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c  (sCost.plan.wsFl
2af20 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f  ags & WHERE_NOT_
2af30 46 55 4c 4c 53 43 41 4e 29 3d 3d 30 20 29 7b 0a  FULLSCAN)==0 ){.
2af40 20 20 20 20 20 20 20 20 20 20 6e 6f 74 49 6e 64            notInd
2af50 65 78 65 64 20 7c 3d 20 6d 3b 0a 20 20 20 20 20  exed |= m;.     
2af60 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
2af70 20 43 6f 6e 64 69 74 69 6f 6e 73 20 75 6e 64 65   Conditions unde
2af80 72 20 77 68 69 63 68 20 74 68 69 73 20 74 61 62  r which this tab
2af90 6c 65 20 62 65 63 6f 6d 65 73 20 74 68 65 20 62  le becomes the b
2afa0 65 73 74 20 73 6f 20 66 61 72 3a 0a 20 20 20 20  est so far:.    
2afb0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2afc0 2a 20 20 20 28 31 29 20 54 68 65 20 74 61 62 6c  *   (1) The tabl
2afd0 65 20 6d 75 73 74 20 6e 6f 74 20 64 65 70 65 6e  e must not depen
2afe0 64 20 6f 6e 20 6f 74 68 65 72 20 74 61 62 6c 65  d on other table
2aff0 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 74 0a  s that have not.
2b000 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20          **      
2b010 20 79 65 74 20 72 75 6e 2e 0a 20 20 20 20 20 20   yet run..      
2b020 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2b030 20 20 28 32 29 20 41 20 66 75 6c 6c 2d 74 61 62    (2) A full-tab
2b040 6c 65 2d 73 63 61 6e 20 70 6c 61 6e 20 63 61 6e  le-scan plan can
2b050 6e 6f 74 20 73 75 70 65 72 63 65 64 65 20 61 6e  not supercede an
2b060 6f 74 68 65 72 20 70 6c 61 6e 20 75 6e 6c 65 73  other plan unles
2b070 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  s.        **    
2b080 20 20 20 69 74 20 69 73 20 61 6e 20 22 6f 70 74     it is an "opt
2b090 69 6d 61 6c 22 20 70 6c 61 6e 20 61 73 20 64 65  imal" plan as de
2b0a0 66 69 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20  fined above..   
2b0b0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2b0c0 2a 2a 20 20 20 28 33 29 20 41 6c 6c 20 74 61 62  **   (3) All tab
2b0d0 6c 65 73 20 68 61 76 65 20 61 6e 20 49 4e 44 45  les have an INDE
2b0e0 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 6f 72  XED BY clause or
2b0f0 20 74 68 69 73 20 74 61 62 6c 65 20 6c 61 63 6b   this table lack
2b100 73 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  s an.        ** 
2b110 20 20 20 20 20 20 49 4e 44 45 58 45 44 20 42 59        INDEXED BY
2b120 20 63 6c 61 75 73 65 20 6f 72 20 74 68 69 73 20   clause or this 
2b130 74 61 62 6c 65 20 75 73 65 73 20 74 68 65 20 73  table uses the s
2b140 70 65 63 69 66 69 63 0a 20 20 20 20 20 20 20 20  pecific.        
2b150 2a 2a 20 20 20 20 20 20 20 69 6e 64 65 78 20 73  **       index s
2b160 70 65 63 69 66 69 65 64 20 62 79 20 69 74 73 20  pecified by its 
2b170 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
2b180 65 2e 20 20 54 68 69 73 20 72 75 6c 65 20 65 6e  e.  This rule en
2b190 73 75 72 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  sures.        **
2b1a0 20 20 20 20 20 20 20 74 68 61 74 20 61 20 62 65         that a be
2b1b0 73 74 2d 73 6f 2d 66 61 72 20 69 73 20 61 6c 77  st-so-far is alw
2b1c0 61 79 73 20 73 65 6c 65 63 74 65 64 20 65 76 65  ays selected eve
2b1d0 6e 20 69 66 20 61 6e 20 69 6d 70 6f 73 73 69 62  n if an impossib
2b1e0 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  le.        **   
2b1f0 20 20 20 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20      combination 
2b200 6f 66 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  of INDEXED BY cl
2b210 61 75 73 65 73 20 61 72 65 20 67 69 76 65 6e 2e  auses are given.
2b220 20 20 54 68 65 20 65 72 72 6f 72 0a 20 20 20 20    The error.    
2b230 20 20 20 20 2a 2a 20 20 20 20 20 20 20 77 69 6c      **       wil
2b240 6c 20 62 65 20 64 65 74 65 63 74 65 64 20 61 6e  l be detected an
2b250 64 20 72 65 6c 61 79 65 64 20 62 61 63 6b 20 74  d relayed back t
2b260 6f 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  o the applicatio
2b270 6e 20 6c 61 74 65 72 2e 0a 20 20 20 20 20 20 20  n later..       
2b280 20 2a 2a 20 20 20 20 20 20 20 54 68 65 20 4e 45   **       The NE
2b290 56 45 52 28 29 20 63 6f 6d 65 73 20 61 62 6f 75  VER() comes abou
2b2a0 74 20 62 65 63 61 75 73 65 20 72 75 6c 65 20 28  t because rule (
2b2b0 32 29 20 61 62 6f 76 65 20 70 72 65 76 65 6e 74  2) above prevent
2b2c0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  s.        **    
2b2d0 20 20 20 41 6e 20 69 6e 64 65 78 61 62 6c 65 20     An indexable 
2b2e0 66 75 6c 6c 2d 74 61 62 6c 65 2d 73 63 61 6e 20  full-table-scan 
2b2f0 66 72 6f 6d 20 72 65 61 63 68 69 6e 67 20 72 75  from reaching ru
2b300 6c 65 20 28 33 29 2e 0a 20 20 20 20 20 20 20 20  le (3)..        
2b310 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
2b320 28 34 29 20 54 68 65 20 70 6c 61 6e 20 63 6f 73  (4) The plan cos
2b330 74 20 6d 75 73 74 20 62 65 20 6c 6f 77 65 72 20  t must be lower 
2b340 74 68 61 6e 20 70 72 69 6f 72 20 70 6c 61 6e 73  than prior plans
2b350 20 6f 72 20 65 6c 73 65 20 74 68 65 0a 20 20 20   or else the.   
2b360 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 63 6f       **       co
2b370 73 74 20 6d 75 73 74 20 62 65 20 74 68 65 20 73  st must be the s
2b380 61 6d 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  ame and the numb
2b390 65 72 20 6f 66 20 72 6f 77 73 20 6d 75 73 74 20  er of rows must 
2b3a0 62 65 20 6c 6f 77 65 72 2e 0a 20 20 20 20 20 20  be lower..      
2b3b0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
2b3c0 20 28 73 43 6f 73 74 2e 75 73 65 64 26 6e 6f 74   (sCost.used&not
2b3d0 52 65 61 64 79 29 3d 3d 30 20 20 20 20 20 20 20  Ready)==0       
2b3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3f0 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20  /* (1) */.      
2b400 20 20 20 20 20 20 26 26 20 28 62 65 73 74 4a 3c        && (bestJ<
2b410 30 20 7c 7c 20 28 6e 6f 74 49 6e 64 65 78 65 64  0 || (notIndexed
2b420 26 6d 29 21 3d 30 20 20 20 20 20 20 20 20 20 20  &m)!=0          
2b430 20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20       /* (2) */. 
2b440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
2b450 7c 20 28 73 43 6f 73 74 2e 70 6c 61 6e 2e 77 73  | (sCost.plan.ws
2b460 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f  Flags & WHERE_NO
2b470 54 5f 46 55 4c 4c 53 43 41 4e 29 21 3d 30 29 0a  T_FULLSCAN)!=0).
2b480 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
2b490 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65 64 3d 3d  nUnconstrained==
2b4a0 30 20 7c 7c 20 70 54 61 62 49 74 65 6d 2d 3e 70  0 || pTabItem->p
2b4b0 49 6e 64 65 78 3d 3d 30 20 20 20 2f 2a 20 28 33  Index==0   /* (3
2b4c0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  ) */.           
2b4d0 20 20 20 20 20 7c 7c 20 4e 45 56 45 52 28 28 73       || NEVER((s
2b4e0 43 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  Cost.plan.wsFlag
2b4f0 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55  s & WHERE_NOT_FU
2b500 4c 4c 53 43 41 4e 29 21 3d 30 29 29 0a 20 20 20  LLSCAN)!=0)).   
2b510 20 20 20 20 20 20 20 20 20 26 26 20 28 62 65 73           && (bes
2b520 74 4a 3c 30 20 7c 7c 20 73 43 6f 73 74 2e 72 43  tJ<0 || sCost.rC
2b530 6f 73 74 3c 62 65 73 74 50 6c 61 6e 2e 72 43 6f  ost<bestPlan.rCo
2b540 73 74 20 20 20 20 20 20 2f 2a 20 28 34 29 20 2a  st      /* (4) *
2b550 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
2b560 20 20 7c 7c 20 28 73 43 6f 73 74 2e 72 43 6f 73    || (sCost.rCos
2b570 74 3c 3d 62 65 73 74 50 6c 61 6e 2e 72 43 6f 73  t<=bestPlan.rCos
2b580 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t .             
2b590 20 20 20 20 26 26 20 73 43 6f 73 74 2e 70 6c 61      && sCost.pla
2b5a0 6e 2e 6e 52 6f 77 3c 62 65 73 74 50 6c 61 6e 2e  n.nRow<bestPlan.
2b5b0 70 6c 61 6e 2e 6e 52 6f 77 29 29 0a 20 20 20 20  plan.nRow)).    
2b5c0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2b5d0 20 57 48 45 52 45 54 52 41 43 45 28 28 22 3d 3d   WHERETRACE(("==
2b5e0 3d 20 74 61 62 6c 65 20 25 64 20 69 73 20 62 65  = table %d is be
2b5f0 73 74 20 73 6f 20 66 61 72 22 0a 20 20 20 20 20  st so far".     
2b600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b610 20 22 20 77 69 74 68 20 63 6f 73 74 3d 25 67 20   " with cost=%g 
2b620 61 6e 64 20 6e 52 6f 77 3d 25 67 5c 6e 22 2c 0a  and nRow=%g\n",.
2b630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b640 20 20 20 20 20 20 6a 2c 20 73 43 6f 73 74 2e 72        j, sCost.r
2b650 43 6f 73 74 2c 20 73 43 6f 73 74 2e 70 6c 61 6e  Cost, sCost.plan
2b660 2e 6e 52 6f 77 29 29 3b 0a 20 20 20 20 20 20 20  .nRow));.       
2b670 20 20 20 62 65 73 74 50 6c 61 6e 20 3d 20 73 43     bestPlan = sC
2b680 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ost;.          b
2b690 65 73 74 4a 20 3d 20 6a 3b 0a 20 20 20 20 20 20  estJ = j;.      
2b6a0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2b6b0 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29 20 62  doNotReorder ) b
2b6c0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2b6d0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
2b6e0 62 65 73 74 4a 3e 3d 30 20 29 3b 0a 20 20 20 20  bestJ>=0 );.    
2b6f0 61 73 73 65 72 74 28 20 6e 6f 74 52 65 61 64 79  assert( notReady
2b700 20 26 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   & getMask(pMask
2b710 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  Set, pTabList->a
2b720 5b 62 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72 29  [bestJ].iCursor)
2b730 20 29 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41   );.    WHERETRA
2b740 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  CE(("*** Optimiz
2b750 65 72 20 73 65 6c 65 63 74 73 20 74 61 62 6c 65  er selects table
2b760 20 25 64 20 66 6f 72 20 6c 6f 6f 70 20 25 64 22   %d for loop %d"
2b770 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b780 20 22 20 77 69 74 68 20 63 6f 73 74 3d 25 67 20   " with cost=%g 
2b790 61 6e 64 20 6e 52 6f 77 3d 25 67 5c 6e 22 2c 0a  and nRow=%g\n",.
2b7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b7b0 62 65 73 74 4a 2c 20 70 4c 65 76 65 6c 2d 70 57  bestJ, pLevel-pW
2b7c0 49 6e 66 6f 2d 3e 61 2c 20 62 65 73 74 50 6c 61  Info->a, bestPla
2b7d0 6e 2e 72 43 6f 73 74 2c 20 62 65 73 74 50 6c 61  n.rCost, bestPla
2b7e0 6e 2e 70 6c 61 6e 2e 6e 52 6f 77 29 29 3b 0a 20  n.plan.nRow));. 
2b7f0 20 20 20 69 66 28 20 28 62 65 73 74 50 6c 61 6e     if( (bestPlan
2b800 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
2b810 57 48 45 52 45 5f 4f 52 44 45 52 42 59 29 21 3d  WHERE_ORDERBY)!=
2b820 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 4f 72  0 ){.      *ppOr
2b830 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d  derBy = 0;.    }
2b840 0a 20 20 20 20 61 6e 64 46 6c 61 67 73 20 26 3d  .    andFlags &=
2b850 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77   bestPlan.plan.w
2b860 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76  sFlags;.    pLev
2b870 65 6c 2d 3e 70 6c 61 6e 20 3d 20 62 65 73 74 50  el->plan = bestP
2b880 6c 61 6e 2e 70 6c 61 6e 3b 0a 20 20 20 20 74 65  lan.plan;.    te
2b890 73 74 63 61 73 65 28 20 62 65 73 74 50 6c 61 6e  stcase( bestPlan
2b8a0 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
2b8b0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 3b  WHERE_INDEXED );
2b8c0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 62  .    testcase( b
2b8d0 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46  estPlan.plan.wsF
2b8e0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d  lags & WHERE_TEM
2b8f0 50 5f 49 4e 44 45 58 20 29 3b 0a 20 20 20 20 69  P_INDEX );.    i
2b900 66 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e  f( bestPlan.plan
2b910 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  .wsFlags & (WHER
2b920 45 5f 49 4e 44 45 58 45 44 7c 57 48 45 52 45 5f  E_INDEXED|WHERE_
2b930 54 45 4d 50 5f 49 4e 44 45 58 29 20 29 7b 0a 20  TEMP_INDEX) ){. 
2b940 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64       pLevel->iId
2b950 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  xCur = pParse->n
2b960 54 61 62 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  Tab++;.    }else
2b970 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
2b980 69 49 64 78 43 75 72 20 3d 20 2d 31 3b 0a 20 20  iIdxCur = -1;.  
2b990 20 20 7d 0a 20 20 20 20 6e 6f 74 52 65 61 64 79    }.    notReady
2b9a0 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 70 4d 61   &= ~getMask(pMa
2b9b0 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d  skSet, pTabList-
2b9c0 3e 61 5b 62 65 73 74 4a 5d 2e 69 43 75 72 73 6f  >a[bestJ].iCurso
2b9d0 72 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  r);.    pLevel->
2b9e0 69 46 72 6f 6d 20 3d 20 28 75 38 29 62 65 73 74  iFrom = (u8)best
2b9f0 4a 3b 0a 20 20 20 20 69 66 28 20 62 65 73 74 50  J;.    if( bestP
2ba00 6c 61 6e 2e 70 6c 61 6e 2e 6e 52 6f 77 3e 3d 28  lan.plan.nRow>=(
2ba10 64 6f 75 62 6c 65 29 31 20 29 7b 0a 20 20 20 20  double)1 ){.    
2ba20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
2ba30 4c 6f 6f 70 20 2a 3d 20 62 65 73 74 50 6c 61 6e  Loop *= bestPlan
2ba40 2e 70 6c 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20  .plan.nRow;.    
2ba50 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
2ba60 74 68 61 74 20 69 66 20 74 68 65 20 74 61 62 6c  that if the tabl
2ba70 65 20 73 63 61 6e 6e 65 64 20 62 79 20 74 68 69  e scanned by thi
2ba80 73 20 6c 6f 6f 70 20 69 74 65 72 61 74 69 6f 6e  s loop iteration
2ba90 20 68 61 64 20 61 6e 0a 20 20 20 20 2a 2a 20 49   had an.    ** I
2baa0 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
2bab0 20 61 74 74 61 63 68 65 64 20 74 6f 20 69 74 2c   attached to it,
2bac0 20 74 68 61 74 20 74 68 65 20 6e 61 6d 65 64 20   that the named 
2bad0 69 6e 64 65 78 20 69 73 20 62 65 69 6e 67 0a 20  index is being. 
2bae0 20 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 74     ** used for t
2baf0 68 65 20 73 63 61 6e 2e 20 49 66 20 6e 6f 74 2c  he scan. If not,
2bb00 20 74 68 65 6e 20 71 75 65 72 79 20 63 6f 6d 70   then query comp
2bb10 69 6c 61 74 69 6f 6e 20 68 61 73 20 66 61 69 6c  ilation has fail
2bb20 65 64 2e 0a 20 20 20 20 2a 2a 20 52 65 74 75 72  ed..    ** Retur
2bb30 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20  n an error..    
2bb40 2a 2f 0a 20 20 20 20 70 49 64 78 20 3d 20 70 54  */.    pIdx = pT
2bb50 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d  abList->a[bestJ]
2bb60 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  .pIndex;.    if(
2bb70 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 69   pIdx ){.      i
2bb80 66 28 20 28 62 65 73 74 50 6c 61 6e 2e 70 6c 61  f( (bestPlan.pla
2bb90 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
2bba0 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20 29 7b  E_INDEXED)==0 ){
2bbb0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2bbc0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2bbd0 20 22 63 61 6e 6e 6f 74 20 75 73 65 20 69 6e 64   "cannot use ind
2bbe0 65 78 3a 20 25 73 22 2c 20 70 49 64 78 2d 3e 7a  ex: %s", pIdx->z
2bbf0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67  Name);.        g
2bc00 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
2bc10 72 6f 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ror;.      }else
2bc20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
2bc30 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  an INDEXED BY cl
2bc40 61 75 73 65 20 69 73 20 75 73 65 64 2c 20 74 68  ause is used, th
2bc50 65 20 62 65 73 74 49 6e 64 65 78 28 29 20 66 75  e bestIndex() fu
2bc60 6e 63 74 69 6f 6e 20 69 73 0a 20 20 20 20 20 20  nction is.      
2bc70 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20    ** guaranteed 
2bc80 74 6f 20 66 69 6e 64 20 74 68 65 20 69 6e 64 65  to find the inde
2bc90 78 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  x specified in t
2bca0 68 65 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  he INDEXED BY cl
2bcb0 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  ause.        ** 
2bcc0 69 66 20 69 74 20 66 69 6e 64 20 61 6e 20 69 6e  if it find an in
2bcd0 64 65 78 20 61 74 20 61 6c 6c 2e 20 2a 2f 0a 20  dex at all. */. 
2bce0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 62         assert( b
2bcf0 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 75 2e 70  estPlan.plan.u.p
2bd00 49 64 78 3d 3d 70 49 64 78 20 29 3b 0a 20 20 20  Idx==pIdx );.   
2bd10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2bd20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a   WHERETRACE(("**
2bd30 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e 69  * Optimizer Fini
2bd40 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20  shed ***\n"));. 
2bd50 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
2bd60 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
2bd70 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
2bd80 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
2bd90 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  r;.  }..  /* If 
2bda0 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20  the total query 
2bdb0 6f 6e 6c 79 20 73 65 6c 65 63 74 73 20 61 20 73  only selects a s
2bdc0 69 6e 67 6c 65 20 72 6f 77 2c 20 74 68 65 6e 20  ingle row, then 
2bdd0 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a  the ORDER BY.  *
2bde0 2a 20 63 6c 61 75 73 65 20 69 73 20 69 72 72 65  * clause is irre
2bdf0 6c 65 76 61 6e 74 2e 0a 20 20 2a 2f 0a 20 20 69  levant..  */.  i
2be00 66 28 20 28 61 6e 64 46 6c 61 67 73 20 26 20 57  f( (andFlags & W
2be10 48 45 52 45 5f 55 4e 49 51 55 45 29 21 3d 30 20  HERE_UNIQUE)!=0 
2be20 26 26 20 70 70 4f 72 64 65 72 42 79 20 29 7b 0a  && ppOrderBy ){.
2be30 20 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d      *ppOrderBy =
2be40 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   0;.  }..  /* If
2be50 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61   the caller is a
2be60 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
2be70 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  TE statement tha
2be80 74 20 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a  t is requesting.
2be90 20 20 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e    ** to use a on
2bea0 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d  e-pass algorithm
2beb0 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  , determine if t
2bec0 68 69 73 20 69 73 20 61 70 70 72 6f 70 72 69 61  his is appropria
2bed0 74 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65  te..  ** The one
2bee0 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 20  -pass algorithm 
2bef0 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20 74 68  only works if th
2bf00 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  e WHERE clause c
2bf10 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20  onstraints.  ** 
2bf20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  the statement to
2bf30 20 75 70 64 61 74 65 20 61 20 73 69 6e 67 6c 65   update a single
2bf40 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   row..  */.  ass
2bf50 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73  ert( (wctrlFlags
2bf60 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
2bf70 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20  _DESIRED)==0 || 
2bf80 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d  pWInfo->nLevel==
2bf90 31 20 29 3b 0a 20 20 69 66 28 20 28 77 63 74 72  1 );.  if( (wctr
2bfa0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2bfb0 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 21  NEPASS_DESIRED)!
2bfc0 3d 30 20 26 26 20 28 61 6e 64 46 6c 61 67 73 20  =0 && (andFlags 
2bfd0 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45 29 21  & WHERE_UNIQUE)!
2bfe0 3d 30 20 29 7b 0a 20 20 20 20 70 57 49 6e 66 6f  =0 ){.    pWInfo
2bff0 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d 20 31 3b  ->okOnePass = 1;
2c000 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30  .    pWInfo->a[0
2c010 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ].plan.wsFlags &
2c020 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  = ~WHERE_IDX_ONL
2c030 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  Y;.  }..  /* Ope
2c040 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  n all tables in 
2c050 74 68 65 20 70 54 61 62 4c 69 73 74 20 61 6e 64  the pTabList and
2c060 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73 65 6c   any indices sel
2c070 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73  ected for.  ** s
2c080 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65 20 74  earching those t
2c090 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  ables..  */.  sq
2c0a0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
2c0b0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 2d 31  chema(pParse, -1
2c0c0 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  ); /* Insert the
2c0d0 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 65 72   cookie verifier
2c0e0 20 47 6f 74 6f 20 2a 2f 0a 20 20 6e 6f 74 52 65   Goto */.  notRe
2c0f0 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29  ady = ~(Bitmask)
2c100 30 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  0;.  pWInfo->nRo
2c110 77 4f 75 74 20 3d 20 28 64 6f 75 62 6c 65 29 31  wOut = (double)1
2c120 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65  ;.  for(i=0, pLe
2c130 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69  vel=pWInfo->a; i
2c140 3c 6e 54 61 62 4c 69 73 74 3b 20 69 2b 2b 2c 20  <nTabList; i++, 
2c150 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54  pLevel++){.    T
2c160 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
2c170 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e  /* Table to open
2c180 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b   */.    int iDb;
2c190 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2c1a0 78 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f  x of database co
2c1b0 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69  ntaining table/i
2c1c0 6e 64 65 78 20 2a 2f 0a 0a 20 20 20 20 70 54 61  ndex */..    pTa
2c1d0 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
2c1e0 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
2c1f0 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  om];.    pTab = 
2c200 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pTabItem->pTab;.
2c210 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62      pLevel->iTab
2c220 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
2c230 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 57 49  iCursor;.    pWI
2c240 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 2a 3d 20  nfo->nRowOut *= 
2c250 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 52 6f  pLevel->plan.nRo
2c260 77 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  w;.    iDb = sql
2c270 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
2c280 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
2c290 65 6d 61 29 3b 0a 20 20 20 20 69 66 28 20 28 70  ema);.    if( (p
2c2a0 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
2c2b0 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30  TF_Ephemeral)!=0
2c2c0 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   || pTab->pSelec
2c2d0 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f  t ){.      /* Do
2c2e0 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20   nothing */.    
2c2f0 7d 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51  }else.#ifndef SQ
2c300 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2c310 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 28  LTABLE.    if( (
2c320 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
2c330 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
2c340 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b  TUALTABLE)!=0 ){
2c350 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
2c360 72 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73  r *pVTab = (cons
2c370 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  t char *)sqlite3
2c380 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54  GetVTable(db, pT
2c390 61 62 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  ab);.      int i
2c3a0 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
2c3b0 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73  iCursor;.      s
2c3c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2c3d0 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43  (v, OP_VOpen, iC
2c3e0 75 72 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c  ur, 0, 0, pVTab,
2c3f0 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d   P4_VTAB);.    }
2c400 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
2c410 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  if( (pLevel->pla
2c420 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
2c430 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20  E_IDX_ONLY)==0. 
2c440 20 20 20 20 20 20 20 20 26 26 20 28 77 63 74 72          && (wctr
2c450 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2c460 4d 49 54 5f 4f 50 45 4e 29 3d 3d 30 20 29 7b 0a  MIT_OPEN)==0 ){.
2c470 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70        int op = p
2c480 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
2c490 20 3f 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20   ? OP_OpenWrite 
2c4a0 3a 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20  : OP_OpenRead;. 
2c4b0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
2c4c0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
2c4d0 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c  abItem->iCursor,
2c4e0 20 69 44 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b   iDb, pTab, op);
2c4f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2c500 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53   pTab->nCol==BMS
2c510 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  -1 );.      test
2c520 63 61 73 65 28 20 70 54 61 62 2d 3e 6e 43 6f 6c  case( pTab->nCol
2c530 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69  ==BMS );.      i
2c540 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  f( !pWInfo->okOn
2c550 65 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e  ePass && pTab->n
2c560 43 6f 6c 3c 42 4d 53 20 29 7b 0a 20 20 20 20 20  Col<BMS ){.     
2c570 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70     Bitmask b = p
2c580 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  TabItem->colUsed
2c590 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20  ;.        int n 
2c5a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  = 0;.        for
2c5b0 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b  (; b; b=b>>1, n+
2c5c0 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c  +){}.        sql
2c5d0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
2c5e0 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
2c5f0 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c  urrentAddr(v)-1,
2c600 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2c610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
2c620 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
2c630 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20  n), P4_INT32);. 
2c640 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
2c650 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  <=pTab->nCol );.
2c660 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2c670 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
2c680 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
2c690 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
2c6a0 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
2c6b0 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  e);.    }.#ifnde
2c6c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2c6d0 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20  TOMATIC_INDEX.  
2c6e0 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70    if( (pLevel->p
2c6f0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
2c700 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 21  ERE_TEMP_INDEX)!
2c710 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  =0 ){.      cons
2c720 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e  tructAutomaticIn
2c730 64 65 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c  dex(pParse, pWC,
2c740 20 70 54 61 62 49 74 65 6d 2c 20 6e 6f 74 52 65   pTabItem, notRe
2c750 61 64 79 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20  ady, pLevel);.  
2c760 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
2c770 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e     if( (pLevel->
2c780 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
2c790 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
2c7a0 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20   ){.      Index 
2c7b0 2a 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  *pIx = pLevel->p
2c7c0 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20  lan.u.pIdx;.    
2c7d0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20    KeyInfo *pKey 
2c7e0 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65  = sqlite3IndexKe
2c7f0 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yinfo(pParse, pI
2c800 78 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 49  x);.      int iI
2c810 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e  dxCur = pLevel->
2c820 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 61  iIdxCur;.      a
2c830 73 73 65 72 74 28 20 70 49 78 2d 3e 70 53 63 68  ssert( pIx->pSch
2c840 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema==pTab->pSche
2c850 6d 61 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ma );.      asse
2c860 72 74 28 20 69 49 64 78 43 75 72 3e 3d 30 20 29  rt( iIdxCur>=0 )
2c870 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2c880 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
2c890 4f 70 65 6e 52 65 61 64 2c 20 69 49 64 78 43 75  OpenRead, iIdxCu
2c8a0 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44  r, pIx->tnum, iD
2c8b0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
2c8c0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
2c8d0 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e  *)pKey, P4_KEYIN
2c8e0 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
2c8f0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2c900 76 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e  v, "%s", pIx->zN
2c910 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ame));.    }.   
2c920 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
2c930 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
2c940 20 69 44 62 29 3b 0a 20 20 20 20 6e 6f 74 52 65   iDb);.    notRe
2c950 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28  ady &= ~getMask(
2c960 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 70  pWC->pMaskSet, p
2c970 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
2c980 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d  );.  }.  pWInfo-
2c990 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  >iTop = sqlite3V
2c9a0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2c9b0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
2c9c0 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
2c9d0 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
2c9e0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
2c9f0 20 74 68 65 20 63 6f 64 65 20 74 6f 20 64 6f 20   the code to do 
2ca00 74 68 65 20 73 65 61 72 63 68 2e 20 20 45 61 63  the search.  Eac
2ca10 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  h iteration of t
2ca20 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70  he for.  ** loop
2ca30 20 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 73   below generates
2ca40 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67   code for a sing
2ca50 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f  le nested loop o
2ca60 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72  f the VM.  ** pr
2ca70 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f  ogram..  */.  no
2ca80 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61  tReady = ~(Bitma
2ca90 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  sk)0;.  for(i=0;
2caa0 20 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 2b 2b   i<nTabList; i++
2cab0 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20  ){.    pLevel = 
2cac0 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20  &pWInfo->a[i];. 
2cad0 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61     explainOneSca
2cae0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
2caf0 73 74 2c 20 70 4c 65 76 65 6c 2c 20 69 2c 20 70  st, pLevel, i, p
2cb00 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 77 63  Level->iFrom, wc
2cb10 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 6e  trlFlags);.    n
2cb20 6f 74 52 65 61 64 79 20 3d 20 63 6f 64 65 4f 6e  otReady = codeOn
2cb30 65 4c 6f 6f 70 53 74 61 72 74 28 70 57 49 6e 66  eLoopStart(pWInf
2cb40 6f 2c 20 69 2c 20 77 63 74 72 6c 46 6c 61 67 73  o, i, wctrlFlags
2cb50 2c 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20 20  , notReady);.   
2cb60 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e   pWInfo->iContin
2cb70 75 65 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  ue = pLevel->add
2cb80 72 43 6f 6e 74 3b 0a 20 20 7d 0a 0a 23 69 66 64  rCont;.  }..#ifd
2cb90 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20 20  ef SQLITE_TEST  
2cba0 2f 2a 20 46 6f 72 20 74 65 73 74 69 6e 67 20 61  /* For testing a
2cbb0 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75 73 65  nd debugging use
2cbc0 20 6f 6e 6c 79 20 2a 2f 0a 20 20 2f 2a 20 52 65   only */.  /* Re
2cbd0 63 6f 72 64 20 69 6e 20 74 68 65 20 71 75 65 72  cord in the quer
2cbe0 79 20 70 6c 61 6e 20 69 6e 66 6f 72 6d 61 74 69  y plan informati
2cbf0 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 75 72  on about the cur
2cc00 72 65 6e 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20  rent table.  ** 
2cc10 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 75 73  and the index us
2cc20 65 64 20 74 6f 20 61 63 63 65 73 73 20 69 74 20  ed to access it 
2cc30 28 69 66 20 61 6e 79 29 2e 20 20 49 66 20 74 68  (if any).  If th
2cc40 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66 0a 20  e table itself. 
2cc50 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65 64 2c   ** is not used,
2cc60 20 69 74 73 20 6e 61 6d 65 20 69 73 20 6a 75 73   its name is jus
2cc70 74 20 27 7b 7d 27 2e 20 20 49 66 20 6e 6f 20 69  t '{}'.  If no i
2cc80 6e 64 65 78 20 69 73 20 75 73 65 64 0a 20 20 2a  ndex is used.  *
2cc90 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6c  * the index is l
2cca0 69 73 74 65 64 20 61 73 20 22 7b 7d 22 2e 20 20  isted as "{}".  
2ccb0 49 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  If the primary k
2ccc0 65 79 20 69 73 20 75 73 65 64 20 74 68 65 0a 20  ey is used the. 
2ccd0 20 2a 2a 20 69 6e 64 65 78 20 6e 61 6d 65 20 69   ** index name i
2cce0 73 20 27 2a 27 2e 0a 20 20 2a 2f 0a 20 20 66 6f  s '*'..  */.  fo
2ccf0 72 28 69 3d 30 3b 20 69 3c 6e 54 61 62 4c 69 73  r(i=0; i<nTabLis
2cd00 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61  t; i++){.    cha
2cd10 72 20 2a 7a 3b 0a 20 20 20 20 69 6e 74 20 6e 3b  r *z;.    int n;
2cd20 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70  .    pLevel = &p
2cd30 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20  WInfo->a[i];.   
2cd40 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61   pTabItem = &pTa
2cd50 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
2cd60 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 7a 20 3d  >iFrom];.    z =
2cd70 20 70 54 61 62 49 74 65 6d 2d 3e 7a 41 6c 69 61   pTabItem->zAlia
2cd80 73 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20  s;.    if( z==0 
2cd90 29 20 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  ) z = pTabItem->
2cda0 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
2cdb0 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
2cdc0 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69 66 28  en30(z);.    if(
2cdd0 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65   n+nQPlan < size
2cde0 6f 66 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79  of(sqlite3_query
2cdf0 5f 70 6c 61 6e 29 2d 31 30 20 29 7b 0a 20 20 20  _plan)-10 ){.   
2ce00 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70     if( pLevel->p
2ce10 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
2ce20 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a  ERE_IDX_ONLY ){.
2ce30 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2ce40 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
2ce50 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 22  an[nQPlan], "{}"
2ce60 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 6e 51  , 2);.        nQ
2ce70 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 20  Plan += 2;.     
2ce80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2ce90 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f  memcpy(&sqlite3_
2cea0 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
2ceb0 6e 5d 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  n], z, n);.     
2cec0 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a     nQPlan += n;.
2ced0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
2cee0 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
2cef0 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27  [nQPlan++] = ' '
2cf00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74  ;.    }.    test
2cf10 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c  case( pLevel->pl
2cf20 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
2cf30 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 3b 0a 20  RE_ROWID_EQ );. 
2cf40 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c 65     testcase( pLe
2cf50 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
2cf60 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f  s & WHERE_ROWID_
2cf70 52 41 4e 47 45 20 29 3b 0a 20 20 20 20 69 66 28  RANGE );.    if(
2cf80 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
2cf90 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 52  Flags & (WHERE_R
2cfa0 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f  OWID_EQ|WHERE_RO
2cfb0 57 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20  WID_RANGE) ){.  
2cfc0 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69      memcpy(&sqli
2cfd0 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
2cfe0 51 50 6c 61 6e 5d 2c 20 22 2a 20 22 2c 20 32 29  QPlan], "* ", 2)
2cff0 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b  ;.      nQPlan +
2d000 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 2;.    }else i
2d010 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  f( (pLevel->plan
2d020 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
2d030 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 7b 0a  _INDEXED)!=0 ){.
2d040 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65        n = sqlite
2d050 33 53 74 72 6c 65 6e 33 30 28 70 4c 65 76 65 6c  3Strlen30(pLevel
2d060 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a  ->plan.u.pIdx->z
2d070 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Name);.      if(
2d080 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65   n+nQPlan < size
2d090 6f 66 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79  of(sqlite3_query
2d0a0 5f 70 6c 61 6e 29 2d 32 20 29 7b 0a 20 20 20 20  _plan)-2 ){.    
2d0b0 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69      memcpy(&sqli
2d0c0 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
2d0d0 51 50 6c 61 6e 5d 2c 20 70 4c 65 76 65 6c 2d 3e  QPlan], pLevel->
2d0e0 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61  plan.u.pIdx->zNa
2d0f0 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20  me, n);.        
2d100 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20  nQPlan += n;.   
2d110 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65       sqlite3_que
2d120 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b  ry_plan[nQPlan++
2d130 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 7d  ] = ' ';.      }
2d140 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2d150 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65    memcpy(&sqlite
2d160 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
2d170 6c 61 6e 5d 2c 20 22 7b 7d 20 22 2c 20 33 29 3b  lan], "{} ", 3);
2d180 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d  .      nQPlan +=
2d190 20 33 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   3;.    }.  }.  
2d1a0 77 68 69 6c 65 28 20 6e 51 50 6c 61 6e 3e 30 20  while( nQPlan>0 
2d1b0 26 26 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79  && sqlite3_query
2d1c0 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2d 31 5d 3d  _plan[nQPlan-1]=
2d1d0 3d 27 20 27 20 29 7b 0a 20 20 20 20 73 71 6c 69  =' ' ){.    sqli
2d1e0 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 2d  te3_query_plan[-
2d1f0 2d 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20  -nQPlan] = 0;.  
2d200 7d 0a 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72  }.  sqlite3_quer
2d210 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 20 3d  y_plan[nQPlan] =
2d220 20 30 3b 0a 20 20 6e 51 50 6c 61 6e 20 3d 20 30   0;.  nQPlan = 0
2d230 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
2d240 54 45 5f 54 45 53 54 20 2f 2f 20 54 65 73 74 69  TE_TEST // Testi
2d250 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
2d260 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20   use only */..  
2d270 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 63 6f  /* Record the co
2d280 6e 74 69 6e 75 61 74 69 6f 6e 20 61 64 64 72 65  ntinuation addre
2d290 73 73 20 69 6e 20 74 68 65 20 57 68 65 72 65 49  ss in the WhereI
2d2a0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
2d2b0 54 68 65 6e 0a 20 20 2a 2a 20 63 6c 65 61 6e 20  Then.  ** clean 
2d2c0 75 70 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  up and return.. 
2d2d0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 57 49   */.  return pWI
2d2e0 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  nfo;..  /* Jump 
2d2f0 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66  here if malloc f
2d300 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65 67  ails */.whereBeg
2d310 69 6e 45 72 72 6f 72 3a 0a 20 20 69 66 28 20 70  inError:.  if( p
2d320 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70 50 61  WInfo ){.    pPa
2d330 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
2d340 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e  = pWInfo->savedN
2d350 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 77  QueryLoop;.    w
2d360 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c  hereInfoFree(db,
2d370 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20   pWInfo);.  }.  
2d380 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
2d390 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  ** Generate the 
2d3a0 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
2d3b0 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d   loop.  See comm
2d3c0 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69  ents on .** sqli
2d3d0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
2d3e0 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
2d3f0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  nformation..*/.v
2d400 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  oid sqlite3Where
2d410 45 6e 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  End(WhereInfo *p
2d420 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72 73 65 20  WInfo){.  Parse 
2d430 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f  *pParse = pWInfo
2d440 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56 64 62 65  ->pParse;.  Vdbe
2d450 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
2d460 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
2d470 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
2d480 65 6c 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  el;.  SrcList *p
2d490 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
2d4a0 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 71  ->pTabList;.  sq
2d4b0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
2d4c0 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47 65  se->db;..  /* Ge
2d4d0 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d  nerate loop term
2d4e0 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20  ination code..  
2d4f0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
2d500 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
2d510 65 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57 49 6e  e);.  for(i=pWIn
2d520 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e  fo->nLevel-1; i>
2d530 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 4c  =0; i--){.    pL
2d540 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
2d550 61 5b 69 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  a[i];.    sqlite
2d560 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
2d570 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
2d580 72 43 6f 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  rCont);.    if( 
2d590 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e  pLevel->op!=OP_N
2d5a0 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  oop ){.      sql
2d5b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2d5c0 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c  , pLevel->op, pL
2d5d0 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c  evel->p1, pLevel
2d5e0 2d 3e 70 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  ->p2);.      sql
2d5f0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
2d600 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70 35 29 3b  (v, pLevel->p5);
2d610 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2d620 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
2d630 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41  ags & WHERE_IN_A
2d640 42 4c 45 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75  BLE && pLevel->u
2d650 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20  .in.nIn>0 ){.   
2d660 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70     struct InLoop
2d670 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74   *pIn;.      int
2d680 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   j;.      sqlite
2d690 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
2d6a0 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
2d6b0 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 66 6f 72  rNxt);.      for
2d6c0 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  (j=pLevel->u.in.
2d6d0 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c  nIn, pIn=&pLevel
2d6e0 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a  ->u.in.aInLoop[j
2d6f0 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70  -1]; j>0; j--, p
2d700 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 73  In--){.        s
2d710 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
2d720 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49  re(v, pIn->addrI
2d730 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20 20  nTop+1);.       
2d740 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2d750 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70  p2(v, OP_Next, p
2d760 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61  In->iCur, pIn->a
2d770 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20  ddrInTop);.     
2d780 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
2d790 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61  mpHere(v, pIn->a
2d7a0 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20 20  ddrInTop-1);.   
2d7b0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
2d7c0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 65  e3DbFree(db, pLe
2d7d0 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
2d7e0 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  p);.    }.    sq
2d7f0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
2d800 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d  Label(v, pLevel-
2d810 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 69  >addrBrk);.    i
2d820 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  f( pLevel->iLeft
2d830 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e  Join ){.      in
2d840 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 64  t addr;.      ad
2d850 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
2d860 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50  AddOp1(v, OP_IfP
2d870 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  os, pLevel->iLef
2d880 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 61 73  tJoin);.      as
2d890 73 65 72 74 28 20 28 70 4c 65 76 65 6c 2d 3e 70  sert( (pLevel->p
2d8a0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
2d8b0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
2d8c0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28  .           || (
2d8d0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
2d8e0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
2d8f0 45 58 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20  EXED)!=0 );.    
2d900 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70    if( (pLevel->p
2d910 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
2d920 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
2d930 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2d940 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2d950 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61   OP_NullRow, pTa
2d960 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  bList->a[i].iCur
2d970 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  sor);.      }.  
2d980 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
2d990 69 49 64 78 43 75 72 3e 3d 30 20 29 7b 0a 20 20  iIdxCur>=0 ){.  
2d9a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2d9b0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75  eAddOp1(v, OP_Nu
2d9c0 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69  llRow, pLevel->i
2d9d0 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d  IdxCur);.      }
2d9e0 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65  .      if( pLeve
2d9f0 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e  l->op==OP_Return
2da00 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2da10 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2da20 20 4f 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65   OP_Gosub, pLeve
2da30 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61  l->p1, pLevel->a
2da40 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20  ddrFirst);.     
2da50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2da60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2da70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
2da80 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72   pLevel->addrFir
2da90 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
2daa0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
2dab0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
2dac0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2dad0 20 54 68 65 20 22 62 72 65 61 6b 22 20 70 6f 69   The "break" poi
2dae0 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75 73 74  nt is here, just
2daf0 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
2db00 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e   the outer loop.
2db10 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20  .  ** Set it..  
2db20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
2db30 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
2db40 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b  pWInfo->iBreak);
2db50 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c  ..  /* Close all
2db60 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73 20   of the cursors 
2db70 74 68 61 74 20 77 65 72 65 20 6f 70 65 6e 65 64  that were opened
2db80 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
2db90 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73  Begin..  */.  as
2dba0 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c  sert( pWInfo->nL
2dbb0 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 57 49 6e 66  evel==1 || pWInf
2dbc0 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 70 54 61 62 4c  o->nLevel==pTabL
2dbd0 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 66  ist->nSrc );.  f
2dbe0 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70  or(i=0, pLevel=p
2dbf0 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e  WInfo->a; i<pWIn
2dc00 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c  fo->nLevel; i++,
2dc10 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
2dc20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2dc30 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d 20  tem *pTabItem = 
2dc40 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
2dc50 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
2dc60 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
2dc70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  TabItem->pTab;. 
2dc80 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21     assert( pTab!
2dc90 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  =0 );.    if( (p
2dca0 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
2dcb0 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30  TF_Ephemeral)==0
2dcc0 0a 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e 70  .     && pTab->p
2dcd0 53 65 6c 65 63 74 3d 3d 30 0a 20 20 20 20 20 26  Select==0.     &
2dce0 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
2dcf0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d  Flags & WHERE_OM
2dd00 49 54 5f 43 4c 4f 53 45 29 3d 3d 30 0a 20 20 20  IT_CLOSE)==0.   
2dd10 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 73   ){.      int ws
2dd20 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
2dd30 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 69  wsFlags;.      i
2dd40 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  f( !pWInfo->okOn
2dd50 65 50 61 73 73 20 26 26 20 28 77 73 20 26 20 57  ePass && (ws & W
2dd60 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
2dd70 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
2dd80 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
2dd90 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62  , OP_Close, pTab
2dda0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
2ddb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2ddc0 28 20 28 77 73 20 26 20 57 48 45 52 45 5f 49 4e  ( (ws & WHERE_IN
2ddd0 44 45 58 45 44 29 21 3d 30 20 26 26 20 28 77 73  DEXED)!=0 && (ws
2dde0 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
2ddf0 44 45 58 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  DEX)==0 ){.     
2de00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2de10 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
2de20 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  , pLevel->iIdxCu
2de30 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
2de40 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
2de50 73 20 73 63 61 6e 20 75 73 65 73 20 61 6e 20 69  s scan uses an i
2de60 6e 64 65 78 2c 20 6d 61 6b 65 20 63 6f 64 65 20  ndex, make code 
2de70 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 74 6f  substitutions to
2de80 20 72 65 61 64 20 64 61 74 61 0a 20 20 20 20 2a   read data.    *
2de90 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78  * from the index
2dea0 20 69 6e 20 70 72 65 66 65 72 65 6e 63 65 20 74   in preference t
2deb0 6f 20 74 68 65 20 74 61 62 6c 65 2e 20 53 6f 6d  o the table. Som
2dec0 65 74 69 6d 65 73 2c 20 74 68 69 73 20 6d 65 61  etimes, this mea
2ded0 6e 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61  ns.    ** the ta
2dee0 62 6c 65 20 6e 65 65 64 20 6e 65 76 65 72 20 62  ble need never b
2def0 65 20 72 65 61 64 20 66 72 6f 6d 2e 20 54 68 69  e read from. Thi
2df00 73 20 69 73 20 61 20 70 65 72 66 6f 72 6d 61 6e  s is a performan
2df10 63 65 20 62 6f 6f 73 74 2c 0a 20 20 20 20 2a 2a  ce boost,.    **
2df20 20 61 73 20 74 68 65 20 76 64 62 65 20 6c 65 76   as the vdbe lev
2df30 65 6c 20 77 61 69 74 73 20 75 6e 74 69 6c 20 74  el waits until t
2df40 68 65 20 74 61 62 6c 65 20 69 73 20 72 65 61 64  he table is read
2df50 20 62 65 66 6f 72 65 20 61 63 74 75 61 6c 6c 79   before actually
2df60 0a 20 20 20 20 2a 2a 20 73 65 65 6b 69 6e 67 20  .    ** seeking 
2df70 74 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72  the table cursor
2df80 20 74 6f 20 74 68 65 20 72 65 63 6f 72 64 20 63   to the record c
2df90 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
2dfa0 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20  the current.    
2dfb0 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74  ** position in t
2dfc0 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a  he index..    **
2dfd0 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74   .    ** Calls t
2dfe0 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  o the code gener
2dff0 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20  ator in between 
2e000 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2e010 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c  n and.    ** sql
2e020 69 74 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c  ite3WhereEnd wil
2e030 6c 20 68 61 76 65 20 63 72 65 61 74 65 64 20 63  l have created c
2e040 6f 64 65 20 74 68 61 74 20 72 65 66 65 72 65 6e  ode that referen
2e050 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20  ces the table.  
2e060 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20    ** directly.  
2e070 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20  This loop scans 
2e080 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f  all that code lo
2e090 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65  oking for opcode
2e0a0 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65  s.    ** that re
2e0b0 66 65 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c  ference the tabl
2e0c0 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74  e and converts t
2e0d0 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73  hem into opcodes
2e0e0 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66   that.    ** ref
2e0f0 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78  erence the index
2e100 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2e110 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
2e120 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
2e130 4e 44 45 58 45 44 29 21 3d 30 20 26 26 20 21 64  NDEXED)!=0 && !d
2e140 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29  b->mallocFailed)
2e150 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 2c 20 6a  {.      int k, j
2e160 2c 20 6c 61 73 74 3b 0a 20 20 20 20 20 20 56 64  , last;.      Vd
2e170 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20  beOp *pOp;.     
2e180 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 70   Index *pIdx = p
2e190 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49  Level->plan.u.pI
2e1a0 64 78 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  dx;..      asser
2e1b0 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20  t( pIdx!=0 );.  
2e1c0 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65      pOp = sqlite
2e1d0 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 57  3VdbeGetOp(v, pW
2e1e0 49 6e 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20 20  Info->iTop);.   
2e1f0 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65     last = sqlite
2e200 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
2e210 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  (v);.      for(k
2e220 3d 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20 6b  =pWInfo->iTop; k
2e230 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b  <last; k++, pOp+
2e240 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
2e250 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d  pOp->p1!=pLevel-
2e260 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69  >iTabCur ) conti
2e270 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
2e280 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
2e290 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  _Column ){.     
2e2a0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
2e2b0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a  pIdx->nColumn; j
2e2c0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
2e2d0 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70 49   if( pOp->p2==pI
2e2e0 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20  dx->aiColumn[j] 
2e2f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2e300 20 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20   pOp->p2 = j;.  
2e310 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d              pOp-
2e320 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  >p1 = pLevel->iI
2e330 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20  dxCur;.         
2e340 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2e350 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e360 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2e370 61 73 73 65 72 74 28 20 28 70 4c 65 76 65 6c 2d  assert( (pLevel-
2e380 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
2e390 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
2e3a0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
2e3b0 20 20 7c 7c 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f    || j<pIdx->nCo
2e3c0 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  lumn );.        
2e3d0 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f  }else if( pOp->o
2e3e0 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20  pcode==OP_Rowid 
2e3f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  ){.          pOp
2e400 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  ->p1 = pLevel->i
2e410 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
2e420 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
2e430 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20  OP_IdxRowid;.   
2e440 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2e450 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
2e460 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a  inal cleanup.  *
2e470 2f 0a 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  /.  pParse->nQue
2e480 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d  ryLoop = pWInfo-
2e490 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70  >savedNQueryLoop
2e4a0 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65  ;.  whereInfoFre
2e4b0 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
2e4c0 20 72 65 74 75 72 6e 3b 0a 7d 0a                  return;.}.