/ Hex Artifact Content
Login

Artifact 2de6723cfb051bcfcfd3d3ca1ac04bb1388ba530:


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 4e  /.#define TERM_N
14b0: 4f 48 45 4c 50 20 20 20 20 20 30 78 38 30 20 20  OHELP     0x80  
14c0: 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 64 6f   /* This term do
14d0: 65 73 20 6e 6f 74 20 72 65 64 75 63 65 20 74 68  es not reduce th
14e0: 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20 2a  e search space *
14f0: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  /../*.** An inst
1500: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
1510: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
1520: 68 6f 6c 64 73 20 61 6c 6c 20 69 6e 66 6f 72 6d  holds all inform
1530: 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 0a 2a 2a  ation about a.**
1540: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
1550: 4d 6f 73 74 6c 79 20 74 68 69 73 20 69 73 20 61  Mostly this is a
1560: 20 63 6f 6e 74 61 69 6e 65 72 20 66 6f 72 20 6f   container for o
1570: 6e 65 20 6f 72 20 6d 6f 72 65 20 57 68 65 72 65  ne or more Where
1580: 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  Terms..*/.struct
1590: 20 57 68 65 72 65 43 6c 61 75 73 65 20 7b 0a 20   WhereClause {. 
15a0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
15b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
15c0: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
15d0: 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
15e0: 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 2f 2a  t *pMaskSet;  /*
15f0: 20 4d 61 70 70 69 6e 67 20 6f 66 20 74 61 62 6c   Mapping of tabl
1600: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
1610: 20 74 6f 20 62 69 74 6d 61 73 6b 73 20 2a 2f 0a   to bitmasks */.
1620: 20 20 42 69 74 6d 61 73 6b 20 76 6d 61 73 6b 3b    Bitmask vmask;
1630: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
1640: 74 6d 61 73 6b 20 69 64 65 6e 74 69 66 79 69 6e  tmask identifyin
1650: 67 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  g virtual table 
1660: 63 75 72 73 6f 72 73 20 2a 2f 0a 20 20 75 38 20  cursors */.  u8 
1670: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
1680: 20 20 20 20 20 20 2f 2a 20 53 70 6c 69 74 20 6f        /* Split o
1690: 70 65 72 61 74 6f 72 2e 20 20 54 4b 5f 41 4e 44  perator.  TK_AND
16a0: 20 6f 72 20 54 4b 5f 4f 52 20 2a 2f 0a 20 20 69   or TK_OR */.  i
16b0: 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
16c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
16d0: 72 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20  r of terms */.  
16e0: 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20  int nSlot;      
16f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1700: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
1710: 20 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54   a[] */.  WhereT
1720: 65 72 6d 20 2a 61 3b 20 20 20 20 20 20 20 20 20  erm *a;         
1730: 20 20 20 2f 2a 20 45 61 63 68 20 61 5b 5d 20 64     /* Each a[] d
1740: 65 73 63 72 69 62 65 73 20 61 20 74 65 72 6d 20  escribes a term 
1750: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 75  of the WHERE clu
1760: 61 73 65 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ase */.#if defin
1770: 65 64 28 53 51 4c 49 54 45 5f 53 4d 41 4c 4c 5f  ed(SQLITE_SMALL_
1780: 53 54 41 43 4b 29 0a 20 20 57 68 65 72 65 54 65  STACK).  WhereTe
1790: 72 6d 20 61 53 74 61 74 69 63 5b 31 5d 3b 20 20  rm aStatic[1];  
17a0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74 61    /* Initial sta
17b0: 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 5b  tic space for a[
17c0: 5d 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 57 68 65  ] */.#else.  Whe
17d0: 72 65 54 65 72 6d 20 61 53 74 61 74 69 63 5b 38  reTerm aStatic[8
17e0: 5d 3b 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  ];    /* Initial
17f0: 20 73 74 61 74 69 63 20 73 70 61 63 65 20 66 6f   static space fo
1800: 72 20 61 5b 5d 20 2a 2f 0a 23 65 6e 64 69 66 0a  r a[] */.#endif.
1810: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72  };../*.** A Wher
1820: 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65 72  eTerm with eOper
1830: 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 68 61 73 20  ator==WO_OR has 
1840: 69 74 73 20 75 2e 70 4f 72 49 6e 66 6f 20 70 6f  its u.pOrInfo po
1850: 69 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20  inter set to.** 
1860: 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  a dynamically al
1870: 6c 6f 63 61 74 65 64 20 69 6e 73 74 61 6e 63 65  located instance
1880: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1890: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  g structure..*/.
18a0: 73 74 72 75 63 74 20 57 68 65 72 65 4f 72 49 6e  struct WhereOrIn
18b0: 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61 75  fo {.  WhereClau
18c0: 73 65 20 77 63 3b 20 20 20 20 20 20 20 20 20 20  se wc;          
18d0: 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e  /* Decomposition
18e0: 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
18f0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65  /.  Bitmask inde
1900: 78 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  xable;       /* 
1910: 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 69  Bitmask of all i
1920: 6e 64 65 78 61 62 6c 65 20 74 61 62 6c 65 73 20  ndexable tables 
1930: 69 6e 20 74 68 65 20 63 6c 61 75 73 65 20 2a 2f  in the clause */
1940: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65  .};../*.** A Whe
1950: 72 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65  reTerm with eOpe
1960: 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 68 61  rator==WO_AND ha
1970: 73 20 69 74 73 20 75 2e 70 41 6e 64 49 6e 66 6f  s its u.pAndInfo
1980: 20 70 6f 69 6e 74 65 72 20 73 65 74 20 74 6f 0a   pointer set to.
1990: 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  ** a dynamically
19a0: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 73 74 61   allocated insta
19b0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
19c0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
19d0: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 41  */.struct WhereA
19e0: 6e 64 49 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65  ndInfo {.  Where
19f0: 43 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20 20  Clause wc;      
1a00: 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 65 78      /* The subex
1a10: 70 72 65 73 73 69 6f 6e 20 62 72 6f 6b 65 6e 20  pression broken 
1a20: 6f 75 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  out */.};../*.**
1a30: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
1a40: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
1a50: 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 74 72  ructure keeps tr
1a60: 61 63 6b 20 6f 66 20 61 20 6d 61 70 70 69 6e 67  ack of a mapping
1a70: 0a 2a 2a 20 62 65 74 77 65 65 6e 20 56 44 42 45  .** between VDBE
1a80: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
1a90: 61 6e 64 20 62 69 74 73 20 6f 66 20 74 68 65 20  and bits of the 
1aa0: 62 69 74 6d 61 73 6b 73 20 69 6e 20 57 68 65 72  bitmasks in Wher
1ab0: 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  eTerm..**.** The
1ac0: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
1ad0: 62 65 72 73 20 61 72 65 20 73 6d 61 6c 6c 20 69  bers are small i
1ae0: 6e 74 65 67 65 72 73 20 63 6f 6e 74 61 69 6e 65  ntegers containe
1af0: 64 20 69 6e 20 0a 2a 2a 20 53 72 63 4c 69 73 74  d in .** SrcList
1b00: 5f 69 74 65 6d 2e 69 43 75 72 73 6f 72 20 61 6e  _item.iCursor an
1b10: 64 20 45 78 70 72 2e 69 54 61 62 6c 65 20 66 69  d Expr.iTable fi
1b20: 65 6c 64 73 2e 20 20 46 6f 72 20 61 6e 79 20 67  elds.  For any g
1b30: 69 76 65 6e 20 57 48 45 52 45 20 0a 2a 2a 20 63  iven WHERE .** c
1b40: 6c 61 75 73 65 2c 20 74 68 65 20 63 75 72 73 6f  lause, the curso
1b50: 72 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20  r numbers might 
1b60: 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  not begin with 0
1b70: 20 61 6e 64 20 74 68 65 79 20 6d 69 67 68 74 0a   and they might.
1b80: 2a 2a 20 63 6f 6e 74 61 69 6e 20 67 61 70 73 20  ** contain gaps 
1b90: 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 69 6e 67  in the numbering
1ba0: 20 73 65 71 75 65 6e 63 65 2e 20 20 42 75 74 20   sequence.  But 
1bb0: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
1bc0: 6d 61 78 69 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f  maximum.** use o
1bd0: 66 20 74 68 65 20 62 69 74 73 20 69 6e 20 6f 75  f the bits in ou
1be0: 72 20 62 69 74 6d 61 73 6b 73 2e 20 20 54 68 69  r bitmasks.  Thi
1bf0: 73 20 73 74 72 75 63 74 75 72 65 20 70 72 6f 76  s structure prov
1c00: 69 64 65 73 20 61 20 6d 61 70 70 69 6e 67 0a 2a  ides a mapping.*
1c10: 2a 20 66 72 6f 6d 20 74 68 65 20 73 70 61 72 73  * from the spars
1c20: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
1c30: 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69 76   into consecutiv
1c40: 65 20 69 6e 74 65 67 65 72 73 20 62 65 67 69 6e  e integers begin
1c50: 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20 30 2e 0a  ning.** with 0..
1c60: 2a 2a 0a 2a 2a 20 49 66 20 57 68 65 72 65 4d 61  **.** If WhereMa
1c70: 73 6b 53 65 74 2e 69 78 5b 41 5d 3d 3d 42 20 69  skSet.ix[A]==B i
1c80: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 54 68 65  t means that The
1c90: 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 42   A-th bit of a B
1ca0: 69 74 6d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73  itmask.** corres
1cb0: 70 6f 6e 64 73 20 56 44 42 45 20 63 75 72 73 6f  ponds VDBE curso
1cc0: 72 20 6e 75 6d 62 65 72 20 42 2e 20 20 54 68 65  r number B.  The
1cd0: 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 62   A-th bit of a b
1ce0: 69 74 6d 61 73 6b 20 69 73 20 31 3c 3c 41 2e 0a  itmask is 1<<A..
1cf0: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1d00: 65 2c 20 69 66 20 74 68 65 20 57 48 45 52 45 20  e, if the WHERE 
1d10: 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69 6f  clause expressio
1d20: 6e 20 75 73 65 64 20 74 68 65 73 65 20 56 44 42  n used these VDB
1d30: 45 0a 2a 2a 20 63 75 72 73 6f 72 73 3a 20 20 34  E.** cursors:  4
1d40: 2c 20 35 2c 20 38 2c 20 32 39 2c 20 35 37 2c 20  , 5, 8, 29, 57, 
1d50: 37 33 2e 20 20 54 68 65 6e 20 74 68 65 20 20 57  73.  Then the  W
1d60: 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75  hereMaskSet stru
1d70: 63 74 75 72 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d  cture.** would m
1d80: 61 70 20 74 68 6f 73 65 20 63 75 72 73 6f 72 20  ap those cursor 
1d90: 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74  numbers into bit
1da0: 73 20 30 20 74 68 72 6f 75 67 68 20 35 2e 0a 2a  s 0 through 5..*
1db0: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
1dc0: 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f  he mapping is no
1dd0: 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 6f 72  t necessarily or
1de0: 64 65 72 65 64 2e 20 20 49 6e 20 74 68 65 20 65  dered.  In the e
1df0: 78 61 6d 70 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c  xample.** above,
1e00: 20 74 68 65 20 6d 61 70 70 69 6e 67 20 6d 69 67   the mapping mig
1e10: 68 74 20 67 6f 20 6c 69 6b 65 20 74 68 69 73 3a  ht go like this:
1e20: 20 20 34 2d 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d    4->3, 5->1, 8-
1e30: 3e 32 2c 20 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37  >2, 29->0,.** 57
1e40: 2d 3e 35 2c 20 37 33 2d 3e 34 2e 20 20 4f 72 20  ->5, 73->4.  Or 
1e50: 6f 6e 65 20 6f 66 20 37 31 39 20 6f 74 68 65 72  one of 719 other
1e60: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6d 69   combinations mi
1e70: 67 68 74 20 62 65 20 75 73 65 64 2e 20 49 74 0a  ght be used. It.
1e80: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 6c  ** does not real
1e90: 6c 79 20 6d 61 74 74 65 72 2e 20 20 57 68 61 74  ly matter.  What
1ea0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 73   is important is
1eb0: 20 74 68 61 74 20 73 70 61 72 73 65 20 63 75 72   that sparse cur
1ec0: 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 61  sor.** numbers a
1ed0: 6c 6c 20 67 65 74 20 6d 61 70 70 65 64 20 69 6e  ll get mapped in
1ee0: 74 6f 20 62 69 74 20 6e 75 6d 62 65 72 73 20 74  to bit numbers t
1ef0: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  hat begin with 0
1f00: 20 61 6e 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20   and contain.** 
1f10: 6e 6f 20 67 61 70 73 2e 0a 2a 2f 0a 73 74 72 75  no gaps..*/.stru
1f20: 63 74 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  ct WhereMaskSet 
1f30: 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  {.  int n;      
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
1f60: 73 73 69 67 6e 65 64 20 63 75 72 73 6f 72 20 76  ssigned cursor v
1f70: 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  alues */.  int i
1f80: 78 5b 42 4d 53 5d 3b 20 20 20 20 20 20 20 20 20  x[BMS];         
1f90: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
1fa0: 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65  or assigned to e
1fb0: 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b 0a 0a 2f  ach bit */.};../
1fc0: 2a 0a 2a 2a 20 41 20 57 68 65 72 65 43 6f 73 74  *.** A WhereCost
1fd0: 20 6f 62 6a 65 63 74 20 72 65 63 6f 72 64 73 20   object records 
1fe0: 61 20 6c 6f 6f 6b 75 70 20 73 74 72 61 74 65 67  a lookup strateg
1ff0: 79 20 61 6e 64 20 74 68 65 20 65 73 74 69 6d 61  y and the estima
2000: 74 65 64 0a 2a 2a 20 63 6f 73 74 20 6f 66 20 70  ted.** cost of p
2010: 75 72 73 75 69 6e 67 20 74 68 61 74 20 73 74 72  ursuing that str
2020: 61 74 65 67 79 2e 0a 2a 2f 0a 73 74 72 75 63 74  ategy..*/.struct
2030: 20 57 68 65 72 65 43 6f 73 74 20 7b 0a 20 20 57   WhereCost {.  W
2040: 68 65 72 65 50 6c 61 6e 20 70 6c 61 6e 3b 20 20  herePlan plan;  
2050: 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20    /* The lookup 
2060: 73 74 72 61 74 65 67 79 20 2a 2f 0a 20 20 64 6f  strategy */.  do
2070: 75 62 6c 65 20 72 43 6f 73 74 3b 20 20 20 20 20  uble rCost;     
2080: 20 2f 2a 20 4f 76 65 72 61 6c 6c 20 63 6f 73 74   /* Overall cost
2090: 20 6f 66 20 70 75 72 73 75 69 6e 67 20 74 68 69   of pursuing thi
20a0: 73 20 73 65 61 72 63 68 20 73 74 72 61 74 65 67  s search strateg
20b0: 79 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 75  y */.  Bitmask u
20c0: 73 65 64 3b 20 20 20 20 20 20 2f 2a 20 42 69 74  sed;      /* Bit
20d0: 6d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20  mask of cursors 
20e0: 75 73 65 64 20 62 79 20 74 68 69 73 20 70 6c 61  used by this pla
20f0: 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42  n */.};../*.** B
2100: 69 74 6d 61 73 6b 73 20 66 6f 72 20 74 68 65 20  itmasks for the 
2110: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 69  operators that i
2120: 6e 64 69 63 65 73 20 61 72 65 20 61 62 6c 65 20  ndices are able 
2130: 74 6f 20 65 78 70 6c 6f 69 74 2e 20 20 41 6e 0a  to exploit.  An.
2140: 2a 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61  ** OR-ed combina
2150: 74 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 76 61  tion of these va
2160: 6c 75 65 73 20 63 61 6e 20 62 65 20 75 73 65 64  lues can be used
2170: 20 77 68 65 6e 20 73 65 61 72 63 68 69 6e 67 20   when searching 
2180: 66 6f 72 0a 2a 2a 20 74 65 72 6d 73 20 69 6e 20  for.** terms in 
2190: 74 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65  the where clause
21a0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f  ..*/.#define WO_
21b0: 49 4e 20 20 20 20 20 30 78 30 30 31 0a 23 64 65  IN     0x001.#de
21c0: 66 69 6e 65 20 57 4f 5f 45 51 20 20 20 20 20 30  fine WO_EQ     0
21d0: 78 30 30 32 0a 23 64 65 66 69 6e 65 20 57 4f 5f  x002.#define WO_
21e0: 4c 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28  LT     (WO_EQ<<(
21f0: 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29 0a 23 64  TK_LT-TK_EQ)).#d
2200: 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20 20 20 20  efine WO_LE     
2210: 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d 54  (WO_EQ<<(TK_LE-T
2220: 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57  K_EQ)).#define W
2230: 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f 45 51 3c  O_GT     (WO_EQ<
2240: 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51 29 29 0a  <(TK_GT-TK_EQ)).
2250: 23 64 65 66 69 6e 65 20 57 4f 5f 47 45 20 20 20  #define WO_GE   
2260: 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 45    (WO_EQ<<(TK_GE
2270: 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65  -TK_EQ)).#define
2280: 20 57 4f 5f 4d 41 54 43 48 20 20 30 78 30 34 30   WO_MATCH  0x040
2290: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49 53 4e 55  .#define WO_ISNU
22a0: 4c 4c 20 30 78 30 38 30 0a 23 64 65 66 69 6e 65  LL 0x080.#define
22b0: 20 57 4f 5f 4f 52 20 20 20 20 20 30 78 31 30 30   WO_OR     0x100
22c0: 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72         /* Two or
22d0: 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74   more OR-connect
22e0: 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23 64 65 66  ed terms */.#def
22f0: 69 6e 65 20 57 4f 5f 41 4e 44 20 20 20 20 30 78  ine WO_AND    0x
2300: 32 30 30 20 20 20 20 20 20 20 2f 2a 20 54 77 6f  200       /* Two
2310: 20 6f 72 20 6d 6f 72 65 20 41 4e 44 2d 63 6f 6e   or more AND-con
2320: 6e 65 63 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a  nected terms */.
2330: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 41 4c 4c 20  .#define WO_ALL 
2340: 20 20 20 30 78 66 66 66 20 20 20 20 20 20 20 2f     0xfff       /
2350: 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 70 6f  * Mask of all po
2360: 73 73 69 62 6c 65 20 57 4f 5f 2a 20 76 61 6c 75  ssible WO_* valu
2370: 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f  es */.#define WO
2380: 5f 53 49 4e 47 4c 45 20 30 78 30 66 66 20 20 20  _SINGLE 0x0ff   
2390: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61      /* Mask of a
23a0: 6c 6c 20 6e 6f 6e 2d 63 6f 6d 70 6f 75 6e 64 20  ll non-compound 
23b0: 57 4f 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 0a  WO_* values */..
23c0: 2f 2a 0a 2a 2a 20 56 61 6c 75 65 20 66 6f 72 20  /*.** Value for 
23d0: 77 73 46 6c 61 67 73 20 72 65 74 75 72 6e 65 64  wsFlags returned
23e0: 20 62 79 20 62 65 73 74 49 6e 64 65 78 28 29 20   by bestIndex() 
23f0: 61 6e 64 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a  and stored in.**
2400: 20 57 68 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c   WhereLevel.wsFl
2410: 61 67 73 2e 20 20 54 68 65 73 65 20 66 6c 61 67  ags.  These flag
2420: 73 20 64 65 74 65 72 6d 69 6e 65 20 77 68 69 63  s determine whic
2430: 68 20 73 65 61 72 63 68 0a 2a 2a 20 73 74 72 61  h search.** stra
2440: 74 65 67 69 65 73 20 61 72 65 20 61 70 70 72 6f  tegies are appro
2450: 70 72 69 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  priate..**.** Th
2460: 65 20 6c 65 61 73 74 20 73 69 67 6e 69 66 69 63  e least signific
2470: 61 6e 74 20 31 32 20 62 69 74 73 20 69 73 20 72  ant 12 bits is r
2480: 65 73 65 72 76 65 64 20 61 73 20 61 20 6d 61 73  eserved as a mas
2490: 6b 20 66 6f 72 20 57 4f 5f 20 76 61 6c 75 65 73  k for WO_ values
24a0: 20 61 62 6f 76 65 2e 0a 2a 2a 20 54 68 65 20 57   above..** The W
24b0: 68 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67  hereLevel.wsFlag
24c0: 73 20 66 69 65 6c 64 20 69 73 20 75 73 75 61 6c  s field is usual
24d0: 6c 79 20 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c  ly set to WO_IN|
24e0: 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2e  WO_EQ|WO_ISNULL.
24f0: 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 74  .** But if the t
2500: 61 62 6c 65 20 69 73 20 74 68 65 20 72 69 67 68  able is the righ
2510: 74 20 74 61 62 6c 65 20 6f 66 20 61 20 6c 65 66  t table of a lef
2520: 74 20 6a 6f 69 6e 2c 20 57 68 65 72 65 4c 65 76  t join, WhereLev
2530: 65 6c 2e 77 73 46 6c 61 67 73 0a 2a 2a 20 69 73  el.wsFlags.** is
2540: 20 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f   set to WO_IN|WO
2550: 5f 45 51 2e 20 20 54 68 65 20 57 68 65 72 65 4c  _EQ.  The WhereL
2560: 65 76 65 6c 2e 77 73 46 6c 61 67 73 20 66 69 65  evel.wsFlags fie
2570: 6c 64 20 63 61 6e 20 74 68 65 6e 20 62 65 20 75  ld can then be u
2580: 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 22 6f  sed as.** the "o
2590: 70 22 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  p" parameter to 
25a0: 66 69 6e 64 54 65 72 6d 20 77 68 65 6e 20 77 65  findTerm when we
25b0: 20 61 72 65 20 72 65 73 6f 6c 76 69 6e 67 20 65   are resolving e
25c0: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
25d0: 6e 74 73 2e 0a 2a 2a 20 49 53 4e 55 4c 4c 20 63  nts..** ISNULL c
25e0: 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20  onstraints will 
25f0: 74 68 65 6e 20 6e 6f 74 20 62 65 20 75 73 65 64  then not be used
2600: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 74 61   on the right ta
2610: 62 6c 65 20 6f 66 20 61 20 6c 65 66 74 0a 2a 2a  ble of a left.**
2620: 20 6a 6f 69 6e 2e 20 20 54 69 63 6b 65 74 73 20   join.  Tickets 
2630: 23 32 31 37 37 20 61 6e 64 20 23 32 31 38 39 2e  #2177 and #2189.
2640: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52  .*/.#define WHER
2650: 45 5f 52 4f 57 49 44 5f 45 51 20 20 20 20 20 30  E_ROWID_EQ     0
2660: 78 30 30 30 30 31 30 30 30 20 20 2f 2a 20 72 6f  x00001000  /* ro
2670: 77 69 64 3d 45 58 50 52 20 6f 72 20 72 6f 77 69  wid=EXPR or rowi
2680: 64 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64  d IN (...) */.#d
2690: 65 66 69 6e 65 20 57 48 45 52 45 5f 52 4f 57 49  efine WHERE_ROWI
26a0: 44 5f 52 41 4e 47 45 20 20 30 78 30 30 30 30 32  D_RANGE  0x00002
26b0: 30 30 30 20 20 2f 2a 20 72 6f 77 69 64 3c 45 58  000  /* rowid<EX
26c0: 50 52 20 61 6e 64 2f 6f 72 20 72 6f 77 69 64 3e  PR and/or rowid>
26d0: 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20  EXPR */.#define 
26e0: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20  WHERE_COLUMN_EQ 
26f0: 20 20 20 30 78 30 30 30 31 30 30 30 30 20 20 2f     0x00010000  /
2700: 2a 20 78 3d 45 58 50 52 20 6f 72 20 78 20 49 4e  * x=EXPR or x IN
2710: 20 28 2e 2e 2e 29 20 6f 72 20 78 20 49 53 20 4e   (...) or x IS N
2720: 55 4c 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ULL */.#define W
2730: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
2740: 45 20 30 78 30 30 30 32 30 30 30 30 20 20 2f 2a  E 0x00020000  /*
2750: 20 78 3c 45 58 50 52 20 61 6e 64 2f 6f 72 20 78   x<EXPR and/or x
2760: 3e 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65  >EXPR */.#define
2770: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
2780: 20 20 20 20 30 78 30 30 30 34 30 30 30 30 20 20      0x00040000  
2790: 2f 2a 20 78 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f  /* x IN (...) */
27a0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43  .#define WHERE_C
27b0: 4f 4c 55 4d 4e 5f 4e 55 4c 4c 20 20 30 78 30 30  OLUMN_NULL  0x00
27c0: 30 38 30 30 30 30 20 20 2f 2a 20 78 20 49 53 20  080000  /* x IS 
27d0: 4e 55 4c 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20  NULL */.#define 
27e0: 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 20 20  WHERE_INDEXED   
27f0: 20 20 20 30 78 30 30 30 66 30 30 30 30 20 20 2f     0x000f0000  /
2800: 2a 20 41 6e 79 74 68 69 6e 67 20 74 68 61 74 20  * Anything that 
2810: 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f  uses an index */
2820: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4e  .#define WHERE_N
2830: 4f 54 5f 46 55 4c 4c 53 43 41 4e 20 30 78 31 30  OT_FULLSCAN 0x10
2840: 30 66 33 30 30 30 20 20 2f 2a 20 44 6f 65 73 20  0f3000  /* Does 
2850: 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 74 61  not do a full ta
2860: 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 23 64 65 66  ble scan */.#def
2870: 69 6e 65 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c  ine WHERE_IN_ABL
2880: 45 20 20 20 20 20 20 30 78 30 30 30 66 31 30 30  E      0x000f100
2890: 30 20 20 2f 2a 20 41 62 6c 65 20 74 6f 20 73 75  0  /* Able to su
28a0: 70 70 6f 72 74 20 61 6e 20 49 4e 20 6f 70 65 72  pport an IN oper
28b0: 61 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ator */.#define 
28c0: 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
28d0: 20 20 20 30 78 30 30 31 30 30 30 30 30 20 20 2f     0x00100000  /
28e0: 2a 20 78 3c 45 58 50 52 20 6f 72 20 78 3c 3d 45  * x<EXPR or x<=E
28f0: 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  XPR constraint *
2900: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
2910: 42 54 4d 5f 4c 49 4d 49 54 20 20 20 20 30 78 30  BTM_LIMIT    0x0
2920: 30 32 30 30 30 30 30 20 20 2f 2a 20 78 3e 45 58  0200000  /* x>EX
2930: 50 52 20 6f 72 20 78 3e 3d 45 58 50 52 20 63 6f  PR or x>=EXPR co
2940: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66  nstraint */.#def
2950: 69 6e 65 20 57 48 45 52 45 5f 42 4f 54 48 5f 4c  ine WHERE_BOTH_L
2960: 49 4d 49 54 20 20 20 30 78 30 30 33 30 30 30 30  IMIT   0x0030000
2970: 30 20 20 2f 2a 20 42 6f 74 68 20 78 3e 45 58 50  0  /* Both x>EXP
2980: 52 20 61 6e 64 20 78 3c 45 58 50 52 20 2a 2f 0a  R and x<EXPR */.
2990: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49 44  #define WHERE_ID
29a0: 58 5f 4f 4e 4c 59 20 20 20 20 20 30 78 30 30 38  X_ONLY     0x008
29b0: 30 30 30 30 30 20 20 2f 2a 20 55 73 65 20 69 6e  00000  /* Use in
29c0: 64 65 78 20 6f 6e 6c 79 20 2d 20 6f 6d 69 74 20  dex only - omit 
29d0: 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65  table */.#define
29e0: 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 20 20   WHERE_ORDERBY  
29f0: 20 20 20 20 30 78 30 31 30 30 30 30 30 30 20 20      0x01000000  
2a00: 2f 2a 20 4f 75 74 70 75 74 20 77 69 6c 6c 20 61  /* Output will a
2a10: 70 70 65 61 72 20 69 6e 20 63 6f 72 72 65 63 74  ppear in correct
2a20: 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e   order */.#defin
2a30: 65 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 20  e WHERE_REVERSE 
2a40: 20 20 20 20 20 30 78 30 32 30 30 30 30 30 30 20       0x02000000 
2a50: 20 2f 2a 20 53 63 61 6e 20 69 6e 20 72 65 76 65   /* Scan in reve
2a60: 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65  rse order */.#de
2a70: 66 69 6e 65 20 57 48 45 52 45 5f 55 4e 49 51 55  fine WHERE_UNIQU
2a80: 45 20 20 20 20 20 20 20 30 78 30 34 30 30 30 30  E       0x040000
2a90: 30 30 20 20 2f 2a 20 53 65 6c 65 63 74 73 20 6e  00  /* Selects n
2aa0: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
2ab0: 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  row */.#define W
2ac0: 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
2ad0: 45 20 30 78 30 38 30 30 30 30 30 30 20 20 2f 2a  E 0x08000000  /*
2ae0: 20 55 73 65 20 76 69 72 74 75 61 6c 2d 74 61 62   Use virtual-tab
2af0: 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  le processing */
2b00: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4d  .#define WHERE_M
2b10: 55 4c 54 49 5f 4f 52 20 20 20 20 20 30 78 31 30  ULTI_OR     0x10
2b20: 30 30 30 30 30 30 20 20 2f 2a 20 4f 52 20 75 73  000000  /* OR us
2b30: 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 69 6e 64  ing multiple ind
2b40: 69 63 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ices */.#define 
2b50: 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58  WHERE_TEMP_INDEX
2b60: 20 20 20 30 78 32 30 30 30 30 30 30 30 20 20 2f     0x20000000  /
2b70: 2a 20 55 73 65 73 20 61 6e 20 65 70 68 65 6d 65  * Uses an epheme
2b80: 72 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 2f 2a  ral index */../*
2b90: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
2ba0: 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 57 68   preallocated Wh
2bb0: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
2bc0: 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ure..*/.static v
2bd0: 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 49  oid whereClauseI
2be0: 6e 69 74 28 0a 20 20 57 68 65 72 65 43 6c 61 75  nit(.  WhereClau
2bf0: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
2c00: 2f 2a 20 54 68 65 20 57 68 65 72 65 43 6c 61 75  /* The WhereClau
2c10: 73 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61 6c  se to be initial
2c20: 69 7a 65 64 20 2a 2f 0a 20 20 50 61 72 73 65 20  ized */.  Parse 
2c30: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
2c40: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
2c50: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
2c60: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
2c70: 73 6b 53 65 74 20 20 20 2f 2a 20 4d 61 70 70 69  skSet   /* Mappi
2c80: 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65 20 63 75  ng from table cu
2c90: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 74 6f 20  rsor numbers to 
2ca0: 62 69 74 6d 61 73 6b 73 20 2a 2f 0a 29 7b 0a 20  bitmasks */.){. 
2cb0: 20 70 57 43 2d 3e 70 50 61 72 73 65 20 3d 20 70   pWC->pParse = p
2cc0: 50 61 72 73 65 3b 0a 20 20 70 57 43 2d 3e 70 4d  Parse;.  pWC->pM
2cd0: 61 73 6b 53 65 74 20 3d 20 70 4d 61 73 6b 53 65  askSet = pMaskSe
2ce0: 74 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72 6d 20  t;.  pWC->nTerm 
2cf0: 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53 6c 6f  = 0;.  pWC->nSlo
2d00: 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28 70 57  t = ArraySize(pW
2d10: 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20 20 70  C->aStatic);.  p
2d20: 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61 53 74  WC->a = pWC->aSt
2d30: 61 74 69 63 3b 0a 20 20 70 57 43 2d 3e 76 6d 61  atic;.  pWC->vma
2d40: 73 6b 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f  sk = 0;.}../* Fo
2d50: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
2d60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
2d70: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
2d80: 57 68 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a 0a  WhereClause*);..
2d90: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
2da0: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
2db0: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68  ciated with a Wh
2dc0: 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74  ereOrInfo object
2dd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2de0: 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65   whereOrInfoDele
2df0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
2e00: 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29 7b  WhereOrInfo *p){
2e10: 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  .  whereClauseCl
2e20: 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73  ear(&p->wc);.  s
2e30: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2e40: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   p);.}../*.** De
2e50: 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d  allocate all mem
2e60: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
2e70: 69 74 68 20 61 20 57 68 65 72 65 41 6e 64 49 6e  ith a WhereAndIn
2e80: 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  fo object..*/.st
2e90: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 41  atic void whereA
2ea0: 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c  ndInfoDelete(sql
2eb0: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 41  ite3 *db, WhereA
2ec0: 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68  ndInfo *p){.  wh
2ed0: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
2ee0: 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65  p->wc);.  sqlite
2ef0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
2f00: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
2f10: 61 74 65 20 61 20 57 68 65 72 65 43 6c 61 75 73  ate a WhereClaus
2f20: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
2f30: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
2f40: 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c  ructure.** itsel
2f50: 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20  f is not freed. 
2f60: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2f70: 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20   the inverse of 
2f80: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
2f90: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
2fa0: 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65  d whereClauseCle
2fb0: 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  ar(WhereClause *
2fc0: 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  pWC){.  int i;. 
2fd0: 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20   WhereTerm *a;. 
2fe0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
2ff0: 57 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  WC->pParse->db;.
3000: 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65    for(i=pWC->nTe
3010: 72 6d 2d 31 2c 20 61 3d 70 57 43 2d 3e 61 3b 20  rm-1, a=pWC->a; 
3020: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 61 2b 2b 29 7b  i>=0; i--, a++){
3030: 0a 20 20 20 20 69 66 28 20 61 2d 3e 77 74 46 6c  .    if( a->wtFl
3040: 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d  ags & TERM_DYNAM
3050: 49 43 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  IC ){.      sqli
3060: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
3070: 2c 20 61 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  , a->pExpr);.   
3080: 20 7d 0a 20 20 20 20 69 66 28 20 61 2d 3e 77 74   }.    if( a->wt
3090: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49  Flags & TERM_ORI
30a0: 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65  NFO ){.      whe
30b0: 72 65 4f 72 49 6e 66 6f 44 65 6c 65 74 65 28 64  reOrInfoDelete(d
30c0: 62 2c 20 61 2d 3e 75 2e 70 4f 72 49 6e 66 6f 29  b, a->u.pOrInfo)
30d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
30e0: 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  a->wtFlags & TER
30f0: 4d 5f 41 4e 44 49 4e 46 4f 20 29 7b 0a 20 20 20  M_ANDINFO ){.   
3100: 20 20 20 77 68 65 72 65 41 6e 64 49 6e 66 6f 44     whereAndInfoD
3110: 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70  elete(db, a->u.p
3120: 41 6e 64 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a  AndInfo);.    }.
3130: 20 20 7d 0a 20 20 69 66 28 20 70 57 43 2d 3e 61    }.  if( pWC->a
3140: 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20 29  !=pWC->aStatic )
3150: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
3160: 72 65 65 28 64 62 2c 20 70 57 43 2d 3e 61 29 3b  ree(db, pWC->a);
3170: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
3180: 64 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 57  d a single new W
3190: 68 65 72 65 54 65 72 6d 20 65 6e 74 72 79 20 74  hereTerm entry t
31a0: 6f 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  o the WhereClaus
31b0: 65 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a 2a 2a  e object pWC..**
31c0: 20 54 68 65 20 6e 65 77 20 57 68 65 72 65 54 65   The new WhereTe
31d0: 72 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e  rm object is con
31e0: 73 74 72 75 63 74 65 64 20 66 72 6f 6d 20 45 78  structed from Ex
31f0: 70 72 20 70 20 61 6e 64 20 77 69 74 68 20 77 74  pr p and with wt
3200: 46 6c 61 67 73 2e 0a 2a 2a 20 54 68 65 20 69 6e  Flags..** The in
3210: 64 65 78 20 69 6e 20 70 57 43 2d 3e 61 5b 5d 20  dex in pWC->a[] 
3220: 6f 66 20 74 68 65 20 6e 65 77 20 57 68 65 72 65  of the new Where
3230: 54 65 72 6d 20 69 73 20 72 65 74 75 72 6e 65 64  Term is returned
3240: 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 20   on success..** 
3250: 30 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  0 is returned if
3260: 20 74 68 65 20 6e 65 77 20 57 68 65 72 65 54 65   the new WhereTe
3270: 72 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  rm could not be 
3280: 61 64 64 65 64 20 64 75 65 20 74 6f 20 61 20 6d  added due to a m
3290: 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  emory.** allocat
32a0: 69 6f 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 20  ion error.  The 
32b0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
32c0: 6e 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 62  n failure will b
32d0: 65 20 72 65 63 6f 72 64 65 64 20 69 6e 0a 2a 2a  e recorded in.**
32e0: 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   the db->mallocF
32f0: 61 69 6c 65 64 20 66 6c 61 67 20 73 6f 20 74 68  ailed flag so th
3300: 61 74 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20  at higher-level 
3310: 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 64 65  functions can de
3320: 74 65 63 74 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  tect it..**.** T
3330: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
3340: 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 73 69   increase the si
3350: 7a 65 20 6f 66 20 74 68 65 20 70 57 43 2d 3e 61  ze of the pWC->a
3360: 5b 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63 65  [] array as nece
3370: 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssary..**.** If 
3380: 74 68 65 20 77 74 46 6c 61 67 73 20 61 72 67 75  the wtFlags argu
3390: 6d 65 6e 74 20 69 6e 63 6c 75 64 65 73 20 54 45  ment includes TE
33a0: 52 4d 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e  RM_DYNAMIC, then
33b0: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a   responsibility.
33c0: 2a 2a 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74  ** for freeing t
33d0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20  he expression p 
33e0: 69 73 20 61 73 73 75 6d 65 64 20 62 79 20 74 68  is assumed by th
33f0: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62  e WhereClause ob
3400: 6a 65 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68 69  ject pWC..** Thi
3410: 73 20 69 73 20 74 72 75 65 20 65 76 65 6e 20 69  s is true even i
3420: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  f this routine f
3430: 61 69 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ails to allocate
3440: 20 61 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d   a new WhereTerm
3450: 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a  ..**.** WARNING:
3460: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
3470: 69 67 68 74 20 72 65 61 6c 6c 6f 63 61 74 65 20  ight reallocate 
3480: 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20 74  the space used t
3490: 6f 20 73 74 6f 72 65 0a 2a 2a 20 57 68 65 72 65  o store.** Where
34a0: 54 65 72 6d 73 2e 20 20 41 6c 6c 20 70 6f 69 6e  Terms.  All poin
34b0: 74 65 72 73 20 74 6f 20 57 68 65 72 65 54 65 72  ters to WhereTer
34c0: 6d 73 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76  ms should be inv
34d0: 61 6c 69 64 61 74 65 64 20 61 66 74 65 72 0a 2a  alidated after.*
34e0: 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  * calling this r
34f0: 6f 75 74 69 6e 65 2e 20 20 53 75 63 68 20 70 6f  outine.  Such po
3500: 69 6e 74 65 72 73 20 6d 61 79 20 62 65 20 72 65  inters may be re
3510: 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 72  initialized by r
3520: 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 74 68  eferencing.** th
3530: 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79  e pWC->a[] array
3540: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3550: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
3560: 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  t(WhereClause *p
3570: 57 43 2c 20 45 78 70 72 20 2a 70 2c 20 75 38 20  WC, Expr *p, u8 
3580: 77 74 46 6c 61 67 73 29 7b 0a 20 20 57 68 65 72  wtFlags){.  Wher
3590: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
35a0: 69 6e 74 20 69 64 78 3b 0a 20 20 74 65 73 74 63  int idx;.  testc
35b0: 61 73 65 28 20 77 74 46 6c 61 67 73 20 26 20 54  ase( wtFlags & T
35c0: 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 20  ERM_VIRTUAL );  
35d0: 2f 2a 20 45 56 3a 20 52 2d 30 30 32 31 31 2d 31  /* EV: R-00211-1
35e0: 35 31 30 30 20 2a 2f 0a 20 20 69 66 28 20 70 57  5100 */.  if( pW
35f0: 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e  C->nTerm>=pWC->n
3600: 53 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72  Slot ){.    Wher
3610: 65 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57  eTerm *pOld = pW
3620: 43 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69 74 65  C->a;.    sqlite
3630: 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 50 61  3 *db = pWC->pPa
3640: 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70 57 43  rse->db;.    pWC
3650: 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ->a = sqlite3DbM
3660: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
3670: 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70  eof(pWC->a[0])*p
3680: 57 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29 3b 0a 20  WC->nSlot*2 );. 
3690: 20 20 20 69 66 28 20 70 57 43 2d 3e 61 3d 3d 30     if( pWC->a==0
36a0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77 74   ){.      if( wt
36b0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e  Flags & TERM_DYN
36c0: 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 20 20  AMIC ){.        
36d0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
36e0: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  e(db, p);.      
36f0: 7d 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 20 3d  }.      pWC->a =
3700: 20 70 4f 6c 64 3b 0a 20 20 20 20 20 20 72 65 74   pOld;.      ret
3710: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
3720: 20 6d 65 6d 63 70 79 28 70 57 43 2d 3e 61 2c 20   memcpy(pWC->a, 
3730: 70 4f 6c 64 2c 20 73 69 7a 65 6f 66 28 70 57 43  pOld, sizeof(pWC
3740: 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 54 65  ->a[0])*pWC->nTe
3750: 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c  rm);.    if( pOl
3760: 64 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20  d!=pWC->aStatic 
3770: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
3780: 44 62 46 72 65 65 28 64 62 2c 20 70 4f 6c 64 29  DbFree(db, pOld)
3790: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 43 2d  ;.    }.    pWC-
37a0: 3e 6e 53 6c 6f 74 20 3d 20 73 71 6c 69 74 65 33  >nSlot = sqlite3
37b0: 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c  DbMallocSize(db,
37c0: 20 70 57 43 2d 3e 61 29 2f 73 69 7a 65 6f 66 28   pWC->a)/sizeof(
37d0: 70 57 43 2d 3e 61 5b 30 5d 29 3b 0a 20 20 7d 0a  pWC->a[0]);.  }.
37e0: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
37f0: 61 5b 69 64 78 20 3d 20 70 57 43 2d 3e 6e 54 65  a[idx = pWC->nTe
3800: 72 6d 2b 2b 5d 3b 0a 20 20 70 54 65 72 6d 2d 3e  rm++];.  pTerm->
3810: 70 45 78 70 72 20 3d 20 70 3b 0a 20 20 70 54 65  pExpr = p;.  pTe
3820: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 3d 20 77 74  rm->wtFlags = wt
3830: 46 6c 61 67 73 3b 0a 20 20 70 54 65 72 6d 2d 3e  Flags;.  pTerm->
3840: 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 54 65  pWC = pWC;.  pTe
3850: 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31  rm->iParent = -1
3860: 3b 0a 20 20 72 65 74 75 72 6e 20 69 64 78 3b 0a  ;.  return idx;.
3870: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
3880: 75 74 69 6e 65 20 69 64 65 6e 74 69 66 69 65 73  utine identifies
3890: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20   subexpressions 
38a0: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
38b0: 75 73 65 20 77 68 65 72 65 0a 2a 2a 20 65 61 63  use where.** eac
38c0: 68 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  h subexpression 
38d0: 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20  is separated by 
38e0: 74 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72  the AND operator
38f0: 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a   or some other.*
3900: 2a 20 6f 70 65 72 61 74 6f 72 20 73 70 65 63 69  * operator speci
3910: 66 69 65 64 20 69 6e 20 74 68 65 20 6f 70 20 70  fied in the op p
3920: 61 72 61 6d 65 74 65 72 2e 20 20 54 68 65 20 57  arameter.  The W
3930: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
3940: 74 75 72 65 0a 2a 2a 20 69 73 20 66 69 6c 6c 65  ture.** is fille
3950: 64 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20  d with pointers 
3960: 74 6f 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  to subexpression
3970: 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  s.  For example:
3980: 0a 2a 2a 0a 2a 2a 20 20 20 20 57 48 45 52 45 20  .**.**    WHERE 
3990: 20 61 3d 3d 27 68 65 6c 6c 6f 27 20 41 4e 44 20   a=='hello' AND 
39a0: 63 6f 61 6c 65 73 63 65 28 62 2c 31 31 29 3c 31  coalesce(b,11)<1
39b0: 30 20 41 4e 44 20 28 63 2b 31 32 21 3d 64 20 4f  0 AND (c+12!=d O
39c0: 52 20 63 3d 3d 32 32 29 0a 2a 2a 20 20 20 20 20  R c==22).**     
39d0: 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f        \________/
39e0: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
39f0: 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f  _____/     \____
3a00: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a  ____________/.**
3a10: 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74              slot
3a20: 5b 30 5d 20 20 20 20 20 20 20 20 20 20 20 20 73  [0]            s
3a30: 6c 6f 74 5b 31 5d 20 20 20 20 20 20 20 20 20 20  lot[1]          
3a40: 20 20 20 20 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a       slot[2].**.
3a50: 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** The original 
3a60: 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20  WHERE clause in 
3a70: 70 45 78 70 72 20 69 73 20 75 6e 61 6c 74 65 72  pExpr is unalter
3a80: 65 64 2e 20 20 41 6c 6c 20 74 68 69 73 20 72 6f  ed.  All this ro
3a90: 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 69 73  utine.** does is
3aa0: 20 6d 61 6b 65 20 73 6c 6f 74 5b 5d 20 65 6e 74   make slot[] ent
3ab0: 72 69 65 73 20 70 6f 69 6e 74 20 74 6f 20 73 75  ries point to su
3ac0: 62 73 74 72 75 63 74 75 72 65 20 77 69 74 68 69  bstructure withi
3ad0: 6e 20 70 45 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 49  n pExpr..**.** I
3ae0: 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  n the previous s
3af0: 65 6e 74 65 6e 63 65 20 61 6e 64 20 69 6e 20 74  entence and in t
3b00: 68 65 20 64 69 61 67 72 61 6d 2c 20 22 73 6c 6f  he diagram, "slo
3b10: 74 5b 5d 22 20 72 65 66 65 72 73 20 74 6f 0a 2a  t[]" refers to.*
3b20: 2a 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  * the WhereClaus
3b30: 65 2e 61 5b 5d 20 61 72 72 61 79 2e 20 20 54 68  e.a[] array.  Th
3b40: 65 20 73 6c 6f 74 5b 5d 20 61 72 72 61 79 20 67  e slot[] array g
3b50: 72 6f 77 73 20 61 73 20 6e 65 65 64 65 64 20 74  rows as needed t
3b60: 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c  o contain.** all
3b70: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
3b80: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73  ERE clause..*/.s
3b90: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
3ba0: 53 70 6c 69 74 28 57 68 65 72 65 43 6c 61 75 73  Split(WhereClaus
3bb0: 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 45  e *pWC, Expr *pE
3bc0: 78 70 72 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20  xpr, int op){.  
3bd0: 70 57 43 2d 3e 6f 70 20 3d 20 28 75 38 29 6f 70  pWC->op = (u8)op
3be0: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ;.  if( pExpr==0
3bf0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
3c00: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29   pExpr->op!=op )
3c10: 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73  {.    whereClaus
3c20: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 45 78  eInsert(pWC, pEx
3c30: 70 72 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  pr, 0);.  }else{
3c40: 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28  .    whereSplit(
3c50: 70 57 43 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  pWC, pExpr->pLef
3c60: 74 2c 20 6f 70 29 3b 0a 20 20 20 20 77 68 65 72  t, op);.    wher
3c70: 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70  eSplit(pWC, pExp
3c80: 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 29 3b 0a  r->pRight, op);.
3c90: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69    }.}../*.** Ini
3ca0: 74 69 61 6c 69 7a 65 20 61 6e 20 65 78 70 72 65  tialize an expre
3cb0: 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 28  ssion mask set (
3cc0: 61 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 6f  a WhereMaskSet o
3cd0: 62 6a 65 63 74 29 0a 2a 2f 0a 23 64 65 66 69 6e  bject).*/.#defin
3ce0: 65 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 50 29  e initMaskSet(P)
3cf0: 20 20 6d 65 6d 73 65 74 28 50 2c 20 30 2c 20 73    memset(P, 0, s
3d00: 69 7a 65 6f 66 28 2a 50 29 29 0a 0a 2f 2a 0a 2a  izeof(*P))../*.*
3d10: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62 69 74  * Return the bit
3d20: 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 67 69 76  mask for the giv
3d30: 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  en cursor number
3d40: 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 0a 2a  .  Return 0 if.*
3d50: 2a 20 69 43 75 72 73 6f 72 20 69 73 20 6e 6f 74  * iCursor is not
3d60: 20 69 6e 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a   in the set..*/.
3d70: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 67  static Bitmask g
3d80: 65 74 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b  etMask(WhereMask
3d90: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69  Set *pMaskSet, i
3da0: 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 69  nt iCursor){.  i
3db0: 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
3dc0: 70 4d 61 73 6b 53 65 74 2d 3e 6e 3c 3d 73 69 7a  pMaskSet->n<=siz
3dd0: 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29  eof(Bitmask)*8 )
3de0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
3df0: 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29  MaskSet->n; i++)
3e00: 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73 6b 53  {.    if( pMaskS
3e10: 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73  et->ix[i]==iCurs
3e20: 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  or ){.      retu
3e30: 72 6e 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c  rn ((Bitmask)1)<
3e40: 3c 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  <i;.    }.  }.  
3e50: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
3e60: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
3e70: 6d 61 73 6b 20 66 6f 72 20 63 75 72 73 6f 72 20  mask for cursor 
3e80: 69 43 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  iCursor..**.** T
3e90: 68 65 72 65 20 69 73 20 6f 6e 65 20 63 75 72 73  here is one curs
3ea0: 6f 72 20 70 65 72 20 74 61 62 6c 65 20 69 6e 20  or per table in 
3eb0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
3ec0: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a    The number of.
3ed0: 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ** tables in the
3ee0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
3ef0: 6c 69 6d 69 74 65 64 20 62 79 20 61 20 74 65 73  limited by a tes
3f00: 74 20 65 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a  t early in the.*
3f10: 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  * sqlite3WhereBe
3f20: 67 69 6e 28 29 20 72 6f 75 74 69 6e 65 2e 20 20  gin() routine.  
3f30: 53 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  So we know that 
3f40: 74 68 65 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78  the pMaskSet->ix
3f50: 5b 5d 0a 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c  [].** array will
3f60: 20 6e 65 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e   never overflow.
3f70: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3f80: 63 72 65 61 74 65 4d 61 73 6b 28 57 68 65 72 65  createMask(Where
3f90: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
3fa0: 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b  t, int iCursor){
3fb0: 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b  .  assert( pMask
3fc0: 53 65 74 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69  Set->n < ArraySi
3fd0: 7a 65 28 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29  ze(pMaskSet->ix)
3fe0: 20 29 3b 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e   );.  pMaskSet->
3ff0: 69 78 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b  ix[pMaskSet->n++
4000: 5d 20 3d 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a  ] = iCursor;.}..
4010: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4020: 6e 65 20 77 61 6c 6b 73 20 28 72 65 63 75 72 73  ne walks (recurs
4030: 69 76 65 6c 79 29 20 61 6e 20 65 78 70 72 65 73  ively) an expres
4040: 73 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 67 65  sion tree and ge
4050: 6e 65 72 61 74 65 73 0a 2a 2a 20 61 20 62 69 74  nerates.** a bit
4060: 6d 61 73 6b 20 69 6e 64 69 63 61 74 69 6e 67 20  mask indicating 
4070: 77 68 69 63 68 20 74 61 62 6c 65 73 20 61 72 65  which tables are
4080: 20 75 73 65 64 20 69 6e 20 74 68 61 74 20 65 78   used in that ex
4090: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65  pression.** tree
40a0: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72  ..**.** In order
40b0: 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e   for this routin
40c0: 65 20 74 6f 20 77 6f 72 6b 2c 20 74 68 65 20 63  e to work, the c
40d0: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
40e0: 6d 75 73 74 20 68 61 76 65 0a 2a 2a 20 70 72 65  must have.** pre
40f0: 76 69 6f 75 73 6c 79 20 69 6e 76 6f 6b 65 64 20  viously invoked 
4100: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
4110: 70 72 4e 61 6d 65 73 28 29 20 6f 6e 20 74 68 65  prNames() on the
4120: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 53 65   expression.  Se
4130: 65 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20  e.** the header 
4140: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20  comment on that 
4150: 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69  routine for addi
4160: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
4170: 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  on..** The sqlit
4180: 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d  e3ResolveExprNam
4190: 65 73 28 29 20 72 6f 75 74 69 6e 65 73 20 6c 6f  es() routines lo
41a0: 6f 6b 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e  oks for column n
41b0: 61 6d 65 73 20 61 6e 64 0a 2a 2a 20 73 65 74 73  ames and.** sets
41c0: 20 74 68 65 69 72 20 6f 70 63 6f 64 65 73 20 74   their opcodes t
41d0: 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20  o TK_COLUMN and 
41e0: 74 68 65 69 72 20 45 78 70 72 2e 69 54 61 62 6c  their Expr.iTabl
41f0: 65 20 66 69 65 6c 64 73 20 74 6f 0a 2a 2a 20 74  e fields to.** t
4200: 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  he VDBE cursor n
4210: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 61 62  umber of the tab
4220: 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  le.  This routin
4230: 65 20 6a 75 73 74 20 68 61 73 20 74 6f 0a 2a 2a  e just has to.**
4240: 20 74 72 61 6e 73 6c 61 74 65 20 74 68 65 20 63   translate the c
4250: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e  ursor numbers in
4260: 74 6f 20 62 69 74 6d 61 73 6b 20 76 61 6c 75 65  to bitmask value
4270: 73 20 61 6e 64 20 4f 52 20 61 6c 6c 0a 2a 2a 20  s and OR all.** 
4280: 74 68 65 20 62 69 74 6d 61 73 6b 73 20 74 6f 67  the bitmasks tog
4290: 65 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  ether..*/.static
42a0: 20 42 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73   Bitmask exprLis
42b0: 74 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72  tTableUsage(Wher
42c0: 65 4d 61 73 6b 53 65 74 2a 2c 20 45 78 70 72 4c  eMaskSet*, ExprL
42d0: 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 42 69  ist*);.static Bi
42e0: 74 6d 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74  tmask exprSelect
42f0: 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65  TableUsage(Where
4300: 4d 61 73 6b 53 65 74 2a 2c 20 53 65 6c 65 63 74  MaskSet*, Select
4310: 2a 29 3b 0a 73 74 61 74 69 63 20 42 69 74 6d 61  *);.static Bitma
4320: 73 6b 20 65 78 70 72 54 61 62 6c 65 55 73 61 67  sk exprTableUsag
4330: 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a  e(WhereMaskSet *
4340: 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 20 2a  pMaskSet, Expr *
4350: 70 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61  p){.  Bitmask ma
4360: 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 3d  sk = 0;.  if( p=
4370: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
4380: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
4390: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 6d 61 73  OLUMN ){.    mas
43a0: 6b 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73  k = getMask(pMas
43b0: 6b 53 65 74 2c 20 70 2d 3e 69 54 61 62 6c 65 29  kSet, p->iTable)
43c0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 61 73  ;.    return mas
43d0: 6b 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b 20 3d 20  k;.  }.  mask = 
43e0: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
43f0: 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 52 69 67  MaskSet, p->pRig
4400: 68 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20 65  ht);.  mask |= e
4410: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
4420: 61 73 6b 53 65 74 2c 20 70 2d 3e 70 4c 65 66 74  askSet, p->pLeft
4430: 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  );.  if( ExprHas
4440: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
4450: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
4460: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c   mask |= exprSel
4470: 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  ectTableUsage(pM
4480: 61 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 53 65  askSet, p->x.pSe
4490: 6c 65 63 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  lect);.  }else{.
44a0: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
44b0: 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70  ListTableUsage(p
44c0: 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 4c  MaskSet, p->x.pL
44d0: 69 73 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ist);.  }.  retu
44e0: 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69  rn mask;.}.stati
44f0: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 4c 69  c Bitmask exprLi
4500: 73 74 54 61 62 6c 65 55 73 61 67 65 28 57 68 65  stTableUsage(Whe
4510: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
4520: 53 65 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  Set, ExprList *p
4530: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
4540: 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d    Bitmask mask =
4550: 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   0;.  if( pList 
4560: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
4570: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
4580: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6d 61 73 6b  i++){.      mask
4590: 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61   |= exprTableUsa
45a0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69  ge(pMaskSet, pLi
45b0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
45c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
45d0: 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74  urn mask;.}.stat
45e0: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 53  ic Bitmask exprS
45f0: 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28  electTableUsage(
4600: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
4610: 61 73 6b 53 65 74 2c 20 53 65 6c 65 63 74 20 2a  askSet, Select *
4620: 70 53 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  pS){.  Bitmask m
4630: 61 73 6b 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  ask = 0;.  while
4640: 28 20 70 53 20 29 7b 0a 20 20 20 20 6d 61 73 6b  ( pS ){.    mask
4650: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
4660: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
4670: 20 70 53 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20   pS->pEList);.  
4680: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
4690: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
46a0: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 47 72 6f 75  skSet, pS->pGrou
46b0: 70 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  pBy);.    mask |
46c0: 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  = exprListTableU
46d0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
46e0: 53 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  S->pOrderBy);.  
46f0: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61    mask |= exprTa
4700: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
4710: 74 2c 20 70 53 2d 3e 70 57 68 65 72 65 29 3b 0a  t, pS->pWhere);.
4720: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
4730: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
4740: 53 65 74 2c 20 70 53 2d 3e 70 48 61 76 69 6e 67  Set, pS->pHaving
4750: 29 3b 0a 20 20 20 20 70 53 20 3d 20 70 53 2d 3e  );.    pS = pS->
4760: 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65  pPrior;.  }.  re
4770: 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a  turn mask;.}../*
4780: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
4790: 69 66 20 74 68 65 20 67 69 76 65 6e 20 6f 70 65  if the given ope
47a0: 72 61 74 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20  rator is one of 
47b0: 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 74 68  the operators th
47c0: 61 74 20 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64  at is.** allowed
47d0: 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 61 62 6c   for an indexabl
47e0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
47f0: 65 72 6d 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65  erm.  The allowe
4800: 64 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 0a  d operators are.
4810: 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22  ** "=", "<", ">"
4820: 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22 2c 20 61 6e  , "<=", ">=", an
4830: 64 20 22 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 49 4d  d "IN"..**.** IM
4840: 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
4850: 20 52 2d 35 39 39 32 36 2d 32 36 33 39 33 20 54   R-59926-26393 T
4860: 6f 20 62 65 20 75 73 61 62 6c 65 20 62 79 20 61  o be usable by a
4870: 6e 20 69 6e 64 65 78 20 61 20 74 65 72 6d 20 6d  n index a term m
4880: 75 73 74 20 62 65 0a 2a 2a 20 6f 66 20 6f 6e 65  ust be.** of one
4890: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
48a0: 67 20 66 6f 72 6d 73 3a 20 63 6f 6c 75 6d 6e 20  g forms: column 
48b0: 3d 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c  = expression col
48c0: 75 6d 6e 20 3e 20 65 78 70 72 65 73 73 69 6f 6e  umn > expression
48d0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 3e 3d 20 65 78  .** column >= ex
48e0: 70 72 65 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e 20  pression column 
48f0: 3c 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c  < expression col
4900: 75 6d 6e 20 3c 3d 20 65 78 70 72 65 73 73 69 6f  umn <= expressio
4910: 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
4920: 3d 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73  = column express
4930: 69 6f 6e 20 3e 20 63 6f 6c 75 6d 6e 20 65 78 70  ion > column exp
4940: 72 65 73 73 69 6f 6e 20 3e 3d 20 63 6f 6c 75 6d  ression >= colum
4950: 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
4960: 3c 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73  < column express
4970: 69 6f 6e 20 3c 3d 20 63 6f 6c 75 6d 6e 20 63 6f  ion <= column co
4980: 6c 75 6d 6e 20 49 4e 0a 2a 2a 20 28 65 78 70 72  lumn IN.** (expr
4990: 65 73 73 69 6f 6e 2d 6c 69 73 74 29 20 63 6f 6c  ession-list) col
49a0: 75 6d 6e 20 49 4e 20 28 73 75 62 71 75 65 72 79  umn IN (subquery
49b0: 29 20 63 6f 6c 75 6d 6e 20 49 53 20 4e 55 4c 4c  ) column IS NULL
49c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
49d0: 6c 6c 6f 77 65 64 4f 70 28 69 6e 74 20 6f 70 29  llowedOp(int op)
49e0: 7b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47  {.  assert( TK_G
49f0: 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54  T>TK_EQ && TK_GT
4a00: 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65  <TK_GE );.  asse
4a10: 72 74 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20  rt( TK_LT>TK_EQ 
4a20: 26 26 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29  && TK_LT<TK_GE )
4a30: 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c  ;.  assert( TK_L
4a40: 45 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45  E>TK_EQ && TK_LE
4a50: 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65  <TK_GE );.  asse
4a60: 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51  rt( TK_GE==TK_EQ
4a70: 2b 34 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f  +4 );.  return o
4a80: 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e  p==TK_IN || (op>
4a90: 3d 54 4b 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b  =TK_EQ && op<=TK
4aa0: 5f 47 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49  _GE) || op==TK_I
4ab0: 53 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  SNULL;.}../*.** 
4ac0: 53 77 61 70 20 74 77 6f 20 6f 62 6a 65 63 74 73  Swap two objects
4ad0: 20 6f 66 20 74 79 70 65 20 54 59 50 45 2e 0a 2a   of type TYPE..*
4ae0: 2f 0a 23 64 65 66 69 6e 65 20 53 57 41 50 28 54  /.#define SWAP(T
4af0: 59 50 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74  YPE,A,B) {TYPE t
4b00: 3d 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a  =A; A=B; B=t;}..
4b10: 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20  /*.** Commute a 
4b20: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
4b30: 74 6f 72 2e 20 20 45 78 70 72 65 73 73 69 6f 6e  tor.  Expression
4b40: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58  s of the form "X
4b50: 20 6f 70 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f   op Y".** are co
4b60: 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 22 59 20  nverted into "Y 
4b70: 6f 70 20 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  op X"..**.** If 
4b80: 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  a collation sequ
4b90: 65 6e 63 65 20 69 73 20 61 73 73 6f 63 69 61 74  ence is associat
4ba0: 65 64 20 77 69 74 68 20 65 69 74 68 65 72 20 74  ed with either t
4bb0: 68 65 20 6c 65 66 74 20 6f 72 20 72 69 67 68 74  he left or right
4bc0: 0a 2a 2a 20 73 69 64 65 20 6f 66 20 74 68 65 20  .** side of the 
4bd0: 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 69 74 20 72  comparison, it r
4be0: 65 6d 61 69 6e 73 20 61 73 73 6f 63 69 61 74 65  emains associate
4bf0: 64 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  d with the same 
4c00: 73 69 64 65 20 61 66 74 65 72 0a 2a 2a 20 74 68  side after.** th
4c10: 65 20 63 6f 6d 6d 75 74 61 74 69 6f 6e 2e 20 53  e commutation. S
4c20: 6f 20 22 59 20 63 6f 6c 6c 61 74 65 20 4e 4f 43  o "Y collate NOC
4c30: 41 53 45 20 6f 70 20 58 22 20 62 65 63 6f 6d 65  ASE op X" become
4c40: 73 20 0a 2a 2a 20 22 58 20 63 6f 6c 6c 61 74 65  s .** "X collate
4c50: 20 4e 4f 43 41 53 45 20 6f 70 20 59 22 2e 20 54   NOCASE op Y". T
4c60: 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 61  his is because a
4c70: 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ny collation seq
4c80: 75 65 6e 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20  uence on.** the 
4c90: 6c 65 66 74 20 68 61 6e 64 20 73 69 64 65 20 6f  left hand side o
4ca0: 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  f a comparison o
4cb0: 76 65 72 72 69 64 65 73 20 61 6e 79 20 63 6f 6c  verrides any col
4cc0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
4cd0: 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 74 6f 20  .** attached to 
4ce0: 74 68 65 20 72 69 67 68 74 2e 20 46 6f 72 20 74  the right. For t
4cf0: 68 65 20 73 61 6d 65 20 72 65 61 73 6f 6e 20 74  he same reason t
4d00: 68 65 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65  he EP_ExpCollate
4d10: 20 66 6c 61 67 0a 2a 2a 20 69 73 20 6e 6f 74 20   flag.** is not 
4d20: 63 6f 6d 6d 75 74 65 64 2e 0a 2a 2f 0a 73 74 61  commuted..*/.sta
4d30: 74 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 6d  tic void exprCom
4d40: 6d 75 74 65 28 50 61 72 73 65 20 2a 70 50 61 72  mute(Parse *pPar
4d50: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
4d60: 7b 0a 20 20 75 31 36 20 65 78 70 52 69 67 68 74  {.  u16 expRight
4d70: 20 3d 20 28 70 45 78 70 72 2d 3e 70 52 69 67 68   = (pExpr->pRigh
4d80: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  t->flags & EP_Ex
4d90: 70 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 75 31 36  pCollate);.  u16
4da0: 20 65 78 70 4c 65 66 74 20 3d 20 28 70 45 78 70   expLeft = (pExp
4db0: 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  r->pLeft->flags 
4dc0: 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29  & EP_ExpCollate)
4dd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f  ;.  assert( allo
4de0: 77 65 64 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29  wedOp(pExpr->op)
4df0: 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54   && pExpr->op!=T
4e00: 4b 5f 49 4e 20 29 3b 0a 20 20 70 45 78 70 72 2d  K_IN );.  pExpr-
4e10: 3e 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 20 3d  >pRight->pColl =
4e20: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
4e30: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
4e40: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70 45  r->pRight);.  pE
4e50: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c  xpr->pLeft->pCol
4e60: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
4e70: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
4e80: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
4e90: 53 57 41 50 28 43 6f 6c 6c 53 65 71 2a 2c 70 45  SWAP(CollSeq*,pE
4ea0: 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 70 43 6f  xpr->pRight->pCo
4eb0: 6c 6c 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  ll,pExpr->pLeft-
4ec0: 3e 70 43 6f 6c 6c 29 3b 0a 20 20 70 45 78 70 72  >pColl);.  pExpr
4ed0: 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20  ->pRight->flags 
4ee0: 3d 20 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  = (pExpr->pRight
4ef0: 2d 3e 66 6c 61 67 73 20 26 20 7e 45 50 5f 45 78  ->flags & ~EP_Ex
4f00: 70 43 6f 6c 6c 61 74 65 29 20 7c 20 65 78 70 4c  pCollate) | expL
4f10: 65 66 74 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c  eft;.  pExpr->pL
4f20: 65 66 74 2d 3e 66 6c 61 67 73 20 3d 20 28 70 45  eft->flags = (pE
4f30: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  xpr->pLeft->flag
4f40: 73 20 26 20 7e 45 50 5f 45 78 70 43 6f 6c 6c 61  s & ~EP_ExpColla
4f50: 74 65 29 20 7c 20 65 78 70 52 69 67 68 74 3b 0a  te) | expRight;.
4f60: 20 20 53 57 41 50 28 45 78 70 72 2a 2c 70 45 78    SWAP(Expr*,pEx
4f70: 70 72 2d 3e 70 52 69 67 68 74 2c 70 45 78 70 72  pr->pRight,pExpr
4f80: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
4f90: 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54  pExpr->op>=TK_GT
4fa0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
4fb0: 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29  TK_LT==TK_GT+2 )
4fc0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b  ;.    assert( TK
4fd0: 5f 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a  _GE==TK_LE+2 );.
4fe0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
4ff0: 54 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61  T>TK_EQ );.    a
5000: 73 73 65 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f  ssert( TK_GT<TK_
5010: 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  LE );.    assert
5020: 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f  ( pExpr->op>=TK_
5030: 47 54 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c  GT && pExpr->op<
5040: 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 70 45  =TK_GE );.    pE
5050: 78 70 72 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70  xpr->op = ((pExp
5060: 72 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b  r->op-TK_GT)^2)+
5070: 54 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TK_GT;.  }.}../*
5080: 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72  .** Translate fr
5090: 6f 6d 20 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f  om TK_xx operato
50a0: 72 20 74 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61  r to WO_xx bitma
50b0: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31  sk..*/.static u1
50c0: 36 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 69  6 operatorMask(i
50d0: 6e 74 20 6f 70 29 7b 0a 20 20 75 31 36 20 63 3b  nt op){.  u16 c;
50e0: 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77  .  assert( allow
50f0: 65 64 4f 70 28 6f 70 29 20 29 3b 0a 20 20 69 66  edOp(op) );.  if
5100: 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20  ( op==TK_IN ){. 
5110: 20 20 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20     c = WO_IN;.  
5120: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
5130: 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63  _ISNULL ){.    c
5140: 20 3d 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20   = WO_ISNULL;.  
5150: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
5160: 74 28 20 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54  t( (WO_EQ<<(op-T
5170: 4b 5f 45 51 29 29 20 3c 20 30 78 37 66 66 66 20  K_EQ)) < 0x7fff 
5180: 29 3b 0a 20 20 20 20 63 20 3d 20 28 75 31 36 29  );.    c = (u16)
5190: 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45  (WO_EQ<<(op-TK_E
51a0: 51 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  Q));.  }.  asser
51b0: 74 28 20 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c  t( op!=TK_ISNULL
51c0: 20 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c   || c==WO_ISNULL
51d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
51e0: 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f  !=TK_IN || c==WO
51f0: 5f 49 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _IN );.  assert(
5200: 20 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d   op!=TK_EQ || c=
5210: 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 61 73 73 65  =WO_EQ );.  asse
5220: 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c  rt( op!=TK_LT ||
5230: 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61   c==WO_LT );.  a
5240: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45  ssert( op!=TK_LE
5250: 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a   || c==WO_LE );.
5260: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
5270: 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20  _GT || c==WO_GT 
5280: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
5290: 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_GE || c==WO_
52a0: 47 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 63  GE );.  return c
52b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
52c0: 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e 20  h for a term in 
52d0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
52e0: 20 74 68 61 74 20 69 73 20 6f 66 20 74 68 65 20   that is of the 
52f0: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78  form "X <op> <ex
5300: 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58 20  pr>".** where X 
5310: 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  is a reference t
5320: 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66  o the iColumn of
5330: 20 74 61 62 6c 65 20 69 43 75 72 20 61 6e 64 20   table iCur and 
5340: 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 0a 2a  <op> is one of.*
5350: 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f 70 65 72  * the WO_xx oper
5360: 61 74 6f 72 20 63 6f 64 65 73 20 73 70 65 63 69  ator codes speci
5370: 66 69 65 64 20 62 79 20 74 68 65 20 6f 70 20 70  fied by the op p
5380: 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52 65 74  arameter..** Ret
5390: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
53a0: 20 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74 75   the term.  Retu
53b0: 72 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e  rn 0 if not foun
53c0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65  d..*/.static Whe
53d0: 72 65 54 65 72 6d 20 2a 66 69 6e 64 54 65 72 6d  reTerm *findTerm
53e0: 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  (.  WhereClause 
53f0: 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68 65  *pWC,     /* The
5400: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
5410: 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a   be searched */.
5420: 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20    int iCur,     
5430: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
5440: 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20  r number of LHS 
5450: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
5460: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ,          /* Co
5470: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 4c  lumn number of L
5480: 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  HS */.  Bitmask 
5490: 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f 2a  notReady,     /*
54a0: 20 52 48 53 20 6d 75 73 74 20 6e 6f 74 20 6f 76   RHS must not ov
54b0: 65 72 6c 61 70 20 77 69 74 68 20 74 68 69 73 20  erlap with this 
54c0: 6d 61 73 6b 20 2a 2f 0a 20 20 75 33 32 20 6f 70  mask */.  u32 op
54d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
54e0: 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f 5f 78 78  /* Mask of WO_xx
54f0: 20 76 61 6c 75 65 73 20 64 65 73 63 72 69 62 69   values describi
5500: 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  ng operator */. 
5510: 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20   Index *pIdx    
5520: 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62         /* Must b
5530: 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  e compatible wit
5540: 68 20 74 68 69 73 20 69 6e 64 65 78 2c 20 69 66  h this index, if
5550: 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a   not NULL */.){.
5560: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
5570: 72 6d 3b 0a 20 20 69 6e 74 20 6b 3b 0a 20 20 61  rm;.  int k;.  a
5580: 73 73 65 72 74 28 20 69 43 75 72 3e 3d 30 20 29  ssert( iCur>=0 )
5590: 3b 0a 20 20 6f 70 20 26 3d 20 57 4f 5f 41 4c 4c  ;.  op &= WO_ALL
55a0: 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  ;.  for(pTerm=pW
55b0: 43 2d 3e 61 2c 20 6b 3d 70 57 43 2d 3e 6e 54 65  C->a, k=pWC->nTe
55c0: 72 6d 3b 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72  rm; k; k--, pTer
55d0: 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54  m++){.    if( pT
55e0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
55f0: 3d 69 43 75 72 0a 20 20 20 20 20 20 20 26 26 20  =iCur.       && 
5600: 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
5610: 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 3d  ght & notReady)=
5620: 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 54 65  =0.       && pTe
5630: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
5640: 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20  ==iColumn.      
5650: 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65   && (pTerm->eOpe
5660: 72 61 74 6f 72 20 26 20 6f 70 29 21 3d 30 0a 20  rator & op)!=0. 
5670: 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20     ){.      if( 
5680: 70 49 64 78 20 26 26 20 70 54 65 72 6d 2d 3e 65  pIdx && pTerm->e
5690: 4f 70 65 72 61 74 6f 72 21 3d 57 4f 5f 49 53 4e  Operator!=WO_ISN
56a0: 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 45  ULL ){.        E
56b0: 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
56c0: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
56d0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
56e0: 20 20 20 20 20 20 20 20 63 68 61 72 20 69 64 78          char idx
56f0: 61 66 66 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  aff;.        int
5700: 20 6a 3b 0a 20 20 20 20 20 20 20 20 50 61 72 73   j;.        Pars
5710: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d  e *pParse = pWC-
5720: 3e 70 50 61 72 73 65 3b 0a 0a 20 20 20 20 20 20  >pParse;..      
5730: 20 20 69 64 78 61 66 66 20 3d 20 70 49 64 78 2d    idxaff = pIdx-
5740: 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43  >pTable->aCol[iC
5750: 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b  olumn].affinity;
5760: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71  .        if( !sq
5770: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
5780: 74 79 4f 6b 28 70 58 2c 20 69 64 78 61 66 66 29  tyOk(pX, idxaff)
5790: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
57a0: 20 20 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20        /* Figure 
57b0: 6f 75 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  out the collatio
57c0: 6e 20 73 65 71 75 65 6e 63 65 20 72 65 71 75 69  n sequence requi
57d0: 72 65 64 20 66 72 6f 6d 20 61 6e 20 69 6e 64 65  red from an inde
57e0: 78 20 66 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a  x for.        **
57f0: 20 69 74 20 74 6f 20 62 65 20 75 73 65 66 75 6c   it to be useful
5800: 20 66 6f 72 20 6f 70 74 69 6d 69 73 69 6e 67 20   for optimising 
5810: 65 78 70 72 65 73 73 69 6f 6e 20 70 58 2e 20 53  expression pX. S
5820: 74 6f 72 65 20 74 68 69 73 0a 20 20 20 20 20 20  tore this.      
5830: 20 20 2a 2a 20 76 61 6c 75 65 20 69 6e 20 76 61    ** value in va
5840: 72 69 61 62 6c 65 20 70 43 6f 6c 6c 2e 0a 20 20  riable pColl..  
5850: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
5860: 20 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65 66   assert(pX->pLef
5870: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  t);.        pCol
5880: 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  l = sqlite3Binar
5890: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
58a0: 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66  pParse, pX->pLef
58b0: 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a  t, pX->pRight);.
58c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70          assert(p
58d0: 43 6f 6c 6c 20 7c 7c 20 70 50 61 72 73 65 2d 3e  Coll || pParse->
58e0: 6e 45 72 72 29 3b 0a 0a 20 20 20 20 20 20 20 20  nErr);..        
58f0: 66 6f 72 28 6a 3d 30 3b 20 70 49 64 78 2d 3e 61  for(j=0; pIdx->a
5900: 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c  iColumn[j]!=iCol
5910: 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  umn; j++){.     
5920: 20 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 6a       if( NEVER(j
5930: 3e 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29  >=pIdx->nColumn)
5940: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
5950: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
5960: 66 28 20 70 43 6f 6c 6c 20 26 26 20 73 71 6c 69  f( pColl && sqli
5970: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c  te3StrICmp(pColl
5980: 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61  ->zName, pIdx->a
5990: 7a 43 6f 6c 6c 5b 6a 5d 29 20 29 20 63 6f 6e 74  zColl[j]) ) cont
59a0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
59b0: 20 20 20 20 72 65 74 75 72 6e 20 70 54 65 72 6d      return pTerm
59c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
59d0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f  turn 0;.}../* Fo
59e0: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
59f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
5a00: 78 70 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c 69  xprAnalyze(SrcLi
5a10: 73 74 2a 2c 20 57 68 65 72 65 43 6c 61 75 73 65  st*, WhereClause
5a20: 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *, int);../*.** 
5a30: 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c 79 7a 65  Call exprAnalyze
5a40: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 69 6e   on all terms in
5a50: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
5a60: 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74    .**.**.*/.stat
5a70: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
5a80: 79 7a 65 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73  yzeAll(.  SrcLis
5a90: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20  t *pTabList,    
5aa0: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
5ab0: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
5ac0: 43 6c 61 75 73 65 20 2a 70 57 43 20 20 20 20 20  Clause *pWC     
5ad0: 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45      /* the WHERE
5ae0: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 61 6e   clause to be an
5af0: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69  alyzed */.){.  i
5b00: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57  nt i;.  for(i=pW
5b10: 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30  C->nTerm-1; i>=0
5b20: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72  ; i--){.    expr
5b30: 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74  Analyze(pTabList
5b40: 2c 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d  , pWC, i);.  }.}
5b50: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
5b60: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
5b70: 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68  IZATION./*.** Ch
5b80: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
5b90: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
5ba0: 6f 6e 20 69 73 20 61 20 4c 49 4b 45 20 6f 72 20  on is a LIKE or 
5bb0: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 74 68  GLOB operator th
5bc0: 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74  at.** can be opt
5bd0: 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 69 6e 65  imized using ine
5be0: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
5bf0: 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55  nts.  Return TRU
5c00: 45 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f  E if it is.** so
5c10: 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f   and false if no
5c20: 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65  t..**.** In orde
5c30: 72 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74  r for the operat
5c40: 6f 72 20 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a  or to be optimiz
5c50: 69 62 6c 65 2c 20 74 68 65 20 52 48 53 20 6d 75  ible, the RHS mu
5c60: 73 74 20 62 65 20 61 20 73 74 72 69 6e 67 0a 2a  st be a string.*
5c70: 2a 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 64  * literal that d
5c80: 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69  oes not begin wi
5c90: 74 68 20 61 20 77 69 6c 64 63 61 72 64 2e 20 20  th a wildcard.  
5ca0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
5cb0: 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50  sLikeOrGlob(.  P
5cc0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
5cd0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
5ce0: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
5cf0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
5d00: 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f  r *pExpr,      /
5d10: 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70 72  * Test this expr
5d20: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ession */.  Expr
5d30: 20 2a 2a 70 70 50 72 65 66 69 78 2c 20 20 2f 2a   **ppPrefix,  /*
5d40: 20 50 6f 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53   Pointer to TK_S
5d50: 54 52 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e  TRING expression
5d60: 20 77 69 74 68 20 70 61 74 74 65 72 6e 20 70 72   with pattern pr
5d70: 65 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  efix */.  int *p
5d80: 69 73 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54  isComplete, /* T
5d90: 72 75 65 20 69 66 20 74 68 65 20 6f 6e 6c 79 20  rue if the only 
5da0: 77 69 6c 64 63 61 72 64 20 69 73 20 25 20 69 6e  wildcard is % in
5db0: 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61 63   the last charac
5dc0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ter */.  int *pn
5dd0: 6f 43 61 73 65 20 20 20 20 20 20 2f 2a 20 54 72  oCase      /* Tr
5de0: 75 65 20 69 66 20 75 70 70 65 72 63 61 73 65 20  ue if uppercase 
5df0: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
5e00: 20 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b   lowercase */.){
5e10: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5e20: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
5e30: 20 53 74 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f   String on RHS o
5e40: 66 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20  f LIKE operator 
5e50: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  */.  Expr *pRigh
5e60: 74 2c 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  t, *pLeft;      
5e70: 2f 2a 20 52 69 67 68 74 20 61 6e 64 20 6c 65 66  /* Right and lef
5e80: 74 20 73 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f  t size of LIKE o
5e90: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70  perator */.  Exp
5ea0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20  rList *pList;   
5eb0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
5ec0: 6f 66 20 6f 70 65 72 61 6e 64 73 20 74 6f 20 74  of operands to t
5ed0: 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  he LIKE operator
5ee0: 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20 20   */.  int c;    
5ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f00: 20 2f 2a 20 4f 6e 65 20 63 68 61 72 61 63 74 65   /* One characte
5f10: 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e  r in z[] */.  in
5f20: 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20  t cnt;          
5f30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5f40: 65 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61  er of non-wildca
5f50: 72 64 20 70 72 65 66 69 78 20 63 68 61 72 61 63  rd prefix charac
5f60: 74 65 72 73 20 2a 2f 0a 20 20 63 68 61 72 20 77  ters */.  char w
5f70: 63 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20  c[3];           
5f80: 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64       /* Wildcard
5f90: 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20   characters */. 
5fa0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
5fb0: 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44  Parse->db;  /* D
5fc0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
5fd0: 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  on */.  sqlite3_
5fe0: 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b  value *pVal = 0;
5ff0: 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
6000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6010: 20 4f 70 63 6f 64 65 20 6f 66 20 70 52 69 67 68   Opcode of pRigh
6020: 74 20 2a 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c  t */..  if( !sql
6030: 69 74 65 33 49 73 4c 69 6b 65 46 75 6e 63 74 69  ite3IsLikeFuncti
6040: 6f 6e 28 64 62 2c 20 70 45 78 70 72 2c 20 70 6e  on(db, pExpr, pn
6050: 6f 43 61 73 65 2c 20 77 63 29 20 29 7b 0a 20 20  oCase, wc) ){.  
6060: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
6070: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 42  #ifdef SQLITE_EB
6080: 43 44 49 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43  CDIC.  if( *pnoC
6090: 61 73 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ase ) return 0;.
60a0: 23 65 6e 64 69 66 0a 20 20 70 4c 69 73 74 20 3d  #endif.  pList =
60b0: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
60c0: 0a 20 20 70 4c 65 66 74 20 3d 20 70 4c 69 73 74  .  pLeft = pList
60d0: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
60e0: 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54  if( pLeft->op!=T
60f0: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 73 71 6c 69  K_COLUMN || sqli
6100: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
6110: 70 4c 65 66 74 29 21 3d 53 51 4c 49 54 45 5f 41  pLeft)!=SQLITE_A
6120: 46 46 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 2f  FF_TEXT ){.    /
6130: 2a 20 49 4d 50 3a 20 52 2d 30 32 30 36 35 2d 34  * IMP: R-02065-4
6140: 39 34 36 35 20 54 68 65 20 6c 65 66 74 2d 68 61  9465 The left-ha
6150: 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 4c  nd side of the L
6160: 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72  IKE or GLOB oper
6170: 61 74 6f 72 20 6d 75 73 74 0a 20 20 20 20 2a 2a  ator must.    **
6180: 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   be the name of 
6190: 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d  an indexed colum
61a0: 6e 20 77 69 74 68 20 54 45 58 54 20 61 66 66 69  n with TEXT affi
61b0: 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74  nity. */.    ret
61c0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 0;.  }.  ass
61d0: 65 72 74 28 20 70 4c 65 66 74 2d 3e 69 43 6f 6c  ert( pLeft->iCol
61e0: 75 6d 6e 21 3d 28 2d 31 29 20 29 3b 20 2f 2a 20  umn!=(-1) ); /* 
61f0: 42 65 63 61 75 73 65 20 49 50 4b 20 6e 65 76 65  Because IPK neve
6200: 72 20 68 61 73 20 41 46 46 5f 54 45 58 54 20 2a  r has AFF_TEXT *
6210: 2f 0a 0a 20 20 70 52 69 67 68 74 20 3d 20 70 4c  /..  pRight = pL
6220: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
6230: 0a 20 20 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e  .  op = pRight->
6240: 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  op;.  if( op==TK
6250: 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20  _REGISTER ){.   
6260: 20 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e 6f 70   op = pRight->op
6270: 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d  2;.  }.  if( op=
6280: 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a  =TK_VARIABLE ){.
6290: 20 20 20 20 56 64 62 65 20 2a 70 52 65 70 72 65      Vdbe *pRepre
62a0: 70 61 72 65 20 3d 20 70 50 61 72 73 65 2d 3e 70  pare = pParse->p
62b0: 52 65 70 72 65 70 61 72 65 3b 0a 20 20 20 20 69  Reprepare;.    i
62c0: 6e 74 20 69 43 6f 6c 20 3d 20 70 52 69 67 68 74  nt iCol = pRight
62d0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70  ->iColumn;.    p
62e0: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Val = sqlite3Vdb
62f0: 65 47 65 74 56 61 6c 75 65 28 70 52 65 70 72 65  eGetValue(pRepre
6300: 70 61 72 65 2c 20 69 43 6f 6c 2c 20 53 51 4c 49  pare, iCol, SQLI
6310: 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a 20 20  TE_AFF_NONE);.  
6320: 20 20 69 66 28 20 70 56 61 6c 20 26 26 20 73 71    if( pVal && sq
6330: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
6340: 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54 45 5f 54  (pVal)==SQLITE_T
6350: 45 58 54 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d  EXT ){.      z =
6360: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
6370: 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c  _value_text(pVal
6380: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
6390: 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61  ite3VdbeSetVarma
63a0: 73 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  sk(pParse->pVdbe
63b0: 2c 20 69 43 6f 6c 29 3b 20 2f 2a 20 49 4d 50 3a  , iCol); /* IMP:
63c0: 20 52 2d 32 33 32 35 37 2d 30 32 37 37 38 20 2a   R-23257-02778 *
63d0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  /.    assert( pR
63e0: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52  ight->op==TK_VAR
63f0: 49 41 42 4c 45 20 7c 7c 20 70 52 69 67 68 74 2d  IABLE || pRight-
6400: 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op==TK_REGISTER
6410: 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
6420: 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b  op==TK_STRING ){
6430: 0a 20 20 20 20 7a 20 3d 20 70 52 69 67 68 74 2d  .    z = pRight-
6440: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20  >u.zToken;.  }. 
6450: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 63 6e   if( z ){.    cn
6460: 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  t = 0;.    while
6470: 28 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20  ( (c=z[cnt])!=0 
6480: 26 26 20 63 21 3d 77 63 5b 30 5d 20 26 26 20 63  && c!=wc[0] && c
6490: 21 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d 77 63  !=wc[1] && c!=wc
64a0: 5b 32 5d 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  [2] ){.      cnt
64b0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
64c0: 28 20 63 6e 74 21 3d 30 20 26 26 20 32 35 35 21  ( cnt!=0 && 255!
64d0: 3d 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b  =(u8)z[cnt-1] ){
64e0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 50 72  .      Expr *pPr
64f0: 65 66 69 78 3b 0a 20 20 20 20 20 20 2a 70 69 73  efix;.      *pis
6500: 43 6f 6d 70 6c 65 74 65 20 3d 20 63 3d 3d 77 63  Complete = c==wc
6510: 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d  [0] && z[cnt+1]=
6520: 3d 30 3b 0a 20 20 20 20 20 20 70 50 72 65 66 69  =0;.      pPrefi
6530: 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  x = sqlite3Expr(
6540: 64 62 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20 7a  db, TK_STRING, z
6550: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  );.      if( pPr
6560: 65 66 69 78 20 29 20 70 50 72 65 66 69 78 2d 3e  efix ) pPrefix->
6570: 75 2e 7a 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20  u.zToken[cnt] = 
6580: 30 3b 0a 20 20 20 20 20 20 2a 70 70 50 72 65 66  0;.      *ppPref
6590: 69 78 20 3d 20 70 50 72 65 66 69 78 3b 0a 20 20  ix = pPrefix;.  
65a0: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56      if( op==TK_V
65b0: 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 20  ARIABLE ){.     
65c0: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61     Vdbe *v = pPa
65d0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20  rse->pVdbe;.    
65e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
65f0: 65 74 56 61 72 6d 61 73 6b 28 76 2c 20 70 52 69  etVarmask(v, pRi
6600: 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 20 2f  ght->iColumn); /
6610: 2a 20 49 4d 50 3a 20 52 2d 32 33 32 35 37 2d 30  * IMP: R-23257-0
6620: 32 37 37 38 20 2a 2f 0a 20 20 20 20 20 20 20 20  2778 */.        
6630: 69 66 28 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65  if( *pisComplete
6640: 20 26 26 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54   && pRight->u.zT
6650: 6f 6b 65 6e 5b 31 5d 20 29 7b 0a 20 20 20 20 20  oken[1] ){.     
6660: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72       /* If the r
6670: 68 73 20 6f 66 20 74 68 65 20 4c 49 4b 45 20 65  hs of the LIKE e
6680: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76  xpression is a v
6690: 61 72 69 61 62 6c 65 2c 20 61 6e 64 20 74 68 65  ariable, and the
66a0: 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20 20 20   current.       
66b0: 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74     ** value of t
66c0: 68 65 20 76 61 72 69 61 62 6c 65 20 6d 65 61 6e  he variable mean
66d0: 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  s there is no ne
66e0: 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  ed to invoke the
66f0: 20 4c 49 4b 45 0a 20 20 20 20 20 20 20 20 20 20   LIKE.          
6700: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  ** function, the
6710: 6e 20 6e 6f 20 4f 50 5f 56 61 72 69 61 62 6c 65  n no OP_Variable
6720: 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74   will be added t
6730: 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20  o the program.. 
6740: 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73           ** This
6750: 20 63 61 75 73 65 73 20 70 72 6f 62 6c 65 6d 73   causes problems
6760: 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33   for the sqlite3
6770: 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
6780: 6e 61 6d 65 28 29 0a 20 20 20 20 20 20 20 20 20  name().         
6790: 20 2a 2a 20 41 50 49 2e 20 54 6f 20 77 6f 72 6b   ** API. To work
67a0: 61 72 6f 75 6e 64 20 74 68 65 6d 2c 20 61 64 64  around them, add
67b0: 20 61 20 64 75 6d 6d 79 20 4f 50 5f 56 61 72 69   a dummy OP_Vari
67c0: 61 62 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20  able here..     
67d0: 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20 20       */ .       
67e0: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
67f0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
6800: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  arse);.         
6810: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
6820: 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
6830: 52 69 67 68 74 2c 20 72 31 29 3b 0a 20 20 20 20  Right, r1);.    
6840: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6850: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 73 71 6c  eChangeP3(v, sql
6860: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
6870: 64 64 72 28 76 29 2d 31 2c 20 30 29 3b 0a 20 20  ddr(v)-1, 0);.  
6880: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
6890: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
68a0: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
68b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
68c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20   }else{.      z 
68d0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
68e0: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
68f0: 65 65 28 70 56 61 6c 29 3b 0a 20 20 72 65 74 75  ee(pVal);.  retu
6900: 72 6e 20 28 7a 21 3d 30 29 3b 0a 7d 0a 23 65 6e  rn (z!=0);.}.#en
6910: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
6920: 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41  IT_LIKE_OPTIMIZA
6930: 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65  TION */...#ifnde
6940: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
6950: 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
6960: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
6970: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
6980: 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ssion is of the 
6990: 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  form.**.**      
69a0: 20 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20     column MATCH 
69b0: 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74  expr.**.** If it
69c0: 20 69 73 20 74 68 65 6e 20 72 65 74 75 72 6e 20   is then return 
69d0: 54 52 55 45 2e 20 20 49 66 20 6e 6f 74 2c 20 72  TRUE.  If not, r
69e0: 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a  eturn FALSE..*/.
69f0: 73 74 61 74 69 63 20 69 6e 74 20 69 73 4d 61 74  static int isMat
6a00: 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20 45 78  chOfColumn(.  Ex
6a10: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 2f  pr *pExpr      /
6a20: 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70 72  * Test this expr
6a30: 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45  ession */.){.  E
6a40: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a  xprList *pList;.
6a50: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
6a60: 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b  !=TK_FUNCTION ){
6a70: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
6a80: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
6a90: 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75  StrICmp(pExpr->u
6aa0: 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 74 63 68 22 29  .zToken,"match")
6ab0: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
6ac0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  n 0;.  }.  pList
6ad0: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
6ae0: 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  t;.  if( pList->
6af0: 6e 45 78 70 72 21 3d 32 20 29 7b 0a 20 20 20 20  nExpr!=2 ){.    
6b00: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
6b10: 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  if( pList->a[1].
6b20: 70 45 78 70 72 2d 3e 6f 70 20 21 3d 20 54 4b 5f  pExpr->op != TK_
6b30: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65  COLUMN ){.    re
6b40: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
6b50: 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
6b60: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
6b70: 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
6b80: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 42  ./*.** If the pB
6b90: 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  ase expression o
6ba0: 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65  riginated in the
6bb0: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
6bc0: 75 73 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e  use of.** a join
6bd0: 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
6be0: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
6bf0: 6d 61 72 6b 69 6e 67 73 20 6f 76 65 72 20 74 6f  markings over to
6c00: 20 64 65 72 69 76 65 64 2e 0a 2a 2f 0a 73 74 61   derived..*/.sta
6c10: 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 66 65  tic void transfe
6c20: 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 45 78  rJoinMarkings(Ex
6c30: 70 72 20 2a 70 44 65 72 69 76 65 64 2c 20 45 78  pr *pDerived, Ex
6c40: 70 72 20 2a 70 42 61 73 65 29 7b 0a 20 20 70 44  pr *pBase){.  pD
6c50: 65 72 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d  erived->flags |=
6c60: 20 70 42 61 73 65 2d 3e 66 6c 61 67 73 20 26 20   pBase->flags & 
6c70: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 70  EP_FromJoin;.  p
6c80: 44 65 72 69 76 65 64 2d 3e 69 52 69 67 68 74 4a  Derived->iRightJ
6c90: 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42 61 73 65  oinTable = pBase
6ca0: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
6cb0: 65 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  e;.}..#if !defin
6cc0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  ed(SQLITE_OMIT_O
6cd0: 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20  R_OPTIMIZATION) 
6ce0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
6cf0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
6d00: 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  )./*.** Analyze 
6d10: 61 20 74 65 72 6d 20 74 68 61 74 20 63 6f 6e 73  a term that cons
6d20: 69 73 74 73 20 6f 66 20 74 77 6f 20 6f 72 20 6d  ists of two or m
6d30: 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64  ore OR-connected
6d40: 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e 20 20 53  .** subterms.  S
6d50: 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  o in:.**.**     
6d60: 2e 2e 2e 20 57 48 45 52 45 20 20 28 61 3d 35 29  ... WHERE  (a=5)
6d70: 20 41 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d 39   AND (b=7 OR c=9
6d80: 20 4f 52 20 64 3d 31 33 29 20 41 4e 44 20 28 64   OR d=13) AND (d
6d90: 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  =13).**         
6da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6db0: 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e   ^^^^^^^^^^^^^^^
6dc0: 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ^^^^^.**.** This
6dd0: 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65   routine analyze
6de0: 73 20 74 65 72 6d 73 20 73 75 63 68 20 61 73 20  s terms such as 
6df0: 74 68 65 20 6d 69 64 64 6c 65 20 74 65 72 6d 20  the middle term 
6e00: 69 6e 20 74 68 65 20 61 62 6f 76 65 20 65 78 61  in the above exa
6e10: 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72 65  mple..** A Where
6e20: 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 20 69 73  OrTerm object is
6e30: 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 61 74   computed and at
6e40: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74 65  tached to the te
6e50: 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61 6c  rm under.** anal
6e60: 79 73 69 73 2c 20 72 65 67 61 72 64 6c 65 73 73  ysis, regardless
6e70: 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65 20   of the outcome 
6e80: 6f 66 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e  of the analysis.
6e90: 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20    Hence:.**.**  
6ea0: 20 20 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46     WhereTerm.wtF
6eb0: 6c 61 67 73 20 20 20 7c 3d 20 20 54 45 52 4d 5f  lags   |=  TERM_
6ec0: 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57 68  ORINFO.**     Wh
6ed0: 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66  ereTerm.u.pOrInf
6ee0: 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d 69 63 61  o  =  a dynamica
6ef0: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68  lly allocated Wh
6f00: 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74  ereOrTerm object
6f10: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20  .**.** The term 
6f20: 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 6d  being analyzed m
6f30: 75 73 74 20 68 61 76 65 20 74 77 6f 20 6f 72 20  ust have two or 
6f40: 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e 65  more of OR-conne
6f50: 63 74 65 64 20 73 75 62 74 65 72 6d 73 2e 0a 2a  cted subterms..*
6f60: 2a 20 41 20 73 69 6e 67 6c 65 20 73 75 62 74 65  * A single subte
6f70: 72 6d 20 6d 69 67 68 74 20 62 65 20 61 20 73 65  rm might be a se
6f80: 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63 74  t of AND-connect
6f90: 65 64 20 73 75 62 2d 73 75 62 74 65 72 6d 73 2e  ed sub-subterms.
6fa0: 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66 20  .** Examples of 
6fb0: 74 65 72 6d 73 20 75 6e 64 65 72 20 61 6e 61 6c  terms under anal
6fc0: 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ysis:.**.**     
6fd0: 28 41 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e  (A)     t1.x=t2.
6fe0: 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20 4f  y OR t1.x=t2.z O
6ff0: 52 20 74 31 2e 79 3d 31 35 20 4f 52 20 74 31 2e  R t1.y=15 OR t1.
7000: 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20 20  z=t3.a+5.**     
7010: 28 42 29 20 20 20 20 20 78 3d 65 78 70 72 31 20  (B)     x=expr1 
7020: 4f 52 20 65 78 70 72 32 3d 78 20 4f 52 20 78 3d  OR expr2=x OR x=
7030: 65 78 70 72 33 0a 2a 2a 20 20 20 20 20 28 43 29  expr3.**     (C)
7040: 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f       t1.x=t2.y O
7050: 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e 44  R (t1.x=t2.z AND
7060: 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20 20   t1.y=15).**    
7070: 20 28 44 29 20 20 20 20 20 78 3d 65 78 70 72 31   (D)     x=expr1
7080: 20 4f 52 20 28 79 3e 31 31 20 41 4e 44 20 79 3c   OR (y>11 AND y<
7090: 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27 2a  22 AND z LIKE '*
70a0: 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20 20  hello*').**     
70b0: 28 45 29 20 20 20 20 20 28 70 2e 61 3d 31 20 41  (E)     (p.a=1 A
70c0: 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e 63  ND q.b=2 AND r.c
70d0: 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34 20 41 4e  =3) OR (p.x=4 AN
70e0: 44 20 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a 3d  D q.y=5 AND r.z=
70f0: 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 31 3a  6).**.** CASE 1:
7100: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75  .**.** If all su
7110: 62 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68  bterms are of th
7120: 65 20 66 6f 72 6d 20 54 2e 43 3d 65 78 70 72 20  e form T.C=expr 
7130: 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20  for some single 
7140: 63 6f 6c 75 6d 6e 20 6f 66 20 43 0a 2a 2a 20 61  column of C.** a
7150: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 20   single table T 
7160: 28 61 73 20 73 68 6f 77 6e 20 69 6e 20 65 78 61  (as shown in exa
7170: 6d 70 6c 65 20 42 20 61 62 6f 76 65 29 20 74 68  mple B above) th
7180: 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  en create a new 
7190: 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20  virtual.** term 
71a0: 74 68 61 74 20 69 73 20 61 6e 20 65 71 75 69 76  that is an equiv
71b0: 61 6c 65 6e 74 20 49 4e 20 65 78 70 72 65 73 73  alent IN express
71c0: 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ion.  In other w
71d0: 6f 72 64 73 2c 20 69 66 20 74 68 65 20 74 65 72  ords, if the ter
71e0: 6d 0a 2a 2a 20 62 65 69 6e 67 20 61 6e 61 6c 79  m.** being analy
71f0: 7a 65 64 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  zed is:.**.**   
7200: 20 20 20 78 20 3d 20 65 78 70 72 31 20 20 4f 52     x = expr1  OR
7210: 20 20 65 78 70 72 32 20 3d 20 78 20 20 4f 52 20    expr2 = x  OR 
7220: 20 78 20 3d 20 65 78 70 72 33 0a 2a 2a 0a 2a 2a   x = expr3.**.**
7230: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e   then create a n
7240: 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20  ew virtual term 
7250: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
7260: 20 20 20 20 20 20 78 20 49 4e 20 28 65 78 70 72        x IN (expr
7270: 31 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a  1,expr2,expr3).*
7280: 2a 0a 2a 2a 20 43 41 53 45 20 32 3a 0a 2a 2a 0a  *.** CASE 2:.**.
7290: 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72  ** If all subter
72a0: 6d 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65  ms are indexable
72b0: 20 62 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62   by a single tab
72c0: 6c 65 20 54 2c 20 74 68 65 6e 20 73 65 74 0a 2a  le T, then set.*
72d0: 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65  *.**     WhereTe
72e0: 72 6d 2e 65 4f 70 65 72 61 74 6f 72 20 20 20 20  rm.eOperator    
72f0: 20 20 20 20 20 20 20 20 20 20 3d 20 20 57 4f 5f            =  WO_
7300: 4f 52 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54  OR.**     WhereT
7310: 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69  erm.u.pOrInfo->i
7320: 6e 64 65 78 61 62 6c 65 20 20 7c 3d 20 20 74 68  ndexable  |=  th
7330: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
7340: 66 6f 72 20 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a  for table T.**.*
7350: 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73 20 22  * A subterm is "
7360: 69 6e 64 65 78 61 62 6c 65 22 20 69 66 20 69 74  indexable" if it
7370: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a   is of the form.
7380: 2a 2a 20 22 54 2e 43 20 3c 6f 70 3e 20 3c 65 78  ** "T.C <op> <ex
7390: 70 72 3e 22 20 77 68 65 72 65 20 43 20 69 73 20  pr>" where C is 
73a0: 61 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61  any column of ta
73b0: 62 6c 65 20 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f  ble T and .** <o
73c0: 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 22 3d 22  p> is one of "="
73d0: 2c 20 22 3c 22 2c 20 22 3c 3d 22 2c 20 22 3e 22  , "<", "<=", ">"
73e0: 2c 20 22 3e 3d 22 2c 20 22 49 53 20 4e 55 4c 4c  , ">=", "IS NULL
73f0: 22 2c 20 6f 72 20 22 49 4e 22 2e 0a 2a 2a 20 41  ", or "IN"..** A
7400: 20 73 75 62 74 65 72 6d 20 69 73 20 61 6c 73 6f   subterm is also
7410: 20 69 6e 64 65 78 61 62 6c 65 20 69 66 20 69 74   indexable if it
7420: 20 69 73 20 61 6e 20 41 4e 44 20 6f 66 20 74 77   is an AND of tw
7430: 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 73 75 62  o or more.** sub
7440: 73 75 62 74 65 72 6d 73 20 61 74 20 6c 65 61 73  subterms at leas
7450: 74 20 6f 6e 65 20 6f 66 20 77 68 69 63 68 20 69  t one of which i
7460: 73 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 49 6e  s indexable.  In
7470: 64 65 78 61 62 6c 65 20 41 4e 44 20 0a 2a 2a 20  dexable AND .** 
7480: 73 75 62 74 65 72 6d 73 20 68 61 76 65 20 74 68  subterms have th
7490: 65 69 72 20 65 4f 70 65 72 61 74 6f 72 20 73 65  eir eOperator se
74a0: 74 20 74 6f 20 57 4f 5f 41 4e 44 20 61 6e 64 20  t to WO_AND and 
74b0: 74 68 65 79 20 68 61 76 65 0a 2a 2a 20 75 2e 70  they have.** u.p
74c0: 41 6e 64 49 6e 66 6f 20 73 65 74 20 74 6f 20 61  AndInfo set to a
74d0: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
74e0: 6f 63 61 74 65 64 20 57 68 65 72 65 41 6e 64 54  ocated WhereAndT
74f0: 65 72 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  erm object..**.*
7500: 2a 20 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 70  * From another p
7510: 6f 69 6e 74 20 6f 66 20 76 69 65 77 2c 20 22 69  oint of view, "i
7520: 6e 64 65 78 61 62 6c 65 22 20 6d 65 61 6e 73 20  ndexable" means 
7530: 74 68 61 74 20 74 68 65 20 73 75 62 74 65 72 6d  that the subterm
7540: 20 63 6f 75 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74   could.** potent
7550: 69 61 6c 6c 79 20 62 65 20 75 73 65 64 20 77 69  ially be used wi
7560: 74 68 20 61 6e 20 69 6e 64 65 78 20 69 66 20 61  th an index if a
7570: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e  n appropriate in
7580: 64 65 78 20 65 78 69 73 74 73 2e 0a 2a 2a 20 54  dex exists..** T
7590: 68 69 73 20 61 6e 61 6c 79 73 69 73 20 64 6f 65  his analysis doe
75a0: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 20 77  s not consider w
75b0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
75c0: 65 20 69 6e 64 65 78 20 65 78 69 73 74 73 3b 20  e index exists; 
75d0: 74 68 61 74 0a 2a 2a 20 69 73 20 73 6f 6d 65 74  that.** is somet
75e0: 68 69 6e 67 20 74 68 65 20 62 65 73 74 49 6e 64  hing the bestInd
75f0: 65 78 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  ex() routine wil
7600: 6c 20 64 65 74 65 72 6d 69 6e 65 2e 20 20 54 68  l determine.  Th
7610: 69 73 20 61 6e 61 6c 79 73 69 73 0a 2a 2a 20 6f  is analysis.** o
7620: 6e 6c 79 20 6c 6f 6f 6b 73 20 61 74 20 77 68 65  nly looks at whe
7630: 74 68 65 72 20 73 75 62 74 65 72 6d 73 20 61 70  ther subterms ap
7640: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
7650: 64 65 78 69 6e 67 20 65 78 69 73 74 2e 0a 2a 2a  dexing exist..**
7660: 0a 2a 2a 20 41 6c 6c 20 65 78 61 6d 70 6c 65 73  .** All examples
7670: 20 41 20 74 68 72 6f 75 67 68 20 45 20 61 62 6f   A through E abo
7680: 76 65 20 61 6c 6c 20 73 61 74 69 73 66 79 20 63  ve all satisfy c
7690: 61 73 65 20 32 2e 20 20 42 75 74 20 69 66 20 61  ase 2.  But if a
76a0: 20 74 65 72 6d 0a 2a 2a 20 61 6c 73 6f 20 73 74   term.** also st
76b0: 61 74 69 73 66 69 65 73 20 63 61 73 65 20 31 20  atisfies case 1 
76c0: 28 73 75 63 68 20 61 73 20 42 29 20 77 65 20 6b  (such as B) we k
76d0: 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 70 74  now that the opt
76e0: 69 6d 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a 20 61  imizer will.** a
76f0: 6c 77 61 79 73 20 70 72 65 66 65 72 20 63 61 73  lways prefer cas
7700: 65 20 31 2c 20 73 6f 20 69 6e 20 74 68 61 74 20  e 1, so in that 
7710: 63 61 73 65 20 77 65 20 70 72 65 74 65 6e 64 20  case we pretend 
7720: 74 68 61 74 20 63 61 73 65 20 32 20 69 73 20 6e  that case 2 is n
7730: 6f 74 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 2e  ot.** satisfied.
7740: 0a 2a 2a 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20  .**.** It might 
7750: 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
7760: 20 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c 65 73   multiple tables
7770: 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2e 20   are indexable. 
7780: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a   For example,.**
7790: 20 28 45 29 20 61 62 6f 76 65 20 69 73 20 69 6e   (E) above is in
77a0: 64 65 78 61 62 6c 65 20 6f 6e 20 74 61 62 6c 65  dexable on table
77b0: 73 20 50 2c 20 51 2c 20 61 6e 64 20 52 2e 0a 2a  s P, Q, and R..*
77c0: 2a 0a 2a 2a 20 54 65 72 6d 73 20 74 68 61 74 20  *.** Terms that 
77d0: 73 61 74 69 73 66 79 20 63 61 73 65 20 32 20 61  satisfy case 2 a
77e0: 72 65 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f  re candidates fo
77f0: 72 20 6c 6f 6f 6b 75 70 20 62 79 20 75 73 69 6e  r lookup by usin
7800: 67 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 69 6e  g.** separate in
7810: 64 69 63 65 73 20 74 6f 20 66 69 6e 64 20 72 6f  dices to find ro
7820: 77 69 64 73 20 66 6f 72 20 65 61 63 68 20 73 75  wids for each su
7830: 62 74 65 72 6d 20 61 6e 64 20 63 6f 6d 70 6f 73  bterm and compos
7840: 69 6e 67 0a 2a 2a 20 74 68 65 20 75 6e 69 6f 6e  ing.** the union
7850: 20 6f 66 20 61 6c 6c 20 72 6f 77 69 64 73 20 75   of all rowids u
7860: 73 69 6e 67 20 61 20 52 6f 77 53 65 74 20 6f 62  sing a RowSet ob
7870: 6a 65 63 74 2e 20 20 54 68 69 73 20 69 73 20 73  ject.  This is s
7880: 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20 22 62 69  imilar.** to "bi
7890: 74 6d 61 70 20 69 6e 64 69 63 65 73 22 20 69 6e  tmap indices" in
78a0: 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
78b0: 65 6e 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f  engines..**.** O
78c0: 54 48 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a 2a 20  THERWISE:.**.** 
78d0: 49 66 20 6e 65 69 74 68 65 72 20 63 61 73 65 20  If neither case 
78e0: 31 20 6e 6f 72 20 63 61 73 65 20 32 20 61 70 70  1 nor case 2 app
78f0: 6c 79 2c 20 74 68 65 6e 20 6c 65 61 76 65 20 74  ly, then leave t
7900: 68 65 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74  he eOperator set
7910: 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 20 20 54 68   to.** zero.  Th
7920: 69 73 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 75  is term is not u
7930: 73 65 66 75 6c 20 66 6f 72 20 73 65 61 72 63 68  seful for search
7940: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7950: 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65   exprAnalyzeOrTe
7960: 72 6d 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  rm(.  SrcList *p
7970: 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Src,            
7980: 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* the FROM clau
7990: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  se */.  WhereCla
79a0: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
79b0: 20 20 2f 2a 20 74 68 65 20 63 6f 6d 70 6c 65 74    /* the complet
79c0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
79d0: 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20  /.  int idxTerm 
79e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
79f0: 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 4f 52   Index of the OR
7a00: 2d 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c  -term to be anal
7a10: 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72  yzed */.){.  Par
7a20: 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43  se *pParse = pWC
7a30: 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 20  ->pParse;       
7a40: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
7a50: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69  ontext */.  sqli
7a60: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
7a70: 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20  ->db;           
7a80: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
7a90: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
7aa0: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
7ab0: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
7ac0: 72 6d 5d 3b 20 20 20 20 2f 2a 20 54 68 65 20 74  rm];    /* The t
7ad0: 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  erm to be analyz
7ae0: 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  ed */.  Expr *pE
7af0: 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
7b00: 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
7b10: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
7b20: 6e 20 6f 66 20 74 68 65 20 74 65 72 6d 20 2a 2f  n of the term */
7b30: 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  .  WhereMaskSet 
7b40: 2a 70 4d 61 73 6b 53 65 74 20 3d 20 70 57 43 2d  *pMaskSet = pWC-
7b50: 3e 70 4d 61 73 6b 53 65 74 3b 20 2f 2a 20 54 61  >pMaskSet; /* Ta
7b60: 62 6c 65 20 75 73 65 20 6d 61 73 6b 73 20 2a 2f  ble use masks */
7b70: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
7b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
7ba0: 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
7bb0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f   WhereClause *pO
7bc0: 72 57 63 3b 20 20 20 20 20 20 20 2f 2a 20 42 72  rWc;       /* Br
7bd0: 65 61 6b 75 70 20 6f 66 20 70 54 65 72 6d 20 69  eakup of pTerm i
7be0: 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a  nto subterms */.
7bf0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72    WhereTerm *pOr
7c00: 54 65 72 6d 3b 20 20 20 20 20 20 20 2f 2a 20 41  Term;       /* A
7c10: 20 53 75 62 2d 74 65 72 6d 20 77 69 74 68 69 6e   Sub-term within
7c20: 20 74 68 65 20 70 4f 72 57 63 20 2a 2f 0a 20 20   the pOrWc */.  
7c30: 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72  WhereOrInfo *pOr
7c40: 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 41 64 64  Info;     /* Add
7c50: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
7c60: 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77  ion associated w
7c70: 69 74 68 20 70 54 65 72 6d 20 2a 2f 0a 20 20 42  ith pTerm */.  B
7c80: 69 74 6d 61 73 6b 20 63 68 6e 67 54 6f 49 4e 3b  itmask chngToIN;
7c90: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
7ca0: 65 73 20 74 68 61 74 20 6d 69 67 68 74 20 73 61  es that might sa
7cb0: 74 69 73 66 79 20 63 61 73 65 20 31 20 2a 2f 0a  tisfy case 1 */.
7cc0: 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65 78 61    Bitmask indexa
7cd0: 62 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ble;        /* T
7ce0: 61 62 6c 65 73 20 74 68 61 74 20 61 72 65 20 69  ables that are i
7cf0: 6e 64 65 78 61 62 6c 65 2c 20 73 61 74 69 73 66  ndexable, satisf
7d00: 79 69 6e 67 20 63 61 73 65 20 32 20 2a 2f 0a 0a  ying case 2 */..
7d10: 20 20 2f 2a 0a 20 20 2a 2a 20 42 72 65 61 6b 20    /*.  ** Break 
7d20: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69 6e  the OR clause in
7d30: 74 6f 20 69 74 73 20 73 65 70 61 72 61 74 65 20  to its separate 
7d40: 73 75 62 74 65 72 6d 73 2e 20 20 54 68 65 20 73  subterms.  The s
7d50: 75 62 74 65 72 6d 73 20 61 72 65 0a 20 20 2a 2a  ubterms are.  **
7d60: 20 73 74 6f 72 65 64 20 69 6e 20 61 20 57 68 65   stored in a Whe
7d70: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
7d80: 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 77 69  re containing wi
7d90: 74 68 69 6e 20 74 68 65 20 57 68 65 72 65 4f 72  thin the WhereOr
7da0: 49 6e 66 6f 0a 20 20 2a 2a 20 6f 62 6a 65 63 74  Info.  ** object
7db0: 20 74 68 61 74 20 69 73 20 61 74 74 61 63 68 65   that is attache
7dc0: 64 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  d to the origina
7dd0: 6c 20 4f 52 20 63 6c 61 75 73 65 20 74 65 72 6d  l OR clause term
7de0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
7df0: 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
7e00: 20 26 20 28 54 45 52 4d 5f 44 59 4e 41 4d 49 43   & (TERM_DYNAMIC
7e10: 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52  |TERM_ORINFO|TER
7e20: 4d 5f 41 4e 44 49 4e 46 4f 29 29 3d 3d 30 20 29  M_ANDINFO))==0 )
7e30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
7e40: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a  r->op==TK_OR );.
7e50: 20 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e    pTerm->u.pOrIn
7e60: 66 6f 20 3d 20 70 4f 72 49 6e 66 6f 20 3d 20 73  fo = pOrInfo = s
7e70: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
7e80: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
7e90: 4f 72 49 6e 66 6f 29 29 3b 0a 20 20 69 66 28 20  OrInfo));.  if( 
7ea0: 70 4f 72 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74  pOrInfo==0 ) ret
7eb0: 75 72 6e 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74  urn;.  pTerm->wt
7ec0: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52  Flags |= TERM_OR
7ed0: 49 4e 46 4f 3b 0a 20 20 70 4f 72 57 63 20 3d 20  INFO;.  pOrWc = 
7ee0: 26 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20  &pOrInfo->wc;.  
7ef0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
7f00: 70 4f 72 57 63 2c 20 70 57 43 2d 3e 70 50 61 72  pOrWc, pWC->pPar
7f10: 73 65 2c 20 70 4d 61 73 6b 53 65 74 29 3b 0a 20  se, pMaskSet);. 
7f20: 20 77 68 65 72 65 53 70 6c 69 74 28 70 4f 72 57   whereSplit(pOrW
7f30: 63 2c 20 70 45 78 70 72 2c 20 54 4b 5f 4f 52 29  c, pExpr, TK_OR)
7f40: 3b 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41  ;.  exprAnalyzeA
7f50: 6c 6c 28 70 53 72 63 2c 20 70 4f 72 57 63 29 3b  ll(pSrc, pOrWc);
7f60: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
7f70: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
7f80: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 57  ;.  assert( pOrW
7f90: 63 2d 3e 6e 54 65 72 6d 3e 3d 32 20 29 3b 0a 0a  c->nTerm>=2 );..
7fa0: 20 20 2f 2a 0a 20 20 2a 2a 20 43 6f 6d 70 75 74    /*.  ** Comput
7fb0: 65 20 74 68 65 20 73 65 74 20 6f 66 20 74 61 62  e the set of tab
7fc0: 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74 20 73  les that might s
7fd0: 61 74 69 73 66 79 20 63 61 73 65 73 20 31 20 6f  atisfy cases 1 o
7fe0: 72 20 32 2e 0a 20 20 2a 2f 0a 20 20 69 6e 64 65  r 2..  */.  inde
7ff0: 78 61 62 6c 65 20 3d 20 7e 28 42 69 74 6d 61 73  xable = ~(Bitmas
8000: 6b 29 30 3b 0a 20 20 63 68 6e 67 54 6f 49 4e 20  k)0;.  chngToIN 
8010: 3d 20 7e 28 70 57 43 2d 3e 76 6d 61 73 6b 29 3b  = ~(pWC->vmask);
8020: 0a 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e  .  for(i=pOrWc->
8030: 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d  nTerm-1, pOrTerm
8040: 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 20  =pOrWc->a; i>=0 
8050: 26 26 20 69 6e 64 65 78 61 62 6c 65 3b 20 69 2d  && indexable; i-
8060: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
8070: 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d     if( (pOrTerm-
8080: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
8090: 53 49 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a 20 20  SINGLE)==0 ){.  
80a0: 20 20 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f      WhereAndInfo
80b0: 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20   *pAndInfo;.    
80c0: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
80d0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 30 20  m->eOperator==0 
80e0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
80f0: 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61   (pOrTerm->wtFla
8100: 67 73 20 26 20 28 54 45 52 4d 5f 41 4e 44 49 4e  gs & (TERM_ANDIN
8110: 46 4f 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 29  FO|TERM_ORINFO))
8120: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 68 6e  ==0 );.      chn
8130: 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20  gToIN = 0;.     
8140: 20 70 41 6e 64 49 6e 66 6f 20 3d 20 73 71 6c 69   pAndInfo = sqli
8150: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
8160: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 41 6e 64 49  b, sizeof(*pAndI
8170: 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 69 66 28  nfo));.      if(
8180: 20 70 41 6e 64 49 6e 66 6f 20 29 7b 0a 20 20 20   pAndInfo ){.   
8190: 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65       WhereClause
81a0: 20 2a 70 41 6e 64 57 43 3b 0a 20 20 20 20 20 20   *pAndWC;.      
81b0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 41 6e    WhereTerm *pAn
81c0: 64 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69  dTerm;.        i
81d0: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 42 69  nt j;.        Bi
81e0: 74 6d 61 73 6b 20 62 20 3d 20 30 3b 0a 20 20 20  tmask b = 0;.   
81f0: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 75 2e       pOrTerm->u.
8200: 70 41 6e 64 49 6e 66 6f 20 3d 20 70 41 6e 64 49  pAndInfo = pAndI
8210: 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  nfo;.        pOr
8220: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
8230: 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20   TERM_ANDINFO;. 
8240: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
8250: 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41  eOperator = WO_A
8260: 4e 44 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64  ND;.        pAnd
8270: 57 43 20 3d 20 26 70 41 6e 64 49 6e 66 6f 2d 3e  WC = &pAndInfo->
8280: 77 63 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  wc;.        wher
8290: 65 43 6c 61 75 73 65 49 6e 69 74 28 70 41 6e 64  eClauseInit(pAnd
82a0: 57 43 2c 20 70 57 43 2d 3e 70 50 61 72 73 65 2c  WC, pWC->pParse,
82b0: 20 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 20 20   pMaskSet);.    
82c0: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70      whereSplit(p
82d0: 41 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e  AndWC, pOrTerm->
82e0: 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a  pExpr, TK_AND);.
82f0: 20 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c          exprAnal
8300: 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e  yzeAll(pSrc, pAn
8310: 64 57 43 29 3b 0a 20 20 20 20 20 20 20 20 74 65  dWC);.        te
8320: 73 74 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c  stcase( db->mall
8330: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
8340: 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c      if( !db->mal
8350: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
8360: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20         for(j=0, 
8370: 70 41 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d  pAndTerm=pAndWC-
8380: 3e 61 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54  >a; j<pAndWC->nT
8390: 65 72 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65  erm; j++, pAndTe
83a0: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  rm++){.         
83b0: 20 20 20 61 73 73 65 72 74 28 20 70 41 6e 64 54     assert( pAndT
83c0: 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20  erm->pExpr );.  
83d0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 6c            if( al
83e0: 6c 6f 77 65 64 4f 70 28 70 41 6e 64 54 65 72 6d  lowedOp(pAndTerm
83f0: 2d 3e 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a  ->pExpr->op) ){.
8400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 20                b 
8410: 7c 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b  |= getMask(pMask
8420: 53 65 74 2c 20 70 41 6e 64 54 65 72 6d 2d 3e 6c  Set, pAndTerm->l
8430: 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  eftCursor);.    
8440: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8450: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
8460: 20 20 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c          indexabl
8470: 65 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a  e &= b;.      }.
8480: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
8490: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
84a0: 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 7b 0a   TERM_COPIED ){.
84b0: 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 74 68        /* Skip th
84c0: 69 73 20 74 65 72 6d 20 66 6f 72 20 6e 6f 77 2e  is term for now.
84d0: 20 20 57 65 20 72 65 76 69 73 69 74 20 69 74 20    We revisit it 
84e0: 77 68 65 6e 20 77 65 20 70 72 6f 63 65 73 73 20  when we process 
84f0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72  the.      ** cor
8500: 72 65 73 70 6f 6e 64 69 6e 67 20 54 45 52 4d 5f  responding TERM_
8510: 56 49 52 54 55 41 4c 20 74 65 72 6d 20 2a 2f 0a  VIRTUAL term */.
8520: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8530: 20 42 69 74 6d 61 73 6b 20 62 3b 0a 20 20 20 20   Bitmask b;.    
8540: 20 20 62 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d    b = getMask(pM
8550: 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d  askSet, pOrTerm-
8560: 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20  >leftCursor);.  
8570: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
8580: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
8590: 56 49 52 54 55 41 4c 20 29 7b 0a 20 20 20 20 20  VIRTUAL ){.     
85a0: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
85b0: 74 68 65 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61  ther = &pOrWc->a
85c0: 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e  [pOrTerm->iParen
85d0: 74 5d 3b 0a 20 20 20 20 20 20 20 20 62 20 7c 3d  t];.        b |=
85e0: 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
85f0: 74 2c 20 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43  t, pOther->leftC
8600: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  ursor);.      }.
8610: 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20        indexable 
8620: 26 3d 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20  &= b;.      if( 
8630: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
8640: 6f 72 21 3d 57 4f 5f 45 51 20 29 7b 0a 20 20 20  or!=WO_EQ ){.   
8650: 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20       chngToIN = 
8660: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
8670: 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e          chngToIN
8680: 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20   &= b;.      }. 
8690: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20     }.  }..  /*. 
86a0: 20 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 73   ** Record the s
86b0: 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61  et of tables tha
86c0: 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32  t satisfy case 2
86d0: 2e 20 20 54 68 65 20 73 65 74 20 6d 69 67 68 74  .  The set might
86e0: 20 62 65 0a 20 20 2a 2a 20 65 6d 70 74 79 2e 0a   be.  ** empty..
86f0: 20 20 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e    */.  pOrInfo->
8700: 69 6e 64 65 78 61 62 6c 65 20 3d 20 69 6e 64 65  indexable = inde
8710: 78 61 62 6c 65 3b 0a 20 20 70 54 65 72 6d 2d 3e  xable;.  pTerm->
8720: 65 4f 70 65 72 61 74 6f 72 20 3d 20 69 6e 64 65  eOperator = inde
8730: 78 61 62 6c 65 3d 3d 30 20 3f 20 30 20 3a 20 57  xable==0 ? 0 : W
8740: 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  O_OR;..  /*.  **
8750: 20 63 68 6e 67 54 6f 49 4e 20 68 6f 6c 64 73 20   chngToIN holds 
8760: 61 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20  a set of tables 
8770: 74 68 61 74 20 2a 6d 69 67 68 74 2a 20 73 61 74  that *might* sat
8780: 69 73 66 79 20 63 61 73 65 20 31 2e 20 20 42 75  isfy case 1.  Bu
8790: 74 0a 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74  t.  ** we have t
87a0: 6f 20 64 6f 20 73 6f 6d 65 20 61 64 64 69 74 69  o do some additi
87b0: 6f 6e 61 6c 20 63 68 65 63 6b 69 6e 67 20 74 6f  onal checking to
87c0: 20 73 65 65 20 69 66 20 63 61 73 65 20 31 20 72   see if case 1 r
87d0: 65 61 6c 6c 79 0a 20 20 2a 2a 20 69 73 20 73 61  eally.  ** is sa
87e0: 74 69 73 66 69 65 64 2e 0a 20 20 2a 2a 0a 20 20  tisfied..  **.  
87f0: 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 77 69 6c 6c  ** chngToIN will
8800: 20 68 6f 6c 64 20 65 69 74 68 65 72 20 30 2c 20   hold either 0, 
8810: 31 2c 20 6f 72 20 32 20 62 69 74 73 2e 20 20 54  1, or 2 bits.  T
8820: 68 65 20 30 2d 62 69 74 20 63 61 73 65 20 6d 65  he 0-bit case me
8830: 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  ans.  ** that th
8840: 65 72 65 20 69 73 20 6e 6f 20 70 6f 73 73 69 62  ere is no possib
8850: 69 6c 69 74 79 20 6f 66 20 74 72 61 6e 73 66 6f  ility of transfo
8860: 72 6d 69 6e 67 20 74 68 65 20 4f 52 20 63 6c 61  rming the OR cla
8870: 75 73 65 20 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a  use into an.  **
8880: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 62 65 63   IN operator bec
8890: 61 75 73 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ause one or more
88a0: 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52   terms in the OR
88b0: 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 0a   clause contain.
88c0: 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f    ** something o
88d0: 74 68 65 72 20 74 68 61 6e 20 3d 3d 20 6f 6e 20  ther than == on 
88e0: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  a column in the 
88f0: 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54  single table.  T
8900: 68 65 20 31 2d 62 69 74 0a 20 20 2a 2a 20 63 61  he 1-bit.  ** ca
8910: 73 65 20 6d 65 61 6e 73 20 74 68 61 74 20 65 76  se means that ev
8920: 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ery term of the 
8930: 4f 52 20 63 6c 61 75 73 65 20 69 73 20 6f 66 20  OR clause is of 
8940: 74 68 65 20 66 6f 72 6d 0a 20 20 2a 2a 20 22 74  the form.  ** "t
8950: 61 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72  able.column=expr
8960: 22 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c  " for some singl
8970: 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6f 6e  e table.  The on
8980: 65 20 62 69 74 20 74 68 61 74 20 69 73 20 73 65  e bit that is se
8990: 74 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 6f 72 72  t.  ** will corr
89a0: 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 63 6f  espond to the co
89b0: 6d 6d 6f 6e 20 74 61 62 6c 65 2e 20 20 57 65 20  mmon table.  We 
89c0: 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68  still need to ch
89d0: 65 63 6b 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a  eck to make.  **
89e0: 20 73 75 72 65 20 74 68 65 20 73 61 6d 65 20 63   sure the same c
89f0: 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 6f 6e  olumn is used on
8a00: 20 61 6c 6c 20 74 65 72 6d 73 2e 20 20 54 68 65   all terms.  The
8a10: 20 32 2d 62 69 74 20 63 61 73 65 20 69 73 20 77   2-bit case is w
8a20: 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c  hen.  ** the all
8a30: 20 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68   terms are of th
8a40: 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 31 2e 63  e form "table1.c
8a50: 6f 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c  olumn=table2.col
8a60: 75 6d 6e 22 2e 20 20 49 74 0a 20 20 2a 2a 20 6d  umn".  It.  ** m
8a70: 69 67 68 74 20 62 65 20 70 6f 73 73 69 62 6c 65  ight be possible
8a80: 20 74 6f 20 66 6f 72 6d 20 61 6e 20 49 4e 20 6f   to form an IN o
8a90: 70 65 72 61 74 6f 72 20 77 69 74 68 20 65 69 74  perator with eit
8aa0: 68 65 72 20 74 61 62 6c 65 31 2e 63 6f 6c 75 6d  her table1.colum
8ab0: 6e 0a 20 20 2a 2a 20 6f 72 20 74 61 62 6c 65 32  n.  ** or table2
8ac0: 2e 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 4c  .column as the L
8ad0: 48 53 20 69 66 20 65 69 74 68 65 72 20 69 73 20  HS if either is 
8ae0: 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20  common to every 
8af0: 74 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 65  term of.  ** the
8b00: 20 4f 52 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a   OR clause..  **
8b10: 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
8b20: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72  terms of the for
8b30: 6d 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31  m "table.column1
8b40: 3d 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20  =table.column2" 
8b50: 28 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74  (the.  ** same t
8b60: 61 62 6c 65 20 6f 6e 20 62 6f 74 68 20 73 69 7a  able on both siz
8b70: 65 73 20 6f 66 20 74 68 65 20 3d 3d 29 20 63 61  es of the ==) ca
8b80: 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65  nnot be optimize
8b90: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68  d..  */.  if( ch
8ba0: 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 69 6e  ngToIN ){.    in
8bb0: 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d  t okToChngToIN =
8bc0: 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20   0;     /* True 
8bd0: 69 66 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f  if the conversio
8be0: 6e 20 74 6f 20 49 4e 20 69 73 20 76 61 6c 69 64  n to IN is valid
8bf0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c   */.    int iCol
8c00: 75 6d 6e 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  umn = -1;       
8c10: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64 65    /* Column inde
8c20: 78 20 6f 6e 20 6c 68 73 20 6f 66 20 49 4e 20 6f  x on lhs of IN o
8c30: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 69  perator */.    i
8c40: 6e 74 20 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b  nt iCursor = -1;
8c50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
8c60: 65 20 63 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20  e cursor common 
8c70: 74 6f 20 61 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a  to all terms */.
8c80: 20 20 20 20 69 6e 74 20 6a 20 3d 20 30 3b 20 20      int j = 0;  
8c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8ca0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
8cb0: 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20  ..    /* Search 
8cc0: 66 6f 72 20 61 20 74 61 62 6c 65 20 61 6e 64 20  for a table and 
8cd0: 63 6f 6c 75 6d 6e 20 74 68 61 74 20 61 70 70 65  column that appe
8ce0: 61 72 73 20 6f 6e 20 6f 6e 65 20 73 69 64 65 20  ars on one side 
8cf0: 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74  or the.    ** ot
8d00: 68 65 72 20 6f 66 20 74 68 65 20 3d 3d 20 6f 70  her of the == op
8d10: 65 72 61 74 6f 72 20 69 6e 20 65 76 65 72 79 20  erator in every 
8d20: 73 75 62 74 65 72 6d 2e 20 20 54 68 61 74 20 74  subterm.  That t
8d30: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a  able and column.
8d40: 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72      ** will be r
8d50: 65 63 6f 72 64 65 64 20 69 6e 20 69 43 75 72 73  ecorded in iCurs
8d60: 6f 72 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20  or and iColumn. 
8d70: 20 54 68 65 72 65 20 6d 69 67 68 74 20 6e 6f 74   There might not
8d80: 20 62 65 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73   be any.    ** s
8d90: 75 63 68 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  uch table and co
8da0: 6c 75 6d 6e 2e 20 20 53 65 74 20 6f 6b 54 6f 43  lumn.  Set okToC
8db0: 68 6e 67 54 6f 49 4e 20 69 66 20 61 6e 20 61 70  hngToIN if an ap
8dc0: 70 72 6f 70 72 69 61 74 65 20 74 61 62 6c 65 0a  propriate table.
8dd0: 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d      ** and colum
8de0: 6e 20 69 73 20 66 6f 75 6e 64 20 62 75 74 20 6c  n is found but l
8df0: 65 61 76 65 20 6f 6b 54 6f 43 68 6e 67 54 6f 49  eave okToChngToI
8e00: 4e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 20 66  N false if not f
8e10: 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ound..    */.   
8e20: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20 26 26   for(j=0; j<2 &&
8e30: 20 21 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20   !okToChngToIN; 
8e40: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4f 72 54  j++){.      pOrT
8e50: 65 72 6d 20 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a  erm = pOrWc->a;.
8e60: 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57        for(i=pOrW
8e70: 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30  c->nTerm-1; i>=0
8e80: 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b  ; i--, pOrTerm++
8e90: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
8ea0: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  t( pOrTerm->eOpe
8eb0: 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a  rator==WO_EQ );.
8ec0: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
8ed0: 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52  >wtFlags &= ~TER
8ee0: 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  M_OR_OK;.       
8ef0: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
8f00: 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f  ftCursor==iCurso
8f10: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  r ){.          /
8f20: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 32 2d  * This is the 2-
8f30: 62 69 74 20 63 61 73 65 20 61 6e 64 20 77 65 20  bit case and we 
8f40: 61 72 65 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e  are on the secon
8f50: 64 20 69 74 65 72 61 74 69 6f 6e 20 61 6e 64 0a  d iteration and.
8f60: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72            ** cur
8f70: 72 65 6e 74 20 74 65 72 6d 20 69 73 20 66 72 6f  rent term is fro
8f80: 6d 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  m the first iter
8f90: 61 74 69 6f 6e 2e 20 20 53 6f 20 73 6b 69 70 20  ation.  So skip 
8fa0: 74 68 69 73 20 74 65 72 6d 2e 20 2a 2f 0a 20 20  this term. */.  
8fb0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8fc0: 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  j==1 );.        
8fd0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
8fe0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
8ff0: 28 20 28 63 68 6e 67 54 6f 49 4e 20 26 20 67 65  ( (chngToIN & ge
9000: 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
9010: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
9020: 73 6f 72 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  sor))==0 ){.    
9030: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 74 65        /* This te
9040: 72 6d 20 6d 75 73 74 20 62 65 20 6f 66 20 74 68  rm must be of th
9050: 65 20 66 6f 72 6d 20 74 31 2e 61 3d 3d 74 32 2e  e form t1.a==t2.
9060: 62 20 77 68 65 72 65 20 74 32 20 69 73 20 69 6e  b where t2 is in
9070: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
9080: 2a 20 63 68 6e 67 54 6f 49 4e 20 73 65 74 20 62  * chngToIN set b
9090: 75 74 20 74 31 20 69 73 20 6e 6f 74 2e 20 20 54  ut t1 is not.  T
90a0: 68 69 73 20 74 65 72 6d 20 77 69 6c 6c 20 62 65  his term will be
90b0: 20 65 69 74 68 65 72 20 70 72 65 63 65 65 64 65   either preceede
90c0: 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f  d.          ** o
90d0: 72 20 66 6f 6c 6c 77 65 64 20 62 79 20 61 6e 20  r follwed by an 
90e0: 69 6e 76 65 72 74 65 64 20 63 6f 70 79 20 28 74  inverted copy (t
90f0: 32 2e 62 3d 3d 74 31 2e 61 29 2e 20 20 53 6b 69  2.b==t1.a).  Ski
9100: 70 20 74 68 69 73 20 74 65 72 6d 20 0a 20 20 20  p this term .   
9110: 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 75 73         ** and us
9120: 65 20 69 74 73 20 69 6e 76 65 72 73 69 6f 6e 2e  e its inversion.
9130: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
9140: 73 74 63 61 73 65 28 20 70 4f 72 54 65 72 6d 2d  stcase( pOrTerm-
9150: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
9160: 43 4f 50 49 45 44 20 29 3b 0a 20 20 20 20 20 20  COPIED );.      
9170: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4f      testcase( pO
9180: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
9190: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
91a0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
91b0: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c  t( pOrTerm->wtFl
91c0: 61 67 73 20 26 20 28 54 45 52 4d 5f 43 4f 50 49  ags & (TERM_COPI
91d0: 45 44 7c 54 45 52 4d 5f 56 49 52 54 55 41 4c 29  ED|TERM_VIRTUAL)
91e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   );.          co
91f0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
9200: 7d 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d  }.        iColum
9210: 6e 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c  n = pOrTerm->u.l
9220: 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
9230: 20 20 20 69 43 75 72 73 6f 72 20 3d 20 70 4f 72     iCursor = pOr
9240: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
9250: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
9260: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
9270: 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( i<0 ){.      
9280: 20 20 2f 2a 20 4e 6f 20 63 61 6e 64 69 64 61 74    /* No candidat
9290: 65 20 74 61 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77  e table+column w
92a0: 61 73 20 66 6f 75 6e 64 2e 20 20 54 68 69 73 20  as found.  This 
92b0: 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 0a 20  can only occur. 
92c0: 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65         ** on the
92d0: 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f   second iteratio
92e0: 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  n */.        ass
92f0: 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20  ert( j==1 );.   
9300: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 63 68       assert( (ch
9310: 6e 67 54 6f 49 4e 26 28 63 68 6e 67 54 6f 49 4e  ngToIN&(chngToIN
9320: 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  -1))==0 );.     
9330: 20 20 20 61 73 73 65 72 74 28 20 63 68 6e 67 54     assert( chngT
9340: 6f 49 4e 3d 3d 67 65 74 4d 61 73 6b 28 70 4d 61  oIN==getMask(pMa
9350: 73 6b 53 65 74 2c 20 69 43 75 72 73 6f 72 29 20  skSet, iCursor) 
9360: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
9370: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9380: 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 31 20 29  testcase( j==1 )
9390: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 68  ;..      /* We h
93a0: 61 76 65 20 66 6f 75 6e 64 20 61 20 63 61 6e 64  ave found a cand
93b0: 69 64 61 74 65 20 74 61 62 6c 65 20 61 6e 64 20  idate table and 
93c0: 63 6f 6c 75 6d 6e 2e 20 20 43 68 65 63 6b 20 74  column.  Check t
93d0: 6f 20 73 65 65 20 69 66 20 74 68 61 74 0a 20 20  o see if that.  
93e0: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64      ** table and
93f0: 20 63 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f   column is commo
9400: 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20  n to every term 
9410: 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  in the OR clause
9420: 20 2a 2f 0a 20 20 20 20 20 20 6f 6b 54 6f 43 68   */.      okToCh
9430: 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20  ngToIN = 1;.    
9440: 20 20 66 6f 72 28 3b 20 69 3e 3d 30 20 26 26 20    for(; i>=0 && 
9450: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 69 2d  okToChngToIN; i-
9460: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
9470: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
9480: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
9490: 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20  r==WO_EQ );.    
94a0: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
94b0: 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75  >leftCursor!=iCu
94c0: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rsor ){.        
94d0: 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61    pOrTerm->wtFla
94e0: 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f  gs &= ~TERM_OR_O
94f0: 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  K;.        }else
9500: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e   if( pOrTerm->u.
9510: 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c  leftColumn!=iCol
9520: 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
9530: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20   okToChngToIN = 
9540: 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
9550: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
9560: 61 66 66 4c 65 66 74 2c 20 61 66 66 52 69 67 68  affLeft, affRigh
9570: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;.          /* 
9580: 49 66 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  If the right-han
9590: 64 20 73 69 64 65 20 69 73 20 61 6c 73 6f 20 61  d side is also a
95a0: 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68   column, then th
95b0: 65 20 61 66 66 69 6e 69 74 69 65 73 0a 20 20 20  e affinities.   
95c0: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 6f 74         ** of bot
95d0: 68 20 72 69 67 68 74 20 61 6e 64 20 6c 65 66 74  h right and left
95e0: 20 73 69 64 65 73 20 6d 75 73 74 20 62 65 20 73   sides must be s
95f0: 75 63 68 20 74 68 61 74 20 6e 6f 20 74 79 70 65  uch that no type
9600: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
9610: 6e 76 65 72 73 69 6f 6e 73 20 61 72 65 20 72 65  nversions are re
9620: 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 72 69  quired on the ri
9630: 67 68 74 2e 20 20 28 54 69 63 6b 65 74 20 23 32  ght.  (Ticket #2
9640: 32 34 39 29 0a 20 20 20 20 20 20 20 20 20 20 2a  249).          *
9650: 2f 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 52  /.          affR
9660: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
9670: 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65  prAffinity(pOrTe
9680: 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
9690: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66  t);.          af
96a0: 66 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  fLeft = sqlite3E
96b0: 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54  xprAffinity(pOrT
96c0: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66  erm->pExpr->pLef
96d0: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t);.          if
96e0: 28 20 61 66 66 52 69 67 68 74 21 3d 30 20 26 26  ( affRight!=0 &&
96f0: 20 61 66 66 52 69 67 68 74 21 3d 61 66 66 4c 65   affRight!=affLe
9700: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ft ){.          
9710: 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d    okToChngToIN =
9720: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   0;.          }e
9730: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
9740: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
9750: 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b  s |= TERM_OR_OK;
9760: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
9770: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
9780: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
9790: 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f  this point, okTo
97a0: 43 68 6e 67 54 6f 49 4e 20 69 73 20 74 72 75 65  ChngToIN is true
97b0: 20 69 66 20 6f 72 69 67 69 6e 61 6c 20 70 54 65   if original pTe
97c0: 72 6d 20 73 61 74 69 73 66 69 65 73 0a 20 20 20  rm satisfies.   
97d0: 20 2a 2a 20 63 61 73 65 20 31 2e 20 20 49 6e 20   ** case 1.  In 
97e0: 74 68 61 74 20 63 61 73 65 2c 20 63 6f 6e 73 74  that case, const
97f0: 72 75 63 74 20 61 20 6e 65 77 20 76 69 72 74 75  ruct a new virtu
9800: 61 6c 20 74 65 72 6d 20 74 68 61 74 20 69 73 20  al term that is 
9810: 0a 20 20 20 20 2a 2a 20 70 54 65 72 6d 20 63 6f  .    ** pTerm co
9820: 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20  nverted into an 
9830: 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20  IN operator..   
9840: 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 3a 20 52   **.    ** EV: R
9850: 2d 30 30 32 31 31 2d 31 35 31 30 30 0a 20 20 20  -00211-15100.   
9860: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6b 54 6f   */.    if( okTo
9870: 43 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20  ChngToIN ){.    
9880: 20 20 45 78 70 72 20 2a 70 44 75 70 3b 20 20 20    Expr *pDup;   
9890: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 72           /* A tr
98a0: 61 6e 73 69 65 6e 74 20 64 75 70 6c 69 63 61 74  ansient duplicat
98b0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  e expression */.
98c0: 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
98d0: 70 4c 69 73 74 20 3d 20 30 3b 20 20 20 2f 2a 20  pList = 0;   /* 
98e0: 54 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  The RHS of the I
98f0: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
9900: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
9910: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  = 0;       /* Th
9920: 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
9930: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
9940: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20    Expr *pNew;   
9950: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
9960: 63 6f 6d 70 6c 65 74 65 20 49 4e 20 6f 70 65 72  complete IN oper
9970: 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 66  ator */..      f
9980: 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72  or(i=pOrWc->nTer
9990: 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72  m-1, pOrTerm=pOr
99a0: 57 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Wc->a; i>=0; i--
99b0: 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20  , pOrTerm++){.  
99c0: 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65        if( (pOrTe
99d0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
99e0: 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63  RM_OR_OK)==0 ) c
99f0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
9a00: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
9a10: 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
9a20: 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  EQ );.        as
9a30: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c  sert( pOrTerm->l
9a40: 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73  eftCursor==iCurs
9a50: 6f 72 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  or );.        as
9a60: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75  sert( pOrTerm->u
9a70: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f  .leftColumn==iCo
9a80: 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  lumn );.        
9a90: 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78  pDup = sqlite3Ex
9aa0: 70 72 44 75 70 28 64 62 2c 20 70 4f 72 54 65 72  prDup(db, pOrTer
9ab0: 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
9ac0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  , 0);.        pL
9ad0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
9ae0: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 57 43 2d  rListAppend(pWC-
9af0: 3e 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  >pParse, pList, 
9b00: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 70  pDup);.        p
9b10: 4c 65 66 74 20 3d 20 70 4f 72 54 65 72 6d 2d 3e  Left = pOrTerm->
9b20: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
9b30: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
9b40: 72 74 28 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a  rt( pLeft!=0 );.
9b50: 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c        pDup = sql
9b60: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
9b70: 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20  pLeft, 0);.     
9b80: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50   pNew = sqlite3P
9b90: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
9ba0: 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20 30 29 3b  IN, pDup, 0, 0);
9bb0: 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20  .      if( pNew 
9bc0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
9bd0: 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 74  dxNew;.        t
9be0: 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69  ransferJoinMarki
9bf0: 6e 67 73 28 70 4e 65 77 2c 20 70 45 78 70 72 29  ngs(pNew, pExpr)
9c00: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
9c10: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
9c20: 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73 53  ty(pNew, EP_xIsS
9c30: 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
9c40: 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20    pNew->x.pList 
9c50: 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  = pList;.       
9c60: 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
9c70: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
9c80: 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56 49 52 54   pNew, TERM_VIRT
9c90: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
9ca0: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
9cb0: 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29  ase( idxNew==0 )
9cc0: 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 41 6e  ;.        exprAn
9cd0: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
9ce0: 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20   idxNew);.      
9cf0: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
9d00: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
9d10: 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65      pWC->a[idxNe
9d20: 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  w].iParent = idx
9d30: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54  Term;.        pT
9d40: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
9d50: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9d60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
9d70: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
9d80: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  pList);.      }.
9d90: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
9da0: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4e 4f 48  lags |= TERM_NOH
9db0: 45 4c 50 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  ELP;.      pTerm
9dc0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 30 3b  ->eOperator = 0;
9dd0: 20 20 2f 2a 20 63 61 73 65 20 31 20 74 72 75 6d    /* case 1 trum
9de0: 70 73 20 63 61 73 65 20 32 20 2a 2f 0a 20 20 20  ps case 2 */.   
9df0: 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20   }.  }.}.#endif 
9e00: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
9e10: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  OR_OPTIMIZATION 
9e20: 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  && !SQLITE_OMIT_
9e30: 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 2f 2a  SUBQUERY */.../*
9e40: 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 74 6f  .** The input to
9e50: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
9e60: 20 61 6e 20 57 68 65 72 65 54 65 72 6d 20 73 74   an WhereTerm st
9e70: 72 75 63 74 75 72 65 20 77 69 74 68 20 6f 6e 6c  ructure with onl
9e80: 79 20 74 68 65 0a 2a 2a 20 22 70 45 78 70 72 22  y the.** "pExpr"
9e90: 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 20 69 6e   field filled in
9ea0: 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  .  The job of th
9eb0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f  is routine is to
9ec0: 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a 2a 2a 20   analyze the.** 
9ed0: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  subexpression an
9ee0: 64 20 70 6f 70 75 6c 61 74 65 20 61 6c 6c 20 74  d populate all t
9ef0: 68 65 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  he other fields 
9f00: 6f 66 20 74 68 65 20 57 68 65 72 65 54 65 72 6d  of the WhereTerm
9f10: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  .** structure..*
9f20: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
9f30: 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ession is of the
9f40: 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e 20 3c 6f   form "<expr> <o
9f50: 70 3e 20 58 22 20 69 74 20 67 65 74 73 20 63 6f  p> X" it gets co
9f60: 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65  mmuted.** to the
9f70: 20 73 74 61 6e 64 61 72 64 20 66 6f 72 6d 20 6f   standard form o
9f80: 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  f "X <op> <expr>
9f90: 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  "..**.** If the 
9fa0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66  expression is of
9fb0: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
9fc0: 3e 20 59 22 20 77 68 65 72 65 20 62 6f 74 68 20  > Y" where both 
9fd0: 58 20 61 6e 64 20 59 20 61 72 65 0a 2a 2a 20 63  X and Y are.** c
9fe0: 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 74 68 65  olumns, then the
9ff0: 20 6f 72 69 67 69 6e 61 6c 20 65 78 70 72 65 73   original expres
a000: 73 69 6f 6e 20 69 73 20 75 6e 63 68 61 6e 67 65  sion is unchange
a010: 64 20 61 6e 64 20 61 20 6e 65 77 20 76 69 72 74  d and a new virt
a020: 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f 66 20 74  ual.** term of t
a030: 68 65 20 66 6f 72 6d 20 22 59 20 3c 6f 70 3e 20  he form "Y <op> 
a040: 58 22 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  X" is added to t
a050: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
a060: 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20  and.** analyzed 
a070: 73 65 70 61 72 61 74 65 6c 79 2e 20 20 54 68 65  separately.  The
a080: 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 20 69   original term i
a090: 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54 45  s marked with TE
a0a0: 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20 61 6e 64  RM_COPIED.** and
a0b0: 20 74 68 65 20 6e 65 77 20 74 65 72 6d 20 69 73   the new term is
a0c0: 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54 45 52   marked with TER
a0d0: 4d 5f 44 59 4e 41 4d 49 43 20 28 62 65 63 61 75  M_DYNAMIC (becau
a0e0: 73 65 20 69 74 27 73 20 70 45 78 70 72 0a 2a 2a  se it's pExpr.**
a0f0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65   needs to be fre
a100: 65 64 20 77 69 74 68 20 74 68 65 20 57 68 65 72  ed with the Wher
a110: 65 43 6c 61 75 73 65 29 20 61 6e 64 20 54 45 52  eClause) and TER
a120: 4d 5f 56 49 52 54 55 41 4c 20 28 62 65 63 61 75  M_VIRTUAL (becau
a130: 73 65 20 69 74 0a 2a 2a 20 69 73 20 61 20 63 6f  se it.** is a co
a140: 6d 6d 75 74 65 64 20 63 6f 70 79 20 6f 66 20 61  mmuted copy of a
a150: 20 70 72 69 6f 72 20 74 65 72 6d 2e 29 20 20 54   prior term.)  T
a160: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d  he original term
a170: 20 68 61 73 20 6e 43 68 69 6c 64 3d 31 0a 2a 2a   has nChild=1.**
a180: 20 61 6e 64 20 74 68 65 20 63 6f 70 79 20 68 61   and the copy ha
a190: 73 20 69 64 78 50 61 72 65 6e 74 20 73 65 74 20  s idxParent set 
a1a0: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
a1b0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72  the original ter
a1c0: 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  m..*/.static voi
a1d0: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 0a 20  d exprAnalyze(. 
a1e0: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
a1f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68             /* th
a200: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
a210: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
a220: 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  pWC,         /* 
a230: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
a240: 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72   */.  int idxTer
a250: 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
a260: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
a270: 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79  term to be analy
a280: 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  zed */.){.  Wher
a290: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
a2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a2b0: 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61  The term to be a
a2c0: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 57 68 65  nalyzed */.  Whe
a2d0: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
a2e0: 53 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Set;          /*
a2f0: 20 53 65 74 20 6f 66 20 74 61 62 6c 65 20 69 6e   Set of table in
a300: 64 65 78 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 45  dex masks */.  E
a310: 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20  xpr *pExpr;     
a320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a330: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
a340: 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  n to be analyzed
a350: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72   */.  Bitmask pr
a360: 65 72 65 71 4c 65 66 74 3b 20 20 20 20 20 20 20  ereqLeft;       
a370: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71         /* Prereq
a380: 75 65 73 69 74 65 73 20 6f 66 20 74 68 65 20 70  uesites of the p
a390: 45 78 70 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20  Expr->pLeft */. 
a3a0: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41   Bitmask prereqA
a3b0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
a3c0: 20 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74    /* Prerequesit
a3d0: 65 73 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20  es of pExpr */. 
a3e0: 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61 52 69   Bitmask extraRi
a3f0: 67 68 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ght = 0;        
a400: 20 20 2f 2a 20 45 78 74 72 61 20 64 65 70 65 6e    /* Extra depen
a410: 64 65 6e 63 69 65 73 20 6f 6e 20 4c 45 46 54 20  dencies on LEFT 
a420: 4a 4f 49 4e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  JOIN */.  Expr *
a430: 70 53 74 72 31 20 3d 20 30 3b 20 20 20 20 20 20  pStr1 = 0;      
a440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48             /* RH
a450: 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f  S of LIKE/GLOB o
a460: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  perator */.  int
a470: 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b   isComplete = 0;
a480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a490: 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f   RHS of LIKE/GLO
a4a0: 42 20 65 6e 64 73 20 77 69 74 68 20 77 69 6c 64  B ends with wild
a4b0: 63 61 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  card */.  int no
a4c0: 43 61 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Case = 0;       
a4d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49             /* LI
a4e0: 4b 45 2f 47 4c 4f 42 20 64 69 73 74 69 6e 67 75  KE/GLOB distingu
a4f0: 69 73 68 65 73 20 63 61 73 65 20 2a 2f 0a 20 20  ishes case */.  
a500: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
a510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a520: 20 2f 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70   /* Top-level op
a530: 65 72 61 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e  erator.  pExpr->
a540: 6f 70 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  op */.  Parse *p
a550: 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61  Parse = pWC->pPa
a560: 72 73 65 3b 20 20 20 20 20 2f 2a 20 50 61 72 73  rse;     /* Pars
a570: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
a580: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
a590: 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
a5a0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
a5b0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69  nnection */..  i
a5c0: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
a5d0: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
a5e0: 6e 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d  n;.  }.  pTerm =
a5f0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
a600: 5d 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20  ];.  pMaskSet = 
a610: 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a 20  pWC->pMaskSet;. 
a620: 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e   pExpr = pTerm->
a630: 70 45 78 70 72 3b 0a 20 20 70 72 65 72 65 71 4c  pExpr;.  prereqL
a640: 65 66 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55  eft = exprTableU
a650: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
a660: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
a670: 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
a680: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20    if( op==TK_IN 
a690: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
a6a0: 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20  Expr->pRight==0 
a6b0: 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  );.    if( ExprH
a6c0: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
a6d0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
a6e0: 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ){.      pTerm->
a6f0: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78  prereqRight = ex
a700: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
a710: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
a720: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a  pr->x.pSelect);.
a730: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a740: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
a750: 67 68 74 20 3d 20 65 78 70 72 4c 69 73 74 54 61  ght = exprListTa
a760: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
a770: 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  t, pExpr->x.pLis
a780: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  t);.    }.  }els
a790: 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  e if( op==TK_ISN
a7a0: 55 4c 4c 20 29 7b 0a 20 20 20 20 70 54 65 72 6d  ULL ){.    pTerm
a7b0: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
a7c0: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
a7d0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
a7e0: 68 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  ht = exprTableUs
a7f0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
a800: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
a810: 7d 0a 20 20 70 72 65 72 65 71 41 6c 6c 20 3d 20  }.  prereqAll = 
a820: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
a830: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 29 3b  MaskSet, pExpr);
a840: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
a850: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
a860: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20  _FromJoin) ){.  
a870: 20 20 42 69 74 6d 61 73 6b 20 78 20 3d 20 67 65    Bitmask x = ge
a880: 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
a890: 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69  pExpr->iRightJoi
a8a0: 6e 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 72 65  nTable);.    pre
a8b0: 72 65 71 41 6c 6c 20 7c 3d 20 78 3b 0a 20 20 20  reqAll |= x;.   
a8c0: 20 65 78 74 72 61 52 69 67 68 74 20 3d 20 78 2d   extraRight = x-
a8d0: 31 3b 20 20 2f 2a 20 4f 4e 20 63 6c 61 75 73 65  1;  /* ON clause
a8e0: 20 74 65 72 6d 73 20 6d 61 79 20 6e 6f 74 20 62   terms may not b
a8f0: 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69  e used with an i
a900: 6e 64 65 78 0a 20 20 20 20 20 20 20 20 20 20 20  ndex.           
a910: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f              ** o
a920: 6e 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20  n left table of 
a930: 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 54 69  a LEFT JOIN.  Ti
a940: 63 6b 65 74 20 23 33 30 31 35 20 2a 2f 0a 20 20  cket #3015 */.  
a950: 7d 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  }.  pTerm->prere
a960: 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c  qAll = prereqAll
a970: 3b 0a 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  ;.  pTerm->leftC
a980: 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 54  ursor = -1;.  pT
a990: 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d  erm->iParent = -
a9a0: 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65  1;.  pTerm->eOpe
a9b0: 72 61 74 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28  rator = 0;.  if(
a9c0: 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 26   allowedOp(op) &
a9d0: 26 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  & (pTerm->prereq
a9e0: 52 69 67 68 74 20 26 20 70 72 65 72 65 71 4c 65  Right & prereqLe
a9f0: 66 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78  ft)==0 ){.    Ex
aa00: 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
aa10: 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 45 78  r->pLeft;.    Ex
aa20: 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78  pr *pRight = pEx
aa30: 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
aa40: 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  if( pLeft->op==T
aa50: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
aa60: 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72    pTerm->leftCur
aa70: 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61  sor = pLeft->iTa
aa80: 62 6c 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  ble;.      pTerm
aa90: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d  ->u.leftColumn =
aaa0: 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b   pLeft->iColumn;
aab0: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f  .      pTerm->eO
aac0: 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74  perator = operat
aad0: 6f 72 4d 61 73 6b 28 6f 70 29 3b 0a 20 20 20 20  orMask(op);.    
aae0: 7d 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  }.    if( pRight
aaf0: 20 26 26 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d   && pRight->op==
ab00: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
ab10: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e     WhereTerm *pN
ab20: 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ew;.      Expr *
ab30: 70 44 75 70 3b 0a 20 20 20 20 20 20 69 66 28 20  pDup;.      if( 
ab40: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
ab50: 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r>=0 ){.        
ab60: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
ab70: 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74      pDup = sqlit
ab80: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45  e3ExprDup(db, pE
ab90: 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  xpr, 0);.       
aba0: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
abb0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
abc0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
abd0: 6c 65 74 65 28 64 62 2c 20 70 44 75 70 29 3b 0a  lete(db, pDup);.
abe0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
abf0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ac00: 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65      idxNew = whe
ac10: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
ac20: 57 43 2c 20 70 44 75 70 2c 20 54 45 52 4d 5f 56  WC, pDup, TERM_V
ac30: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
ac40: 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 69 66  MIC);.        if
ac50: 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 20 72 65  ( idxNew==0 ) re
ac60: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e  turn;.        pN
ac70: 65 77 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  ew = &pWC->a[idx
ac80: 4e 65 77 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e  New];.        pN
ac90: 65 77 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64  ew->iParent = id
aca0: 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70  xTerm;.        p
acb0: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
acc0: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20  dxTerm];.       
acd0: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
ace0: 20 31 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72   1;.        pTer
acf0: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
ad00: 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20  RM_COPIED;.     
ad10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ad20: 70 44 75 70 20 3d 20 70 45 78 70 72 3b 0a 20 20  pDup = pExpr;.  
ad30: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 54 65        pNew = pTe
ad40: 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rm;.      }.    
ad50: 20 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 70 50    exprCommute(pP
ad60: 61 72 73 65 2c 20 70 44 75 70 29 3b 0a 20 20 20  arse, pDup);.   
ad70: 20 20 20 70 4c 65 66 74 20 3d 20 70 44 75 70 2d     pLeft = pDup-
ad80: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 4e  >pLeft;.      pN
ad90: 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  ew->leftCursor =
ada0: 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a   pLeft->iTable;.
adb0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 6c 65        pNew->u.le
adc0: 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74  ftColumn = pLeft
add0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
ade0: 20 74 65 73 74 63 61 73 65 28 20 28 70 72 65 72   testcase( (prer
adf0: 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61 52 69  eqLeft | extraRi
ae00: 67 68 74 29 20 21 3d 20 70 72 65 72 65 71 4c 65  ght) != prereqLe
ae10: 66 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  ft );.      pNew
ae20: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
ae30: 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74  prereqLeft | ext
ae40: 72 61 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70  raRight;.      p
ae50: 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  New->prereqAll =
ae60: 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20   prereqAll;.    
ae70: 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f    pNew->eOperato
ae80: 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b  r = operatorMask
ae90: 28 70 44 75 70 2d 3e 6f 70 29 3b 0a 20 20 20 20  (pDup->op);.    
aea0: 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  }.  }..#ifndef S
aeb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45  QLITE_OMIT_BETWE
aec0: 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  EN_OPTIMIZATION.
aed0: 20 20 2f 2a 20 49 66 20 61 20 74 65 72 6d 20 69    /* If a term i
aee0: 73 20 74 68 65 20 42 45 54 57 45 45 4e 20 6f 70  s the BETWEEN op
aef0: 65 72 61 74 6f 72 2c 20 63 72 65 61 74 65 20 74  erator, create t
af00: 77 6f 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74  wo new virtual t
af10: 65 72 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20 64  erms.  ** that d
af20: 65 66 69 6e 65 20 74 68 65 20 72 61 6e 67 65 20  efine the range 
af30: 74 68 61 74 20 74 68 65 20 42 45 54 57 45 45 4e  that the BETWEEN
af40: 20 69 6d 70 6c 65 6d 65 6e 74 73 2e 20 20 46 6f   implements.  Fo
af50: 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a  r example:.  **.
af60: 20 20 2a 2a 20 20 20 20 20 20 61 20 42 45 54 57    **      a BETW
af70: 45 45 4e 20 62 20 41 4e 44 20 63 0a 20 20 2a 2a  EEN b AND c.  **
af80: 0a 20 20 2a 2a 20 69 73 20 63 6f 6e 76 65 72 74  .  ** is convert
af90: 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20  ed into:.  **.  
afa0: 2a 2a 20 20 20 20 20 20 28 61 20 42 45 54 57 45  **      (a BETWE
afb0: 45 4e 20 62 20 41 4e 44 20 63 29 20 41 4e 44 20  EN b AND c) AND 
afc0: 28 61 3e 3d 62 29 20 41 4e 44 20 28 61 3c 3d 63  (a>=b) AND (a<=c
afd0: 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ).  **.  ** The 
afe0: 74 77 6f 20 6e 65 77 20 74 65 72 6d 73 20 61 72  two new terms ar
aff0: 65 20 61 64 64 65 64 20 6f 6e 74 6f 20 74 68 65  e added onto the
b000: 20 65 6e 64 20 6f 66 20 74 68 65 20 57 68 65 72   end of the Wher
b010: 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 2e 0a  eClause object..
b020: 20 20 2a 2a 20 54 68 65 20 6e 65 77 20 74 65 72    ** The new ter
b030: 6d 73 20 61 72 65 20 22 64 79 6e 61 6d 69 63 22  ms are "dynamic"
b040: 20 61 6e 64 20 61 72 65 20 63 68 69 6c 64 72 65   and are childre
b050: 6e 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  n of the origina
b060: 6c 20 42 45 54 57 45 45 4e 0a 20 20 2a 2a 20 74  l BETWEEN.  ** t
b070: 65 72 6d 2e 20 20 54 68 61 74 20 6d 65 61 6e 73  erm.  That means
b080: 20 74 68 61 74 20 69 66 20 74 68 65 20 42 45 54   that if the BET
b090: 57 45 45 4e 20 74 65 72 6d 20 69 73 20 63 6f 64  WEEN term is cod
b0a0: 65 64 2c 20 74 68 65 20 63 68 69 6c 64 72 65 6e  ed, the children
b0b0: 20 61 72 65 0a 20 20 2a 2a 20 73 6b 69 70 70 65   are.  ** skippe
b0c0: 64 2e 20 20 4f 72 2c 20 69 66 20 74 68 65 20 63  d.  Or, if the c
b0d0: 68 69 6c 64 72 65 6e 20 61 72 65 20 73 61 74 69  hildren are sati
b0e0: 73 66 69 65 64 20 62 79 20 61 6e 20 69 6e 64 65  sfied by an inde
b0f0: 78 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  x, the original.
b100: 20 20 2a 2a 20 42 45 54 57 45 45 4e 20 74 65 72    ** BETWEEN ter
b110: 6d 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20  m is skipped..  
b120: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45  */.  else if( pE
b130: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57  xpr->op==TK_BETW
b140: 45 45 4e 20 26 26 20 70 57 43 2d 3e 6f 70 3d 3d  EEN && pWC->op==
b150: 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 45 78  TK_AND ){.    Ex
b160: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
b170: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
b180: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
b190: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 6f  tatic const u8 o
b1a0: 70 73 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20 54  ps[] = {TK_GE, T
b1b0: 4b 5f 4c 45 7d 3b 0a 20 20 20 20 61 73 73 65 72  K_LE};.    asser
b1c0: 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20  t( pList!=0 );. 
b1d0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
b1e0: 2d 3e 6e 45 78 70 72 3d 3d 32 20 29 3b 0a 20 20  ->nExpr==2 );.  
b1f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20    for(i=0; i<2; 
b200: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
b210: 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20   *pNewExpr;.    
b220: 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20    int idxNew;.  
b230: 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73      pNewExpr = s
b240: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
b250: 73 65 2c 20 6f 70 73 5b 69 5d 2c 20 0a 20 20 20  se, ops[i], .   
b260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b270: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b280: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
b290: 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29 2c 0a 20  pr->pLeft, 0),. 
b2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2b0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
b2c0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
b2d0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
b2e0: 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  , 0), 0);.      
b2f0: 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c  idxNew = whereCl
b300: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
b310: 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56  pNewExpr, TERM_V
b320: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
b330: 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MIC);.      test
b340: 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20  case( idxNew==0 
b350: 29 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e 61  );.      exprAna
b360: 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20  lyze(pSrc, pWC, 
b370: 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 70  idxNew);.      p
b380: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
b390: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70  dxTerm];.      p
b3a0: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50  WC->a[idxNew].iP
b3b0: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
b3c0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 65 72 6d  .    }.    pTerm
b3d0: 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20  ->nChild = 2;.  
b3e0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
b3f0: 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f  TE_OMIT_BETWEEN_
b400: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
b410: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
b420: 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
b430: 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64  IMIZATION) && !d
b440: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
b450: 49 54 5f 53 55 42 51 55 45 52 59 29 0a 20 20 2f  IT_SUBQUERY).  /
b460: 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d  * Analyze a term
b470: 20 74 68 61 74 20 69 73 20 63 6f 6d 70 6f 73 65   that is compose
b480: 64 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  d of two or more
b490: 20 73 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63   subterms connec
b4a0: 74 65 64 20 62 79 0a 20 20 2a 2a 20 61 6e 20 4f  ted by.  ** an O
b4b0: 52 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f  R operator..  */
b4c0: 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78 70  .  else if( pExp
b4d0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a  r->op==TK_OR ){.
b4e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 57 43 2d      assert( pWC-
b4f0: 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20  >op==TK_AND );. 
b500: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72     exprAnalyzeOr
b510: 54 65 72 6d 28 70 53 72 63 2c 20 70 57 43 2c 20  Term(pSrc, pWC, 
b520: 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20 70 54  idxTerm);.    pT
b530: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
b540: 78 54 65 72 6d 5d 3b 0a 20 20 7d 0a 23 65 6e 64  xTerm];.  }.#end
b550: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
b560: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
b570: 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  N */..#ifndef SQ
b580: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
b590: 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a  PTIMIZATION.  /*
b5a0: 20 41 64 64 20 63 6f 6e 73 74 72 61 69 6e 74 73   Add constraints
b5b0: 20 74 6f 20 72 65 64 75 63 65 20 74 68 65 20 73   to reduce the s
b5c0: 65 61 72 63 68 20 73 70 61 63 65 20 6f 6e 20 61  earch space on a
b5d0: 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 0a 20 20   LIKE or GLOB.  
b5e0: 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a  ** operator..  *
b5f0: 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b 65 20 70 61  *.  ** A like pa
b600: 74 74 65 72 6e 20 6f 66 20 74 68 65 20 66 6f 72  ttern of the for
b610: 6d 20 22 78 20 4c 49 4b 45 20 27 61 62 63 25 27  m "x LIKE 'abc%'
b620: 22 20 69 73 20 63 68 61 6e 67 65 64 20 69 6e 74  " is changed int
b630: 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  o constraints.  
b640: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
b650: 20 78 3e 3d 27 61 62 63 27 20 41 4e 44 20 78 3c   x>='abc' AND x<
b660: 27 61 62 64 27 20 41 4e 44 20 78 20 4c 49 4b 45  'abd' AND x LIKE
b670: 20 27 61 62 63 25 27 0a 20 20 2a 2a 0a 20 20 2a   'abc%'.  **.  *
b680: 2a 20 54 68 65 20 6c 61 73 74 20 63 68 61 72 61  * The last chara
b690: 63 74 65 72 20 6f 66 20 74 68 65 20 70 72 65 66  cter of the pref
b6a0: 69 78 20 22 61 62 63 22 20 69 73 20 69 6e 63 72  ix "abc" is incr
b6b0: 65 6d 65 6e 74 65 64 20 74 6f 20 66 6f 72 6d 20  emented to form 
b6c0: 74 68 65 0a 20 20 2a 2a 20 74 65 72 6d 69 6e 61  the.  ** termina
b6d0: 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e 20 22  tion condition "
b6e0: 61 62 64 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  abd"..  */.  if(
b6f0: 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44   pWC->op==TK_AND
b700: 20 0a 20 20 20 26 26 20 69 73 4c 69 6b 65 4f 72   .   && isLikeOr
b710: 47 6c 6f 62 28 70 50 61 72 73 65 2c 20 70 45 78  Glob(pParse, pEx
b720: 70 72 2c 20 26 70 53 74 72 31 2c 20 26 69 73 43  pr, &pStr1, &isC
b730: 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f 43 61 73 65  omplete, &noCase
b740: 29 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72 20  ).  ){.    Expr 
b750: 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a  *pLeft;       /*
b760: 20 4c 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f   LHS of LIKE/GLO
b770: 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  B operator */.  
b780: 20 20 45 78 70 72 20 2a 70 53 74 72 32 3b 20 20    Expr *pStr2;  
b790: 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20       /* Copy of 
b7a0: 70 53 74 72 31 20 2d 20 52 48 53 20 6f 66 20 4c  pStr1 - RHS of L
b7b0: 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f  IKE/GLOB operato
b7c0: 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70  r */.    Expr *p
b7d0: 4e 65 77 45 78 70 72 31 3b 0a 20 20 20 20 45 78  NewExpr1;.    Ex
b7e0: 70 72 20 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20  pr *pNewExpr2;. 
b7f0: 20 20 20 69 6e 74 20 69 64 78 4e 65 77 31 3b 0a     int idxNew1;.
b800: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 32 3b      int idxNew2;
b810: 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
b820: 6f 6c 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 6c 61  oll;    /* Colla
b830: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f  ting sequence to
b840: 20 75 73 65 20 2a 2f 0a 0a 20 20 20 20 70 4c 65   use */..    pLe
b850: 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ft = pExpr->x.pL
b860: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
b870: 0a 20 20 20 20 70 53 74 72 32 20 3d 20 73 71 6c  .    pStr2 = sql
b880: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
b890: 70 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 69  pStr1, 0);.    i
b8a0: 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
b8b0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 75 38  iled ){.      u8
b8c0: 20 63 2c 20 2a 70 43 3b 20 20 20 20 20 20 20 2f   c, *pC;       /
b8d0: 2a 20 4c 61 73 74 20 63 68 61 72 61 63 74 65 72  * Last character
b8e0: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
b8f0: 74 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20  t wildcard */.  
b900: 20 20 20 20 70 43 20 3d 20 28 75 38 2a 29 26 70      pC = (u8*)&p
b910: 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 73  Str2->u.zToken[s
b920: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
b930: 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2d  Str2->u.zToken)-
b940: 31 5d 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 70  1];.      c = *p
b950: 43 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43  C;.      if( noC
b960: 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ase ){.        /
b970: 2a 20 54 68 65 20 70 6f 69 6e 74 20 69 73 20 74  * The point is t
b980: 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  o increment the 
b990: 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 62  last character b
b9a0: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a  efore the first.
b9b0: 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 64 63          ** wildc
b9c0: 61 72 64 2e 20 20 42 75 74 20 69 66 20 77 65 20  ard.  But if we 
b9d0: 69 6e 63 72 65 6d 65 6e 74 20 27 40 27 2c 20 74  increment '@', t
b9e0: 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20 69 74  hat will push it
b9f0: 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
ba00: 20 20 2a 2a 20 61 6c 70 68 61 62 65 74 69 63 20    ** alphabetic 
ba10: 72 61 6e 67 65 20 77 68 65 72 65 20 63 61 73 65  range where case
ba20: 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 77 69 6c   conversions wil
ba30: 6c 20 6d 65 73 73 20 75 70 20 74 68 65 20 0a 20  l mess up the . 
ba40: 20 20 20 20 20 20 20 2a 2a 20 69 6e 65 71 75 61         ** inequa
ba50: 6c 69 74 79 2e 20 20 54 6f 20 61 76 6f 69 64 20  lity.  To avoid 
ba60: 74 68 69 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  this, make sure 
ba70: 74 6f 20 61 6c 73 6f 20 72 75 6e 20 74 68 65 20  to also run the 
ba80: 66 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  full.        ** 
ba90: 4c 49 4b 45 20 6f 6e 20 61 6c 6c 20 63 61 6e 64  LIKE on all cand
baa0: 69 64 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  idate expression
bab0: 73 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68  s by clearing th
bac0: 65 20 69 73 43 6f 6d 70 6c 65 74 65 20 66 6c 61  e isComplete fla
bad0: 67 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  g.        */.   
bae0: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 41 27 2d       if( c=='A'-
baf0: 31 20 29 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d  1 ) isComplete =
bb00: 20 30 3b 20 20 20 2f 2a 20 45 56 3a 20 52 2d 36   0;   /* EV: R-6
bb10: 34 33 33 39 2d 30 38 32 30 37 20 2a 2f 0a 0a 0a  4339-08207 */...
bb20: 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69          c = sqli
bb30: 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b  te3UpperToLower[
bb40: 63 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c];.      }.    
bb50: 20 20 2a 70 43 20 3d 20 63 20 2b 20 31 3b 0a 20    *pC = c + 1;. 
bb60: 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 6c 20 3d     }.    pColl =
bb70: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
bb80: 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55  Seq(db, SQLITE_U
bb90: 54 46 38 2c 20 6e 6f 43 61 73 65 20 3f 20 22 4e  TF8, noCase ? "N
bba0: 4f 43 41 53 45 22 20 3a 20 22 42 49 4e 41 52 59  OCASE" : "BINARY
bbb0: 22 2c 30 29 3b 0a 20 20 20 20 70 4e 65 77 45 78  ",0);.    pNewEx
bbc0: 70 72 31 20 3d 20 73 71 6c 69 74 65 33 50 45 78  pr1 = sqlite3PEx
bbd0: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 47 45  pr(pParse, TK_GE
bbe0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
bbf0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
bc00: 78 70 72 53 65 74 43 6f 6c 6c 28 73 71 6c 69 74  xprSetColl(sqlit
bc10: 65 33 45 78 70 72 44 75 70 28 64 62 2c 70 4c 65  e3ExprDup(db,pLe
bc20: 66 74 2c 30 29 2c 20 70 43 6f 6c 6c 29 2c 0a 20  ft,0), pColl),. 
bc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc40: 20 20 20 20 70 53 74 72 31 2c 20 30 29 3b 0a 20      pStr1, 0);. 
bc50: 20 20 20 69 64 78 4e 65 77 31 20 3d 20 77 68 65     idxNew1 = whe
bc60: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
bc70: 57 43 2c 20 70 4e 65 77 45 78 70 72 31 2c 20 54  WC, pNewExpr1, T
bc80: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
bc90: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74  _DYNAMIC);.    t
bca0: 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 31  estcase( idxNew1
bcb0: 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41  ==0 );.    exprA
bcc0: 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43  nalyze(pSrc, pWC
bcd0: 2c 20 69 64 78 4e 65 77 31 29 3b 0a 20 20 20 20  , idxNew1);.    
bce0: 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69  pNewExpr2 = sqli
bcf0: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
bd00: 20 54 4b 5f 4c 54 2c 0a 20 20 20 20 20 20 20 20   TK_LT,.        
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
bd20: 69 74 65 33 45 78 70 72 53 65 74 43 6f 6c 6c 28  ite3ExprSetColl(
bd30: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
bd40: 62 2c 70 4c 65 66 74 2c 30 29 2c 20 70 43 6f 6c  b,pLeft,0), pCol
bd50: 6c 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  l),.            
bd60: 20 20 20 20 20 20 20 20 20 70 53 74 72 32 2c 20           pStr2, 
bd70: 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 32 20  0);.    idxNew2 
bd80: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
bd90: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70  ert(pWC, pNewExp
bda0: 72 32 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  r2, TERM_VIRTUAL
bdb0: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
bdc0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64      testcase( id
bdd0: 78 4e 65 77 32 3d 3d 30 20 29 3b 0a 20 20 20 20  xNew2==0 );.    
bde0: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
bdf0: 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 32 29 3b  , pWC, idxNew2);
be00: 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57  .    pTerm = &pW
be10: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
be20: 20 20 20 69 66 28 20 69 73 43 6f 6d 70 6c 65 74     if( isComplet
be30: 65 20 29 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e  e ){.      pWC->
be40: 61 5b 69 64 78 4e 65 77 31 5d 2e 69 50 61 72 65  a[idxNew1].iPare
be50: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
be60: 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65      pWC->a[idxNe
be70: 77 32 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64  w2].iParent = id
be80: 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65  xTerm;.      pTe
be90: 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a  rm->nChild = 2;.
bea0: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
beb0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
bec0: 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  LIKE_OPTIMIZATIO
bed0: 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  N */..#ifndef SQ
bee0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
bef0: 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 41 64 64 20  LTABLE.  /* Add 
bf00: 61 20 57 4f 5f 4d 41 54 43 48 20 61 75 78 69 6c  a WO_MATCH auxil
bf10: 69 61 72 79 20 74 65 72 6d 20 74 6f 20 74 68 65  iary term to the
bf20: 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 65 74 20   constraint set 
bf30: 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  if the.  ** curr
bf40: 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ent expression i
bf50: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20  s of the form:  
bf60: 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70  column MATCH exp
bf70: 72 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69 6e 66  r..  ** This inf
bf80: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
bf90: 20 62 79 20 74 68 65 20 78 42 65 73 74 49 6e 64   by the xBestInd
bfa0: 65 78 20 6d 65 74 68 6f 64 73 20 6f 66 0a 20 20  ex methods of.  
bfb0: 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
bfc0: 73 2e 20 20 54 68 65 20 6e 61 74 69 76 65 20 71  s.  The native q
bfd0: 75 65 72 79 20 6f 70 74 69 6d 69 7a 65 72 20 64  uery optimizer d
bfe0: 6f 65 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 0a  oes not attempt.
bff0: 20 20 2a 2a 20 74 6f 20 64 6f 20 61 6e 79 74 68    ** to do anyth
c000: 69 6e 67 20 77 69 74 68 20 4d 41 54 43 48 20 66  ing with MATCH f
c010: 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  unctions..  */. 
c020: 20 69 66 28 20 69 73 4d 61 74 63 68 4f 66 43 6f   if( isMatchOfCo
c030: 6c 75 6d 6e 28 70 45 78 70 72 29 20 29 7b 0a 20  lumn(pExpr) ){. 
c040: 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20     int idxNew;. 
c050: 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c     Expr *pRight,
c060: 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 57 68 65   *pLeft;.    Whe
c070: 72 65 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d  reTerm *pNewTerm
c080: 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 70 72  ;.    Bitmask pr
c090: 65 72 65 71 43 6f 6c 75 6d 6e 2c 20 70 72 65 72  ereqColumn, prer
c0a0: 65 71 45 78 70 72 3b 0a 0a 20 20 20 20 70 52 69  eqExpr;..    pRi
c0b0: 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ght = pExpr->x.p
c0c0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
c0d0: 3b 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45  ;.    pLeft = pE
c0e0: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
c0f0: 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 72  1].pExpr;.    pr
c100: 65 72 65 71 45 78 70 72 20 3d 20 65 78 70 72 54  ereqExpr = exprT
c110: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
c120: 65 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  et, pRight);.   
c130: 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 20 3d 20   prereqColumn = 
c140: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
c150: 4d 61 73 6b 53 65 74 2c 20 70 4c 65 66 74 29 3b  MaskSet, pLeft);
c160: 0a 20 20 20 20 69 66 28 20 28 70 72 65 72 65 71  .    if( (prereq
c170: 45 78 70 72 20 26 20 70 72 65 72 65 71 43 6f 6c  Expr & prereqCol
c180: 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  umn)==0 ){.     
c190: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b   Expr *pNewExpr;
c1a0: 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70 72 20  .      pNewExpr 
c1b0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
c1c0: 50 61 72 73 65 2c 20 54 4b 5f 4d 41 54 43 48 2c  Parse, TK_MATCH,
c1d0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
c1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1f0: 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44 75  0, sqlite3ExprDu
c200: 70 28 64 62 2c 20 70 52 69 67 68 74 2c 20 30 29  p(db, pRight, 0)
c210: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64 78 4e  , 0);.      idxN
c220: 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  ew = whereClause
c230: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
c240: 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55  Expr, TERM_VIRTU
c250: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29  AL|TERM_DYNAMIC)
c260: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
c270: 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20  ( idxNew==0 );. 
c280: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20       pNewTerm = 
c290: 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b  &pWC->a[idxNew];
c2a0: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
c2b0: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 70  >prereqRight = p
c2c0: 72 65 72 65 71 45 78 70 72 3b 0a 20 20 20 20 20  rereqExpr;.     
c2d0: 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43   pNewTerm->leftC
c2e0: 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69  ursor = pLeft->i
c2f0: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65  Table;.      pNe
c300: 77 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  wTerm->u.leftCol
c310: 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f  umn = pLeft->iCo
c320: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77  lumn;.      pNew
c330: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
c340: 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a 20 20 20 20  = WO_MATCH;.    
c350: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69 50 61 72    pNewTerm->iPar
c360: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
c370: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
c380: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
c390: 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69       pTerm->nChi
c3a0: 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54  ld = 1;.      pT
c3b0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
c3c0: 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20  TERM_COPIED;.   
c3d0: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65     pNewTerm->pre
c3e0: 72 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e  reqAll = pTerm->
c3f0: 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d  prereqAll;.    }
c400: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
c410: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
c420: 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 2f 2a  ALTABLE */..  /*
c430: 20 50 72 65 76 65 6e 74 20 4f 4e 20 63 6c 61 75   Prevent ON clau
c440: 73 65 20 74 65 72 6d 73 20 6f 66 20 61 20 4c 45  se terms of a LE
c450: 46 54 20 4a 4f 49 4e 20 66 72 6f 6d 20 62 65 69  FT JOIN from bei
c460: 6e 67 20 75 73 65 64 20 74 6f 20 64 72 69 76 65  ng used to drive
c470: 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 66  .  ** an index f
c480: 6f 72 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  or tables to the
c490: 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69   left of the joi
c4a0: 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 2d  n..  */.  pTerm-
c4b0: 3e 70 72 65 72 65 71 52 69 67 68 74 20 7c 3d 20  >prereqRight |= 
c4c0: 65 78 74 72 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f  extraRight;.}../
c4d0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
c4e0: 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65   if any of the e
c4f0: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 70 4c  xpressions in pL
c500: 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 2e 2e 2e  ist->a[iFirst...
c510: 5d 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 20 72  ] contain.** a r
c520: 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20  eference to any 
c530: 74 61 62 6c 65 20 6f 74 68 65 72 20 74 68 61 6e  table other than
c540: 20 74 68 65 20 69 42 61 73 65 20 74 61 62 6c 65   the iBase table
c550: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c560: 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54  referencesOtherT
c570: 61 62 6c 65 73 28 0a 20 20 45 78 70 72 4c 69 73  ables(.  ExprLis
c580: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
c590: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 65 78 70     /* Search exp
c5a0: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 73 20  ressions in ths 
c5b0: 6c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d  list */.  WhereM
c5c0: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
c5d0: 2c 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66  ,   /* Mapping f
c5e0: 72 6f 6d 20 74 61 62 6c 65 73 20 74 6f 20 62 69  rom tables to bi
c5f0: 74 6d 61 70 73 20 2a 2f 0a 20 20 69 6e 74 20 69  tmaps */.  int i
c600: 46 69 72 73 74 2c 20 20 20 20 20 20 20 20 20 20  First,          
c610: 20 20 20 20 20 2f 2a 20 42 65 20 73 65 61 72 63       /* Be searc
c620: 68 69 6e 67 20 77 69 74 68 20 74 68 65 20 69 46  hing with the iF
c630: 69 72 73 74 2d 74 68 20 65 78 70 72 65 73 73 69  irst-th expressi
c640: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73  on */.  int iBas
c650: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
c660: 20 20 2f 2a 20 49 67 6e 6f 72 65 20 72 65 66 65    /* Ignore refe
c670: 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74  rences to this t
c680: 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 42 69 74  able */.){.  Bit
c690: 6d 61 73 6b 20 61 6c 6c 6f 77 65 64 20 3d 20 7e  mask allowed = ~
c6a0: 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
c6b0: 2c 20 69 42 61 73 65 29 3b 0a 20 20 77 68 69 6c  , iBase);.  whil
c6c0: 65 28 20 69 46 69 72 73 74 3c 70 4c 69 73 74 2d  e( iFirst<pList-
c6d0: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 69 66  >nExpr ){.    if
c6e0: 28 20 28 65 78 70 72 54 61 62 6c 65 55 73 61 67  ( (exprTableUsag
c6f0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73  e(pMaskSet, pLis
c700: 74 2d 3e 61 5b 69 46 69 72 73 74 2b 2b 5d 2e 70  t->a[iFirst++].p
c710: 45 78 70 72 29 26 61 6c 6c 6f 77 65 64 29 21 3d  Expr)&allowed)!=
c720: 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
c730: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
c740: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f   return 0;.}.../
c750: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
c760: 65 20 64 65 63 69 64 65 73 20 69 66 20 70 49 64  e decides if pId
c770: 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  x can be used to
c780: 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44   satisfy the ORD
c790: 45 52 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65 2e  ER BY.** clause.
c7a0: 20 20 49 66 20 69 74 20 63 61 6e 2c 20 69 74 20    If it can, it 
c7b0: 72 65 74 75 72 6e 73 20 31 2e 20 20 49 66 20 70  returns 1.  If p
c7c0: 49 64 78 20 63 61 6e 6e 6f 74 20 73 61 74 69 73  Idx cannot satis
c7d0: 66 79 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20  fy the.** ORDER 
c7e0: 42 59 20 63 6c 61 75 73 65 2c 20 74 68 69 73 20  BY clause, this 
c7f0: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
c800: 30 2e 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42  0..**.** pOrderB
c810: 79 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  y is an ORDER BY
c820: 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 61 20 53   clause from a S
c830: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
c840: 20 20 70 54 61 62 20 69 73 20 74 68 65 0a 2a 2a    pTab is the.**
c850: 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65   left-most table
c860: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
c870: 75 73 65 20 6f 66 20 74 68 61 74 20 73 61 6d 65  use of that same
c880: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
c890: 74 20 61 6e 64 0a 2a 2a 20 74 68 65 20 74 61 62  t and.** the tab
c8a0: 6c 65 20 68 61 73 20 61 20 63 75 72 73 6f 72 20  le has a cursor 
c8b0: 6e 75 6d 62 65 72 20 6f 66 20 22 62 61 73 65 22  number of "base"
c8c0: 2e 20 20 70 49 64 78 20 69 73 20 61 6e 20 69 6e  .  pIdx is an in
c8d0: 64 65 78 20 6f 6e 20 70 54 61 62 2e 0a 2a 2a 0a  dex on pTab..**.
c8e0: 2a 2a 20 6e 45 71 43 6f 6c 20 69 73 20 74 68 65  ** nEqCol is the
c8f0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
c900: 6e 73 20 6f 66 20 70 49 64 78 20 74 68 61 74 20  ns of pIdx that 
c910: 61 72 65 20 75 73 65 64 20 61 73 20 65 71 75 61  are used as equa
c920: 6c 69 74 79 0a 2a 2a 20 63 6f 6e 73 74 72 61 69  lity.** constrai
c930: 6e 74 73 2e 20 20 41 6e 79 20 6f 66 20 74 68 65  nts.  Any of the
c940: 73 65 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62  se columns may b
c950: 65 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 74  e missing from t
c960: 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63  he ORDER BY.** c
c970: 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 6d 61  lause and the ma
c980: 74 63 68 20 63 61 6e 20 73 74 69 6c 6c 20 62 65  tch can still be
c990: 20 61 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a   a success..**.*
c9a0: 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  * All terms of t
c9b0: 68 65 20 4f 52 44 45 52 20 42 59 20 74 68 61 74  he ORDER BY that
c9c0: 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 74   match against t
c9d0: 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62 65  he index must be
c9e0: 20 65 69 74 68 65 72 0a 2a 2a 20 41 53 43 20 6f   either.** ASC o
c9f0: 72 20 44 45 53 43 2e 20 20 28 54 65 72 6d 73 20  r DESC.  (Terms 
ca00: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
ca10: 63 6c 61 75 73 65 20 70 61 73 74 20 74 68 65 20  clause past the 
ca20: 65 6e 64 20 6f 66 20 61 20 55 4e 49 51 55 45 0a  end of a UNIQUE.
ca30: 2a 2a 20 69 6e 64 65 78 20 64 6f 20 6e 6f 74 20  ** index do not 
ca40: 6e 65 65 64 20 74 6f 20 73 61 74 69 73 66 79 20  need to satisfy 
ca50: 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e  this constraint.
ca60: 29 20 20 54 68 65 20 2a 70 62 52 65 76 20 76 61  )  The *pbRev va
ca70: 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  lue is.** set to
ca80: 20 31 20 69 66 20 74 68 65 20 4f 52 44 45 52 20   1 if the ORDER 
ca90: 42 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c 6c  BY clause is all
caa0: 20 44 45 53 43 20 61 6e 64 20 69 74 20 69 73 20   DESC and it is 
cab0: 73 65 74 20 74 6f 20 30 20 69 66 0a 2a 2a 20 74  set to 0 if.** t
cac0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
cad0: 73 65 20 69 73 20 61 6c 6c 20 41 53 43 2e 0a 2a  se is all ASC..*
cae0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 53  /.static int isS
caf0: 6f 72 74 69 6e 67 49 6e 64 65 78 28 0a 20 20 50  ortingIndex(.  P
cb00: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
cb10: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
cb20: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
cb30: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
cb40: 73 6b 53 65 74 2c 20 2f 2a 20 4d 61 70 70 69 6e  skSet, /* Mappin
cb50: 67 20 66 72 6f 6d 20 74 61 62 6c 65 20 63 75 72  g from table cur
cb60: 73 6f 72 20 6e 75 6d 62 65 72 73 20 74 6f 20 62  sor numbers to b
cb70: 69 74 6d 61 70 73 20 2a 2f 0a 20 20 49 6e 64 65  itmaps */.  Inde
cb80: 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
cb90: 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
cba0: 20 77 65 20 61 72 65 20 74 65 73 74 69 6e 67 20   we are testing 
cbb0: 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65 2c 20 20  */.  int base,  
cbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cbd0: 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  Cursor number fo
cbe0: 72 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  r the table to b
cbf0: 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 45 78  e sorted */.  Ex
cc00: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
cc10: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  ,     /* The ORD
cc20: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
cc30: 20 20 69 6e 74 20 6e 45 71 43 6f 6c 2c 20 20 20    int nEqCol,   
cc40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
cc50: 62 65 72 20 6f 66 20 69 6e 64 65 78 20 63 6f 6c  ber of index col
cc60: 75 6d 6e 73 20 77 69 74 68 20 3d 3d 20 63 6f 6e  umns with == con
cc70: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 69 6e  straints */.  in
cc80: 74 20 2a 70 62 52 65 76 20 20 20 20 20 20 20 20  t *pbRev        
cc90: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
cca0: 31 20 69 66 20 4f 52 44 45 52 20 42 59 20 69 73  1 if ORDER BY is
ccb0: 20 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 69 6e   DESC */.){.  in
ccc0: 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
ccd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cce0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
ccf0: 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
cd00: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
cd10: 20 20 20 20 2f 2a 20 58 4f 52 20 6f 66 20 69 6e      /* XOR of in
cd20: 64 65 78 20 61 6e 64 20 4f 52 44 45 52 20 42 59  dex and ORDER BY
cd30: 20 73 6f 72 74 20 64 69 72 65 63 74 69 6f 6e 20   sort direction 
cd40: 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20  */.  int nTerm; 
cd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd60: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
cd70: 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  f ORDER BY terms
cd80: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70   */.  struct Exp
cd90: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72  rList_item *pTer
cda0: 6d 3b 20 20 20 20 2f 2a 20 41 20 74 65 72 6d 20  m;    /* A term 
cdb0: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
cdc0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 71 6c 69  clause */.  sqli
cdd0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
cde0: 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  ->db;..  assert(
cdf0: 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a   pOrderBy!=0 );.
ce00: 20 20 6e 54 65 72 6d 20 3d 20 70 4f 72 64 65 72    nTerm = pOrder
ce10: 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73  By->nExpr;.  ass
ce20: 65 72 74 28 20 6e 54 65 72 6d 3e 30 20 29 3b 0a  ert( nTerm>0 );.
ce30: 0a 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 70  .  /* Argument p
ce40: 49 64 78 20 6d 75 73 74 20 65 69 74 68 65 72 20  Idx must either 
ce50: 70 6f 69 6e 74 20 74 6f 20 61 20 27 72 65 61 6c  point to a 'real
ce60: 27 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 73 74  ' named index st
ce70: 72 75 63 74 75 72 65 2c 20 0a 20 20 2a 2a 20 6f  ructure, .  ** o
ce80: 72 20 61 6e 20 69 6e 64 65 78 20 73 74 72 75 63  r an index struc
ce90: 74 75 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f  ture allocated o
cea0: 6e 20 74 68 65 20 73 74 61 63 6b 20 62 79 20 62  n the stack by b
ceb0: 65 73 74 42 74 72 65 65 49 6e 64 65 78 28 29 20  estBtreeIndex() 
cec0: 74 6f 0a 20 20 2a 2a 20 72 65 70 72 65 73 65 6e  to.  ** represen
ced0: 74 20 74 68 65 20 72 6f 77 69 64 20 69 6e 64 65  t the rowid inde
cee0: 78 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  x that is part o
cef0: 66 20 65 76 65 72 79 20 74 61 62 6c 65 2e 20 20  f every table.  
cf00: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  */.  assert( pId
cf10: 78 2d 3e 7a 4e 61 6d 65 20 7c 7c 20 28 70 49 64  x->zName || (pId
cf20: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26  x->nColumn==1 &&
cf30: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
cf40: 30 5d 3d 3d 2d 31 29 20 29 3b 0a 0a 20 20 2f 2a  0]==-1) );..  /*
cf50: 20 4d 61 74 63 68 20 74 65 72 6d 73 20 6f 66 20   Match terms of 
cf60: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
cf70: 75 73 65 20 61 67 61 69 6e 73 74 20 63 6f 6c 75  use against colu
cf80: 6d 6e 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  mns of.  ** the 
cf90: 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  index..  **.  **
cfa0: 20 4e 6f 74 65 20 74 68 61 74 20 69 6e 64 69 63   Note that indic
cfb0: 65 73 20 68 61 76 65 20 70 49 64 78 2d 3e 6e 43  es have pIdx->nC
cfc0: 6f 6c 75 6d 6e 20 72 65 67 75 6c 61 72 20 63 6f  olumn regular co
cfd0: 6c 75 6d 6e 73 20 70 6c 75 73 0a 20 20 2a 2a 20  lumns plus.  ** 
cfe0: 6f 6e 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63  one additional c
cff0: 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 69 6e 67  olumn containing
d000: 20 74 68 65 20 72 6f 77 69 64 2e 20 20 54 68 65   the rowid.  The
d010: 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 0a 20 20   rowid column.  
d020: 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ** of the index 
d030: 69 73 20 61 6c 73 6f 20 61 6c 6c 6f 77 65 64 20  is also allowed 
d040: 74 6f 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74  to match against
d050: 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20   the ORDER BY.  
d060: 2a 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a  ** clause..  */.
d070: 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65    for(i=j=0, pTe
d080: 72 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20  rm=pOrderBy->a; 
d090: 6a 3c 6e 54 65 72 6d 20 26 26 20 69 3c 3d 70 49  j<nTerm && i<=pI
d0a0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  dx->nColumn; i++
d0b0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
d0c0: 70 72 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  pr;       /* The
d0d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74   expression of t
d0e0: 68 65 20 4f 52 44 45 52 20 42 59 20 70 54 65 72  he ORDER BY pTer
d0f0: 6d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71  m */.    CollSeq
d100: 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 54   *pColl;    /* T
d110: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
d120: 75 65 6e 63 65 20 6f 66 20 70 45 78 70 72 20 2a  uence of pExpr *
d130: 2f 0a 20 20 20 20 69 6e 74 20 74 65 72 6d 53 6f  /.    int termSo
d140: 72 74 4f 72 64 65 72 3b 20 2f 2a 20 53 6f 72 74  rtOrder; /* Sort
d150: 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73 20   order for this 
d160: 74 65 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  term */.    int 
d170: 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 2f  iColumn;       /
d180: 2a 20 54 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d  * The i-th colum
d190: 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  n of the index. 
d1a0: 20 2d 31 20 66 6f 72 20 72 6f 77 69 64 20 2a 2f   -1 for rowid */
d1b0: 0a 20 20 20 20 69 6e 74 20 69 53 6f 72 74 4f 72  .    int iSortOr
d1c0: 64 65 72 3b 20 20 20 20 2f 2a 20 31 20 66 6f 72  der;    /* 1 for
d1d0: 20 44 45 53 43 2c 20 30 20 66 6f 72 20 41 53 43   DESC, 0 for ASC
d1e0: 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 69 6e 64   on the i-th ind
d1f0: 65 78 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 63  ex term */.    c
d200: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
d210: 3b 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65  ; /* Name of the
d220: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
d230: 6e 63 65 20 66 6f 72 20 69 2d 74 68 20 69 6e 64  nce for i-th ind
d240: 65 78 20 74 65 72 6d 20 2a 2f 0a 0a 20 20 20 20  ex term */..    
d250: 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
d260: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45  Expr;.    if( pE
d270: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
d280: 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61  MN || pExpr->iTa
d290: 62 6c 65 21 3d 62 61 73 65 20 29 7b 0a 20 20 20  ble!=base ){.   
d2a0: 20 20 20 2f 2a 20 43 61 6e 20 6e 6f 74 20 75 73     /* Can not us
d2b0: 65 20 61 6e 20 69 6e 64 65 78 20 73 6f 72 74 20  e an index sort 
d2c0: 6f 6e 20 61 6e 79 74 68 69 6e 67 20 74 68 61 74  on anything that
d2d0: 20 69 73 20 6e 6f 74 20 61 20 63 6f 6c 75 6d 6e   is not a column
d2e0: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   in the.      **
d2f0: 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65   left-most table
d300: 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
d310: 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  use */.      bre
d320: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  ak;.    }.    pC
d330: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
d340: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
d350: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28   pExpr);.    if(
d360: 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
d370: 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
d380: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20  ltColl;.    }.  
d390: 20 20 69 66 28 20 70 49 64 78 2d 3e 7a 4e 61 6d    if( pIdx->zNam
d3a0: 65 20 26 26 20 69 3c 70 49 64 78 2d 3e 6e 43 6f  e && i<pIdx->nCo
d3b0: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69 43  lumn ){.      iC
d3c0: 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 61 69  olumn = pIdx->ai
d3d0: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
d3e0: 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49   if( iColumn==pI
d3f0: 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65  dx->pTable->iPKe
d400: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f  y ){.        iCo
d410: 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
d420: 20 7d 0a 20 20 20 20 20 20 69 53 6f 72 74 4f 72   }.      iSortOr
d430: 64 65 72 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72  der = pIdx->aSor
d440: 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 20  tOrder[i];.     
d450: 20 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61   zColl = pIdx->a
d460: 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 7d 65  zColl[i];.    }e
d470: 6c 73 65 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75  lse{.      iColu
d480: 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69  mn = -1;.      i
d490: 53 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a 20  SortOrder = 0;. 
d4a0: 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 43 6f       zColl = pCo
d4b0: 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 7d  ll->zName;.    }
d4c0: 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
d4d0: 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e  iColumn!=iColumn
d4e0: 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43   || sqlite3StrIC
d4f0: 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c  mp(pColl->zName,
d500: 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20   zColl) ){.     
d510: 20 2f 2a 20 54 65 72 6d 20 6a 20 6f 66 20 74 68   /* Term j of th
d520: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
d530: 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  e does not match
d540: 20 63 6f 6c 75 6d 6e 20 69 20 6f 66 20 74 68 65   column i of the
d550: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
d560: 69 66 28 20 69 3c 6e 45 71 43 6f 6c 20 29 7b 0a  if( i<nEqCol ){.
d570: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e          /* If an
d580: 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68   index column th
d590: 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65  at is constraine
d5a0: 64 20 62 79 20 3d 3d 20 66 61 69 6c 73 20 74 6f  d by == fails to
d5b0: 20 6d 61 74 63 68 20 61 6e 0a 20 20 20 20 20 20   match an.      
d5c0: 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 74 65    ** ORDER BY te
d5d0: 72 6d 2c 20 74 68 61 74 20 69 73 20 4f 4b 2e 20  rm, that is OK. 
d5e0: 20 4a 75 73 74 20 69 67 6e 6f 72 65 20 74 68 61   Just ignore tha
d5f0: 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
d600: 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 2a 2f  index.        */
d610: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
d620: 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  e;.      }else i
d630: 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c  f( i==pIdx->nCol
d640: 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  umn ){.        /
d650: 2a 20 49 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 69  * Index column i
d660: 20 69 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20   is the rowid.  
d670: 41 6c 6c 20 6f 74 68 65 72 20 74 65 72 6d 73 20  All other terms 
d680: 6d 61 74 63 68 2e 20 2a 2f 0a 20 20 20 20 20 20  match. */.      
d690: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
d6a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
d6b0: 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c   If an index col
d6c0: 75 6d 6e 20 66 61 69 6c 73 20 74 6f 20 6d 61 74  umn fails to mat
d6d0: 63 68 20 61 6e 64 20 69 73 20 6e 6f 74 20 63 6f  ch and is not co
d6e0: 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 0a  nstrained by ==.
d6f0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
d700: 74 68 65 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74  the index cannot
d710: 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44   satisfy the ORD
d720: 45 52 20 42 59 20 63 6f 6e 73 74 72 61 69 6e 74  ER BY constraint
d730: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
d740: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
d750: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
d760: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
d770: 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 7c 7c 20  SortOrder!=0 || 
d780: 69 43 6f 6c 75 6d 6e 3d 3d 2d 31 20 29 3b 0a 20  iColumn==-1 );. 
d790: 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
d7a0: 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c  ->sortOrder==0 |
d7b0: 7c 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64  | pTerm->sortOrd
d7c0: 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  er==1 );.    ass
d7d0: 65 72 74 28 20 69 53 6f 72 74 4f 72 64 65 72 3d  ert( iSortOrder=
d7e0: 3d 30 20 7c 7c 20 69 53 6f 72 74 4f 72 64 65 72  =0 || iSortOrder
d7f0: 3d 3d 31 20 29 3b 0a 20 20 20 20 74 65 72 6d 53  ==1 );.    termS
d800: 6f 72 74 4f 72 64 65 72 20 3d 20 69 53 6f 72 74  ortOrder = iSort
d810: 4f 72 64 65 72 20 5e 20 70 54 65 72 6d 2d 3e 73  Order ^ pTerm->s
d820: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 69 66  ortOrder;.    if
d830: 28 20 69 3e 6e 45 71 43 6f 6c 20 29 7b 0a 20 20  ( i>nEqCol ){.  
d840: 20 20 20 20 69 66 28 20 74 65 72 6d 53 6f 72 74      if( termSort
d850: 4f 72 64 65 72 21 3d 73 6f 72 74 4f 72 64 65 72  Order!=sortOrder
d860: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
d870: 6e 64 69 63 65 73 20 63 61 6e 20 6f 6e 6c 79 20  ndices can only 
d880: 62 65 20 75 73 65 64 20 69 66 20 61 6c 6c 20 4f  be used if all O
d890: 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 70 61  RDER BY terms pa
d8a0: 73 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  st the.        *
d8b0: 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  * equality const
d8c0: 72 61 69 6e 74 73 20 61 72 65 20 61 6c 6c 20 65  raints are all e
d8d0: 69 74 68 65 72 20 44 45 53 43 20 6f 72 20 41 53  ither DESC or AS
d8e0: 43 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  C. */.        re
d8f0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
d900: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d910: 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 74 65 72   sortOrder = ter
d920: 6d 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  mSortOrder;.    
d930: 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 70  }.    j++;.    p
d940: 54 65 72 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Term++;.    if( 
d950: 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 72 65  iColumn<0 && !re
d960: 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54 61 62  ferencesOtherTab
d970: 6c 65 73 28 70 4f 72 64 65 72 42 79 2c 20 70 4d  les(pOrderBy, pM
d980: 61 73 6b 53 65 74 2c 20 6a 2c 20 62 61 73 65 29  askSet, j, base)
d990: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
d9a0: 74 68 65 20 69 6e 64 65 78 65 64 20 63 6f 6c 75  the indexed colu
d9b0: 6d 6e 20 69 73 20 74 68 65 20 70 72 69 6d 61 72  mn is the primar
d9c0: 79 20 6b 65 79 20 61 6e 64 20 65 76 65 72 79 74  y key and everyt
d9d0: 68 69 6e 67 20 6d 61 74 63 68 65 73 0a 20 20 20  hing matches.   
d9e0: 20 20 20 2a 2a 20 73 6f 20 66 61 72 20 61 6e 64     ** so far and
d9f0: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44   none of the ORD
da00: 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 74  ER BY terms to t
da10: 68 65 20 72 69 67 68 74 20 72 65 66 65 72 65 6e  he right referen
da20: 63 65 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a  ce other.      *
da30: 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  * tables in the 
da40: 6a 6f 69 6e 2c 20 74 68 65 6e 20 77 65 20 61 72  join, then we ar
da50: 65 20 61 73 73 75 72 65 64 20 74 68 61 74 20 74  e assured that t
da60: 68 65 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20  he index can be 
da70: 75 73 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 74  used .      ** t
da80: 6f 20 73 6f 72 74 20 62 65 63 61 75 73 65 20 74  o sort because t
da90: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  he primary key i
daa0: 73 20 75 6e 69 71 75 65 20 61 6e 64 20 73 6f 20  s unique and so 
dab0: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 6f 74 68 65  none of the othe
dac0: 72 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  r.      ** colum
dad0: 6e 73 20 77 69 6c 6c 20 6d 61 6b 65 20 61 6e 79  ns will make any
dae0: 20 64 69 66 66 65 72 65 6e 63 65 0a 20 20 20 20   difference.    
daf0: 20 20 2a 2f 0a 20 20 20 20 20 20 6a 20 3d 20 6e    */.      j = n
db00: 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Term;.    }.  }.
db10: 0a 20 20 2a 70 62 52 65 76 20 3d 20 73 6f 72 74  .  *pbRev = sort
db20: 4f 72 64 65 72 21 3d 30 3b 0a 20 20 69 66 28 20  Order!=0;.  if( 
db30: 6a 3e 3d 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20  j>=nTerm ){.    
db40: 2f 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20  /* All terms of 
db50: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
db60: 75 73 65 20 61 72 65 20 63 6f 76 65 72 65 64 20  use are covered 
db70: 62 79 20 74 68 69 73 20 69 6e 64 65 78 20 73 6f  by this index so
db80: 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 6e 64  .    ** this ind
db90: 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 66  ex can be used f
dba0: 6f 72 20 73 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20  or sorting. */. 
dbb0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
dbc0: 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45  .  if( pIdx->onE
dbd0: 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26  rror!=OE_None &&
dbe0: 20 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   i==pIdx->nColum
dbf0: 6e 0a 20 20 20 20 20 20 26 26 20 21 72 65 66 65  n.      && !refe
dc00: 72 65 6e 63 65 73 4f 74 68 65 72 54 61 62 6c 65  rencesOtherTable
dc10: 73 28 70 4f 72 64 65 72 42 79 2c 20 70 4d 61 73  s(pOrderBy, pMas
dc20: 6b 53 65 74 2c 20 6a 2c 20 62 61 73 65 29 20 29  kSet, j, base) )
dc30: 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 74 65 72  {.    /* All ter
dc40: 6d 73 20 6f 66 20 74 68 69 73 20 69 6e 64 65 78  ms of this index
dc50: 20 6d 61 74 63 68 20 73 6f 6d 65 20 70 72 65 66   match some pref
dc60: 69 78 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ix of the ORDER 
dc70: 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a  BY clause.    **
dc80: 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69   and the index i
dc90: 73 20 55 4e 49 51 55 45 20 61 6e 64 20 6e 6f 20  s UNIQUE and no 
dca0: 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 74 61 69  terms on the tai
dcb0: 6c 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  l of the ORDER B
dcc0: 59 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20  Y.    ** clause 
dcd0: 72 65 66 65 72 65 6e 63 65 20 6f 74 68 65 72 20  reference other 
dce0: 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e  tables in a join
dcf0: 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 61 6c  .  If this is al
dd00: 6c 20 74 72 75 65 20 74 68 65 6e 0a 20 20 20 20  l true then.    
dd10: 2a 2a 20 74 68 65 20 6f 72 64 65 72 20 62 79 20  ** the order by 
dd20: 63 6c 61 75 73 65 20 69 73 20 73 75 70 65 72 66  clause is superf
dd30: 6c 75 6f 75 73 2e 20 2a 2f 0a 20 20 20 20 72 65  luous. */.    re
dd40: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
dd50: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
dd60: 20 50 72 65 70 61 72 65 20 61 20 63 72 75 64 65   Prepare a crude
dd70: 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
dd80: 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68   logarithm of th
dd90: 65 20 69 6e 70 75 74 20 76 61 6c 75 65 2e 0a 2a  e input value..*
dda0: 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6e 65  * The results ne
ddb0: 65 64 20 6e 6f 74 20 62 65 20 65 78 61 63 74 2e  ed not be exact.
ddc0: 20 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 75    This is only u
ddd0: 73 65 64 20 66 6f 72 20 65 73 74 69 6d 61 74 69  sed for estimati
dde0: 6e 67 0a 2a 2a 20 74 68 65 20 74 6f 74 61 6c 20  ng.** the total 
ddf0: 63 6f 73 74 20 6f 66 20 70 65 72 66 6f 72 6d 69  cost of performi
de00: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 69  ng operations wi
de10: 74 68 20 4f 28 6c 6f 67 4e 29 20 6f 72 20 4f 28  th O(logN) or O(
de20: 4e 6c 6f 67 4e 29 0a 2a 2a 20 63 6f 6d 70 6c 65  NlogN).** comple
de30: 78 69 74 79 2e 20 20 42 65 63 61 75 73 65 20 4e  xity.  Because N
de40: 20 69 73 20 6a 75 73 74 20 61 20 67 75 65 73 73   is just a guess
de50: 2c 20 69 74 20 69 73 20 6e 6f 20 67 72 65 61 74  , it is no great
de60: 20 74 72 61 67 65 64 79 20 69 66 0a 2a 2a 20 6c   tragedy if.** l
de70: 6f 67 4e 20 69 73 20 61 20 6c 69 74 74 6c 65 20  ogN is a little 
de80: 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 64  off..*/.static d
de90: 6f 75 62 6c 65 20 65 73 74 4c 6f 67 28 64 6f 75  ouble estLog(dou
dea0: 62 6c 65 20 4e 29 7b 0a 20 20 64 6f 75 62 6c 65  ble N){.  double
deb0: 20 6c 6f 67 4e 20 3d 20 31 3b 0a 20 20 64 6f 75   logN = 1;.  dou
dec0: 62 6c 65 20 78 20 3d 20 31 30 3b 0a 20 20 77 68  ble x = 10;.  wh
ded0: 69 6c 65 28 20 4e 3e 78 20 29 7b 0a 20 20 20 20  ile( N>x ){.    
dee0: 6c 6f 67 4e 20 2b 3d 20 31 3b 0a 20 20 20 20 78  logN += 1;.    x
def0: 20 2a 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 72 65   *= 10;.  }.  re
df00: 74 75 72 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a 2f 2a  turn logN;.}../*
df10: 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65 73  .** Two routines
df20: 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 74 68   for printing th
df30: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20  e content of an 
df40: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
df50: 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  fo.** structure.
df60: 20 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69    Used for testi
df70: 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
df80: 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74 68   only.  If neith
df90: 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53  er.** SQLITE_TES
dfa0: 54 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 42 55  T or SQLITE_DEBU
dfb0: 47 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20 74  G are defined, t
dfc0: 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69 6e  hen these routin
dfd0: 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73  es.** are no-ops
dfe0: 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  ..*/.#if !define
dff0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
e000: 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64  RTUALTABLE) && d
e010: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
e020: 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64  BUG).static void
e030: 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54   TRACE_IDX_INPUT
e040: 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  S(sqlite3_index_
e050: 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20  info *p){.  int 
e060: 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  i;.  if( !sqlite
e070: 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65  3WhereTrace ) re
e080: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
e090: 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
e0a0: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  t; i++){.    sql
e0b0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
e0c0: 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64  "  constraint[%d
e0d0: 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64  ]: col=%d termid
e0e0: 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c 65  =%d op=%d usable
e0f0: 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d=%d\n",.       
e100: 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  i,.       p->aCo
e110: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c  nstraint[i].iCol
e120: 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  umn,.       p->a
e130: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54  Constraint[i].iT
e140: 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20 20  ermOffset,.     
e150: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
e160: 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70  [i].op,.       p
e170: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
e180: 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20  .usable);.  }.  
e190: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
e1a0: 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
e1b0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
e1c0: 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79 5b  intf("  orderby[
e1d0: 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63  %d]: col=%d desc
e1e0: 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69  =%d\n",.       i
e1f0: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64  ,.       p->aOrd
e200: 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c  erBy[i].iColumn,
e210: 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65  .       p->aOrde
e220: 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20  rBy[i].desc);.  
e230: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
e240: 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
e250: 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  S(sqlite3_index_
e260: 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20  info *p){.  int 
e270: 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  i;.  if( !sqlite
e280: 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65  3WhereTrace ) re
e290: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
e2a0: 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
e2b0: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  t; i++){.    sql
e2c0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
e2d0: 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61 72  "  usage[%d]: ar
e2e0: 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64  gvIdx=%d omit=%d
e2f0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
e300: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
e310: 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67  aintUsage[i].arg
e320: 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 70  vIndex,.       p
e330: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
e340: 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d  ge[i].omit);.  }
e350: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
e360: 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d 3d  rintf("  idxNum=
e370: 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d  %d\n", p->idxNum
e380: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
e390: 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 53 74  gPrintf("  idxSt
e3a0: 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53  r=%s\n", p->idxS
e3b0: 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  tr);.  sqlite3De
e3c0: 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64  bugPrintf("  ord
e3d0: 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c  erByConsumed=%d\
e3e0: 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f  n", p->orderByCo
e3f0: 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74  nsumed);.  sqlit
e400: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
e410: 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d 25   estimatedCost=%
e420: 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74  g\n", p->estimat
e430: 65 64 43 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73 65  edCost);.}.#else
e440: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49  .#define TRACE_I
e450: 44 58 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65  DX_INPUTS(A).#de
e460: 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f  fine TRACE_IDX_O
e470: 55 54 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66  UTPUTS(A).#endif
e480: 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 71 75 69 72 65  ../* .** Require
e490: 64 20 62 65 63 61 75 73 65 20 62 65 73 74 49 6e  d because bestIn
e4a0: 64 65 78 28 29 20 69 73 20 63 61 6c 6c 65 64 20  dex() is called 
e4b0: 62 79 20 62 65 73 74 4f 72 43 6c 61 75 73 65 49  by bestOrClauseI
e4c0: 6e 64 65 78 28 29 20 0a 2a 2f 0a 73 74 61 74 69  ndex() .*/.stati
e4d0: 63 20 76 6f 69 64 20 62 65 73 74 49 6e 64 65 78  c void bestIndex
e4e0: 28 0a 20 20 20 20 50 61 72 73 65 2a 2c 20 57 68  (.    Parse*, Wh
e4f0: 65 72 65 43 6c 61 75 73 65 2a 2c 20 73 74 72 75  ereClause*, stru
e500: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 2a  ct SrcList_item*
e510: 2c 0a 20 20 20 20 42 69 74 6d 61 73 6b 2c 20 42  ,.    Bitmask, B
e520: 69 74 6d 61 73 6b 2c 20 45 78 70 72 4c 69 73 74  itmask, ExprList
e530: 2a 2c 20 57 68 65 72 65 43 6f 73 74 2a 29 3b 0a  *, WhereCost*);.
e540: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
e550: 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
e560: 66 69 6e 64 20 61 6e 20 73 63 61 6e 6e 69 6e 67  find an scanning
e570: 20 73 74 72 61 74 65 67 79 20 74 68 61 74 20 63   strategy that c
e580: 61 6e 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 74  an be used .** t
e590: 6f 20 6f 70 74 69 6d 69 7a 65 20 61 6e 20 27 4f  o optimize an 'O
e5a0: 52 27 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  R' expression th
e5b0: 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  at is part of a 
e5c0: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 0a 2a  WHERE clause. .*
e5d0: 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 61  *.** The table a
e5e0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 46  ssociated with F
e5f0: 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
e600: 70 53 72 63 20 6d 61 79 20 62 65 20 65 69 74 68  pSrc may be eith
e610: 65 72 20 61 0a 2a 2a 20 72 65 67 75 6c 61 72 20  er a.** regular 
e620: 42 2d 54 72 65 65 20 74 61 62 6c 65 20 6f 72 20  B-Tree table or 
e630: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
e640: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e650: 62 65 73 74 4f 72 43 6c 61 75 73 65 49 6e 64 65  bestOrClauseInde
e660: 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
e670: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
e680: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
e690: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
e6a0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
e6b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
e6c0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
e6d0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
e6e0: 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a  _item *pSrc,  /*
e6f0: 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
e700: 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20   term to search 
e710: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
e720: 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20  Ready,          
e730: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73   /* Mask of curs
e740: 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  ors not availabl
e750: 65 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a  e for indexing *
e760: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 56  /.  Bitmask notV
e770: 61 6c 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  alid,           
e780: 2f 2a 20 43 75 72 73 6f 72 73 20 6e 6f 74 20 61  /* Cursors not a
e790: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6e 79  vailable for any
e7a0: 20 70 75 72 70 6f 73 65 20 2a 2f 0a 20 20 45 78   purpose */.  Ex
e7b0: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
e7c0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
e7d0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
e7e0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20   */.  WhereCost 
e7f0: 2a 70 43 6f 73 74 20 20 20 20 20 20 20 20 20 20  *pCost          
e800: 20 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74    /* Lowest cost
e810: 20 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 29   query plan */.)
e820: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
e830: 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
e840: 41 54 49 4f 4e 0a 20 20 63 6f 6e 73 74 20 69 6e  ATION.  const in
e850: 74 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e 69  t iCur = pSrc->i
e860: 43 75 72 73 6f 72 3b 20 20 20 2f 2a 20 54 68 65  Cursor;   /* The
e870: 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74   cursor of the t
e880: 61 62 6c 65 20 74 6f 20 62 65 20 61 63 63 65 73  able to be acces
e890: 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 42  sed */.  const B
e8a0: 69 74 6d 61 73 6b 20 6d 61 73 6b 53 72 63 20 3d  itmask maskSrc =
e8b0: 20 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70 4d   getMask(pWC->pM
e8c0: 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 20 20  askSet, iCur);  
e8d0: 2f 2a 20 42 69 74 6d 61 73 6b 20 66 6f 72 20 70  /* Bitmask for p
e8e0: 53 72 63 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  Src */.  WhereTe
e8f0: 72 6d 20 2a 20 63 6f 6e 73 74 20 70 57 43 45 6e  rm * const pWCEn
e900: 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d  d = &pWC->a[pWC-
e910: 3e 6e 54 65 72 6d 5d 3b 20 20 20 20 20 20 20 20  >nTerm];        
e920: 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61  /* End of pWC->a
e930: 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  [] */.  WhereTer
e940: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
e950: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
e960: 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68  ingle term of th
e970: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
e980: 2f 0a 0a 20 20 2f 2a 20 4e 6f 20 4f 52 2d 63 6c  /..  /* No OR-cl
e990: 61 75 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ause optimizatio
e9a0: 6e 20 61 6c 6c 6f 77 65 64 20 69 66 20 74 68 65  n allowed if the
e9b0: 20 49 4e 44 45 58 45 44 20 42 59 20 6f 72 20 4e   INDEXED BY or N
e9c0: 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73  OT INDEXED claus
e9d0: 65 73 0a 20 20 2a 2a 20 61 72 65 20 75 73 65 64  es.  ** are used
e9e0: 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e   */.  if( pSrc->
e9f0: 6e 6f 74 49 6e 64 65 78 65 64 20 7c 7c 20 70 53  notIndexed || pS
ea00: 72 63 2d 3e 70 49 6e 64 65 78 21 3d 30 20 29 7b  rc->pIndex!=0 ){
ea10: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
ea20: 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68  ..  /* Search th
ea30: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
ea40: 65 72 6d 73 20 66 6f 72 20 61 20 75 73 61 62 6c  erms for a usabl
ea50: 65 20 57 4f 5f 4f 52 20 74 65 72 6d 2e 20 2a 2f  e WO_OR term. */
ea60: 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
ea70: 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
ea80: 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
ea90: 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
eaa0: 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 0a 20 20  rator==WO_OR .  
eab0: 20 20 20 26 26 20 28 28 70 54 65 72 6d 2d 3e 70     && ((pTerm->p
eac0: 72 65 72 65 71 41 6c 6c 20 26 20 7e 6d 61 73 6b  rereqAll & ~mask
ead0: 53 72 63 29 20 26 20 6e 6f 74 52 65 61 64 79 29  Src) & notReady)
eae0: 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65  ==0.     && (pTe
eaf0: 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69  rm->u.pOrInfo->i
eb00: 6e 64 65 78 61 62 6c 65 20 26 20 6d 61 73 6b 53  ndexable & maskS
eb10: 72 63 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20  rc)!=0 .    ){. 
eb20: 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65       WhereClause
eb30: 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d   * const pOrWC =
eb40: 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e   &pTerm->u.pOrIn
eb50: 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68  fo->wc;.      Wh
eb60: 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20  ereTerm * const 
eb70: 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57  pOrWCEnd = &pOrW
eb80: 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72  C->a[pOrWC->nTer
eb90: 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54  m];.      WhereT
eba0: 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20  erm *pOrTerm;.  
ebb0: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
ebc0: 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a  WHERE_MULTI_OR;.
ebd0: 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 54 6f        double rTo
ebe0: 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 64  tal = 0;.      d
ebf0: 6f 75 62 6c 65 20 6e 52 6f 77 20 3d 20 30 3b 0a  ouble nRow = 0;.
ec00: 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 75 73        Bitmask us
ec10: 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 66  ed = 0;..      f
ec20: 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43  or(pOrTerm=pOrWC
ec30: 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72  ->a; pOrTerm<pOr
ec40: 57 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b  WCEnd; pOrTerm++
ec50: 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  ){.        Where
ec60: 43 6f 73 74 20 73 54 65 72 6d 43 6f 73 74 3b 0a  Cost sTermCost;.
ec70: 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
ec80: 43 45 28 28 22 2e 2e 2e 20 4d 75 6c 74 69 2d 69  CE(("... Multi-i
ec90: 6e 64 65 78 20 4f 52 20 74 65 73 74 69 6e 67 20  ndex OR testing 
eca0: 66 6f 72 20 74 65 72 6d 20 25 64 20 6f 66 20 25  for term %d of %
ecb0: 64 2e 2e 2e 2e 5c 6e 22 2c 20 0a 20 20 20 20 20  d....\n", .     
ecc0: 20 20 20 20 20 28 70 4f 72 54 65 72 6d 20 2d 20       (pOrTerm - 
ecd0: 70 4f 72 57 43 2d 3e 61 29 2c 20 28 70 54 65 72  pOrWC->a), (pTer
ece0: 6d 20 2d 20 70 57 43 2d 3e 61 29 0a 20 20 20 20  m - pWC->a).    
ecf0: 20 20 20 20 29 29 3b 0a 20 20 20 20 20 20 20 20      ));.        
ed00: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  if( pOrTerm->eOp
ed10: 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 29  erator==WO_AND )
ed20: 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68 65 72  {.          Wher
ed30: 65 43 6c 61 75 73 65 20 2a 70 41 6e 64 57 43 20  eClause *pAndWC 
ed40: 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41  = &pOrTerm->u.pA
ed50: 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20  ndInfo->wc;.    
ed60: 20 20 20 20 20 20 62 65 73 74 49 6e 64 65 78 28        bestIndex(
ed70: 70 50 61 72 73 65 2c 20 70 41 6e 64 57 43 2c 20  pParse, pAndWC, 
ed80: 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20  pSrc, notReady, 
ed90: 6e 6f 74 56 61 6c 69 64 2c 20 30 2c 20 26 73 54  notValid, 0, &sT
eda0: 65 72 6d 43 6f 73 74 29 3b 0a 20 20 20 20 20 20  ermCost);.      
edb0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54    }else if( pOrT
edc0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
edd0: 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20  =iCur ){.       
ede0: 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 74     WhereClause t
edf0: 65 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20  empWC;.         
ee00: 20 74 65 6d 70 57 43 2e 70 50 61 72 73 65 20 3d   tempWC.pParse =
ee10: 20 70 57 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pWC->pParse;.  
ee20: 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70          tempWC.p
ee30: 4d 61 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70  MaskSet = pWC->p
ee40: 4d 61 73 6b 53 65 74 3b 0a 20 20 20 20 20 20 20  MaskSet;.       
ee50: 20 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d 20 54     tempWC.op = T
ee60: 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 20  K_AND;.         
ee70: 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54   tempWC.a = pOrT
ee80: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 74  erm;.          t
ee90: 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b  empWC.nTerm = 1;
eea0: 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74 49  .          bestI
eeb0: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26 74 65  ndex(pParse, &te
eec0: 6d 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52  mpWC, pSrc, notR
eed0: 65 61 64 79 2c 20 6e 6f 74 56 61 6c 69 64 2c 20  eady, notValid, 
eee0: 30 2c 20 26 73 54 65 72 6d 43 6f 73 74 29 3b 0a  0, &sTermCost);.
eef0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
ef00: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
ef10: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
ef20: 20 20 20 20 20 72 54 6f 74 61 6c 20 2b 3d 20 73       rTotal += s
ef30: 54 65 72 6d 43 6f 73 74 2e 72 43 6f 73 74 3b 0a  TermCost.rCost;.
ef40: 20 20 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20          nRow += 
ef50: 73 54 65 72 6d 43 6f 73 74 2e 70 6c 61 6e 2e 6e  sTermCost.plan.n
ef60: 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 75 73 65  Row;.        use
ef70: 64 20 7c 3d 20 73 54 65 72 6d 43 6f 73 74 2e 75  d |= sTermCost.u
ef80: 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28  sed;.        if(
ef90: 20 72 54 6f 74 61 6c 3e 3d 70 43 6f 73 74 2d 3e   rTotal>=pCost->
efa0: 72 43 6f 73 74 20 29 20 62 72 65 61 6b 3b 0a 20  rCost ) break;. 
efb0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
efc0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
efd0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
efe0: 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 73 63   increase the sc
eff0: 61 6e 20 63 6f 73 74 20 74 6f 20 61 63 63 6f 75  an cost to accou
f000: 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  nt .      ** for
f010: 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65   the cost of the
f020: 20 73 6f 72 74 2e 20 2a 2f 0a 20 20 20 20 20 20   sort. */.      
f030: 69 66 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20  if( pOrderBy!=0 
f040: 29 7b 0a 20 20 20 20 20 20 20 20 57 48 45 52 45  ){.        WHERE
f050: 54 52 41 43 45 28 28 22 2e 2e 2e 20 73 6f 72 74  TRACE(("... sort
f060: 69 6e 67 20 69 6e 63 72 65 61 73 65 73 20 4f 52  ing increases OR
f070: 20 63 6f 73 74 20 25 2e 39 67 20 74 6f 20 25 2e   cost %.9g to %.
f080: 39 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  9g\n",.         
f090: 20 20 20 20 20 20 20 20 20 20 20 72 54 6f 74 61             rTota
f0a0: 6c 2c 20 72 54 6f 74 61 6c 2b 6e 52 6f 77 2a 65  l, rTotal+nRow*e
f0b0: 73 74 4c 6f 67 28 6e 52 6f 77 29 29 29 3b 0a 20  stLog(nRow)));. 
f0c0: 20 20 20 20 20 20 20 72 54 6f 74 61 6c 20 2b 3d         rTotal +=
f0d0: 20 6e 52 6f 77 2a 65 73 74 4c 6f 67 28 6e 52 6f   nRow*estLog(nRo
f0e0: 77 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  w);.      }..   
f0f0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 73     /* If the cos
f100: 74 20 6f 66 20 73 63 61 6e 6e 69 6e 67 20 75 73  t of scanning us
f110: 69 6e 67 20 74 68 69 73 20 4f 52 20 74 65 72 6d  ing this OR term
f120: 20 66 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f   for optimizatio
f130: 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c 65  n is.      ** le
f140: 73 73 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  ss than the curr
f150: 65 6e 74 20 63 6f 73 74 20 73 74 6f 72 65 64 20  ent cost stored 
f160: 69 6e 20 70 43 6f 73 74 2c 20 72 65 70 6c 61 63  in pCost, replac
f170: 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20  e the contents. 
f180: 20 20 20 20 20 2a 2a 20 6f 66 20 70 43 6f 73 74       ** of pCost
f190: 2e 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45  . */.      WHERE
f1a0: 54 52 41 43 45 28 28 22 2e 2e 2e 20 6d 75 6c 74  TRACE(("... mult
f1b0: 69 2d 69 6e 64 65 78 20 4f 52 20 63 6f 73 74 3d  i-index OR cost=
f1c0: 25 2e 39 67 20 6e 72 6f 77 3d 25 2e 39 67 5c 6e  %.9g nrow=%.9g\n
f1d0: 22 2c 20 72 54 6f 74 61 6c 2c 20 6e 52 6f 77 29  ", rTotal, nRow)
f1e0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 54 6f  );.      if( rTo
f1f0: 74 61 6c 3c 70 43 6f 73 74 2d 3e 72 43 6f 73 74  tal<pCost->rCost
f200: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 73   ){.        pCos
f210: 74 2d 3e 72 43 6f 73 74 20 3d 20 72 54 6f 74 61  t->rCost = rTota
f220: 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74  l;.        pCost
f230: 2d 3e 75 73 65 64 20 3d 20 75 73 65 64 3b 0a 20  ->used = used;. 
f240: 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c         pCost->pl
f250: 61 6e 2e 6e 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a  an.nRow = nRow;.
f260: 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70          pCost->p
f270: 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 66 6c  lan.wsFlags = fl
f280: 61 67 73 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  ags;.        pCo
f290: 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 54 65 72 6d  st->plan.u.pTerm
f2a0: 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
f2b0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
f2c0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
f2d0: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
f2e0: 4e 20 2a 2f 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  N */.}..#ifndef 
f2f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
f300: 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a  MATIC_INDEX./*.*
f310: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
f320: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
f330: 65 20 74 65 72 6d 20 70 54 65 72 6d 20 69 73 20  e term pTerm is 
f340: 6f 66 20 61 20 66 6f 72 6d 20 77 68 65 72 65 20  of a form where 
f350: 69 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 75  it.** could be u
f360: 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65  sed with an inde
f370: 78 20 74 6f 20 61 63 63 65 73 73 20 70 53 72 63  x to access pSrc
f380: 2c 20 61 73 73 75 6d 69 6e 67 20 61 6e 20 61 70  , assuming an ap
f390: 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e 64  propriate.** ind
f3a0: 65 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a 73  ex existed..*/.s
f3b0: 74 61 74 69 63 20 69 6e 74 20 74 65 72 6d 43 61  tatic int termCa
f3c0: 6e 44 72 69 76 65 49 6e 64 65 78 28 0a 20 20 57  nDriveIndex(.  W
f3d0: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
f3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f3f0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
f400: 72 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  rm to check */. 
f410: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
f420: 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20  item *pSrc,     
f430: 2f 2a 20 54 61 62 6c 65 20 77 65 20 61 72 65 20  /* Table we are 
f440: 74 72 79 69 6e 67 20 74 6f 20 61 63 63 65 73 73  trying to access
f450: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
f460: 74 52 65 61 64 79 20 20 20 20 20 20 20 20 20 20  tReady          
f470: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 69       /* Tables i
f480: 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f 66  n outer loops of
f490: 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a   the join */.){.
f4a0: 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 69 66    char aff;.  if
f4b0: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
f4c0: 73 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75 72 73  sor!=pSrc->iCurs
f4d0: 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  or ) return 0;. 
f4e0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
f4f0: 72 61 74 6f 72 21 3d 57 4f 5f 45 51 20 29 20 72  rator!=WO_EQ ) r
f500: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
f510: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
f520: 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d  ht & notReady)!=
f530: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
f540: 61 66 66 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  aff = pSrc->pTab
f550: 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e 75 2e  ->aCol[pTerm->u.
f560: 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69  leftColumn].affi
f570: 6e 69 74 79 3b 0a 20 20 69 66 28 20 21 73 71 6c  nity;.  if( !sql
f580: 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
f590: 79 4f 6b 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  yOk(pTerm->pExpr
f5a0: 2c 20 61 66 66 29 20 29 20 72 65 74 75 72 6e 20  , aff) ) return 
f5b0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  0;.  return 1;.}
f5c0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
f5d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
f5e0: 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a  OMATIC_INDEX./*.
f5f0: 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  ** If the query 
f600: 70 6c 61 6e 20 66 6f 72 20 70 53 72 63 20 73 70  plan for pSrc sp
f610: 65 63 69 66 69 65 64 20 69 6e 20 70 43 6f 73 74  ecified in pCost
f620: 20 69 73 20 61 20 66 75 6c 6c 20 74 61 62 6c 65   is a full table
f630: 20 73 63 61 6e 0a 2a 2a 20 61 6e 64 20 69 6e 64   scan.** and ind
f640: 65 78 69 6e 67 20 69 73 20 61 6c 6c 6f 77 73 20  exing is allows 
f650: 28 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20  (if there is no 
f660: 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75  NOT INDEXED clau
f670: 73 65 29 20 61 6e 64 20 69 74 0a 2a 2a 20 70 6f  se) and it.** po
f680: 73 73 69 62 6c 65 20 74 6f 20 63 6f 6e 73 74 72  ssible to constr
f690: 75 63 74 20 61 20 74 72 61 6e 73 69 65 6e 74 20  uct a transient 
f6a0: 69 6e 64 65 78 20 74 68 61 74 20 77 6f 75 6c 64  index that would
f6b0: 20 70 65 72 66 6f 72 6d 20 62 65 74 74 65 72 0a   perform better.
f6c0: 2a 2a 20 74 68 61 6e 20 61 20 66 75 6c 6c 20 74  ** than a full t
f6d0: 61 62 6c 65 20 73 63 61 6e 20 65 76 65 6e 20 77  able scan even w
f6e0: 68 65 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 20  hen the cost of 
f6f0: 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 74 68 65  constructing the
f700: 20 69 6e 64 65 78 0a 2a 2a 20 69 73 20 74 61 6b   index.** is tak
f710: 65 6e 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2c  en into account,
f720: 20 74 68 65 6e 20 61 6c 74 65 72 20 74 68 65 20   then alter the 
f730: 71 75 65 72 79 20 70 6c 61 6e 20 74 6f 20 75 73  query plan to us
f740: 65 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 69 65  e the.** transie
f750: 6e 74 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  nt index..*/.sta
f760: 74 69 63 20 76 6f 69 64 20 62 65 73 74 41 75 74  tic void bestAut
f770: 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20 50  omaticIndex(.  P
f780: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
f790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
f7a0: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
f7b0: 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
f7c0: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
f7d0: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
f7e0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
f7f0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
f800: 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46  *pSrc,  /* The F
f810: 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
f820: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42  to search */.  B
f830: 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
f840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
f850: 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68  sk of cursors th
f860: 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  at are not avail
f870: 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  able */.  WhereC
f880: 6f 73 74 20 2a 70 43 6f 73 74 20 20 20 20 20 20  ost *pCost      
f890: 20 20 20 20 20 20 2f 2a 20 4c 6f 77 65 73 74 20        /* Lowest 
f8a0: 63 6f 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20  cost query plan 
f8b0: 2a 2f 0a 29 7b 0a 20 20 64 6f 75 62 6c 65 20 6e  */.){.  double n
f8c0: 54 61 62 6c 65 52 6f 77 3b 20 20 20 20 20 20 20  TableRow;       
f8d0: 20 20 20 20 2f 2a 20 52 6f 77 73 20 69 6e 20 74      /* Rows in t
f8e0: 68 65 20 69 6e 70 75 74 20 74 61 62 6c 65 20 2a  he input table *
f8f0: 2f 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 67 4e 3b  /.  double logN;
f900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f910: 2f 2a 20 6c 6f 67 28 6e 54 61 62 6c 65 52 6f 77  /* log(nTableRow
f920: 29 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 63 6f  ) */.  double co
f930: 73 74 54 65 6d 70 49 64 78 3b 20 20 20 20 20 20  stTempIdx;      
f940: 20 20 20 2f 2a 20 70 65 72 2d 71 75 65 72 79 20     /* per-query 
f950: 63 6f 73 74 20 6f 66 20 74 68 65 20 74 72 61 6e  cost of the tran
f960: 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20  sient index */. 
f970: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
f980: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
f990: 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66  A single term of
f9a0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
f9b0: 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
f9c0: 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20 20   *pWCEnd;       
f9d0: 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43     /* End of pWC
f9e0: 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 54 61 62 6c 65  ->a[] */.  Table
f9f0: 20 2a 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20   *pTable;       
fa00: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
fa10: 74 68 74 20 6d 69 67 68 74 20 62 65 20 69 6e 64  tht might be ind
fa20: 65 78 65 64 20 2a 2f 0a 0a 20 20 69 66 28 20 28  exed */..  if( (
fa30: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
fa40: 73 20 26 20 53 51 4c 49 54 45 5f 41 75 74 6f 49  s & SQLITE_AutoI
fa50: 6e 64 65 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ndex)==0 ){.    
fa60: 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64  /* Automatic ind
fa70: 69 63 65 73 20 61 72 65 20 64 69 73 61 62 6c 65  ices are disable
fa80: 64 20 61 74 20 72 75 6e 2d 74 69 6d 65 20 2a 2f  d at run-time */
fa90: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
faa0: 0a 20 20 69 66 28 20 28 70 43 6f 73 74 2d 3e 70  .  if( (pCost->p
fab0: 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
fac0: 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e  ERE_NOT_FULLSCAN
fad0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57  )!=0 ){.    /* W
fae0: 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 73  e already have s
faf0: 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 69 6e 64 65  ome kind of inde
fb00: 78 20 69 6e 20 75 73 65 20 66 6f 72 20 74 68 69  x in use for thi
fb10: 73 20 71 75 65 72 79 2e 20 2a 2f 0a 20 20 20 20  s query. */.    
fb20: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
fb30: 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78  ( pSrc->notIndex
fb40: 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ed ){.    /* The
fb50: 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61   NOT INDEXED cla
fb60: 75 73 65 20 61 70 70 65 61 72 73 20 69 6e 20 74  use appears in t
fb70: 68 65 20 53 51 4c 2e 20 2a 2f 0a 20 20 20 20 72  he SQL. */.    r
fb80: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61 73  eturn;.  }..  as
fb90: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 51  sert( pParse->nQ
fba0: 75 65 72 79 4c 6f 6f 70 20 3e 3d 20 28 64 6f 75  ueryLoop >= (dou
fbb0: 62 6c 65 29 31 20 29 3b 0a 20 20 70 54 61 62 6c  ble)1 );.  pTabl
fbc0: 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a  e = pSrc->pTab;.
fbd0: 20 20 6e 54 61 62 6c 65 52 6f 77 20 3d 20 70 54    nTableRow = pT
fbe0: 61 62 6c 65 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20  able->nRowEst;. 
fbf0: 20 6c 6f 67 4e 20 3d 20 65 73 74 4c 6f 67 28 6e   logN = estLog(n
fc00: 54 61 62 6c 65 52 6f 77 29 3b 0a 20 20 63 6f 73  TableRow);.  cos
fc10: 74 54 65 6d 70 49 64 78 20 3d 20 32 2a 6c 6f 67  tTempIdx = 2*log
fc20: 4e 2a 28 6e 54 61 62 6c 65 52 6f 77 2f 70 50 61  N*(nTableRow/pPa
fc30: 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
fc40: 2b 20 31 29 3b 0a 20 20 69 66 28 20 63 6f 73 74  + 1);.  if( cost
fc50: 54 65 6d 70 49 64 78 3e 3d 70 43 6f 73 74 2d 3e  TempIdx>=pCost->
fc60: 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20  rCost ){.    /* 
fc70: 54 68 65 20 63 6f 73 74 20 6f 66 20 63 72 65 61  The cost of crea
fc80: 74 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65  ting the transie
fc90: 6e 74 20 74 61 62 6c 65 20 77 6f 75 6c 64 20 62  nt table would b
fca0: 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 20  e greater than. 
fcb0: 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 65 20     ** doing the 
fcc0: 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20  full table scan 
fcd0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  */.    return;. 
fce0: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
fcf0: 66 6f 72 20 61 6e 79 20 65 71 75 61 6c 69 74 79  for any equality
fd00: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 74 65 72 6d   comparison term
fd10: 20 2a 2f 0a 20 20 70 57 43 45 6e 64 20 3d 20 26   */.  pWCEnd = &
fd20: 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
fd30: 6d 5d 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d  m];.  for(pTerm=
fd40: 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
fd50: 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  CEnd; pTerm++){.
fd60: 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44      if( termCanD
fd70: 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c  riveIndex(pTerm,
fd80: 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29   pSrc, notReady)
fd90: 20 29 7b 0a 20 20 20 20 20 20 57 48 45 52 45 54   ){.      WHERET
fda0: 52 41 43 45 28 28 22 61 75 74 6f 2d 69 6e 64 65  RACE(("auto-inde
fdb0: 78 20 72 65 64 75 63 65 73 20 63 6f 73 74 20 66  x reduces cost f
fdc0: 72 6f 6d 20 25 2e 32 66 20 74 6f 20 25 2e 32 66  rom %.2f to %.2f
fdd0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
fde0: 20 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e           pCost->
fdf0: 72 43 6f 73 74 2c 20 63 6f 73 74 54 65 6d 70 49  rCost, costTempI
fe00: 64 78 29 29 3b 0a 20 20 20 20 20 20 70 43 6f 73  dx));.      pCos
fe10: 74 2d 3e 72 43 6f 73 74 20 3d 20 63 6f 73 74 54  t->rCost = costT
fe20: 65 6d 70 49 64 78 3b 0a 20 20 20 20 20 20 70 43  empIdx;.      pC
fe30: 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 20 3d  ost->plan.nRow =
fe40: 20 6c 6f 67 4e 20 2b 20 31 3b 0a 20 20 20 20 20   logN + 1;.     
fe50: 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46   pCost->plan.wsF
fe60: 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 54 45 4d  lags = WHERE_TEM
fe70: 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20 20 70  P_INDEX;.      p
fe80: 43 6f 73 74 2d 3e 75 73 65 64 20 3d 20 70 54 65  Cost->used = pTe
fe90: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b  rm->prereqRight;
fea0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
feb0: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a    }.  }.}.#else.
fec0: 23 20 64 65 66 69 6e 65 20 62 65 73 74 41 75 74  # define bestAut
fed0: 6f 6d 61 74 69 63 49 6e 64 65 78 28 41 2c 42 2c  omaticIndex(A,B,
fee0: 43 2c 44 2c 45 29 20 20 2f 2a 20 6e 6f 2d 6f 70  C,D,E)  /* no-op
fef0: 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51   */.#endif /* SQ
ff00: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
ff10: 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 0a 23  TIC_INDEX */...#
ff20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ff30: 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
ff40: 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  EX./*.** Generat
ff50: 65 20 63 6f 64 65 20 74 6f 20 63 6f 6e 73 74 72  e code to constr
ff60: 75 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62  uct the Index ob
ff70: 6a 65 63 74 20 66 6f 72 20 61 6e 20 61 75 74 6f  ject for an auto
ff80: 6d 61 74 69 63 20 69 6e 64 65 78 0a 2a 2a 20 61  matic index.** a
ff90: 6e 64 20 74 6f 20 73 65 74 20 75 70 20 74 68 65  nd to set up the
ffa0: 20 57 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65   WhereLevel obje
ffb0: 63 74 20 70 4c 65 76 65 6c 20 73 6f 20 74 68 61  ct pLevel so tha
ffc0: 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  t the code gener
ffd0: 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20 75 73  ator.** makes us
ffe0: 65 20 6f 66 20 74 68 65 20 61 75 74 6f 6d 61 74  e of the automat
fff0: 69 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ic index..*/.sta
10000 74 69 63 20 76 6f 69 64 20 63 6f 6e 73 74 72 75  tic void constru
10010 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78  ctAutomaticIndex
10020 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
10030 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
10040 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
10050 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
10060 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
10070 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
10080 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
10090 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
100a0 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20  item *pSrc,  /* 
100b0 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
100c0 74 65 72 6d 20 74 6f 20 67 65 74 20 74 68 65 20  term to get the 
100d0 6e 65 78 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  next index */.  
100e0 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
100f0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ,           /* M
10100 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74  ask of cursors t
10110 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69  hat are not avai
10120 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65  lable */.  Where
10130 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20 20  Level *pLevel   
10140 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
10150 6e 65 77 20 69 6e 64 65 78 20 68 65 72 65 20 2a  new index here *
10160 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  /.){.  int nColu
10170 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mn;             
10180 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
10190 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63  columns in the c
101a0 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 64 65 78  onstructed index
101b0 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
101c0 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
101d0 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65    /* A single te
101e0 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
101f0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
10200 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20  eTerm *pWCEnd;  
10210 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
10220 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20  f pWC->a[] */.  
10230 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20  int nByte;      
10240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
10250 79 74 65 20 6f 66 20 6d 65 6d 6f 72 79 20 6e 65  yte of memory ne
10260 65 64 65 64 20 66 6f 72 20 70 49 64 78 20 2a 2f  eded for pIdx */
10270 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
10280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10290 2a 20 4f 62 6a 65 63 74 20 64 65 73 63 72 69 62  * Object describ
102a0 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65 6e  ing the transien
102b0 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62  t index */.  Vdb
102c0 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
102d0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70           /* Prep
102e0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75  ared statement u
102f0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
10300 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 49 73  n */.  int regIs
10310 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
10320 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73     /* Register s
10330 65 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 61  et by initializa
10340 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tion */.  int ad
10350 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20  drInit;         
10360 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
10370 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69   of the initiali
10380 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a 75  zation bypass ju
10390 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  mp */.  Table *p
103a0 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20  Table;          
103b0 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
103c0 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a   being indexed *
103d0 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
103e0 79 69 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  yinfo;          
103f0 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69  /* Key informati
10400 6f 6e 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  on for the index
10410 20 2a 2f 20 20 20 0a 20 20 69 6e 74 20 61 64 64   */   .  int add
10420 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  rTop;           
10430 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
10440 68 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f  he index fill lo
10450 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  op */.  int regR
10460 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20  ecord;          
10470 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
10480 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65 78  holding an index
10490 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
104a0 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
104b0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
104c0 6d 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  mn counter */.  
104d0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
104e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
104f0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
10500 20 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20   int mxBitCol;  
10510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10520 4d 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69  Maximum column i
10530 6e 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  n pSrc->colUsed 
10540 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  */.  CollSeq *pC
10550 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
10560 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65   /* Collating se
10570 71 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63  quence to on a c
10580 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 42 69 74 6d 61  olumn */.  Bitma
10590 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20 20 20 20  sk idxCols;     
105a0 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70         /* Bitmap
105b0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64   of columns used
105c0 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f   for indexing */
105d0 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61  .  Bitmask extra
105e0 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20 2f  Cols;          /
105f0 2a 20 42 69 74 6d 61 70 20 6f 66 20 61 64 64 69  * Bitmap of addi
10600 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a  tional columns *
10610 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  /..  /* Generate
10620 20 63 6f 64 65 20 74 6f 20 73 6b 69 70 20 6f 76   code to skip ov
10630 65 72 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20  er the creation 
10640 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  and initializati
10650 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 74  on of the.  ** t
10660 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 6f  ransient index o
10670 6e 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71  n 2nd and subseq
10680 75 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 73 20  uent iterations 
10690 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a  of the loop. */.
106a0 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
106b0 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76  dbe;.  assert( v
106c0 21 3d 30 20 29 3b 0a 20 20 72 65 67 49 73 49 6e  !=0 );.  regIsIn
106d0 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  it = ++pParse->n
106e0 4d 65 6d 3b 0a 20 20 61 64 64 72 49 6e 69 74 20  Mem;.  addrInit 
106f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
10700 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op1(v, OP_If, re
10710 67 49 73 49 6e 69 74 29 3b 0a 20 20 73 71 6c 69  gIsInit);.  sqli
10720 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10730 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
10740 72 65 67 49 73 49 6e 69 74 29 3b 0a 0a 20 20 2f  regIsInit);..  /
10750 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
10760 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68  er of columns th
10770 61 74 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64  at will be added
10780 20 74 6f 20 74 68 65 20 69 6e 64 65 78 0a 20 20   to the index.  
10790 2a 2a 20 61 6e 64 20 75 73 65 64 20 74 6f 20 6d  ** and used to m
107a0 61 74 63 68 20 57 48 45 52 45 20 63 6c 61 75 73  atch WHERE claus
107b0 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  e constraints */
107c0 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a  .  nColumn = 0;.
107d0 20 20 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d    pTable = pSrc-
107e0 3e 70 54 61 62 3b 0a 20 20 70 57 43 45 6e 64 20  >pTab;.  pWCEnd 
107f0 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e  = &pWC->a[pWC->n
10800 54 65 72 6d 5d 3b 0a 20 20 69 64 78 43 6f 6c 73  Term];.  idxCols
10810 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72   = 0;.  for(pTer
10820 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
10830 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
10840 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61  {.    if( termCa
10850 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72  nDriveIndex(pTer
10860 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  m, pSrc, notRead
10870 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  y) ){.      int 
10880 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  iCol = pTerm->u.
10890 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
108a0 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20    Bitmask cMask 
108b0 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 28 28  = iCol>=BMS ? ((
108c0 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53  Bitmask)1)<<(BMS
108d0 2d 31 29 20 3a 20 28 28 42 69 74 6d 61 73 6b 29  -1) : ((Bitmask)
108e0 31 29 3c 3c 69 43 6f 6c 3b 0a 20 20 20 20 20 20  1)<<iCol;.      
108f0 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
10900 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  BMS );.      tes
10910 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53  tcase( iCol==BMS
10920 2d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  -1 );.      if( 
10930 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b  (idxCols & cMask
10940 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
10950 6e 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20  nColumn++;.     
10960 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d     idxCols |= cM
10970 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ask;.      }.   
10980 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
10990 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 3b 0a 20 20   nColumn>0 );.  
109a0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71  pLevel->plan.nEq
109b0 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 2f   = nColumn;..  /
109c0 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
109d0 65 72 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c  er of additional
109e0 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20   columns needed 
109f0 74 6f 20 63 72 65 61 74 65 20 61 0a 20 20 2a 2a  to create a.  **
10a00 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e   covering index.
10a10 20 20 41 20 22 63 6f 76 65 72 69 6e 67 20 69 6e    A "covering in
10a20 64 65 78 22 20 69 73 20 61 6e 20 69 6e 64 65 78  dex" is an index
10a30 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
10a40 6c 6c 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20  ll.  ** columns 
10a50 74 68 61 74 20 61 72 65 20 6e 65 65 64 65 64 20  that are needed 
10a60 62 79 20 74 68 65 20 71 75 65 72 79 2e 20 20 57  by the query.  W
10a70 69 74 68 20 61 20 63 6f 76 65 72 69 6e 67 20 69  ith a covering i
10a80 6e 64 65 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f  ndex, the.  ** o
10a90 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65  riginal table ne
10aa0 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ver needs to be 
10ab0 61 63 63 65 73 73 65 64 2e 20 20 41 75 74 6f 6d  accessed.  Autom
10ac0 61 74 69 63 20 69 6e 64 69 63 65 73 20 6d 75 73  atic indices mus
10ad0 74 0a 20 20 2a 2a 20 62 65 20 61 20 63 6f 76 65  t.  ** be a cove
10ae0 72 69 6e 67 20 69 6e 64 65 78 20 62 65 63 61 75  ring index becau
10af0 73 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c  se the index wil
10b00 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64  l not be updated
10b10 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69   if the.  ** ori
10b20 67 69 6e 61 6c 20 74 61 62 6c 65 20 63 68 61 6e  ginal table chan
10b30 67 65 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ges and the inde
10b40 78 20 61 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e  x and table cann
10b50 6f 74 20 62 6f 74 68 20 62 65 20 75 73 65 64 0a  ot both be used.
10b60 20 20 2a 2a 20 69 66 20 74 68 65 79 20 67 6f 20    ** if they go 
10b70 6f 75 74 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a  out of sync..  *
10b80 2f 0a 20 20 65 78 74 72 61 43 6f 6c 73 20 3d 20  /.  extraCols = 
10b90 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20  pSrc->colUsed & 
10ba0 28 7e 69 64 78 43 6f 6c 73 20 7c 20 28 28 28 42  (~idxCols | (((B
10bb0 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d  itmask)1)<<(BMS-
10bc0 31 29 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c  1)));.  mxBitCol
10bd0 20 3d 20 28 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c   = (pTable->nCol
10be0 20 3e 3d 20 42 4d 53 2d 31 29 20 3f 20 42 4d 53   >= BMS-1) ? BMS
10bf0 2d 31 20 3a 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  -1 : pTable->nCo
10c00 6c 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  l;.  testcase( p
10c10 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53  Table->nCol==BMS
10c20 2d 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  -1 );.  testcase
10c30 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d  ( pTable->nCol==
10c40 42 4d 53 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69  BMS-2 );.  for(i
10c50 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20  =0; i<mxBitCol; 
10c60 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78  i++){.    if( ex
10c70 74 72 61 43 6f 6c 73 20 26 20 28 28 28 42 69 74  traCols & (((Bit
10c80 6d 61 73 6b 29 31 29 3c 3c 69 29 20 29 20 6e 43  mask)1)<<i) ) nC
10c90 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69  olumn++;.  }.  i
10ca0 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  f( pSrc->colUsed
10cb0 20 26 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29   & (((Bitmask)1)
10cc0 3c 3c 28 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20  <<(BMS-1)) ){.  
10cd0 20 20 6e 43 6f 6c 75 6d 6e 20 2b 3d 20 70 54 61    nColumn += pTa
10ce0 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20  ble->nCol - BMS 
10cf0 2b 20 31 3b 0a 20 20 7d 0a 20 20 70 4c 65 76 65  + 1;.  }.  pLeve
10d00 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
10d10 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
10d20 45 51 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f  EQ | WHERE_IDX_O
10d30 4e 4c 59 20 7c 20 57 4f 5f 45 51 3b 0a 0a 20 20  NLY | WO_EQ;..  
10d40 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65  /* Construct the
10d50 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f   Index object to
10d60 20 64 65 73 63 72 69 62 65 20 74 68 69 73 20 69   describe this i
10d70 6e 64 65 78 20 2a 2f 0a 20 20 6e 42 79 74 65 20  ndex */.  nByte 
10d80 3d 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 3b  = sizeof(Index);
10d90 0a 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c  .  nByte += nCol
10da0 75 6d 6e 2a 73 69 7a 65 6f 66 28 69 6e 74 29 3b  umn*sizeof(int);
10db0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69       /* Index.ai
10dc0 43 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 6e 42 79 74  Column */.  nByt
10dd0 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a  e += nColumn*siz
10de0 65 6f 66 28 63 68 61 72 2a 29 3b 20 20 20 2f 2a  eof(char*);   /*
10df0 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 2a 2f   Index.azColl */
10e00 0a 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c  .  nByte += nCol
10e10 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  umn;            
10e20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53       /* Index.aS
10e30 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 49  ortOrder */.  pI
10e40 64 78 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  dx = sqlite3DbMa
10e50 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
10e60 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69  >db, nByte);.  i
10e70 66 28 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74  f( pIdx==0 ) ret
10e80 75 72 6e 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 70  urn;.  pLevel->p
10e90 6c 61 6e 2e 75 2e 70 49 64 78 20 3d 20 70 49 64  lan.u.pIdx = pId
10ea0 78 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  x;.  pIdx->azCol
10eb0 6c 20 3d 20 28 63 68 61 72 2a 2a 29 26 70 49 64  l = (char**)&pId
10ec0 78 5b 31 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 69  x[1];.  pIdx->ai
10ed0 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26  Column = (int*)&
10ee0 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f  pIdx->azColl[nCo
10ef0 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e 61  lumn];.  pIdx->a
10f00 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
10f10 29 26 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  )&pIdx->aiColumn
10f20 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64  [nColumn];.  pId
10f30 78 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f  x->zName = "auto
10f40 2d 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78 2d  -index";.  pIdx-
10f50 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 75  >nColumn = nColu
10f60 6d 6e 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61 62  mn;.  pIdx->pTab
10f70 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e  le = pTable;.  n
10f80 20 3d 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20   = 0;.  idxCols 
10f90 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d  = 0;.  for(pTerm
10fa0 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70  =pWC->a; pTerm<p
10fb0 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  WCEnd; pTerm++){
10fc0 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e  .    if( termCan
10fd0 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d  DriveIndex(pTerm
10fe0 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79  , pSrc, notReady
10ff0 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
11000 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  Col = pTerm->u.l
11010 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
11020 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d   Bitmask cMask =
11030 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 28 28 42   iCol>=BMS ? ((B
11040 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d  itmask)1)<<(BMS-
11050 31 29 20 3a 20 28 28 42 69 74 6d 61 73 6b 29 31  1) : ((Bitmask)1
11060 29 3c 3c 69 43 6f 6c 3b 0a 20 20 20 20 20 20 69  )<<iCol;.      i
11070 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d  f( (idxCols & cM
11080 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
11090 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54     Expr *pX = pT
110a0 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
110b0 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63      idxCols |= c
110c0 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 49  Mask;.        pI
110d0 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20  dx->aiColumn[n] 
110e0 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
110f0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70  olumn;.        p
11100 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  Coll = sqlite3Bi
11110 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
11120 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  eq(pParse, pX->p
11130 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74  Left, pX->pRight
11140 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  );.        pIdx-
11150 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 70 43 6f  >azColl[n] = pCo
11160 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ll->zName;.     
11170 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a     n++;.      }.
11180 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
11190 72 74 28 20 28 75 33 32 29 6e 3d 3d 70 4c 65 76  rt( (u32)n==pLev
111a0 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20 29 3b 0a  el->plan.nEq );.
111b0 0a 20 20 2f 2a 20 41 64 64 20 61 64 64 69 74 69  .  /* Add additi
111c0 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65  onal columns nee
111d0 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  ded to make the 
111e0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
111f0 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63 6f 76 65  into.  ** a cove
11200 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ring index */.  
11210 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74  for(i=0; i<mxBit
11220 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
11230 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20 28  f( extraCols & (
11240 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69 29  ((Bitmask)1)<<i)
11250 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   ){.      pIdx->
11260 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b  aiColumn[n] = i;
11270 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43  .      pIdx->azC
11280 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59  oll[n] = "BINARY
11290 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20  ";.      n++;.  
112a0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53    }.  }.  if( pS
112b0 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 28  rc->colUsed & ((
112c0 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d  (Bitmask)1)<<(BM
112d0 53 2d 31 29 29 20 29 7b 0a 20 20 20 20 66 6f 72  S-1)) ){.    for
112e0 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61 62  (i=BMS-1; i<pTab
112f0 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  le->nCol; i++){.
11300 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f        pIdx->aiCo
11310 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20  lumn[n] = i;.   
11320 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
11330 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20  n] = "BINARY";. 
11340 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a       n++;.    }.
11350 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3d    }.  assert( n=
11360 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 0a 20 20 2f  =nColumn );..  /
11370 2a 20 43 72 65 61 74 65 20 74 68 65 20 61 75 74  * Create the aut
11380 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a  omatic index */.
11390 20 20 70 4b 65 79 69 6e 66 6f 20 3d 20 73 71 6c    pKeyinfo = sql
113a0 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f  ite3IndexKeyinfo
113b0 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a  (pParse, pIdx);.
113c0 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c    assert( pLevel
113d0 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a  ->iIdxCur>=0 );.
113e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
113f0 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 41 75  Op4(v, OP_OpenAu
11400 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76 65 6c 2d  toindex, pLevel-
11410 3e 69 49 64 78 43 75 72 2c 20 6e 43 6f 6c 75 6d  >iIdxCur, nColum
11420 6e 2b 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  n+1, 0,.        
11430 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
11440 72 2a 29 70 4b 65 79 69 6e 66 6f 2c 20 50 34 5f  r*)pKeyinfo, P4_
11450 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
11460 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
11470 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70 54  (v, "for %s", pT
11480 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a  able->zName));..
11490 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61 75    /* Fill the au
114a0 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77 69  tomatic index wi
114b0 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  th content */.  
114c0 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
114d0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
114e0 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76 65 6c  P_Rewind, pLevel
114f0 2d 3e 69 54 61 62 43 75 72 29 3b 0a 20 20 72 65  ->iTabCur);.  re
11500 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65  gRecord = sqlite
11510 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
11520 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65  se);.  sqlite3Ge
11530 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70  nerateIndexKey(p
11540 50 61 72 73 65 2c 20 70 49 64 78 2c 20 70 4c 65  Parse, pIdx, pLe
11550 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72 65  vel->iTabCur, re
11560 67 52 65 63 6f 72 64 2c 20 31 29 3b 0a 20 20 73  gRecord, 1);.  s
11570 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11580 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
11590 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  , pLevel->iIdxCu
115a0 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  r, regRecord);. 
115b0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
115c0 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55  geP5(v, OPFLAG_U
115d0 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20  SESEEKRESULT);. 
115e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
115f0 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70  p2(v, OP_Next, p
11600 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20  Level->iTabCur, 
11610 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20 20 73 71  addrTop+1);.  sq
11620 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
11630 35 28 76 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54  5(v, SQLITE_STMT
11640 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58  STATUS_AUTOINDEX
11650 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
11660 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
11670 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  Top);.  sqlite3R
11680 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
11690 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29  arse, regRecord)
116a0 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  ;.  .  /* Jump h
116b0 65 72 65 20 77 68 65 6e 20 73 6b 69 70 70 69 6e  ere when skippin
116c0 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  g the initializa
116d0 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tion */.  sqlite
116e0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
116f0 20 61 64 64 72 49 6e 69 74 29 3b 0a 7d 0a 23 65   addrInit);.}.#e
11700 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
11710 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
11720 44 45 58 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  DEX */..#ifndef 
11730 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
11740 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41  UALTABLE./*.** A
11750 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f 70 75  llocate and popu
11760 6c 61 74 65 20 61 6e 20 73 71 6c 69 74 65 33 5f  late an sqlite3_
11770 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
11780 74 75 72 65 2e 20 49 74 20 69 73 20 74 68 65 20  ture. It is the 
11790 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  .** responsibili
117a0 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
117b0 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 72   to eventually r
117c0 65 6c 65 61 73 65 20 74 68 65 20 73 74 72 75 63  elease the struc
117d0 74 75 72 65 0a 2a 2a 20 62 79 20 70 61 73 73 69  ture.** by passi
117e0 6e 67 20 74 68 65 20 70 6f 69 6e 74 65 72 20 72  ng the pointer r
117f0 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
11800 66 75 6e 63 74 69 6f 6e 20 74 6f 20 73 71 6c 69  function to sqli
11810 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73  te3_free()..*/.s
11820 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e  tatic sqlite3_in
11830 64 65 78 5f 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61  dex_info *alloca
11840 74 65 49 6e 64 65 78 49 6e 66 6f 28 0a 20 20 50  teIndexInfo(.  P
11850 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20  arse *pParse, . 
11860 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
11870 43 2c 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  C,.  struct SrcL
11880 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 0a  ist_item *pSrc,.
11890 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
118a0 65 72 42 79 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  erBy.){.  int i,
118b0 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b   j;.  int nTerm;
118c0 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
118d0 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
118e0 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20  nt *pIdxCons;.  
118f0 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
11900 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a 70 49  ndex_orderby *pI
11910 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73 74 72  dxOrderBy;.  str
11920 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
11930 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
11940 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68  ge *pUsage;.  Wh
11950 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
11960 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a    int nOrderBy;.
11970 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
11980 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a  info *pIdxInfo;.
11990 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22  .  WHERETRACE(("
119a0 52 65 63 6f 6d 70 75 74 69 6e 67 20 69 6e 64 65  Recomputing inde
119b0 78 20 69 6e 66 6f 20 66 6f 72 20 25 73 2e 2e 2e  x info for %s...
119c0 5c 6e 22 2c 20 70 53 72 63 2d 3e 70 54 61 62 2d  \n", pSrc->pTab-
119d0 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20  >zName));..  /* 
119e0 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
119f0 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57 48 45   of possible WHE
11a00 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72  RE clause constr
11a10 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e 67 0a  aints referring.
11a20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 76 69 72    ** to this vir
11a30 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tual table */.  
11a40 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20 70  for(i=nTerm=0, p
11a50 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70  Term=pWC->a; i<p
11a60 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20  WC->nTerm; i++, 
11a70 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
11a80 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
11a90 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75  sor != pSrc->iCu
11aa0 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  rsor ) continue;
11ab0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54  .    assert( (pT
11ac0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28  erm->eOperator&(
11ad0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
11ae0 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 74  -1))==0 );.    t
11af0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
11b00 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e  eOperator==WO_IN
11b10 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
11b20 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
11b30 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  or==WO_ISNULL );
11b40 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
11b50 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
11b60 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20  IN|WO_ISNULL) ) 
11b70 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54  continue;.    nT
11b80 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  erm++;.  }..  /*
11b90 20 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   If the ORDER BY
11ba0 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
11bb0 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   only columns in
11bc0 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20   the current .  
11bd0 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
11be0 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73   then allocate s
11bf0 70 61 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72  pace for the aOr
11c00 64 65 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20  derBy part of.  
11c10 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ** the sqlite3_i
11c20 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
11c30 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64  ure..  */.  nOrd
11c40 65 72 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  erBy = 0;.  if( 
11c50 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
11c60 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
11c70 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
11c80 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
11c90 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  xpr = pOrderBy->
11ca0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
11cb0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
11cc0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45  =TK_COLUMN || pE
11cd0 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72  xpr->iTable!=pSr
11ce0 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 62 72 65  c->iCursor ) bre
11cf0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
11d00 28 20 69 3d 3d 70 4f 72 64 65 72 42 79 2d 3e 6e  ( i==pOrderBy->n
11d10 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 6e 4f  Expr ){.      nO
11d20 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
11d30 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 7d 0a  y->nExpr;.    }.
11d40 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
11d50 74 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  te the sqlite3_i
11d60 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
11d70 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49  ure.  */.  pIdxI
11d80 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
11d90 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65  allocZero(pParse
11da0 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49  ->db, sizeof(*pI
11db0 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20  dxInfo).        
11dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11dd0 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49     + (sizeof(*pI
11de0 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66  dxCons) + sizeof
11df0 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d  (*pUsage))*nTerm
11e00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11e10 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69              + si
11e20 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65 72 42  zeof(*pIdxOrderB
11e30 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20  y)*nOrderBy );. 
11e40 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30   if( pIdxInfo==0
11e50 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
11e60 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11e70 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29  "out of memory")
11e80 3b 0a 20 20 20 20 2f 2a 20 28 64 6f 75 62 6c 65  ;.    /* (double
11e90 29 30 20 49 6e 20 63 61 73 65 20 6f 66 20 53 51  )0 In case of SQ
11ea0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
11eb0 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20  NG_POINT... */. 
11ec0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
11ed0 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
11ee0 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e  e the structure.
11ef0 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e    The sqlite3_in
11f00 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
11f10 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a  re contains.  **
11f20 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68 61   many fields tha
11f30 74 20 61 72 65 20 64 65 63 6c 61 72 65 64 20 22  t are declared "
11f40 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65 6e  const" to preven
11f50 74 20 78 42 65 73 74 49 6e 64 65 78 20 66 72 6f  t xBestIndex fro
11f60 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20  m.  ** changing 
11f70 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65 20 74  them.  We have t
11f80 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20  o do some funky 
11f90 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64 65 72  casting in order
11fa0 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c   to.  ** initial
11fb0 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c 64 73  ize those fields
11fc0 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e  ..  */.  pIdxCon
11fd0 73 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69  s = (struct sqli
11fe0 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
11ff0 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 5b  aint*)&pIdxInfo[
12000 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65 72 42  1];.  pIdxOrderB
12010 79 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69  y = (struct sqli
12020 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62  te3_index_orderb
12030 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65  y*)&pIdxCons[nTe
12040 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20 3d 20  rm];.  pUsage = 
12050 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
12060 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
12070 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f 72 64  _usage*)&pIdxOrd
12080 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a  erBy[nOrderBy];.
12090 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e    *(int*)&pIdxIn
120a0 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20  fo->nConstraint 
120b0 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69 6e 74  = nTerm;.  *(int
120c0 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72  *)&pIdxInfo->nOr
120d0 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79  derBy = nOrderBy
120e0 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c  ;.  *(struct sql
120f0 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
12100 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66  raint**)&pIdxInf
12110 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d  o->aConstraint =
12120 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a 28 73   pIdxCons;.  *(s
12130 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
12140 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70  dex_orderby**)&p
12150 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42  IdxInfo->aOrderB
12160 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42 79 3b  y = pIdxOrderBy;
12170 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69  .  *(struct sqli
12180 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
12190 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70 49  aint_usage**)&pI
121a0 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
121b0 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20 20 20  intUsage =.     
121c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 55                pU
12200 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a  sage;..  for(i=j
12210 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61  =0, pTerm=pWC->a
12220 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; i<pWC->nTerm; 
12230 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  i++, pTerm++){. 
12240 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
12250 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63  ftCursor != pSrc
12260 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74  ->iCursor ) cont
12270 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
12280 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
12290 74 6f 72 26 28 70 54 65 72 6d 2d 3e 65 4f 70 65  tor&(pTerm->eOpe
122a0 72 61 74 6f 72 2d 31 29 29 3d 3d 30 20 29 3b 0a  rator-1))==0 );.
122b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
122c0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
122d0 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73  WO_IN );.    tes
122e0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
122f0 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55  perator==WO_ISNU
12300 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54  LL );.    if( pT
12310 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
12320 20 28 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c   (WO_IN|WO_ISNUL
12330 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  L) ) continue;. 
12340 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69     pIdxCons[j].i
12350 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e  Column = pTerm->
12360 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
12370 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54    pIdxCons[j].iT
12380 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20  ermOffset = i;. 
12390 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f     pIdxCons[j].o
123a0 70 20 3d 20 28 75 38 29 70 54 65 72 6d 2d 3e 65  p = (u8)pTerm->e
123b0 4f 70 65 72 61 74 6f 72 3b 0a 20 20 20 20 2f 2a  Operator;.    /*
123c0 20 54 68 65 20 64 69 72 65 63 74 20 61 73 73 69   The direct assi
123d0 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70 72  gnment in the pr
123e0 65 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20 70  evious line is p
123f0 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63  ossible only bec
12400 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  ause.    ** the 
12410 57 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f 49  WO_ and SQLITE_I
12420 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
12430 20 63 6f 64 65 73 20 61 72 65 20 69 64 65 6e 74   codes are ident
12440 69 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20 2a  ical.  The.    *
12450 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  * following asse
12460 72 74 73 20 76 65 72 69 66 79 20 74 68 69 73 20  rts verify this 
12470 66 61 63 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73  fact. */.    ass
12480 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49  ert( WO_EQ==SQLI
12490 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
124a0 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 61 73  INT_EQ );.    as
124b0 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c  sert( WO_LT==SQL
124c0 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
124d0 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 61  AINT_LT );.    a
124e0 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51  ssert( WO_LE==SQ
124f0 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
12500 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20  RAINT_LE );.    
12510 61 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53  assert( WO_GT==S
12520 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
12530 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20  TRAINT_GT );.   
12540 20 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d   assert( WO_GE==
12550 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
12560 53 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20  STRAINT_GE );.  
12570 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4d 41 54    assert( WO_MAT
12580 43 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  CH==SQLITE_INDEX
12590 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43  _CONSTRAINT_MATC
125a0 48 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  H );.    assert(
125b0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
125c0 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 4c 54  r & (WO_EQ|WO_LT
125d0 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f  |WO_LE|WO_GT|WO_
125e0 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a  GE|WO_MATCH) );.
125f0 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66      j++;.  }.  f
12600 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
12610 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  By; i++){.    Ex
12620 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64  pr *pExpr = pOrd
12630 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
12640 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42  ;.    pIdxOrderB
12650 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70  y[i].iColumn = p
12660 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
12670 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69     pIdxOrderBy[i
12680 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42  ].desc = pOrderB
12690 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
126a0 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  r;.  }..  return
126b0 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a   pIdxInfo;.}../*
126c0 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 62  .** The table ob
126d0 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65 20 70  ject reference p
126e0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
126f0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
12700 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
12710 20 6d 75 73 74 20 72 65 70 72 65 73 65 6e 74 20   must represent 
12720 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
12730 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
12740 6e 76 6f 6b 65 73 20 74 68 65 20 78 42 65 73 74  nvokes the xBest
12750 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f  Index().** metho
12760 64 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c  d of the virtual
12770 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
12780 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
12790 66 6f 20 70 6f 69 6e 74 65 72 20 70 61 73 73 65  fo pointer passe
127a0 64 0a 2a 2a 20 61 73 20 74 68 65 20 61 72 67 75  d.** as the argu
127b0 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ment..**.** If a
127c0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
127d0 70 50 61 72 73 65 20 69 73 20 70 6f 70 75 6c 61  pParse is popula
127e0 74 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f  ted with an erro
127f0 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20 61 0a  r message and a.
12800 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ** non-zero valu
12810 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
12820 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72  therwise, 0 is r
12830 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
12840 6f 75 74 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f  output.** part o
12850 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  f the sqlite3_in
12860 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
12870 72 65 20 69 73 20 6c 65 66 74 20 70 6f 70 75 6c  re is left popul
12880 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74  ated..**.** Whet
12890 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72  her or not an er
128a0 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ror is returned,
128b0 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   it is the respo
128c0 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
128d0 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  .** caller to ev
128e0 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 70 2d  entually free p-
128f0 3e 69 64 78 53 74 72 20 69 66 20 70 2d 3e 6e 65  >idxStr if p->ne
12900 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 69  edToFreeIdxStr i
12910 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74 68 61 74  ndicates.** that
12920 20 74 68 69 73 20 69 73 20 72 65 71 75 69 72 65   this is require
12930 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
12940 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 50   vtabBestIndex(P
12950 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
12960 62 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c 69 74  ble *pTab, sqlit
12970 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
12980 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  ){.  sqlite3_vta
12990 62 20 2a 70 56 74 61 62 20 3d 20 73 71 6c 69 74  b *pVtab = sqlit
129a0 65 33 47 65 74 56 54 61 62 6c 65 28 70 50 61 72  e3GetVTable(pPar
129b0 73 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70  se->db, pTab)->p
129c0 56 74 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vtab;.  int i;. 
129d0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 57 48 45 52   int rc;..  WHER
129e0 45 54 52 41 43 45 28 28 22 78 42 65 73 74 49 6e  ETRACE(("xBestIn
129f0 64 65 78 20 66 6f 72 20 25 73 5c 6e 22 2c 20 70  dex for %s\n", p
12a00 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
12a10 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53  TRACE_IDX_INPUTS
12a20 28 70 29 3b 0a 20 20 72 63 20 3d 20 70 56 74 61  (p);.  rc = pVta
12a30 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73  b->pModule->xBes
12a40 74 49 6e 64 65 78 28 70 56 74 61 62 2c 20 70 29  tIndex(pVtab, p)
12a50 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 4f 55  ;.  TRACE_IDX_OU
12a60 54 50 55 54 53 28 70 29 3b 0a 0a 20 20 69 66 28  TPUTS(p);..  if(
12a70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12a80 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  {.    if( rc==SQ
12a90 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
12aa0 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
12ab0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
12ac0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
12ad0 21 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20  !pVtab->zErrMsg 
12ae0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12af0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
12b00 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72   "%s", sqlite3Er
12b10 72 53 74 72 28 72 63 29 29 3b 0a 20 20 20 20 7d  rStr(rc));.    }
12b20 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
12b30 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
12b40 73 65 2c 20 22 25 73 22 2c 20 70 56 74 61 62 2d  se, "%s", pVtab-
12b50 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d  >zErrMsg);.    }
12b60 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
12b70 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d  ree(pVtab->zErrM
12b80 73 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45  sg);.  pVtab->zE
12b90 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 66 6f  rrMsg = 0;..  fo
12ba0 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e  r(i=0; i<p->nCon
12bb0 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  straint; i++){. 
12bc0 20 20 20 69 66 28 20 21 70 2d 3e 61 43 6f 6e 73     if( !p->aCons
12bd0 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65  traint[i].usable
12be0 20 26 26 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69   && p->aConstrai
12bf0 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49  ntUsage[i].argvI
12c00 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20 20 20 20  ndex>0 ){.      
12c10 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
12c20 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
12c30 20 20 20 22 74 61 62 6c 65 20 25 73 3a 20 78 42     "table %s: xB
12c40 65 73 74 49 6e 64 65 78 20 72 65 74 75 72 6e 65  estIndex returne
12c50 64 20 61 6e 20 69 6e 76 61 6c 69 64 20 70 6c 61  d an invalid pla
12c60 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  n", pTab->zName)
12c70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
12c80 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45  eturn pParse->nE
12c90 72 72 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f  rr;.}.../*.** Co
12ca0 6d 70 75 74 65 20 74 68 65 20 62 65 73 74 20 69  mpute the best i
12cb0 6e 64 65 78 20 66 6f 72 20 61 20 76 69 72 74 75  ndex for a virtu
12cc0 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
12cd0 54 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 69  The best index i
12ce0 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68  s computed by th
12cf0 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74  e xBestIndex met
12d00 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75  hod of the virtu
12d10 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 6d 6f 64 75  al.** table modu
12d20 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  le.  This routin
12d30 65 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  e is really just
12d40 20 61 20 77 72 61 70 70 65 72 20 74 68 61 74 20   a wrapper that 
12d50 73 65 74 73 20 75 70 0a 2a 2a 20 74 68 65 20 73  sets up.** the s
12d60 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
12d70 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
12d80 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 6d   is used to comm
12d90 75 6e 69 63 61 74 65 20 77 69 74 68 0a 2a 2a 20  unicate with.** 
12da0 78 42 65 73 74 49 6e 64 65 78 2e 0a 2a 2a 0a 2a  xBestIndex..**.*
12db0 2a 20 49 6e 20 61 20 6a 6f 69 6e 2c 20 74 68 69  * In a join, thi
12dc0 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
12dd0 62 65 20 63 61 6c 6c 65 64 20 6d 75 6c 74 69 70  be called multip
12de0 6c 65 20 74 69 6d 65 73 20 66 6f 72 20 74 68 65  le times for the
12df0 0a 2a 2a 20 73 61 6d 65 20 76 69 72 74 75 61 6c  .** same virtual
12e00 20 74 61 62 6c 65 2e 20 20 54 68 65 20 73 71 6c   table.  The sql
12e10 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
12e20 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65  structure is cre
12e30 61 74 65 64 0a 2a 2a 20 61 6e 64 20 69 6e 69 74  ated.** and init
12e40 69 61 6c 69 7a 65 64 20 6f 6e 20 74 68 65 20 66  ialized on the f
12e50 69 72 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20  irst invocation 
12e60 61 6e 64 20 72 65 75 73 65 64 20 6f 6e 20 61 6c  and reused on al
12e70 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20  l subsequent.** 
12e80 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 20 20 54 68  invocations.  Th
12e90 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
12ea0 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  info structure i
12eb0 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e  s also used when
12ec0 0a 2a 2a 20 63 6f 64 65 20 69 73 20 67 65 6e 65  .** code is gene
12ed0 72 61 74 65 64 20 74 6f 20 61 63 63 65 73 73 20  rated to access 
12ee0 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
12ef0 65 2e 20 20 54 68 65 20 77 68 65 72 65 49 6e 66  e.  The whereInf
12f00 6f 44 65 6c 65 74 65 28 29 20 0a 2a 2a 20 72 6f  oDelete() .** ro
12f10 75 74 69 6e 65 20 74 61 6b 65 73 20 63 61 72 65  utine takes care
12f20 20 6f 66 20 66 72 65 65 69 6e 67 20 74 68 65 20   of freeing the 
12f30 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
12f40 66 6f 20 73 74 72 75 63 74 75 72 65 20 61 66 74  fo structure aft
12f50 65 72 0a 2a 2a 20 65 76 65 72 79 62 6f 64 79 20  er.** everybody 
12f60 68 61 73 20 66 69 6e 69 73 68 65 64 20 77 69 74  has finished wit
12f70 68 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  h it..*/.static 
12f80 76 6f 69 64 20 62 65 73 74 56 69 72 74 75 61 6c  void bestVirtual
12f90 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
12fa0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
12fb0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12fc0 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
12fd0 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
12fe0 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20   *pWC,          
12ff0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
13000 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
13010 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
13020 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 20 2f 2a  m *pSrc,      /*
13030 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
13040 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20   term to search 
13050 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
13060 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20  Ready,          
13070 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
13080 63 75 72 73 6f 72 73 20 6e 6f 74 20 61 76 61 69  cursors not avai
13090 6c 61 62 6c 65 20 66 6f 72 20 69 6e 64 65 78 20  lable for index 
130a0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
130b0 56 61 6c 69 64 2c 20 20 20 20 20 20 20 20 20 20  Valid,          
130c0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20       /* Cursors 
130d0 6e 6f 74 20 76 61 6c 69 64 20 66 6f 72 20 61 6e  not valid for an
130e0 79 20 70 75 72 70 6f 73 65 20 2a 2f 0a 20 20 45  y purpose */.  E
130f0 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
13100 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  y,             /
13110 2a 20 54 68 65 20 6f 72 64 65 72 20 62 79 20 63  * The order by c
13120 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
13130 43 6f 73 74 20 2a 70 43 6f 73 74 2c 20 20 20 20  Cost *pCost,    
13140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
13150 77 65 73 74 20 63 6f 73 74 20 71 75 65 72 79 20  west cost query 
13160 70 6c 61 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  plan */.  sqlite
13170 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 2a 70  3_index_info **p
13180 70 49 64 78 49 6e 66 6f 20 20 2f 2a 20 49 6e 64  pIdxInfo  /* Ind
13190 65 78 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70  ex information p
131a0 61 73 73 65 64 20 74 6f 20 78 42 65 73 74 49 6e  assed to xBestIn
131b0 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  dex */.){.  Tabl
131c0 65 20 2a 70 54 61 62 20 3d 20 70 53 72 63 2d 3e  e *pTab = pSrc->
131d0 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pTab;.  sqlite3_
131e0 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78  index_info *pIdx
131f0 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 73  Info;.  struct s
13200 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
13210 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e  straint *pIdxCon
13220 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  s;.  struct sqli
13230 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
13240 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61  aint_usage *pUsa
13250 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  ge;.  WhereTerm 
13260 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 2c  *pTerm;.  int i,
13270 20 6a 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72   j;.  int nOrder
13280 42 79 3b 0a 20 20 64 6f 75 62 6c 65 20 72 43 6f  By;.  double rCo
13290 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  st;..  /* Make s
132a0 75 72 65 20 77 73 46 6c 61 67 73 20 69 73 20 69  ure wsFlags is i
132b0 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 73 6f  nitialized to so
132c0 6d 65 20 73 61 6e 65 20 76 61 6c 75 65 2e 20 4f  me sane value. O
132d0 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
132e0 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 69 6e   .  ** malloc in
132f0 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e   allocateIndexIn
13300 66 6f 28 29 20 66 61 69 6c 73 20 61 6e 64 20 74  fo() fails and t
13310 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
13320 75 72 6e 73 20 6c 65 61 76 69 6e 67 0a 20 20 2a  urns leaving.  *
13330 2a 20 77 73 46 6c 61 67 73 20 69 6e 20 61 6e 20  * wsFlags in an 
13340 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 74  uninitialized st
13350 61 74 65 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ate, the caller 
13360 6d 61 79 20 62 65 68 61 76 65 20 75 6e 70 72 65  may behave unpre
13370 64 69 63 74 61 62 6c 79 2e 0a 20 20 2a 2f 0a 20  dictably..  */. 
13380 20 6d 65 6d 73 65 74 28 70 43 6f 73 74 2c 20 30   memset(pCost, 0
13390 2c 20 73 69 7a 65 6f 66 28 2a 70 43 6f 73 74 29  , sizeof(*pCost)
133a0 29 3b 0a 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e  );.  pCost->plan
133b0 2e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  .wsFlags = WHERE
133c0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 0a  _VIRTUALTABLE;..
133d0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 71 6c 69    /* If the sqli
133e0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
133f0 74 72 75 63 74 75 72 65 20 68 61 73 20 6e 6f 74  tructure has not
13400 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79   been previously
13410 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  .  ** allocated 
13420 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c  and initialized,
13430 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61   then allocate a
13440 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  nd initialize it
13450 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 49 64   now..  */.  pId
13460 78 49 6e 66 6f 20 3d 20 2a 70 70 49 64 78 49 6e  xInfo = *ppIdxIn
13470 66 6f 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e  fo;.  if( pIdxIn
13480 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 70  fo==0 ){.    *pp
13490 49 64 78 49 6e 66 6f 20 3d 20 70 49 64 78 49 6e  IdxInfo = pIdxIn
134a0 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64  fo = allocateInd
134b0 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  exInfo(pParse, p
134c0 57 43 2c 20 70 53 72 63 2c 20 70 4f 72 64 65 72  WC, pSrc, pOrder
134d0 42 79 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  By);.  }.  if( p
134e0 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20  IdxInfo==0 ){.  
134f0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
13500 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
13510 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  t, the sqlite3_i
13520 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
13530 75 72 65 20 74 68 61 74 20 70 49 64 78 49 6e 66  ure that pIdxInf
13540 6f 20 70 6f 69 6e 74 73 0a 20 20 2a 2a 20 74 6f  o points.  ** to
13550 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20   will have been 
13560 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 65 69 74  initialized, eit
13570 68 65 72 20 64 75 72 69 6e 67 20 74 68 65 20 63  her during the c
13580 75 72 72 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f  urrent invocatio
13590 6e 20 6f 72 0a 20 20 2a 2a 20 64 75 72 69 6e 67  n or.  ** during
135a0 20 73 6f 6d 65 20 70 72 69 6f 72 20 69 6e 76 6f   some prior invo
135b0 63 61 74 69 6f 6e 2e 20 20 4e 6f 77 20 77 65 20  cation.  Now we 
135c0 6a 75 73 74 20 68 61 76 65 20 74 6f 20 63 75 73  just have to cus
135d0 74 6f 6d 69 7a 65 20 74 68 65 0a 20 20 2a 2a 20  tomize the.  ** 
135e0 64 65 74 61 69 6c 73 20 6f 66 20 70 49 64 78 49  details of pIdxI
135f0 6e 66 6f 20 66 6f 72 20 74 68 65 20 63 75 72 72  nfo for the curr
13600 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61  ent invocation a
13610 6e 64 20 70 61 73 73 20 69 74 20 74 6f 0a 20 20  nd pass it to.  
13620 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 2e 0a 20  ** xBestIndex.. 
13630 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 6f   */..  /* The mo
13640 64 75 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62  dule name must b
13650 65 20 64 65 66 69 6e 65 64 2e 20 41 6c 73 6f 2c  e defined. Also,
13660 20 62 79 20 74 68 69 73 20 70 6f 69 6e 74 20 74   by this point t
13670 68 65 72 65 20 6d 75 73 74 0a 20 20 2a 2a 20 62  here must.  ** b
13680 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
13690 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73  n sqlite3_vtab s
136a0 74 72 75 63 74 75 72 65 2e 20 4f 74 68 65 72 77  tructure. Otherw
136b0 69 73 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  ise.  ** sqlite3
136c0 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
136d0 65 73 28 29 20 77 6f 75 6c 64 20 68 61 76 65 20  es() would have 
136e0 70 69 63 6b 65 64 20 75 70 20 74 68 65 20 65 72  picked up the er
136f0 72 6f 72 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73  ror. .  */.  ass
13700 65 72 74 28 20 70 54 61 62 2d 3e 61 7a 4d 6f 64  ert( pTab->azMod
13710 75 6c 65 41 72 67 20 26 26 20 70 54 61 62 2d 3e  uleArg && pTab->
13720 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 30 5d 20 29  azModuleArg[0] )
13730 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
13740 74 65 33 47 65 74 56 54 61 62 6c 65 28 70 50 61  te3GetVTable(pPa
13750 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 29 20 29  rse->db, pTab) )
13760 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
13770 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e 75 73  aConstraint[].us
13780 61 62 6c 65 20 66 69 65 6c 64 73 20 61 6e 64 20  able fields and 
13790 69 6e 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20 0a  initialize all .
137a0 20 20 2a 2a 20 6f 75 74 70 75 74 20 76 61 72 69    ** output vari
137b0 61 62 6c 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 20  ables to zero.. 
137c0 20 2a 2a 0a 20 20 2a 2a 20 61 43 6f 6e 73 74 72   **.  ** aConstr
137d0 61 69 6e 74 5b 5d 2e 75 73 61 62 6c 65 20 69 73  aint[].usable is
137e0 20 74 72 75 65 20 66 6f 72 20 63 6f 6e 73 74 72   true for constr
137f0 61 69 6e 74 73 20 77 68 65 72 65 20 74 68 65 20  aints where the 
13800 72 69 67 68 74 2d 68 61 6e 64 0a 20 20 2a 2a 20  right-hand.  ** 
13810 73 69 64 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  side contains on
13820 6c 79 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ly references to
13830 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
13840 65 66 74 20 6f 66 20 74 68 65 20 63 75 72 72 65  eft of the curre
13850 6e 74 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20  nt.  ** table.  
13860 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
13870 69 66 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  if the constrain
13880 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
13890 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
138a0 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 3d 20 65        column = e
138b0 78 70 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e  xpr.  **.  ** an
138c0 64 20 77 65 20 61 72 65 20 65 76 61 6c 75 61 74  d we are evaluat
138d0 69 6e 67 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e  ing a join, then
138e0 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
138f0 6f 6e 20 63 6f 6c 75 6d 6e 20 69 73 20 0a 20 20  on column is .  
13900 2a 2a 20 6f 6e 6c 79 20 76 61 6c 69 64 20 69 66  ** only valid if
13910 20 61 6c 6c 20 74 61 62 6c 65 73 20 72 65 66 65   all tables refe
13920 72 65 6e 63 65 64 20 69 6e 20 65 78 70 72 20 6f  renced in expr o
13930 63 63 75 72 20 74 6f 20 74 68 65 20 6c 65 66 74  ccur to the left
13940 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62  .  ** of the tab
13950 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f  le containing co
13960 6c 75 6d 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lumn..  **.  ** 
13970 54 68 65 20 61 43 6f 6e 73 74 72 61 69 6e 74 73  The aConstraints
13980 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e  [] array contain
13990 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  s entries for al
139a0 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  l constraints.  
139b0 2a 2a 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ** on the curren
139c0 74 20 74 61 62 6c 65 2e 20 20 54 68 61 74 20 77  t table.  That w
139d0 61 79 20 77 65 20 6f 6e 6c 79 20 68 61 76 65 20  ay we only have 
139e0 74 6f 20 63 6f 6d 70 75 74 65 20 69 74 20 6f 6e  to compute it on
139f0 63 65 0a 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f  ce.  ** even tho
13a00 75 67 68 20 77 65 20 6d 69 67 68 74 20 74 72 79  ugh we might try
13a10 20 74 6f 20 70 69 63 6b 20 74 68 65 20 62 65 73   to pick the bes
13a20 74 20 69 6e 64 65 78 20 6d 75 6c 74 69 70 6c 65  t index multiple
13a30 20 74 69 6d 65 73 2e 0a 20 20 2a 2a 20 46 6f 72   times..  ** For
13a40 20 65 61 63 68 20 61 74 74 65 6d 70 74 20 61 74   each attempt at
13a50 20 70 69 63 6b 69 6e 67 20 61 6e 20 69 6e 64 65   picking an inde
13a60 78 2c 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  x, the order of 
13a70 74 61 62 6c 65 73 20 69 6e 20 74 68 65 0a 20 20  tables in the.  
13a80 2a 2a 20 6a 6f 69 6e 20 6d 69 67 68 74 20 62 65  ** join might be
13a90 20 64 69 66 66 65 72 65 6e 74 20 73 6f 20 77 65   different so we
13aa0 20 68 61 76 65 20 74 6f 20 72 65 63 6f 6d 70 75   have to recompu
13ab0 74 65 20 74 68 65 20 75 73 61 62 6c 65 20 66 6c  te the usable fl
13ac0 61 67 0a 20 20 2a 2a 20 65 61 63 68 20 74 69 6d  ag.  ** each tim
13ad0 65 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f  e..  */.  pIdxCo
13ae0 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71  ns = *(struct sq
13af0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
13b00 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
13b10 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->aConstraint;
13b20 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49 64 78  .  pUsage = pIdx
13b30 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
13b40 74 55 73 61 67 65 3b 0a 20 20 66 6f 72 28 69 3d  tUsage;.  for(i=
13b50 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e  0; i<pIdxInfo->n
13b60 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c  Constraint; i++,
13b70 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20   pIdxCons++){.  
13b80 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e    j = pIdxCons->
13b90 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20  iTermOffset;.   
13ba0 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
13bb0 5b 6a 5d 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  [j];.    pIdxCon
13bc0 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65  s->usable = (pTe
13bd0 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 26  rm->prereqRight&
13be0 6e 6f 74 52 65 61 64 79 29 20 3f 20 30 20 3a 20  notReady) ? 0 : 
13bf0 31 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  1;.  }.  memset(
13c00 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f  pUsage, 0, sizeo
13c10 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 70 49 64  f(pUsage[0])*pId
13c20 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
13c30 6e 74 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49  nt);.  if( pIdxI
13c40 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
13c50 64 78 53 74 72 20 29 7b 0a 20 20 20 20 73 71 6c  dxStr ){.    sql
13c60 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e  ite3_free(pIdxIn
13c70 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 7d  fo->idxStr);.  }
13c80 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  .  pIdxInfo->idx
13c90 53 74 72 20 3d 20 30 3b 0a 20 20 70 49 64 78 49  Str = 0;.  pIdxI
13ca0 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b  nfo->idxNum = 0;
13cb0 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65  .  pIdxInfo->nee
13cc0 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20  dToFreeIdxStr = 
13cd0 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f  0;.  pIdxInfo->o
13ce0 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d  rderByConsumed =
13cf0 20 30 3b 0a 20 20 2f 2a 20 28 28 64 6f 75 62 6c   0;.  /* ((doubl
13d00 65 29 32 29 20 49 6e 20 63 61 73 65 20 6f 66 20  e)2) In case of 
13d10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
13d20 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f  TING_POINT... */
13d30 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74  .  pIdxInfo->est
13d40 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c  imatedCost = SQL
13d50 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28 28  ITE_BIG_DBL / ((
13d60 64 6f 75 62 6c 65 29 32 29 3b 0a 20 20 6e 4f 72  double)2);.  nOr
13d70 64 65 72 42 79 20 3d 20 70 49 64 78 49 6e 66 6f  derBy = pIdxInfo
13d80 2d 3e 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 66  ->nOrderBy;.  if
13d90 28 20 21 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  ( !pOrderBy ){. 
13da0 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72     pIdxInfo->nOr
13db0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a  derBy = 0;.  }..
13dc0 20 20 69 66 28 20 76 74 61 62 42 65 73 74 49 6e    if( vtabBestIn
13dd0 64 65 78 28 70 50 61 72 73 65 2c 20 70 54 61 62  dex(pParse, pTab
13de0 2c 20 70 49 64 78 49 6e 66 6f 29 20 29 7b 0a 20  , pIdxInfo) ){. 
13df0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
13e00 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73    pIdxCons = *(s
13e10 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
13e20 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a  dex_constraint**
13e30 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
13e40 73 74 72 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69  straint;.  for(i
13e50 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e  =0; i<pIdxInfo->
13e60 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
13e70 29 7b 0a 20 20 20 20 69 66 28 20 70 55 73 61 67  ){.    if( pUsag
13e80 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30  e[i].argvIndex>0
13e90 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d   ){.      pCost-
13ea0 3e 75 73 65 64 20 7c 3d 20 70 57 43 2d 3e 61 5b  >used |= pWC->a[
13eb0 70 49 64 78 43 6f 6e 73 5b 69 5d 2e 69 54 65 72  pIdxCons[i].iTer
13ec0 6d 4f 66 66 73 65 74 5d 2e 70 72 65 72 65 71 52  mOffset].prereqR
13ed0 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ight;.    }.  }.
13ee0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
13ef0 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
13f00 61 75 73 65 2c 20 61 6e 64 20 74 68 65 20 73 65  ause, and the se
13f10 6c 65 63 74 65 64 20 76 69 72 74 75 61 6c 20 74  lected virtual t
13f20 61 62 6c 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20  able index.  ** 
13f30 64 6f 65 73 20 6e 6f 74 20 73 61 74 69 73 66 79  does not satisfy
13f40 20 69 74 2c 20 69 6e 63 72 65 61 73 65 20 74 68   it, increase th
13f50 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20 73 63  e cost of the sc
13f60 61 6e 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20  an accordingly. 
13f70 54 68 69 73 0a 20 20 2a 2a 20 6d 61 74 63 68 65  This.  ** matche
13f80 73 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  s the processing
13f90 20 66 6f 72 20 6e 6f 6e 2d 76 69 72 74 75 61 6c   for non-virtual
13fa0 20 74 61 62 6c 65 73 20 69 6e 20 62 65 73 74 42   tables in bestB
13fb0 74 72 65 65 49 6e 64 65 78 28 29 2e 0a 20 20 2a  treeIndex()..  *
13fc0 2f 0a 20 20 72 43 6f 73 74 20 3d 20 70 49 64 78  /.  rCost = pIdx
13fd0 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
13fe0 6f 73 74 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  ost;.  if( pOrde
13ff0 72 42 79 20 26 26 20 70 49 64 78 49 6e 66 6f 2d  rBy && pIdxInfo-
14000 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
14010 3d 3d 30 20 29 7b 0a 20 20 20 20 72 43 6f 73 74  ==0 ){.    rCost
14020 20 2b 3d 20 65 73 74 4c 6f 67 28 72 43 6f 73 74   += estLog(rCost
14030 29 2a 72 43 6f 73 74 3b 0a 20 20 7d 0a 0a 20 20  )*rCost;.  }..  
14040 2f 2a 20 54 68 65 20 63 6f 73 74 20 69 73 20 6e  /* The cost is n
14050 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  ot allowed to be
14060 20 6c 61 72 67 65 72 20 74 68 61 6e 20 53 51 4c   larger than SQL
14070 49 54 45 5f 42 49 47 5f 44 42 4c 20 28 74 68 65  ITE_BIG_DBL (the
14080 0a 20 20 2a 2a 20 69 6e 69 74 61 6c 20 76 61 6c  .  ** inital val
14090 75 65 20 6f 66 20 6c 6f 77 65 73 74 43 6f 73 74  ue of lowestCost
140a0 20 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2e 20 49   in this loop. I
140b0 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 74 68  f it is, then th
140c0 65 0a 20 20 2a 2a 20 28 63 6f 73 74 3c 6c 6f 77  e.  ** (cost<low
140d0 65 73 74 43 6f 73 74 29 20 74 65 73 74 20 62 65  estCost) test be
140e0 6c 6f 77 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  low will never b
140f0 65 20 74 72 75 65 2e 0a 20 20 2a 2a 20 0a 20 20  e true..  ** .  
14100 2a 2a 20 55 73 65 20 22 28 64 6f 75 62 6c 65 29  ** Use "(double)
14110 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 32  2" instead of "2
14120 2e 30 22 20 69 6e 20 63 61 73 65 20 4f 4d 49 54  .0" in case OMIT
14130 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 20  _FLOATING_POINT 
14140 0a 20 20 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  .  ** is defined
14150 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 53 51  ..  */.  if( (SQ
14160 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f 28 28 64  LITE_BIG_DBL/((d
14170 6f 75 62 6c 65 29 32 29 29 3c 72 43 6f 73 74 20  ouble)2))<rCost 
14180 29 7b 0a 20 20 20 20 70 43 6f 73 74 2d 3e 72 43  ){.    pCost->rC
14190 6f 73 74 20 3d 20 28 53 51 4c 49 54 45 5f 42 49  ost = (SQLITE_BI
141a0 47 5f 44 42 4c 2f 28 28 64 6f 75 62 6c 65 29 32  G_DBL/((double)2
141b0 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
141c0 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20   pCost->rCost = 
141d0 72 43 6f 73 74 3b 0a 20 20 7d 0a 20 20 70 43 6f  rCost;.  }.  pCo
141e0 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62  st->plan.u.pVtab
141f0 49 64 78 20 3d 20 70 49 64 78 49 6e 66 6f 3b 0a  Idx = pIdxInfo;.
14200 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e    if( pIdxInfo->
14210 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20  orderByConsumed 
14220 29 7b 0a 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c  ){.    pCost->pl
14230 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  an.wsFlags |= WH
14240 45 52 45 5f 4f 52 44 45 52 42 59 3b 0a 20 20 7d  ERE_ORDERBY;.  }
14250 0a 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 6e  .  pCost->plan.n
14260 45 71 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e  Eq = 0;.  pIdxIn
14270 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e  fo->nOrderBy = n
14280 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 54  OrderBy;..  /* T
14290 72 79 20 74 6f 20 66 69 6e 64 20 61 20 6d 6f 72  ry to find a mor
142a0 65 20 65 66 66 69 63 69 65 6e 74 20 61 63 63 65  e efficient acce
142b0 73 73 20 70 61 74 74 65 72 6e 20 62 79 20 75 73  ss pattern by us
142c0 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 69 6e 64  ing multiple ind
142d0 65 78 65 73 0a 20 20 2a 2a 20 74 6f 20 6f 70 74  exes.  ** to opt
142e0 69 6d 69 7a 65 20 61 6e 20 4f 52 20 65 78 70 72  imize an OR expr
142f0 65 73 73 69 6f 6e 20 77 69 74 68 69 6e 20 74 68  ession within th
14300 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
14310 0a 20 20 2a 2f 0a 20 20 62 65 73 74 4f 72 43 6c  .  */.  bestOrCl
14320 61 75 73 65 49 6e 64 65 78 28 70 50 61 72 73 65  auseIndex(pParse
14330 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74  , pWC, pSrc, not
14340 52 65 61 64 79 2c 20 6e 6f 74 56 61 6c 69 64 2c  Ready, notValid,
14350 20 70 4f 72 64 65 72 42 79 2c 20 70 43 6f 73 74   pOrderBy, pCost
14360 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
14370 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
14380 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  ALTABLE */../*.*
14390 2a 20 41 72 67 75 6d 65 6e 74 20 70 49 64 78 20  * Argument pIdx 
143a0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
143b0 61 6e 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  an index structu
143c0 72 65 20 74 68 61 74 20 68 61 73 20 61 6e 20 61  re that has an a
143d0 72 72 61 79 20 6f 66 0a 2a 2a 20 53 51 4c 49 54  rray of.** SQLIT
143e0 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 20  E_INDEX_SAMPLES 
143f0 65 76 65 6e 6c 79 20 73 70 61 63 65 64 20 73 61  evenly spaced sa
14400 6d 70 6c 65 73 20 6f 66 20 74 68 65 20 66 69 72  mples of the fir
14410 73 74 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d  st indexed colum
14420 6e 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 49  n.** stored in I
14430 6e 64 65 78 2e 61 53 61 6d 70 6c 65 2e 20 54 68  ndex.aSample. Th
14440 65 73 65 20 73 61 6d 70 6c 65 73 20 64 69 76 69  ese samples divi
14450 64 65 20 74 68 65 20 64 6f 6d 61 69 6e 20 6f 66  de the domain of
14460 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 0a 2a   values stored.*
14470 2a 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f  * the index into
14480 20 28 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53   (SQLITE_INDEX_S
14490 41 4d 50 4c 45 53 2b 31 29 20 72 65 67 69 6f 6e  AMPLES+1) region
144a0 73 2e 0a 2a 2a 20 52 65 67 69 6f 6e 20 30 20 63  s..** Region 0 c
144b0 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 76 61 6c 75  ontains all valu
144c0 65 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  es less than the
144d0 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20 76 61   first sample va
144e0 6c 75 65 2e 20 52 65 67 69 6f 6e 0a 2a 2a 20 31  lue. Region.** 1
144f0 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 75 65 73   contains values
14500 20 62 65 74 77 65 65 6e 20 74 68 65 20 66 69 72   between the fir
14510 73 74 20 61 6e 64 20 73 65 63 6f 6e 64 20 73 61  st and second sa
14520 6d 70 6c 65 73 2e 20 20 52 65 67 69 6f 6e 20 32  mples.  Region 2
14530 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 76 61 6c   contains.** val
14540 75 65 73 20 62 65 74 77 65 65 6e 20 73 61 6d 70  ues between samp
14550 6c 65 73 20 32 20 61 6e 64 20 33 2e 20 20 41 6e  les 2 and 3.  An
14560 64 20 73 6f 20 6f 6e 2e 20 20 52 65 67 69 6f 6e  d so on.  Region
14570 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41   SQLITE_INDEX_SA
14580 4d 50 4c 45 53 0a 2a 2a 20 63 6f 6e 74 61 69 6e  MPLES.** contain
14590 73 20 76 61 6c 75 65 73 20 6c 61 72 67 65 72 20  s values larger 
145a0 74 68 61 6e 20 74 68 65 20 6c 61 73 74 20 73 61  than the last sa
145b0 6d 70 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  mple..**.** If t
145c0 68 65 20 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e  he index contain
145d0 73 20 6d 61 6e 79 20 64 75 70 6c 69 63 61 74 65  s many duplicate
145e0 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 76 61  s of a single va
145f0 6c 75 65 2c 20 74 68 65 6e 20 69 74 20 69 73 0a  lue, then it is.
14600 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  ** possible that
14610 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 61 64 6a   two or more adj
14620 61 63 65 6e 74 20 73 61 6d 70 6c 65 73 20 63 61  acent samples ca
14630 6e 20 68 6f 6c 64 20 74 68 65 20 73 61 6d 65 20  n hold the same 
14640 76 61 6c 75 65 2e 0a 2a 2a 20 57 68 65 6e 20 74  value..** When t
14650 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c  hat is the case,
14660 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 70 6f   the smallest po
14670 73 73 69 62 6c 65 20 72 65 67 69 6f 6e 20 63 6f  ssible region co
14680 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  de is returned.*
14690 2a 20 77 68 65 6e 20 72 6f 75 6e 64 55 70 20 69  * when roundUp i
146a0 73 20 66 61 6c 73 65 20 61 6e 64 20 74 68 65 20  s false and the 
146b0 6c 61 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65  largest possible
146c0 20 72 65 67 69 6f 6e 20 63 6f 64 65 20 69 73 20   region code is 
146d0 72 65 74 75 72 6e 65 64 0a 2a 2a 20 77 68 65 6e  returned.** when
146e0 20 72 6f 75 6e 64 55 70 20 69 73 20 74 72 75 65   roundUp is true
146f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
14700 73 73 66 75 6c 2c 20 74 68 69 73 20 66 75 6e 63  ssful, this func
14710 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20  tion determines 
14720 77 68 69 63 68 20 6f 66 20 74 68 65 20 72 65 67  which of the reg
14730 69 6f 6e 73 20 76 61 6c 75 65 20 0a 2a 2a 20 70  ions value .** p
14740 56 61 6c 20 6c 69 65 73 20 69 6e 2c 20 73 65 74  Val lies in, set
14750 73 20 2a 70 69 52 65 67 69 6f 6e 20 74 6f 20 74  s *piRegion to t
14760 68 65 20 72 65 67 69 6f 6e 20 69 6e 64 65 78 20  he region index 
14770 28 61 20 76 61 6c 75 65 20 62 65 74 77 65 65 6e  (a value between
14780 20 30 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45   0.** and SQLITE
14790 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 2b 31  _INDEX_SAMPLES+1
147a0 2c 20 69 6e 63 6c 75 73 69 76 65 29 20 61 6e 64  , inclusive) and
147b0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
147c0 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 61 6e  OK..** Or, if an
147d0 20 4f 4f 4d 20 6f 63 63 75 72 73 20 77 68 69 6c   OOM occurs whil
147e0 65 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 65 78  e converting tex
147f0 74 20 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e  t values between
14800 20 65 6e 63 6f 64 69 6e 67 73 2c 0a 2a 2a 20 53   encodings,.** S
14810 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
14820 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 69 52  eturned and *piR
14830 65 67 69 6f 6e 20 69 73 20 75 6e 64 65 66 69 6e  egion is undefin
14840 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ed..*/.#ifdef SQ
14850 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
14860 32 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  2.static int whe
14870 72 65 52 61 6e 67 65 52 65 67 69 6f 6e 28 0a 20  reRangeRegion(. 
14880 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
14890 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
148a0 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
148b0 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ion */.  Index *
148c0 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  pIdx,           
148d0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
148e0 20 63 6f 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e   consider domain
148f0 20 6f 66 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33   of */.  sqlite3
14900 5f 76 61 6c 75 65 20 2a 70 56 61 6c 2c 20 20 20  _value *pVal,   
14910 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
14920 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20 69   consider */.  i
14930 6e 74 20 72 6f 75 6e 64 55 70 2c 20 20 20 20 20  nt roundUp,     
14940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
14950 74 75 72 6e 20 6c 61 72 67 65 73 74 20 76 61 6c  turn largest val
14960 69 64 20 72 65 67 69 6f 6e 20 69 66 20 74 72 75  id region if tru
14970 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 52 65  e */.  int *piRe
14980 67 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  gion            
14990 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 67 69 6f     /* OUT: Regio
149a0 6e 20 6f 66 20 64 6f 6d 61 69 6e 20 69 6e 20 77  n of domain in w
149b0 68 69 63 68 20 76 61 6c 75 65 20 6c 69 65 73 20  hich value lies 
149c0 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
149d0 72 6f 75 6e 64 55 70 3d 3d 30 20 7c 7c 20 72 6f  roundUp==0 || ro
149e0 75 6e 64 55 70 3d 3d 31 20 29 3b 0a 20 20 69 66  undUp==1 );.  if
149f0 28 20 41 4c 57 41 59 53 28 70 56 61 6c 29 20 29  ( ALWAYS(pVal) )
14a00 7b 0a 20 20 20 20 49 6e 64 65 78 53 61 6d 70 6c  {.    IndexSampl
14a10 65 20 2a 61 53 61 6d 70 6c 65 20 3d 20 70 49 64  e *aSample = pId
14a20 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 20 20  x->aSample;.    
14a30 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 69  int i = 0;.    i
14a40 6e 74 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74  nt eType = sqlit
14a50 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 56  e3_value_type(pV
14a60 61 6c 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 54  al);..    if( eT
14a70 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  ype==SQLITE_INTE
14a80 47 45 52 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  GER || eType==SQ
14a90 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20  LITE_FLOAT ){.  
14aa0 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73      double r = s
14ab0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
14ac0 62 6c 65 28 70 56 61 6c 29 3b 0a 20 20 20 20 20  ble(pVal);.     
14ad0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53 51 4c 49   for(i=0; i<SQLI
14ae0 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53  TE_INDEX_SAMPLES
14af0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
14b00 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65  if( aSample[i].e
14b10 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  Type==SQLITE_NUL
14b20 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  L ) continue;.  
14b30 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c        if( aSampl
14b40 65 5b 69 5d 2e 65 54 79 70 65 3e 3d 53 51 4c 49  e[i].eType>=SQLI
14b50 54 45 5f 54 45 58 54 20 29 20 62 72 65 61 6b 3b  TE_TEXT ) break;
14b60 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 6f 75  .        if( rou
14b70 6e 64 55 70 20 29 7b 0a 20 20 20 20 20 20 20 20  ndUp ){.        
14b80 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d    if( aSample[i]
14b90 2e 75 2e 72 3e 72 20 29 20 62 72 65 61 6b 3b 0a  .u.r>r ) break;.
14ba0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
14bb0 20 20 20 20 20 20 20 20 20 69 66 28 20 61 53 61           if( aSa
14bc0 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3e 3d 72 20 29  mple[i].u.r>=r )
14bd0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
14be0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
14bf0 6c 73 65 20 69 66 28 20 65 54 79 70 65 3d 3d 53  lse if( eType==S
14c00 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20  QLITE_NULL ){.  
14c10 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20 20      i = 0;.     
14c20 20 69 66 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a   if( roundUp ){.
14c30 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69          while( i
14c40 3c 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41  <SQLITE_INDEX_SA
14c50 4d 50 4c 45 53 20 26 26 20 61 53 61 6d 70 6c 65  MPLES && aSample
14c60 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54  [i].eType==SQLIT
14c70 45 5f 4e 55 4c 4c 20 29 20 69 2b 2b 3b 0a 20 20  E_NULL ) i++;.  
14c80 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
14c90 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20   .      sqlite3 
14ca0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
14cb0 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  ;.      CollSeq 
14cc0 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 63 6f  *pColl;.      co
14cd0 6e 73 74 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20  nst u8 *z;.     
14ce0 20 69 6e 74 20 6e 3b 0a 0a 20 20 20 20 20 20 2f   int n;..      /
14cf0 2a 20 70 56 61 6c 20 63 6f 6d 65 73 20 66 72 6f  * pVal comes fro
14d00 6d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72  m sqlite3ValueFr
14d10 6f 6d 45 78 70 72 28 29 20 73 6f 20 74 68 65 20  omExpr() so the 
14d20 74 79 70 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e  type cannot be N
14d30 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ULL */.      ass
14d40 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49  ert( eType==SQLI
14d50 54 45 5f 54 45 58 54 20 7c 7c 20 65 54 79 70 65  TE_TEXT || eType
14d60 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 3b  ==SQLITE_BLOB );
14d70 0a 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ..      if( eTyp
14d80 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29  e==SQLITE_BLOB )
14d90 7b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 28 63  {.        z = (c
14da0 6f 6e 73 74 20 75 38 20 2a 29 73 71 6c 69 74 65  onst u8 *)sqlite
14db0 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70 56 61  3_value_blob(pVa
14dc0 6c 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  l);.        pCol
14dd0 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
14de0 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  l;.        asser
14df0 74 28 20 70 43 6f 6c 6c 2d 3e 65 6e 63 3d 3d 53  t( pColl->enc==S
14e00 51 4c 49 54 45 5f 55 54 46 38 20 29 3b 0a 20 20  QLITE_UTF8 );.  
14e10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14e20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
14e30 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 64 62 2c  e3GetCollSeq(db,
14e40 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
14e50 20 2a 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 29 3b   *pIdx->azColl);
14e60 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
14e70 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ll==0 ){.       
14e80 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
14e90 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
14ea0 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  uch collation se
14eb0 71 75 65 6e 63 65 3a 20 25 73 22 2c 0a 20 20 20  quence: %s",.   
14ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ed0 20 20 20 20 20 20 20 2a 70 49 64 78 2d 3e 61 7a         *pIdx->az
14ee0 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  Coll);.         
14ef0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
14f00 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
14f10 20 20 20 20 20 20 20 20 7a 20 3d 20 28 63 6f 6e          z = (con
14f20 73 74 20 75 38 20 2a 29 73 71 6c 69 74 65 33 56  st u8 *)sqlite3V
14f30 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20 70  alueText(pVal, p
14f40 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20  Coll->enc);.    
14f50 20 20 20 20 69 66 28 20 21 7a 20 29 7b 0a 20 20      if( !z ){.  
14f60 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
14f70 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
14f80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
14f90 73 73 65 72 74 28 20 7a 20 26 26 20 70 43 6f 6c  ssert( z && pCol
14fa0 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  l && pColl->xCmp
14fb0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
14fc0 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 56 61 6c    n = sqlite3Val
14fd0 75 65 42 79 74 65 73 28 70 56 61 6c 2c 20 70 43  ueBytes(pVal, pC
14fe0 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 0a 20 20 20 20  oll->enc);..    
14ff0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53 51 4c    for(i=0; i<SQL
15000 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45  ITE_INDEX_SAMPLE
15010 53 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  S; i++){.       
15020 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20   int c;.        
15030 69 6e 74 20 65 53 61 6d 70 6c 65 74 79 70 65 20  int eSampletype 
15040 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79  = aSample[i].eTy
15050 70 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pe;.        if( 
15060 65 53 61 6d 70 6c 65 74 79 70 65 3d 3d 53 51 4c  eSampletype==SQL
15070 49 54 45 5f 4e 55 4c 4c 20 7c 7c 20 65 53 61 6d  ITE_NULL || eSam
15080 70 6c 65 74 79 70 65 3c 65 54 79 70 65 20 29 20  pletype<eType ) 
15090 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
150a0 20 20 69 66 28 20 28 65 53 61 6d 70 6c 65 74 79    if( (eSamplety
150b0 70 65 21 3d 65 54 79 70 65 29 20 29 20 62 72 65  pe!=eType) ) bre
150c0 61 6b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ak;.#ifndef SQLI
150d0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
150e0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 2d        if( pColl-
150f0 3e 65 6e 63 21 3d 53 51 4c 49 54 45 5f 55 54 46  >enc!=SQLITE_UTF
15100 38 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  8 ){.          i
15110 6e 74 20 6e 53 61 6d 70 6c 65 3b 0a 20 20 20 20  nt nSample;.    
15120 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 61 6d        char *zSam
15130 70 6c 65 20 3d 20 73 71 6c 69 74 65 33 55 74 66  ple = sqlite3Utf
15140 38 74 6f 31 36 28 0a 20 20 20 20 20 20 20 20 20  8to16(.         
15150 20 20 20 20 20 64 62 2c 20 70 43 6f 6c 6c 2d 3e       db, pColl->
15160 65 6e 63 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  enc, aSample[i].
15170 75 2e 7a 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  u.z, aSample[i].
15180 6e 42 79 74 65 2c 20 26 6e 53 61 6d 70 6c 65 0a  nByte, &nSample.
15190 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
151a0 20 20 20 20 20 20 20 69 66 28 20 21 7a 53 61 6d         if( !zSam
151b0 70 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ple ){.         
151c0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
151d0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
151e0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
151f0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
15200 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
15210 20 20 20 20 20 20 63 20 3d 20 70 43 6f 6c 6c 2d        c = pColl-
15220 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73  >xCmp(pColl->pUs
15230 65 72 2c 20 6e 53 61 6d 70 6c 65 2c 20 7a 53 61  er, nSample, zSa
15240 6d 70 6c 65 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20  mple, n, z);.   
15250 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
15260 46 72 65 65 28 64 62 2c 20 7a 53 61 6d 70 6c 65  Free(db, zSample
15270 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
15280 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
15290 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  {.          c = 
152a0 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c  pColl->xCmp(pCol
152b0 6c 2d 3e 70 55 73 65 72 2c 20 61 53 61 6d 70 6c  l->pUser, aSampl
152c0 65 5b 69 5d 2e 6e 42 79 74 65 2c 20 61 53 61 6d  e[i].nByte, aSam
152d0 70 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 6e 2c 20 7a  ple[i].u.z, n, z
152e0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
152f0 20 20 20 20 20 69 66 28 20 63 2d 72 6f 75 6e 64       if( c-round
15300 55 70 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  Up>=0 ) break;. 
15310 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
15320 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
15330 26 20 69 3c 3d 53 51 4c 49 54 45 5f 49 4e 44 45  & i<=SQLITE_INDE
15340 58 5f 53 41 4d 50 4c 45 53 20 29 3b 0a 20 20 20  X_SAMPLES );.   
15350 20 2a 70 69 52 65 67 69 6f 6e 20 3d 20 69 3b 0a   *piRegion = i;.
15360 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
15370 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
15380 20 20 20 2f 2a 20 23 69 66 64 65 66 20 53 51 4c     /* #ifdef SQL
15390 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32  ITE_ENABLE_STAT2
153a0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78   */../*.** If ex
153b0 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 72  pression pExpr r
153c0 65 70 72 65 73 65 6e 74 73 20 61 20 6c 69 74 65  epresents a lite
153d0 72 61 6c 20 76 61 6c 75 65 2c 20 73 65 74 20 2a  ral value, set *
153e0 70 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a  pp to point to.*
153f0 2a 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c  * an sqlite3_val
15400 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ue structure con
15410 74 61 69 6e 69 6e 67 20 74 68 65 20 73 61 6d 65  taining the same
15420 20 76 61 6c 75 65 2c 20 77 69 74 68 20 61 66 66   value, with aff
15430 69 6e 69 74 79 0a 2a 2a 20 61 66 66 20 61 70 70  inity.** aff app
15440 6c 69 65 64 20 74 6f 20 69 74 2c 20 62 65 66 6f  lied to it, befo
15450 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 49 74  re returning. It
15460 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
15470 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 0a 2a  bility of the .*
15480 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  * caller to even
15490 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74  tually release t
154a0 68 69 73 20 73 74 72 75 63 74 75 72 65 20 62 79  his structure by
154b0 20 70 61 73 73 69 6e 67 20 69 74 20 74 6f 20 0a   passing it to .
154c0 2a 2a 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  ** sqlite3ValueF
154d0 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ree()..**.** If 
154e0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 72 73  the current pars
154f0 65 20 69 73 20 61 20 72 65 63 6f 6d 70 69 6c 65  e is a recompile
15500 20 28 73 71 6c 69 74 65 33 52 65 70 72 65 70 61   (sqlite3Reprepa
15510 72 65 28 29 29 20 61 6e 64 20 70 45 78 70 72 0a  re()) and pExpr.
15520 2a 2a 20 69 73 20 61 6e 20 53 51 4c 20 76 61 72  ** is an SQL var
15530 69 61 62 6c 65 20 74 68 61 74 20 63 75 72 72 65  iable that curre
15540 6e 74 6c 79 20 68 61 73 20 61 20 6e 6f 6e 2d 4e  ntly has a non-N
15550 55 4c 4c 20 76 61 6c 75 65 20 62 6f 75 6e 64 20  ULL value bound 
15560 74 6f 20 69 74 2c 0a 2a 2a 20 63 72 65 61 74 65  to it,.** create
15570 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   an sqlite3_valu
15580 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  e structure cont
15590 61 69 6e 69 6e 67 20 74 68 69 73 20 76 61 6c 75  aining this valu
155a0 65 2c 20 61 67 61 69 6e 20 77 69 74 68 0a 2a 2a  e, again with.**
155b0 20 61 66 66 69 6e 69 74 79 20 61 66 66 20 61 70   affinity aff ap
155c0 70 6c 69 65 64 20 74 6f 20 69 74 2c 20 69 6e 73  plied to it, ins
155d0 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  tead..**.** If n
155e0 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 61 62  either of the ab
155f0 6f 76 65 20 61 70 70 6c 79 2c 20 73 65 74 20 2a  ove apply, set *
15600 70 70 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  pp to NULL..**.*
15610 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
15620 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20  curs, return an 
15630 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65  error code. Othe
15640 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
15650 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
15660 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a  TE_ENABLE_STAT2.
15670 73 74 61 74 69 63 20 69 6e 74 20 76 61 6c 75 65  static int value
15680 46 72 6f 6d 45 78 70 72 28 0a 20 20 50 61 72 73  FromExpr(.  Pars
15690 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45 78  e *pParse, .  Ex
156a0 70 72 20 2a 70 45 78 70 72 2c 20 0a 20 20 75 38  pr *pExpr, .  u8
156b0 20 61 66 66 2c 20 0a 20 20 73 71 6c 69 74 65 33   aff, .  sqlite3
156c0 5f 76 61 6c 75 65 20 2a 2a 70 70 0a 29 7b 0a 20  _value **pp.){. 
156d0 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
156e0 54 4b 5f 56 41 52 49 41 42 4c 45 0a 20 20 20 7c  TK_VARIABLE.   |
156f0 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  | (pExpr->op==TK
15700 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 45 78  _REGISTER && pEx
15710 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 56 41 52 49  pr->op2==TK_VARI
15720 41 42 4c 45 29 0a 20 20 29 7b 0a 20 20 20 20 69  ABLE).  ){.    i
15730 6e 74 20 69 56 61 72 20 3d 20 70 45 78 70 72 2d  nt iVar = pExpr-
15740 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71  >iColumn;.    sq
15750 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d  lite3VdbeSetVarm
15760 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62  ask(pParse->pVdb
15770 65 2c 20 69 56 61 72 29 3b 20 2f 2a 20 49 4d 50  e, iVar); /* IMP
15780 3a 20 52 2d 32 33 32 35 37 2d 30 32 37 37 38 20  : R-23257-02778 
15790 2a 2f 0a 20 20 20 20 2a 70 70 20 3d 20 73 71 6c  */.    *pp = sql
157a0 69 74 65 33 56 64 62 65 47 65 74 56 61 6c 75 65  ite3VdbeGetValue
157b0 28 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70  (pParse->pReprep
157c0 61 72 65 2c 20 69 56 61 72 2c 20 61 66 66 29 3b  are, iVar, aff);
157d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
157e0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74  TE_OK;.  }.  ret
157f0 75 72 6e 20 73 71 6c 69 74 65 33 56 61 6c 75 65  urn sqlite3Value
15800 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2d  FromExpr(pParse-
15810 3e 64 62 2c 20 70 45 78 70 72 2c 20 53 51 4c 49  >db, pExpr, SQLI
15820 54 45 5f 55 54 46 38 2c 20 61 66 66 2c 20 70 70  TE_UTF8, aff, pp
15830 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
15840 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
15850 20 69 73 20 75 73 65 64 20 74 6f 20 65 73 74 69   is used to esti
15860 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
15870 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
15880 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20  l be visited.** 
15890 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69  by scanning an i
158a0 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65  ndex for a range
158b0 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20   of values. The 
158c0 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61  range may have a
158d0 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64  n upper.** bound
158e0 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c  , a lower bound,
158f0 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48   or both. The WH
15900 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
15910 20 74 68 61 74 20 73 65 74 20 74 68 65 20 75 70   that set the up
15920 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72  per.** and lower
15930 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72   bounds are repr
15940 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65  esented by pLowe
15950 72 20 61 6e 64 20 70 55 70 70 65 72 20 72 65 73  r and pUpper res
15960 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a  pectively. For.*
15970 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d  * example, assum
15980 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20 70  ing that index p
15990 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a   is on t1(a):.**
159a0 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
159b0 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e  1 WHERE a > ? AN
159c0 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20  D a < ? ....**  
159d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159e0 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f    |_____|   |___
159f0 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  __|.**          
15a00 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
15a10 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
15a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a30 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70 65 72  pLower    pUpper
15a40 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  .**.** If either
15a50 20 6f 66 20 74 68 65 20 75 70 70 65 72 20 6f 72   of the upper or
15a60 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20   lower bound is 
15a70 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65  not present, the
15a80 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64  n NULL is passed
15a90 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20   in.** place of 
15aa0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
15ab0 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a  g WhereTerm..**.
15ac0 2a 2a 20 54 68 65 20 6e 45 71 20 70 61 72 61 6d  ** The nEq param
15ad0 65 74 65 72 20 69 73 20 70 61 73 73 65 64 20 74  eter is passed t
15ae0 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
15af0 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 73 75 62  index column sub
15b00 6a 65 63 74 20 74 6f 20 74 68 65 0a 2a 2a 20 72  ject to the.** r
15b10 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e  ange constraint.
15b20 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c   Or, equivalentl
15b30 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  y, the number of
15b40 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
15b50 61 69 6e 74 73 0a 2a 2a 20 6f 70 74 69 6d 69 7a  aints.** optimiz
15b60 65 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f 73  ed by the propos
15b70 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46  ed index scan. F
15b80 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75  or example, assu
15b90 6d 69 6e 67 20 69 6e 64 65 78 20 70 20 69 73 0a  ming index p is.
15ba0 2a 2a 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20  ** on t1(a, b), 
15bb0 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65 72  and the SQL quer
15bc0 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  y is:.**.**   ..
15bd0 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
15be0 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20  a = ? AND b > ? 
15bf0 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND b < ? ....**
15c00 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 73 68 6f  .** then nEq sho
15c10 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 74 68  uld be passed th
15c20 65 20 76 61 6c 75 65 20 31 20 28 61 73 20 74 68  e value 1 (as th
15c30 65 20 72 61 6e 67 65 20 72 65 73 74 72 69 63 74  e range restrict
15c40 65 64 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 62 2c  ed column,.** b,
15c50 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 6c   is the second l
15c60 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  eft-most column 
15c70 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20 4f  of the index). O
15c80 72 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 20  r, if the query 
15c90 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20  is:.**.**   ... 
15ca0 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
15cb0 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e  > ? AND a < ? ..
15cc0 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71  ..**.** then nEq
15cd0 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65   should be passe
15ce0 64 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  d 0..**.** The r
15cf0 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73  eturned value is
15d00 20 61 6e 20 69 6e 74 65 67 65 72 20 62 65 74 77   an integer betw
15d10 65 65 6e 20 31 20 61 6e 64 20 31 30 30 2c 20 69  een 1 and 100, i
15d20 6e 63 6c 75 73 69 76 65 2e 20 41 20 72 65 74 75  nclusive. A retu
15d30 72 6e 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 31  rn.** value of 1
15d40 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
15d50 74 68 65 20 70 72 6f 70 6f 73 65 64 20 72 61 6e  the proposed ran
15d60 67 65 20 73 63 61 6e 20 69 73 20 65 78 70 65 63  ge scan is expec
15d70 74 65 64 20 74 6f 20 76 69 73 69 74 0a 2a 2a 20  ted to visit.** 
15d80 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 20 31 2f  approximately 1/
15d90 31 30 30 74 68 20 28 31 25 29 20 6f 66 20 74 68  100th (1%) of th
15da0 65 20 72 6f 77 73 20 73 65 6c 65 63 74 65 64 20  e rows selected 
15db0 62 79 20 74 68 65 20 6e 45 71 20 65 71 75 61 6c  by the nEq equal
15dc0 69 74 79 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e  ity.** constrain
15dd0 74 73 20 28 69 66 20 61 6e 79 29 2e 20 41 20 72  ts (if any). A r
15de0 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 31  eturn value of 1
15df0 30 30 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  00 indicates tha
15e00 74 20 69 74 20 69 73 20 65 78 70 65 63 74 65 64  t it is expected
15e10 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 72 61 6e  .** that the ran
15e20 67 65 20 73 63 61 6e 20 77 69 6c 6c 20 76 69 73  ge scan will vis
15e30 69 74 20 65 76 65 72 79 20 72 6f 77 20 28 31 30  it every row (10
15e40 30 25 29 20 73 65 6c 65 63 74 65 64 20 62 79 20  0%) selected by 
15e50 74 68 65 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20  the equality.** 
15e60 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 2a 2a 0a  constraints..**.
15e70 2a 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63  ** In the absenc
15e80 65 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74  e of sqlite_stat
15e90 32 20 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20  2 ANALYZE data, 
15ea0 65 61 63 68 20 72 61 6e 67 65 20 69 6e 65 71 75  each range inequ
15eb0 61 6c 69 74 79 0a 2a 2a 20 72 65 64 75 63 65 73  ality.** reduces
15ec0 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
15ed0 65 20 62 79 20 32 2f 33 72 64 73 2e 20 20 48 65  e by 2/3rds.  He
15ee0 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 63 6f 6e  nce a single con
15ef0 73 74 72 61 69 6e 74 20 28 78 3e 3f 29 0a 2a 2a  straint (x>?).**
15f00 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 72 65   results in a re
15f10 74 75 72 6e 20 6f 66 20 33 33 20 61 6e 64 20 61  turn of 33 and a
15f20 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
15f30 74 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20  t (x>? AND x<?) 
15f40 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 20 61 20  results.** in a 
15f50 72 65 74 75 72 6e 20 6f 66 20 31 31 2e 0a 2a 2f  return of 11..*/
15f60 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
15f70 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 0a 20  eRangeScanEst(. 
15f80 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
15f90 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
15fa0 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
15fb0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
15fc0 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
15fd0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
15fe0 78 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  x containing the
15ff0 20 72 61 6e 67 65 2d 63 6f 6d 70 61 72 65 64 20   range-compared 
16000 63 6f 6c 75 6d 6e 3b 20 22 78 22 20 2a 2f 0a 20  column; "x" */. 
16010 20 69 6e 74 20 6e 45 71 2c 20 20 20 20 20 20 20   int nEq,       
16020 20 20 20 20 20 20 2f 2a 20 69 6e 64 65 78 20 69        /* index i
16030 6e 74 6f 20 70 2d 3e 61 43 6f 6c 5b 5d 20 6f 66  nto p->aCol[] of
16040 20 74 68 65 20 72 61 6e 67 65 2d 63 6f 6d 70 61   the range-compa
16050 72 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  red column */.  
16060 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65  WhereTerm *pLowe
16070 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f  r,   /* Lower bo
16080 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65  und on the range
16090 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69  . ex: "x>123" Mi
160a0 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
160b0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70   WhereTerm *pUpp
160c0 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62  er,   /* Upper b
160d0 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67  ound on the rang
160e0 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d  e. ex: "x<455" M
160f0 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
16100 20 20 69 6e 74 20 2a 70 69 45 73 74 20 20 20 20    int *piEst    
16110 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
16120 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 29  eturn value */.)
16130 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
16140 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66 20  ITE_OK;..#ifdef 
16150 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
16160 41 54 32 0a 0a 20 20 69 66 28 20 6e 45 71 3d 3d  AT2..  if( nEq==
16170 30 20 26 26 20 70 2d 3e 61 53 61 6d 70 6c 65 20  0 && p->aSample 
16180 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
16190 61 6c 75 65 20 2a 70 4c 6f 77 65 72 56 61 6c 20  alue *pLowerVal 
161a0 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
161b0 5f 76 61 6c 75 65 20 2a 70 55 70 70 65 72 56 61  _value *pUpperVa
161c0 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  l = 0;.    int i
161d0 45 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 4c 6f  Est;.    int iLo
161e0 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  wer = 0;.    int
161f0 20 69 55 70 70 65 72 20 3d 20 53 51 4c 49 54 45   iUpper = SQLITE
16200 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 3b 0a  _INDEX_SAMPLES;.
16210 20 20 20 20 69 6e 74 20 72 6f 75 6e 64 55 70 55      int roundUpU
16220 70 70 65 72 3b 0a 20 20 20 20 69 6e 74 20 72 6f  pper;.    int ro
16230 75 6e 64 55 70 4c 6f 77 65 72 3b 0a 20 20 20 20  undUpLower;.    
16240 75 38 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62  u8 aff = p->pTab
16250 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f  le->aCol[p->aiCo
16260 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e 69 74  lumn[0]].affinit
16270 79 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c 6f 77  y;..    if( pLow
16280 65 72 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  er ){.      Expr
16290 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77 65 72   *pExpr = pLower
162a0 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
162b0 0a 20 20 20 20 20 20 72 63 20 3d 20 76 61 6c 75  .      rc = valu
162c0 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65  eFromExpr(pParse
162d0 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 26 70  , pExpr, aff, &p
162e0 4c 6f 77 65 72 56 61 6c 29 3b 0a 20 20 20 20 20  LowerVal);.     
162f0 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72 2d   assert( pLower-
16300 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 47  >eOperator==WO_G
16310 54 20 7c 7c 20 70 4c 6f 77 65 72 2d 3e 65 4f 70  T || pLower->eOp
16320 65 72 61 74 6f 72 3d 3d 57 4f 5f 47 45 20 29 3b  erator==WO_GE );
16330 0a 20 20 20 20 20 20 72 6f 75 6e 64 55 70 4c 6f  .      roundUpLo
16340 77 65 72 20 3d 20 28 70 4c 6f 77 65 72 2d 3e 65  wer = (pLower->e
16350 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 47 54 29  Operator==WO_GT)
16360 20 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a 20 20 20   ?1:0;.    }.   
16370 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16380 4f 4b 20 26 26 20 70 55 70 70 65 72 20 29 7b 0a  OK && pUpper ){.
16390 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
163a0 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45 78 70  r = pUpper->pExp
163b0 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
163c0 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45   rc = valueFromE
163d0 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78 70  xpr(pParse, pExp
163e0 72 2c 20 61 66 66 2c 20 26 70 55 70 70 65 72 56  r, aff, &pUpperV
163f0 61 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  al);.      asser
16400 74 28 20 70 55 70 70 65 72 2d 3e 65 4f 70 65 72  t( pUpper->eOper
16410 61 74 6f 72 3d 3d 57 4f 5f 4c 54 20 7c 7c 20 70  ator==WO_LT || p
16420 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Upper->eOperator
16430 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20  ==WO_LE );.     
16440 20 72 6f 75 6e 64 55 70 55 70 70 65 72 20 3d 20   roundUpUpper = 
16450 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74  (pUpper->eOperat
16460 6f 72 3d 3d 57 4f 5f 4c 45 29 20 3f 31 3a 30 3b  or==WO_LE) ?1:0;
16470 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
16480 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
16490 20 28 70 4c 6f 77 65 72 56 61 6c 3d 3d 30 20 26   (pLowerVal==0 &
164a0 26 20 70 55 70 70 65 72 56 61 6c 3d 3d 30 29 20  & pUpperVal==0) 
164b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
164c0 56 61 6c 75 65 46 72 65 65 28 70 4c 6f 77 65 72  ValueFree(pLower
164d0 56 61 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Val);.      sqli
164e0 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 55 70  te3ValueFree(pUp
164f0 70 65 72 56 61 6c 29 3b 0a 20 20 20 20 20 20 67  perVal);.      g
16500 6f 74 6f 20 72 61 6e 67 65 5f 65 73 74 5f 66 61  oto range_est_fa
16510 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 7d 65 6c 73  llback;.    }els
16520 65 20 69 66 28 20 70 4c 6f 77 65 72 56 61 6c 3d  e if( pLowerVal=
16530 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
16540 20 77 68 65 72 65 52 61 6e 67 65 52 65 67 69 6f   whereRangeRegio
16550 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70 55 70  n(pParse, p, pUp
16560 70 65 72 56 61 6c 2c 20 72 6f 75 6e 64 55 70 55  perVal, roundUpU
16570 70 70 65 72 2c 20 26 69 55 70 70 65 72 29 3b 0a  pper, &iUpper);.
16580 20 20 20 20 20 20 69 66 28 20 70 4c 6f 77 65 72        if( pLower
16590 20 29 20 69 4c 6f 77 65 72 20 3d 20 69 55 70 70   ) iLower = iUpp
165a0 65 72 2f 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20  er/2;.    }else 
165b0 69 66 28 20 70 55 70 70 65 72 56 61 6c 3d 3d 30  if( pUpperVal==0
165c0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
165d0 68 65 72 65 52 61 6e 67 65 52 65 67 69 6f 6e 28  hereRangeRegion(
165e0 70 50 61 72 73 65 2c 20 70 2c 20 70 4c 6f 77 65  pParse, p, pLowe
165f0 72 56 61 6c 2c 20 72 6f 75 6e 64 55 70 4c 6f 77  rVal, roundUpLow
16600 65 72 2c 20 26 69 4c 6f 77 65 72 29 3b 0a 20 20  er, &iLower);.  
16610 20 20 20 20 69 66 28 20 70 55 70 70 65 72 20 29      if( pUpper )
16620 20 69 55 70 70 65 72 20 3d 20 28 69 4c 6f 77 65   iUpper = (iLowe
16630 72 20 2b 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  r + SQLITE_INDEX
16640 5f 53 41 4d 50 4c 45 53 20 2b 20 31 29 2f 32 3b  _SAMPLES + 1)/2;
16650 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16660 20 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e 67    rc = whereRang
16670 65 52 65 67 69 6f 6e 28 70 50 61 72 73 65 2c 20  eRegion(pParse, 
16680 70 2c 20 70 55 70 70 65 72 56 61 6c 2c 20 72 6f  p, pUpperVal, ro
16690 75 6e 64 55 70 55 70 70 65 72 2c 20 26 69 55 70  undUpUpper, &iUp
166a0 70 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  per);.      if( 
166b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
166c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68  .        rc = wh
166d0 65 72 65 52 61 6e 67 65 52 65 67 69 6f 6e 28 70  ereRangeRegion(p
166e0 50 61 72 73 65 2c 20 70 2c 20 70 4c 6f 77 65 72  Parse, p, pLower
166f0 56 61 6c 2c 20 72 6f 75 6e 64 55 70 4c 6f 77 65  Val, roundUpLowe
16700 72 2c 20 26 69 4c 6f 77 65 72 29 3b 0a 20 20 20  r, &iLower);.   
16710 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 57     }.    }.    W
16720 48 45 52 45 54 52 41 43 45 28 28 22 72 61 6e 67  HERETRACE(("rang
16730 65 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20  e scan regions: 
16740 25 64 2e 2e 25 64 5c 6e 22 2c 20 69 4c 6f 77 65  %d..%d\n", iLowe
16750 72 2c 20 69 55 70 70 65 72 29 29 3b 0a 0a 20 20  r, iUpper));..  
16760 20 20 69 45 73 74 20 3d 20 69 55 70 70 65 72 20    iEst = iUpper 
16770 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20 74 65  - iLower;.    te
16780 73 74 63 61 73 65 28 20 69 45 73 74 3d 3d 53 51  stcase( iEst==SQ
16790 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c  LITE_INDEX_SAMPL
167a0 45 53 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ES );.    assert
167b0 28 20 69 45 73 74 3c 3d 53 51 4c 49 54 45 5f 49  ( iEst<=SQLITE_I
167c0 4e 44 45 58 5f 53 41 4d 50 4c 45 53 20 29 3b 0a  NDEX_SAMPLES );.
167d0 20 20 20 20 69 66 28 20 69 45 73 74 3c 31 20 29      if( iEst<1 )
167e0 7b 0a 20 20 20 20 20 20 2a 70 69 45 73 74 20 3d  {.      *piEst =
167f0 20 35 30 2f 53 51 4c 49 54 45 5f 49 4e 44 45 58   50/SQLITE_INDEX
16800 5f 53 41 4d 50 4c 45 53 3b 0a 20 20 20 20 7d 65  _SAMPLES;.    }e
16810 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 69 45 73  lse{.      *piEs
16820 74 20 3d 20 28 69 45 73 74 2a 31 30 30 29 2f 53  t = (iEst*100)/S
16830 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50  QLITE_INDEX_SAMP
16840 4c 45 53 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  LES;.    }.    s
16850 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
16860 70 4c 6f 77 65 72 56 61 6c 29 3b 0a 20 20 20 20  pLowerVal);.    
16870 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
16880 28 70 55 70 70 65 72 56 61 6c 29 3b 0a 20 20 20  (pUpperVal);.   
16890 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
168a0 72 61 6e 67 65 5f 65 73 74 5f 66 61 6c 6c 62 61  range_est_fallba
168b0 63 6b 3a 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53  ck:.#else.  UNUS
168c0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61  ED_PARAMETER(pPa
168d0 72 73 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  rse);.  UNUSED_P
168e0 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 55  ARAMETER(p);.  U
168f0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
16900 6e 45 71 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  nEq);.#endif.  a
16910 73 73 65 72 74 28 20 70 4c 6f 77 65 72 20 7c 7c  ssert( pLower ||
16920 20 70 55 70 70 65 72 20 29 3b 0a 20 20 69 66 28   pUpper );.  if(
16930 20 70 4c 6f 77 65 72 20 26 26 20 70 55 70 70 65   pLower && pUppe
16940 72 20 29 7b 0a 20 20 20 20 2a 70 69 45 73 74 20  r ){.    *piEst 
16950 3d 20 31 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = 11;.  }else{. 
16960 20 20 20 2a 70 69 45 73 74 20 3d 20 33 33 3b 0a     *piEst = 33;.
16970 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
16980 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
16990 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a 2f  E_ENABLE_STAT2./
169a0 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
169b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
169c0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
169d0 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a  turned based on.
169e0 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79 20 63  ** an equality c
169f0 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41 4c 55  onstraint x=VALU
16a00 45 20 61 6e 64 20 77 68 65 72 65 20 74 68 61 74  E and where that
16a10 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20 69 6e   VALUE occurs in
16a20 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67 72 61  .** the histogra
16a30 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20 6f 6e  m data.  This on
16a40 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20 78 20  ly works when x 
16a50 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  is the left-most
16a60 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e  .** column of an
16a70 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c 69 74   index and sqlit
16a80 65 5f 73 74 61 74 32 20 68 69 73 74 6f 67 72 61  e_stat2 histogra
16a90 6d 20 64 61 74 61 20 69 73 20 61 76 61 69 6c 61  m data is availa
16aa0 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20  ble.** for that 
16ab0 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 57 72 69  index..**.** Wri
16ac0 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  te the estimated
16ad0 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20   row count into 
16ae0 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72  *pnRow and retur
16af0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a  n SQLITE_OK. .**
16b00 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61   If unable to ma
16b10 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20  ke an estimate, 
16b20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63  leave *pnRow unc
16b30 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72  hanged and retur
16b40 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  n.** non-zero..*
16b50 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
16b60 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74  e can fail if it
16b70 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f   is unable to lo
16b80 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ad a collating s
16b90 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69  equence.** requi
16ba0 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63  red for string c
16bb0 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66  omparison, or if
16bc0 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63   unable to alloc
16bd0 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  ate memory.** fo
16be0 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69  r a UTF conversi
16bf0 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  on required for 
16c00 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65  comparison.  The
16c10 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64   error is stored
16c20 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73  .** in the pPars
16c30 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
16c40 69 6e 74 20 77 68 65 72 65 45 71 75 61 6c 53 63  int whereEqualSc
16c50 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a  anEst(.  Parse *
16c60 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
16c70 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20   Parsing & code 
16c80 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
16c90 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  xt */.  Index *p
16ca0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
16cb0 54 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65 20  The index whose 
16cc0 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
16cd0 20 69 73 20 70 54 65 72 6d 20 2a 2f 0a 20 20 45   is pTerm */.  E
16ce0 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
16cf0 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
16d00 6e 20 66 6f 72 20 56 41 4c 55 45 20 69 6e 20 74  n for VALUE in t
16d10 68 65 20 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74  he x=VALUE const
16d20 72 61 69 6e 74 20 2a 2f 0a 20 20 64 6f 75 62 6c  raint */.  doubl
16d30 65 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 20  e *pnRow        
16d40 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76  /* Write the rev
16d50 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74  ised row estimat
16d60 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73  e here */.){.  s
16d70 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52  qlite3_value *pR
16d80 68 73 20 3d 20 30 3b 20 20 2f 2a 20 56 41 4c 55  hs = 0;  /* VALU
16d90 45 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20  E on right-hand 
16da0 73 69 64 65 20 6f 66 20 70 54 65 72 6d 20 2a 2f  side of pTerm */
16db0 0a 20 20 69 6e 74 20 69 4c 6f 77 65 72 2c 20 69  .  int iLower, i
16dc0 55 70 70 65 72 3b 20 20 20 20 20 20 20 2f 2a 20  Upper;       /* 
16dd0 52 61 6e 67 65 20 6f 66 20 68 69 73 74 6f 67 72  Range of histogr
16de0 61 6d 20 72 65 67 69 6f 6e 73 20 63 6f 6e 74 61  am regions conta
16df0 69 6e 69 6e 67 20 70 52 68 73 20 2a 2f 0a 20 20  ining pRhs */.  
16e00 75 38 20 61 66 66 3b 20 20 20 20 20 20 20 20 20  u8 aff;         
16e10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
16e20 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a  umn affinity */.
16e30 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
16e40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
16e50 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ubfunction retur
16e60 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 64 6f 75 62  n code */.  doub
16e70 6c 65 20 6e 52 6f 77 45 73 74 3b 20 20 20 20 20  le nRowEst;     
16e80 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 65 73 74        /* New est
16e90 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
16ea0 62 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 0a  ber of rows */..
16eb0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61    assert( p->aSa
16ec0 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 61 66 66  mple!=0 );.  aff
16ed0 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43   = p->pTable->aC
16ee0 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30  ol[p->aiColumn[0
16ef0 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 72  ]].affinity;.  r
16f00 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78 70  c = valueFromExp
16f10 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  r(pParse, pExpr,
16f20 20 61 66 66 2c 20 26 70 52 68 73 29 3b 0a 20 20   aff, &pRhs);.  
16f30 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68  if( rc ) goto wh
16f40 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 5f  ereEqualScanEst_
16f50 63 61 6e 63 65 6c 3b 0a 20 20 69 66 28 20 70 52  cancel;.  if( pR
16f60 68 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  hs==0 ) return S
16f70 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
16f80 20 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e 67    rc = whereRang
16f90 65 52 65 67 69 6f 6e 28 70 50 61 72 73 65 2c 20  eRegion(pParse, 
16fa0 70 2c 20 70 52 68 73 2c 20 30 2c 20 26 69 4c 6f  p, pRhs, 0, &iLo
16fb0 77 65 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  wer);.  if( rc )
16fc0 20 67 6f 74 6f 20 77 68 65 72 65 45 71 75 61 6c   goto whereEqual
16fd0 53 63 61 6e 45 73 74 5f 63 61 6e 63 65 6c 3b 0a  ScanEst_cancel;.
16fe0 20 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e 67    rc = whereRang
16ff0 65 52 65 67 69 6f 6e 28 70 50 61 72 73 65 2c 20  eRegion(pParse, 
17000 70 2c 20 70 52 68 73 2c 20 31 2c 20 26 69 55 70  p, pRhs, 1, &iUp
17010 70 65 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  per);.  if( rc )
17020 20 67 6f 74 6f 20 77 68 65 72 65 45 71 75 61 6c   goto whereEqual
17030 53 63 61 6e 45 73 74 5f 63 61 6e 63 65 6c 3b 0a  ScanEst_cancel;.
17040 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 65    WHERETRACE(("e
17050 71 75 61 6c 69 74 79 20 73 63 61 6e 20 72 65 67  quality scan reg
17060 69 6f 6e 73 3a 20 25 64 2e 2e 25 64 5c 6e 22 2c  ions: %d..%d\n",
17070 20 69 4c 6f 77 65 72 2c 20 69 55 70 70 65 72 29   iLower, iUpper)
17080 29 3b 0a 20 20 69 66 28 20 69 4c 6f 77 65 72 3e  );.  if( iLower>
17090 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20 6e  =iUpper ){.    n
170a0 52 6f 77 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f  RowEst = p->aiRo
170b0 77 45 73 74 5b 30 5d 2f 28 53 51 4c 49 54 45 5f  wEst[0]/(SQLITE_
170c0 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 2a 32 29  INDEX_SAMPLES*2)
170d0 3b 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 45 73  ;.    if( nRowEs
170e0 74 3c 2a 70 6e 52 6f 77 20 29 20 2a 70 6e 52 6f  t<*pnRow ) *pnRo
170f0 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 7d  w = nRowEst;.  }
17100 65 6c 73 65 7b 0a 20 20 20 20 6e 52 6f 77 45 73  else{.    nRowEs
17110 74 20 3d 20 28 69 55 70 70 65 72 2d 69 4c 6f 77  t = (iUpper-iLow
17120 65 72 29 2a 70 2d 3e 61 69 52 6f 77 45 73 74 5b  er)*p->aiRowEst[
17130 30 5d 2f 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  0]/SQLITE_INDEX_
17140 53 41 4d 50 4c 45 53 3b 0a 20 20 20 20 2a 70 6e  SAMPLES;.    *pn
17150 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20  Row = nRowEst;. 
17160 20 7d 0a 0a 77 68 65 72 65 45 71 75 61 6c 53 63   }..whereEqualSc
17170 61 6e 45 73 74 5f 63 61 6e 63 65 6c 3a 0a 20 20  anEst_cancel:.  
17180 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
17190 28 70 52 68 73 29 3b 0a 20 20 72 65 74 75 72 6e  (pRhs);.  return
171a0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
171b0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
171c0 45 4e 41 42 4c 45 5f 53 54 41 54 32 29 20 2a 2f  ENABLE_STAT2) */
171d0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
171e0 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a 2f 2a 0a  ENABLE_STAT2./*.
171f0 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
17200 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
17210 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75  hat will be retu
17220 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  rned based on.**
17230 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   an IN constrain
17240 74 20 77 68 65 72 65 20 74 68 65 20 72 69 67 68  t where the righ
17250 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
17260 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a  he IN operator.*
17270 2a 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 76  * is a list of v
17280 61 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a  alues.  Example:
17290 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57 48  .**.**        WH
172a0 45 52 45 20 78 20 49 4e 20 28 31 2c 32 2c 33 2c  ERE x IN (1,2,3,
172b0 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  4).**.** Write t
172c0 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77  he estimated row
172d0 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52   count into *pnR
172e0 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ow and return SQ
172f0 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20  LITE_OK. .** If 
17300 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61  unable to make a
17310 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76  n estimate, leav
17320 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67  e *pnRow unchang
17330 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ed and return.**
17340 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a   non-zero..**.**
17350 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
17360 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20  n fail if it is 
17370 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61  unable to load a
17380 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
17390 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20  nce.** required 
173a0 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61  for string compa
173b0 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61  rison, or if una
173c0 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ble to allocate 
173d0 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20  memory.** for a 
173e0 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72  UTF conversion r
173f0 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70  equired for comp
17400 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72  arison.  The err
17410 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20  or is stored.** 
17420 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
17430 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20  ructure..*/.int 
17440 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 0a  whereInScanEst(.
17450 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
17460 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
17470 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74  g & code generat
17480 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
17490 20 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20   Index *p,      
174a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
174b0 65 78 20 77 68 6f 73 65 20 6c 65 66 74 2d 6d 6f  ex whose left-mo
174c0 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 70 54 65  st column is pTe
174d0 72 6d 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  rm */.  ExprList
174e0 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20   *pList,     /* 
174f0 54 68 65 20 76 61 6c 75 65 20 6c 69 73 74 20 6f  The value list o
17500 6e 20 74 68 65 20 52 48 53 20 6f 66 20 22 78 20  n the RHS of "x 
17510 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e  IN (v1,v2,v3,...
17520 29 22 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 2a  )" */.  double *
17530 70 6e 52 6f 77 20 20 20 20 20 20 20 20 2f 2a 20  pnRow        /* 
17540 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65  Write the revise
17550 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68  d row estimate h
17560 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ere */.){.  sqli
17570 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20  te3_value *pVal 
17580 3d 20 30 3b 20 20 2f 2a 20 4f 6e 65 20 76 61 6c  = 0;  /* One val
17590 75 65 20 66 72 6f 6d 20 6c 69 73 74 20 2a 2f 0a  ue from list */.
175a0 20 20 69 6e 74 20 69 4c 6f 77 65 72 2c 20 69 55    int iLower, iU
175b0 70 70 65 72 3b 20 20 20 20 20 20 20 2f 2a 20 52  pper;       /* R
175c0 61 6e 67 65 20 6f 66 20 68 69 73 74 6f 67 72 61  ange of histogra
175d0 6d 20 72 65 67 69 6f 6e 73 20 63 6f 6e 74 61 69  m regions contai
175e0 6e 69 6e 67 20 70 52 68 73 20 2a 2f 0a 20 20 75  ning pRhs */.  u
175f0 38 20 61 66 66 3b 20 20 20 20 20 20 20 20 20 20  8 aff;          
17600 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
17610 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a 20  mn affinity */. 
17620 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
17630 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 53 75  _OK;       /* Su
17640 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e  bfunction return
17650 20 63 6f 64 65 20 2a 2f 0a 20 20 64 6f 75 62 6c   code */.  doubl
17660 65 20 6e 52 6f 77 45 73 74 3b 20 20 20 20 20 20  e nRowEst;      
17670 20 20 20 20 20 2f 2a 20 4e 65 77 20 65 73 74 69       /* New esti
17680 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62  mate of the numb
17690 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20  er of rows */.  
176a0 69 6e 74 20 6e 53 70 61 6e 20 3d 20 30 3b 20 20  int nSpan = 0;  
176b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
176c0 62 65 72 20 6f 66 20 68 69 73 74 6f 67 72 61 6d  ber of histogram
176d0 20 72 65 67 69 6f 6e 73 20 73 70 61 6e 6e 65 64   regions spanned
176e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 69 6e 67 6c   */.  int nSingl
176f0 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
17700 2f 2a 20 48 69 73 74 6f 67 72 61 6d 20 72 65 67  /* Histogram reg
17710 69 6f 6e 73 20 68 69 74 20 62 79 20 61 20 73 69  ions hit by a si
17720 6e 67 6c 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20  ngle value */.  
17730 69 6e 74 20 6e 4e 6f 74 46 6f 75 6e 64 20 3d 20  int nNotFound = 
17740 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75  0;        /* Cou
17750 6e 74 20 6f 66 20 76 61 6c 75 65 73 20 74 68 61  nt of values tha
17760 74 20 61 72 65 20 6e 6f 74 20 63 6f 6e 73 74 61  t are not consta
17770 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  nts */.  int i; 
17780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
177a0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
177b0 0a 20 20 75 38 20 61 53 70 61 6e 5b 53 51 4c 49  .  u8 aSpan[SQLI
177c0 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53  TE_INDEX_SAMPLES
177d0 2b 31 5d 3b 20 20 20 20 2f 2a 20 48 69 73 74 6f  +1];    /* Histo
177e0 67 72 61 6d 20 72 65 67 69 6f 6e 73 20 74 68 61  gram regions tha
177f0 74 20 61 72 65 20 73 70 61 6e 6e 65 64 20 2a 2f  t are spanned */
17800 0a 20 20 75 38 20 61 53 69 6e 67 6c 65 5b 53 51  .  u8 aSingle[SQ
17810 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c  LITE_INDEX_SAMPL
17820 45 53 2b 31 5d 3b 20 20 2f 2a 20 48 69 73 74 6f  ES+1];  /* Histo
17830 67 72 61 6d 20 72 65 67 69 6f 6e 73 20 68 69 74  gram regions hit
17840 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65   once */..  asse
17850 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d  rt( p->aSample!=
17860 30 20 29 3b 0a 20 20 61 66 66 20 3d 20 70 2d 3e  0 );.  aff = p->
17870 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e  pTable->aCol[p->
17880 61 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66  aiColumn[0]].aff
17890 69 6e 69 74 79 3b 0a 20 20 6d 65 6d 73 65 74 28  inity;.  memset(
178a0 61 53 70 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66  aSpan, 0, sizeof
178b0 28 61 53 70 61 6e 29 29 3b 0a 20 20 6d 65 6d 73  (aSpan));.  mems
178c0 65 74 28 61 53 69 6e 67 6c 65 2c 20 30 2c 20 73  et(aSingle, 0, s
178d0 69 7a 65 6f 66 28 61 53 69 6e 67 6c 65 29 29 3b  izeof(aSingle));
178e0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
178f0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
17900 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  {.    sqlite3Val
17910 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20  ueFree(pVal);.  
17920 20 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d    rc = valueFrom
17930 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 4c 69  Expr(pParse, pLi
17940 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
17950 61 66 66 2c 20 26 70 56 61 6c 29 3b 0a 20 20 20  aff, &pVal);.   
17960 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
17970 0a 20 20 20 20 69 66 28 20 70 56 61 6c 3d 3d 30  .    if( pVal==0
17980 20 7c 7c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   || sqlite3_valu
17990 65 5f 74 79 70 65 28 70 56 61 6c 29 3d 3d 53 51  e_type(pVal)==SQ
179a0 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20  LITE_NULL ){.   
179b0 20 20 20 6e 4e 6f 74 46 6f 75 6e 64 2b 2b 3b 0a     nNotFound++;.
179c0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
179d0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 77      }.    rc = w
179e0 68 65 72 65 52 61 6e 67 65 52 65 67 69 6f 6e 28  hereRangeRegion(
179f0 70 50 61 72 73 65 2c 20 70 2c 20 70 56 61 6c 2c  pParse, p, pVal,
17a00 20 30 2c 20 26 69 4c 6f 77 65 72 29 3b 0a 20 20   0, &iLower);.  
17a10 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
17a20 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  ;.    rc = where
17a30 52 61 6e 67 65 52 65 67 69 6f 6e 28 70 50 61 72  RangeRegion(pPar
17a40 73 65 2c 20 70 2c 20 70 56 61 6c 2c 20 31 2c 20  se, p, pVal, 1, 
17a50 26 69 55 70 70 65 72 29 3b 0a 20 20 20 20 69 66  &iUpper);.    if
17a60 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
17a70 20 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d 69 55    if( iLower>=iU
17a80 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20 61 53  pper ){.      aS
17a90 69 6e 67 6c 65 5b 69 4c 6f 77 65 72 5d 20 3d 20  ingle[iLower] = 
17aa0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
17ab0 20 20 20 20 61 73 73 65 72 74 28 20 69 4c 6f 77      assert( iLow
17ac0 65 72 3e 3d 30 20 26 26 20 69 55 70 70 65 72 3c  er>=0 && iUpper<
17ad0 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41  =SQLITE_INDEX_SA
17ae0 4d 50 4c 45 53 20 29 3b 0a 20 20 20 20 20 20 77  MPLES );.      w
17af0 68 69 6c 65 28 20 69 4c 6f 77 65 72 3c 69 55 70  hile( iLower<iUp
17b00 70 65 72 20 29 20 61 53 70 61 6e 5b 69 4c 6f 77  per ) aSpan[iLow
17b10 65 72 2b 2b 5d 20 3d 20 31 3b 0a 20 20 20 20 7d  er++] = 1;.    }
17b20 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
17b30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17b40 66 6f 72 28 69 3d 6e 53 70 61 6e 3d 30 3b 20 69  for(i=nSpan=0; i
17b50 3c 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53  <=SQLITE_INDEX_S
17b60 41 4d 50 4c 45 53 3b 20 69 2b 2b 29 7b 0a 20 20  AMPLES; i++){.  
17b70 20 20 20 20 69 66 28 20 61 53 70 61 6e 5b 69 5d      if( aSpan[i]
17b80 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 53 70 61   ){.        nSpa
17b90 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n++;.      }else
17ba0 20 69 66 28 20 61 53 69 6e 67 6c 65 5b 69 5d 20   if( aSingle[i] 
17bb0 29 7b 0a 20 20 20 20 20 20 20 20 6e 53 69 6e 67  ){.        nSing
17bc0 6c 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  le++;.      }.  
17bd0 20 20 7d 0a 20 20 20 20 6e 52 6f 77 45 73 74 20    }.    nRowEst 
17be0 3d 20 28 6e 53 70 61 6e 2a 32 2b 6e 53 69 6e 67  = (nSpan*2+nSing
17bf0 6c 65 29 2a 70 2d 3e 61 69 52 6f 77 45 73 74 5b  le)*p->aiRowEst[
17c00 30 5d 2f 28 32 2a 53 51 4c 49 54 45 5f 49 4e 44  0]/(2*SQLITE_IND
17c10 45 58 5f 53 41 4d 50 4c 45 53 29 0a 20 20 20 20  EX_SAMPLES).    
17c20 20 20 20 20 20 20 20 20 20 20 20 2b 20 6e 4e 6f             + nNo
17c30 74 46 6f 75 6e 64 2a 70 2d 3e 61 69 52 6f 77 45  tFound*p->aiRowE
17c40 73 74 5b 31 5d 3b 0a 20 20 20 20 69 66 28 20 6e  st[1];.    if( n
17c50 52 6f 77 45 73 74 20 3e 20 70 2d 3e 61 69 52 6f  RowEst > p->aiRo
17c60 77 45 73 74 5b 30 5d 20 29 20 6e 52 6f 77 45 73  wEst[0] ) nRowEs
17c70 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b  t = p->aiRowEst[
17c80 30 5d 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d  0];.    *pnRow =
17c90 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 57 48   nRowEst;.    WH
17ca0 45 52 45 54 52 41 43 45 28 28 22 49 4e 20 72 6f  ERETRACE(("IN ro
17cb0 77 20 65 73 74 69 6d 61 74 65 3a 20 6e 53 70 61  w estimate: nSpa
17cc0 6e 3d 25 64 2c 20 6e 53 69 6e 67 6c 65 3d 25 64  n=%d, nSingle=%d
17cd0 2c 20 6e 4e 6f 74 46 6f 75 6e 64 3d 25 64 2c 20  , nNotFound=%d, 
17ce0 65 73 74 3d 25 67 5c 6e 22 2c 0a 20 20 20 20 20  est=%g\n",.     
17cf0 20 20 20 20 20 20 20 20 20 20 20 20 6e 53 70 61              nSpa
17d00 6e 2c 20 6e 53 69 6e 67 6c 65 2c 20 6e 4e 6f 74  n, nSingle, nNot
17d10 46 6f 75 6e 64 2c 20 6e 52 6f 77 45 73 74 29 29  Found, nRowEst))
17d20 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
17d30 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
17d40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
17d50 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
17d60 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53  (SQLITE_ENABLE_S
17d70 54 41 54 32 29 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a  TAT2) */.../*.**
17d80 20 46 69 6e 64 20 74 68 65 20 71 75 65 72 79 20   Find the query 
17d90 70 6c 61 6e 20 66 6f 72 20 61 63 63 65 73 73 69  plan for accessi
17da0 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  ng a particular 
17db0 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20 74 68  table.  Write th
17dc0 65 0a 2a 2a 20 62 65 73 74 20 71 75 65 72 79 20  e.** best query 
17dd0 70 6c 61 6e 20 61 6e 64 20 69 74 73 20 63 6f 73  plan and its cos
17de0 74 20 69 6e 74 6f 20 74 68 65 20 57 68 65 72 65  t into the Where
17df0 43 6f 73 74 20 6f 62 6a 65 63 74 20 73 75 70 70  Cost object supp
17e00 6c 69 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 6c  lied as the.** l
17e10 61 73 74 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ast parameter..*
17e20 2a 0a 2a 2a 20 54 68 65 20 6c 6f 77 65 73 74 20  *.** The lowest 
17e30 63 6f 73 74 20 70 6c 61 6e 20 77 69 6e 73 2e 20  cost plan wins. 
17e40 20 54 68 65 20 63 6f 73 74 20 69 73 20 61 6e 20   The cost is an 
17e50 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
17e60 61 6d 6f 75 6e 74 20 6f 66 0a 2a 2a 20 43 50 55  amount of.** CPU
17e70 20 61 6e 64 20 64 69 73 6b 20 49 2f 4f 20 6e 65   and disk I/O ne
17e80 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ed to process th
17e90 65 20 72 65 71 75 65 73 74 20 75 73 69 6e 67 20  e request using 
17ea0 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 6c 61  the selected pla
17eb0 6e 2e 0a 2a 2a 20 46 61 63 74 6f 72 73 20 74 68  n..** Factors th
17ec0 61 74 20 69 6e 66 6c 75 65 6e 63 65 20 63 6f 73  at influence cos
17ed0 74 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a  t include:.**.**
17ee0 20 20 20 20 2a 20 20 54 68 65 20 65 73 74 69 6d      *  The estim
17ef0 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72  ated number of r
17f00 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ows that will be
17f10 20 72 65 74 72 69 65 76 65 64 2e 20 20 28 54 68   retrieved.  (Th
17f20 65 0a 2a 2a 20 20 20 20 20 20 20 66 65 77 65 72  e.**       fewer
17f30 20 74 68 65 20 62 65 74 74 65 72 2e 29 0a 2a 2a   the better.).**
17f40 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68 65  .**    *  Whethe
17f50 72 20 6f 72 20 6e 6f 74 20 73 6f 72 74 69 6e 67  r or not sorting
17f60 20 6d 75 73 74 20 6f 63 63 75 72 2e 0a 2a 2a 0a   must occur..**.
17f70 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68 65 72  **    *  Whether
17f80 20 6f 72 20 6e 6f 74 20 74 68 65 72 65 20 6d 75   or not there mu
17f90 73 74 20 62 65 20 73 65 70 61 72 61 74 65 20 6c  st be separate l
17fa0 6f 6f 6b 75 70 73 20 69 6e 20 74 68 65 0a 2a 2a  ookups in the.**
17fb0 20 20 20 20 20 20 20 69 6e 64 65 78 20 61 6e 64         index and
17fc0 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62   in the main tab
17fd0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le..**.** If the
17fe0 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45  re was an INDEXE
17ff0 44 20 42 59 20 63 6c 61 75 73 65 20 28 70 53 72  D BY clause (pSr
18000 63 2d 3e 70 49 6e 64 65 78 29 20 61 74 74 61 63  c->pIndex) attac
18010 68 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65  hed to the table
18020 20 69 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73   in.** the SQL s
18030 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 74  tatement, then t
18040 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c  his function onl
18050 79 20 63 6f 6e 73 69 64 65 72 73 20 70 6c 61 6e  y considers plan
18060 73 20 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20  s using the .** 
18070 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 49 66 20  named index. If 
18080 6e 6f 20 73 75 63 68 20 70 6c 61 6e 20 69 73 20  no such plan is 
18090 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20  found, then the 
180a0 72 65 74 75 72 6e 65 64 20 63 6f 73 74 20 69 73  returned cost is
180b0 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 49 47 5f 44  .** SQLITE_BIG_D
180c0 42 4c 2e 20 49 66 20 61 20 70 6c 61 6e 20 69 73  BL. If a plan is
180d0 20 66 6f 75 6e 64 20 74 68 61 74 20 75 73 65 73   found that uses
180e0 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78   the named index
180f0 2c 20 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 63  , .** then the c
18100 6f 73 74 20 69 73 20 63 61 6c 63 75 6c 61 74 65  ost is calculate
18110 64 20 69 6e 20 74 68 65 20 75 73 75 61 6c 20 77  d in the usual w
18120 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4e  ay..**.** If a N
18130 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73  OT INDEXED claus
18140 65 20 28 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65  e (pSrc->notInde
18150 78 65 64 21 3d 30 29 20 77 61 73 20 61 74 74 61  xed!=0) was atta
18160 63 68 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  ched to the tabl
18170 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 53 45 4c  e .** in the SEL
18180 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  ECT statement, t
18190 68 65 6e 20 6e 6f 20 69 6e 64 65 78 65 73 20 61  hen no indexes a
181a0 72 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 48  re considered. H
181b0 6f 77 65 76 65 72 2c 20 74 68 65 20 0a 2a 2a 20  owever, the .** 
181c0 73 65 6c 65 63 74 65 64 20 70 6c 61 6e 20 6d 61  selected plan ma
181d0 79 20 73 74 69 6c 6c 20 74 61 6b 65 20 61 64 76  y still take adv
181e0 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20 74 61  antage of the ta
181f0 62 6c 65 73 20 62 75 69 6c 74 2d 69 6e 20 72 6f  bles built-in ro
18200 77 69 64 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2f  wid.** index..*/
18210 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65 73  .static void bes
18220 74 42 74 72 65 65 49 6e 64 65 78 28 0a 20 20 50  tBtreeIndex(.  P
18230 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
18240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
18250 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
18260 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
18270 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
18280 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
18290 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
182a0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
182b0 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46  *pSrc,  /* The F
182c0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
182d0 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42  to search */.  B
182e0 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
182f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
18300 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 6e 6f  sk of cursors no
18310 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  t available for 
18320 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69  indexing */.  Bi
18330 74 6d 61 73 6b 20 6e 6f 74 56 61 6c 69 64 2c 20  tmask notValid, 
18340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
18350 73 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  sors not availab
18360 6c 65 20 66 6f 72 20 61 6e 79 20 70 75 72 70 6f  le for any purpo
18370 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
18380 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
18390 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
183a0 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
183b0 57 68 65 72 65 43 6f 73 74 20 2a 70 43 6f 73 74  WhereCost *pCost
183c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
183d0 6f 77 65 73 74 20 63 6f 73 74 20 71 75 65 72 79  owest cost query
183e0 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e   plan */.){.  in
183f0 74 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e 69  t iCur = pSrc->i
18400 43 75 72 73 6f 72 3b 20 20 20 2f 2a 20 54 68 65  Cursor;   /* The
18410 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74   cursor of the t
18420 61 62 6c 65 20 74 6f 20 62 65 20 61 63 63 65 73  able to be acces
18430 73 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  sed */.  Index *
18440 70 50 72 6f 62 65 3b 20 20 20 20 20 20 20 20 20  pProbe;         
18450 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
18460 20 77 65 20 61 72 65 20 65 76 61 6c 75 61 74 69   we are evaluati
18470 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ng */.  Index *p
18480 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
18490 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70      /* Copy of p
184a0 50 72 6f 62 65 2c 20 6f 72 20 7a 65 72 6f 20 66  Probe, or zero f
184b0 6f 72 20 49 50 4b 20 69 6e 64 65 78 20 2a 2f 0a  or IPK index */.
184c0 20 20 69 6e 74 20 65 71 54 65 72 6d 4d 61 73 6b    int eqTermMask
184d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
184e0 20 43 75 72 72 65 6e 74 20 6d 61 73 6b 20 6f 66   Current mask of
184f0 20 76 61 6c 69 64 20 65 71 75 61 6c 69 74 79 20   valid equality 
18500 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69  operators */.  i
18510 6e 74 20 69 64 78 45 71 54 65 72 6d 4d 61 73 6b  nt idxEqTermMask
18520 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ;          /* In
18530 64 65 78 20 6d 61 73 6b 20 6f 66 20 76 61 6c 69  dex mask of vali
18540 64 20 65 71 75 61 6c 69 74 79 20 6f 70 65 72 61  d equality opera
18550 74 6f 72 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20  tors */.  Index 
18560 73 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  sPk;            
18570 20 20 20 20 20 20 2f 2a 20 41 20 66 61 6b 65 20        /* A fake 
18580 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72  index object for
18590 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
185a0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   */.  unsigned i
185b0 6e 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d  nt aiRowEstPk[2]
185c0 3b 20 2f 2a 20 54 68 65 20 61 69 52 6f 77 45 73  ; /* The aiRowEs
185d0 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68  t[] value for th
185e0 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20  e sPk index */. 
185f0 20 69 6e 74 20 61 69 43 6f 6c 75 6d 6e 50 6b 20   int aiColumnPk 
18600 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a 20  = -1;        /* 
18610 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61  The aColumn[] va
18620 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20  lue for the sPk 
18630 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 77  index */.  int w
18640 73 46 6c 61 67 4d 61 73 6b 3b 20 20 20 20 20 20  sFlagMask;      
18650 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 77 65         /* Allowe
18660 64 20 66 6c 61 67 73 20 69 6e 20 70 43 6f 73 74  d flags in pCost
18670 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 20 2a 2f  ->plan.wsFlag */
18680 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
18690 65 20 74 68 65 20 63 6f 73 74 20 74 6f 20 61 20  e the cost to a 
186a0 77 6f 72 73 74 2d 63 61 73 65 20 76 61 6c 75 65  worst-case value
186b0 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f   */.  memset(pCo
186c0 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  st, 0, sizeof(*p
186d0 43 6f 73 74 29 29 3b 0a 20 20 70 43 6f 73 74 2d  Cost));.  pCost-
186e0 3e 72 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f  >rCost = SQLITE_
186f0 42 49 47 5f 44 42 4c 3b 0a 0a 20 20 2f 2a 20 49  BIG_DBL;..  /* I
18700 66 20 74 68 65 20 70 53 72 63 20 74 61 62 6c 65  f the pSrc table
18710 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74 61   is the right ta
18720 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  ble of a LEFT JO
18730 49 4e 20 74 68 65 6e 20 77 65 20 6d 61 79 20 6e  IN then we may n
18740 6f 74 0a 20 20 2a 2a 20 75 73 65 20 61 6e 20 69  ot.  ** use an i
18750 6e 64 65 78 20 74 6f 20 73 61 74 69 73 66 79 20  ndex to satisfy 
18760 49 53 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69  IS NULL constrai
18770 6e 74 73 20 6f 6e 20 74 68 61 74 20 74 61 62 6c  nts on that tabl
18780 65 2e 20 20 54 68 69 73 20 69 73 0a 20 20 2a 2a  e.  This is.  **
18790 20 62 65 63 61 75 73 65 20 63 6f 6c 75 6d 6e 73   because columns
187a0 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62 65   might end up be
187b0 69 6e 67 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  ing NULL if the 
187c0 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6d  table does not m
187d0 61 74 63 68 20 2d 0a 20 20 2a 2a 20 61 20 63 69  atch -.  ** a ci
187e0 72 63 75 6d 73 74 61 6e 63 65 20 77 68 69 63 68  rcumstance which
187f0 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e 6e 6f   the index canno
18800 74 20 68 65 6c 70 20 75 73 20 64 69 73 63 6f 76  t help us discov
18810 65 72 2e 20 20 54 69 63 6b 65 74 20 23 32 31 37  er.  Ticket #217
18820 37 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  7..  */.  if( pS
18830 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  rc->jointype & J
18840 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 69 64  T_LEFT ){.    id
18850 78 45 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f  xEqTermMask = WO
18860 5f 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c  _EQ|WO_IN;.  }el
18870 73 65 7b 0a 20 20 20 20 69 64 78 45 71 54 65 72  se{.    idxEqTer
18880 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f  mMask = WO_EQ|WO
18890 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20  _IN|WO_ISNULL;. 
188a0 20 7d 0a 0a 20 20 69 66 28 20 70 53 72 63 2d 3e   }..  if( pSrc->
188b0 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a  pIndex ){.    /*
188c0 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   An INDEXED BY c
188d0 6c 61 75 73 65 20 73 70 65 63 69 66 69 65 73 20  lause specifies 
188e0 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64  a particular ind
188f0 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20  ex to use */.   
18900 20 70 49 64 78 20 3d 20 70 50 72 6f 62 65 20 3d   pIdx = pProbe =
18910 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3b 0a 20   pSrc->pIndex;. 
18920 20 20 20 77 73 46 6c 61 67 4d 61 73 6b 20 3d 20     wsFlagMask = 
18930 7e 28 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51  ~(WHERE_ROWID_EQ
18940 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e  |WHERE_ROWID_RAN
18950 47 45 29 3b 0a 20 20 20 20 65 71 54 65 72 6d 4d  GE);.    eqTermM
18960 61 73 6b 20 3d 20 69 64 78 45 71 54 65 72 6d 4d  ask = idxEqTermM
18970 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ask;.  }else{.  
18980 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
18990 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
189a0 73 65 2e 20 20 43 72 65 61 74 65 20 61 20 66 61  se.  Create a fa
189b0 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  ke Index object 
189c0 74 6f 0a 20 20 20 20 2a 2a 20 72 65 70 72 65 73  to.    ** repres
189d0 65 6e 74 20 74 68 65 20 70 72 69 6d 61 72 79 20  ent the primary 
189e0 6b 65 79 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78  key */.    Index
189f0 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
18a00 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 79 20           /* Any 
18a10 6f 74 68 65 72 20 69 6e 64 65 78 20 6f 6e 20 74  other index on t
18a20 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  he table */.    
18a30 6d 65 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c 20  memset(&sPk, 0, 
18a40 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a  sizeof(Index));.
18a50 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20      sPk.nColumn 
18a60 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43  = 1;.    sPk.aiC
18a70 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d  olumn = &aiColum
18a80 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52  nPk;.    sPk.aiR
18a90 6f 77 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74  owEst = aiRowEst
18aa0 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72  Pk;.    sPk.onEr
18ab0 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65  ror = OE_Replace
18ac0 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65  ;.    sPk.pTable
18ad0 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20   = pSrc->pTab;. 
18ae0 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d     aiRowEstPk[0]
18af0 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 6e   = pSrc->pTab->n
18b00 52 6f 77 45 73 74 3b 0a 20 20 20 20 61 69 52 6f  RowEst;.    aiRo
18b10 77 45 73 74 50 6b 5b 31 5d 20 3d 20 31 3b 0a 20  wEstPk[1] = 1;. 
18b20 20 20 20 70 46 69 72 73 74 20 3d 20 70 53 72 63     pFirst = pSrc
18b30 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  ->pTab->pIndex;.
18b40 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f      if( pSrc->no
18b50 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20  tIndexed==0 ){. 
18b60 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d       sPk.pNext =
18b70 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20   pFirst;.    }. 
18b80 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b     pProbe = &sPk
18b90 3b 0a 20 20 20 20 77 73 46 6c 61 67 4d 61 73 6b  ;.    wsFlagMask
18ba0 20 3d 20 7e 28 0a 20 20 20 20 20 20 20 20 57 48   = ~(.        WH
18bb0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48  ERE_COLUMN_IN|WH
18bc0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48  ERE_COLUMN_EQ|WH
18bd0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 7c  ERE_COLUMN_NULL|
18be0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
18bf0 47 45 0a 20 20 20 20 29 3b 0a 20 20 20 20 65 71  GE.    );.    eq
18c00 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51  TermMask = WO_EQ
18c10 7c 57 4f 5f 49 4e 3b 0a 20 20 20 20 70 49 64 78  |WO_IN;.    pIdx
18c20 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
18c30 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e  Loop over all in
18c40 64 69 63 65 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f  dices looking fo
18c50 72 20 74 68 65 20 62 65 73 74 20 6f 6e 65 20 74  r the best one t
18c60 6f 20 75 73 65 0a 20 20 2a 2f 0a 20 20 66 6f 72  o use.  */.  for
18c70 28 3b 20 70 50 72 6f 62 65 3b 20 70 49 64 78 3d  (; pProbe; pIdx=
18c80 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70  pProbe=pProbe->p
18c90 4e 65 78 74 29 7b 0a 20 20 20 20 63 6f 6e 73 74  Next){.    const
18ca0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 20   unsigned int * 
18cb0 63 6f 6e 73 74 20 61 69 52 6f 77 45 73 74 20 3d  const aiRowEst =
18cc0 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73   pProbe->aiRowEs
18cd0 74 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 63 6f  t;.    double co
18ce0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
18cf0 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 75 73     /* Cost of us
18d00 69 6e 67 20 70 50 72 6f 62 65 20 2a 2f 0a 20 20  ing pProbe */.  
18d10 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77 3b 20 20    double nRow;  
18d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18d30 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   Estimated numbe
18d40 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 72 65 73  r of rows in res
18d50 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 69  ult set */.    i
18d60 6e 74 20 72 65 76 3b 20 20 20 20 20 20 20 20 20  nt rev;         
18d70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
18d80 75 65 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65  ue to scan in re
18d90 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20  verse order */. 
18da0 20 20 20 69 6e 74 20 77 73 46 6c 61 67 73 20 3d     int wsFlags =
18db0 20 30 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   0;.    Bitmask 
18dc0 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  used = 0;..    /
18dd0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
18de0 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 70 6f  variables are po
18df0 70 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e  pulated based on
18e00 20 74 68 65 20 70 72 6f 70 65 72 74 69 65 73 20   the properties 
18e10 6f 66 0a 20 20 20 20 2a 2a 20 73 63 61 6e 20 62  of.    ** scan b
18e20 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 2e 20  eing evaluated. 
18e30 54 68 65 79 20 61 72 65 20 74 68 65 6e 20 75 73  They are then us
18e40 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
18e50 74 68 65 20 65 78 70 65 63 74 65 64 0a 20 20 20  the expected.   
18e60 20 2a 2a 20 63 6f 73 74 20 61 6e 64 20 6e 75 6d   ** cost and num
18e70 62 65 72 20 6f 66 20 72 6f 77 73 20 72 65 74 75  ber of rows retu
18e80 72 6e 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  rned..    **.   
18e90 20 2a 2a 20 20 6e 45 71 3a 20 0a 20 20 20 20 2a   **  nEq: .    *
18ea0 2a 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 65  *    Number of e
18eb0 71 75 61 6c 69 74 79 20 74 65 72 6d 73 20 74 68  quality terms th
18ec0 61 74 20 63 61 6e 20 62 65 20 69 6d 70 6c 65 6d  at can be implem
18ed0 65 6e 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  ented using the 
18ee0 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20  index..    **.  
18ef0 20 20 2a 2a 20 20 6e 49 6e 4d 75 6c 3a 20 20 0a    **  nInMul:  .
18f00 20 20 20 20 2a 2a 20 20 20 20 54 68 65 20 22 69      **    The "i
18f10 6e 2d 6d 75 6c 74 69 70 6c 69 65 72 22 2e 20 54  n-multiplier". T
18f20 68 69 73 20 69 73 20 61 6e 20 65 73 74 69 6d 61  his is an estima
18f30 74 65 20 6f 66 20 68 6f 77 20 6d 61 6e 79 20 73  te of how many s
18f40 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20 0a  eek operations .
18f50 20 20 20 20 2a 2a 20 20 20 20 53 51 4c 69 74 65      **    SQLite
18f60 20 6d 75 73 74 20 70 65 72 66 6f 72 6d 20 6f 6e   must perform on
18f70 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 71 75   the index in qu
18f80 65 73 74 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d  estion. For exam
18f90 70 6c 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20  ple, if the .   
18fa0 20 2a 2a 20 20 20 20 57 48 45 52 45 20 63 6c 61   **    WHERE cla
18fb0 75 73 65 20 69 73 3a 0a 20 20 20 20 2a 2a 0a 20  use is:.    **. 
18fc0 20 20 20 2a 2a 20 20 20 20 20 20 57 48 45 52 45     **      WHERE
18fd0 20 61 20 49 4e 20 28 31 2c 20 32 2c 20 33 29 20   a IN (1, 2, 3) 
18fe0 41 4e 44 20 62 20 49 4e 20 28 34 2c 20 35 2c 20  AND b IN (4, 5, 
18ff0 36 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  6).    **.    **
19000 20 20 20 20 53 51 4c 69 74 65 20 6d 75 73 74 20      SQLite must 
19010 70 65 72 66 6f 72 6d 20 39 20 6c 6f 6f 6b 75 70  perform 9 lookup
19020 73 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 6f 6e  s on an index on
19030 20 28 61 2c 20 62 29 2c 20 73 6f 20 6e 49 6e 4d   (a, b), so nInM
19040 75 6c 20 69 73 20 0a 20 20 20 20 2a 2a 20 20 20  ul is .    **   
19050 20 73 65 74 20 74 6f 20 39 2e 20 47 69 76 65 6e   set to 9. Given
19060 20 74 68 65 20 73 61 6d 65 20 73 63 68 65 6d 61   the same schema
19070 20 61 6e 64 20 65 69 74 68 65 72 20 6f 66 20 74   and either of t
19080 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 57 48 45  he following WHE
19090 52 45 20 0a 20 20 20 20 2a 2a 20 20 20 20 63 6c  RE .    **    cl
190a0 61 75 73 65 73 3a 0a 20 20 20 20 2a 2a 0a 20 20  auses:.    **.  
190b0 20 20 2a 2a 20 20 20 20 20 20 57 48 45 52 45 20    **      WHERE 
190c0 61 20 3d 20 20 31 0a 20 20 20 20 2a 2a 20 20 20  a =  1.    **   
190d0 20 20 20 57 48 45 52 45 20 61 20 3e 3d 20 32 0a     WHERE a >= 2.
190e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
190f0 20 6e 49 6e 4d 75 6c 20 69 73 20 73 65 74 20 74   nInMul is set t
19100 6f 20 31 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  o 1..    **.    
19110 2a 2a 20 20 20 20 49 66 20 74 68 65 72 65 20 65  **    If there e
19120 78 69 73 74 73 20 61 20 57 48 45 52 45 20 74 65  xists a WHERE te
19130 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rm of the form "
19140 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  x IN (SELECT ...
19150 29 22 2c 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a  )", then .    **
19160 20 20 20 20 74 68 65 20 73 75 62 2d 73 65 6c 65      the sub-sele
19170 63 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  ct is assumed to
19180 20 72 65 74 75 72 6e 20 32 35 20 72 6f 77 73 20   return 25 rows 
19190 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  for the purposes
191a0 20 6f 66 20 0a 20 20 20 20 2a 2a 20 20 20 20 64   of .    **    d
191b0 65 74 65 72 6d 69 6e 69 6e 67 20 6e 49 6e 4d 75  etermining nInMu
191c0 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  l..    **.    **
191d0 20 20 62 49 6e 45 73 74 3a 20 20 0a 20 20 20 20    bInEst:  .    
191e0 2a 2a 20 20 20 20 53 65 74 20 74 6f 20 74 72 75  **    Set to tru
191f0 65 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61  e if there was a
19200 74 20 6c 65 61 73 74 20 6f 6e 65 20 22 78 20 49  t least one "x I
19210 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
19220 74 65 72 6d 20 75 73 65 64 20 0a 20 20 20 20 2a  term used .    *
19230 2a 20 20 20 20 69 6e 20 64 65 74 65 72 6d 69 6e  *    in determin
19240 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ing the value of
19250 20 6e 49 6e 4d 75 6c 2e 0a 20 20 20 20 2a 2a 0a   nInMul..    **.
19260 20 20 20 20 2a 2a 20 20 65 73 74 42 6f 75 6e 64      **  estBound
19270 3a 0a 20 20 20 20 2a 2a 20 20 20 20 41 6e 20 65  :.    **    An e
19280 73 74 69 6d 61 74 65 20 6f 6e 20 74 68 65 20 61  stimate on the a
19290 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 74 61 62  mount of the tab
192a0 6c 65 20 74 68 61 74 20 6d 75 73 74 20 62 65 20  le that must be 
192b0 73 65 61 72 63 68 65 64 2e 20 20 41 0a 20 20 20  searched.  A.   
192c0 20 2a 2a 20 20 20 20 76 61 6c 75 65 20 6f 66 20   **    value of 
192d0 31 30 30 20 6d 65 61 6e 73 20 74 68 65 20 65 6e  100 means the en
192e0 74 69 72 65 20 74 61 62 6c 65 20 69 73 20 73 65  tire table is se
192f0 61 72 63 68 65 64 2e 20 20 52 61 6e 67 65 20 63  arched.  Range c
19300 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 20 20 2a  onstraints.    *
19310 2a 20 20 20 20 6d 69 67 68 74 20 72 65 64 75 63  *    might reduc
19320 65 20 74 68 69 73 20 74 6f 20 61 20 76 61 6c 75  e this to a valu
19330 65 20 6c 65 73 73 20 74 68 61 6e 20 31 30 30 20  e less than 100 
19340 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
19350 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20 20   only.    **    
19360 61 20 66 72 61 63 74 69 6f 6e 20 6f 66 20 74 68  a fraction of th
19370 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20 73 65  e table needs se
19380 61 72 63 68 69 6e 67 2e 20 20 49 6e 20 74 68 65  arching.  In the
19390 20 61 62 73 65 6e 63 65 20 6f 66 0a 20 20 20 20   absence of.    
193a0 2a 2a 20 20 20 20 73 71 6c 69 74 65 5f 73 74 61  **    sqlite_sta
193b0 74 32 20 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c  t2 ANALYZE data,
193c0 20 61 20 73 69 6e 67 6c 65 20 69 6e 65 71 75 61   a single inequa
193d0 6c 69 74 79 20 72 65 64 75 63 65 73 20 74 68 65  lity reduces the
193e0 20 73 65 61 72 63 68 0a 20 20 20 20 2a 2a 20 20   search.    **  
193f0 20 20 73 70 61 63 65 20 74 6f 20 31 2f 33 72 64    space to 1/3rd
19400 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69   its original si
19410 7a 65 2e 20 20 53 6f 20 61 6e 20 78 3e 3f 20 63  ze.  So an x>? c
19420 6f 6e 73 74 72 61 69 6e 74 20 72 65 64 75 63 65  onstraint reduce
19430 73 0a 20 20 20 20 2a 2a 20 20 20 20 65 73 74 42  s.    **    estB
19440 6f 75 6e 64 20 74 6f 20 33 33 2e 20 20 54 77 6f  ound to 33.  Two
19450 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 78 3e   constraints (x>
19460 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65 64 75 63  ? AND x<?) reduc
19470 65 20 65 73 74 42 6f 75 6e 64 20 74 6f 20 31 31  e estBound to 11
19480 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
19490 20 62 53 6f 72 74 3a 20 20 20 0a 20 20 20 20 2a   bSort:   .    *
194a0 2a 20 20 20 20 42 6f 6f 6c 65 61 6e 2e 20 54 72  *    Boolean. Tr
194b0 75 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ue if there is a
194c0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
194d0 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 71 75  e that will requ
194e0 69 72 65 20 61 6e 20 0a 20 20 20 20 2a 2a 20 20  ire an .    **  
194f0 20 20 65 78 74 65 72 6e 61 6c 20 73 6f 72 74 20    external sort 
19500 28 69 2e 65 2e 20 73 63 61 6e 6e 69 6e 67 20 74  (i.e. scanning t
19510 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 65  he index being e
19520 76 61 6c 75 61 74 65 64 20 77 69 6c 6c 20 6e 6f  valuated will no
19530 74 20 0a 20 20 20 20 2a 2a 20 20 20 20 63 6f 72  t .    **    cor
19540 72 65 63 74 6c 79 20 6f 72 64 65 72 20 72 65 63  rectly order rec
19550 6f 72 64 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ords)..    **.  
19560 20 20 2a 2a 20 20 62 4c 6f 6f 6b 75 70 3a 20 0a    **  bLookup: .
19570 20 20 20 20 2a 2a 20 20 20 20 42 6f 6f 6c 65 61      **    Boolea
19580 6e 2e 20 54 72 75 65 20 69 66 20 66 6f 72 20 65  n. True if for e
19590 61 63 68 20 69 6e 64 65 78 20 65 6e 74 72 79 20  ach index entry 
195a0 76 69 73 69 74 65 64 20 61 20 6c 6f 6f 6b 75 70  visited a lookup
195b0 20 6f 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   on the .    ** 
195c0 20 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67     corresponding
195d0 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 69 73   table b-tree is
195e0 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20   required. This 
195f0 69 73 20 61 6c 77 61 79 73 20 66 61 6c 73 65 20  is always false 
19600 0a 20 20 20 20 2a 2a 20 20 20 20 66 6f 72 20 74  .    **    for t
19610 68 65 20 72 6f 77 69 64 20 69 6e 64 65 78 2e 20  he rowid index. 
19620 46 6f 72 20 6f 74 68 65 72 20 69 6e 64 65 78 65  For other indexe
19630 73 2c 20 69 74 20 69 73 20 74 72 75 65 20 75 6e  s, it is true un
19640 6c 65 73 73 20 61 6c 6c 20 74 68 65 20 0a 20 20  less all the .  
19650 20 20 2a 2a 20 20 20 20 63 6f 6c 75 6d 6e 73 20    **    columns 
19660 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75 73 65  of the table use
19670 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20  d by the SELECT 
19680 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 70 72  statement are pr
19690 65 73 65 6e 74 20 69 6e 20 0a 20 20 20 20 2a 2a  esent in .    **
196a0 20 20 20 20 74 68 65 20 69 6e 64 65 78 20 28 73      the index (s
196b0 75 63 68 20 61 6e 20 69 6e 64 65 78 20 69 73 20  uch an index is 
196c0 73 6f 6d 65 74 69 6d 65 73 20 64 65 73 63 72 69  sometimes descri
196d0 62 65 64 20 61 73 20 61 20 63 6f 76 65 72 69 6e  bed as a coverin
196e0 67 20 69 6e 64 65 78 29 2e 0a 20 20 20 20 2a 2a  g index)..    **
196f0 20 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c      For example,
19700 20 67 69 76 65 6e 20 74 68 65 20 69 6e 64 65 78   given the index
19710 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68 65 20   on (a, b), the 
19720 73 65 63 6f 6e 64 20 6f 66 20 74 68 65 20 66 6f  second of the fo
19730 6c 6c 6f 77 69 6e 67 20 0a 20 20 20 20 2a 2a 20  llowing .    ** 
19740 20 20 20 74 77 6f 20 71 75 65 72 69 65 73 20 72     two queries r
19750 65 71 75 69 72 65 73 20 74 61 62 6c 65 20 62 2d  equires table b-
19760 74 72 65 65 20 6c 6f 6f 6b 75 70 73 2c 20 62 75  tree lookups, bu
19770 74 20 74 68 65 20 66 69 72 73 74 20 64 6f 65 73  t the first does
19780 20 6e 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20   not..    **.   
19790 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
197a0 53 45 4c 45 43 54 20 61 2c 20 62 20 20 20 20 46  SELECT a, b    F
197b0 52 4f 4d 20 74 62 6c 20 57 48 45 52 45 20 61 20  ROM tbl WHERE a 
197c0 3d 20 31 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20  = 1;.    **     
197d0 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61          SELECT a
197e0 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74 62 6c 20  , b, c FROM tbl 
197f0 57 48 45 52 45 20 61 20 3d 20 31 3b 0a 20 20 20  WHERE a = 1;.   
19800 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 71 3b   */.    int nEq;
19810 0a 20 20 20 20 69 6e 74 20 62 49 6e 45 73 74 20  .    int bInEst 
19820 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 49 6e  = 0;.    int nIn
19830 4d 75 6c 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74  Mul = 1;.    int
19840 20 65 73 74 42 6f 75 6e 64 20 3d 20 31 30 30 3b   estBound = 100;
19850 0a 20 20 20 20 69 6e 74 20 6e 42 6f 75 6e 64 20  .    int nBound 
19860 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
19870 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
19880 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
19890 73 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 69 6e  s seen */.    in
198a0 74 20 62 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20  t bSort = 0;.   
198b0 20 69 6e 74 20 62 4c 6f 6f 6b 75 70 20 3d 20 30   int bLookup = 0
198c0 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
198d0 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
198e0 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
198f0 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
19900 45 20 63 6c 61 75 73 65 20 2a 2f 0a 23 69 66 64  E clause */.#ifd
19910 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
19920 5f 53 54 41 54 32 0a 20 20 20 20 57 68 65 72 65  _STAT2.    Where
19930 54 65 72 6d 20 2a 70 46 69 72 73 74 54 65 72 6d  Term *pFirstTerm
19940 20 3d 20 30 3b 20 20 20 20 2f 2a 20 46 69 72 73   = 0;    /* Firs
19950 74 20 74 65 72 6d 20 6d 61 74 63 68 69 6e 67 20  t term matching 
19960 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 23 65 6e  the index */.#en
19970 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 74 65  dif..    /* Dete
19980 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65 73  rmine the values
19990 20 6f 66 20 6e 45 71 20 61 6e 64 20 6e 49 6e 4d   of nEq and nInM
199a0 75 6c 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6e 45  ul */.    for(nE
199b0 71 3d 30 3b 20 6e 45 71 3c 70 50 72 6f 62 65 2d  q=0; nEq<pProbe-
199c0 3e 6e 43 6f 6c 75 6d 6e 3b 20 6e 45 71 2b 2b 29  >nColumn; nEq++)
199d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20  {.      int j = 
199e0 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e  pProbe->aiColumn
199f0 5b 6e 45 71 5d 3b 0a 20 20 20 20 20 20 70 54 65  [nEq];.      pTe
19a00 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  rm = findTerm(pW
19a10 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52  C, iCur, j, notR
19a20 65 61 64 79 2c 20 65 71 54 65 72 6d 4d 61 73 6b  eady, eqTermMask
19a30 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 69  , pIdx);.      i
19a40 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72  f( pTerm==0 ) br
19a50 65 61 6b 3b 0a 20 20 20 20 20 20 77 73 46 6c 61  eak;.      wsFla
19a60 67 73 20 7c 3d 20 28 57 48 45 52 45 5f 43 4f 4c  gs |= (WHERE_COL
19a70 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57  UMN_EQ|WHERE_ROW
19a80 49 44 5f 45 51 29 3b 0a 20 20 20 20 20 20 69 66  ID_EQ);.      if
19a90 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
19aa0 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20  or & WO_IN ){.  
19ab0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
19ac0 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
19ad0 3b 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61 67  ;.        wsFlag
19ae0 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
19af0 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 20 20 69 66  N_IN;.        if
19b00 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
19b10 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
19b20 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
19b30 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 53 45      /* "x IN (SE
19b40 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 41 73 73  LECT ...)":  Ass
19b50 75 6d 65 20 74 68 65 20 53 45 4c 45 43 54 20 72  ume the SELECT r
19b60 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a  eturns 25 rows *
19b70 2f 0a 20 20 20 20 20 20 20 20 20 20 6e 49 6e 4d  /.          nInM
19b80 75 6c 20 2a 3d 20 32 35 3b 0a 20 20 20 20 20 20  ul *= 25;.      
19b90 20 20 20 20 62 49 6e 45 73 74 20 3d 20 31 3b 0a      bInEst = 1;.
19ba0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
19bb0 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e  ( ALWAYS(pExpr->
19bc0 78 2e 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20  x.pList) ){.    
19bd0 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28        /* "x IN (
19be0 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e  value, value, ..
19bf0 2e 29 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  .)" */.         
19c00 20 6e 49 6e 4d 75 6c 20 2a 3d 20 70 45 78 70 72   nInMul *= pExpr
19c10 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
19c20 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   + 1;.        }.
19c30 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
19c40 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
19c50 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a   & WO_ISNULL ){.
19c60 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20          wsFlags 
19c70 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
19c80 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 23 69  NULL;.      }.#i
19c90 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
19ca0 4c 45 5f 53 54 41 54 32 0a 20 20 20 20 20 20 69  LE_STAT2.      i
19cb0 66 28 20 6e 45 71 3d 3d 30 20 26 26 20 70 50 72  f( nEq==0 && pPr
19cc0 6f 62 65 2d 3e 61 53 61 6d 70 6c 65 20 29 20 70  obe->aSample ) p
19cd0 46 69 72 73 74 54 65 72 6d 20 3d 20 70 54 65 72  FirstTerm = pTer
19ce0 6d 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  m;.#endif.      
19cf0 75 73 65 64 20 7c 3d 20 70 54 65 72 6d 2d 3e 70  used |= pTerm->p
19d00 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20  rereqRight;.    
19d10 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 74 65 72 6d  }..    /* Determ
19d20 69 6e 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ine the value of
19d30 20 65 73 74 42 6f 75 6e 64 2e 20 2a 2f 0a 20 20   estBound. */.  
19d40 20 20 69 66 28 20 6e 45 71 3c 70 50 72 6f 62 65    if( nEq<pProbe
19d50 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->nColumn ){.   
19d60 20 20 20 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62     int j = pProb
19d70 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d  e->aiColumn[nEq]
19d80 3b 0a 20 20 20 20 20 20 69 66 28 20 66 69 6e 64  ;.      if( find
19d90 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
19da0 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  j, notReady, WO_
19db0 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57  LT|WO_LE|WO_GT|W
19dc0 4f 5f 47 45 2c 20 70 49 64 78 29 20 29 7b 0a 20  O_GE, pIdx) ){. 
19dd0 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d         WhereTerm
19de0 20 2a 70 54 6f 70 20 3d 20 66 69 6e 64 54 65 72   *pTop = findTer
19df0 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20  m(pWC, iCur, j, 
19e00 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c  notReady, WO_LT|
19e10 57 4f 5f 4c 45 2c 20 70 49 64 78 29 3b 0a 20 20  WO_LE, pIdx);.  
19e20 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
19e30 2a 70 42 74 6d 20 3d 20 66 69 6e 64 54 65 72 6d  *pBtm = findTerm
19e40 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e  (pWC, iCur, j, n
19e50 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57  otReady, WO_GT|W
19e60 4f 5f 47 45 2c 20 70 49 64 78 29 3b 0a 20 20 20  O_GE, pIdx);.   
19e70 20 20 20 20 20 77 68 65 72 65 52 61 6e 67 65 53       whereRangeS
19e80 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
19e90 50 72 6f 62 65 2c 20 6e 45 71 2c 20 70 42 74 6d  Probe, nEq, pBtm
19ea0 2c 20 70 54 6f 70 2c 20 26 65 73 74 42 6f 75 6e  , pTop, &estBoun
19eb0 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  d);.        if( 
19ec0 70 54 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  pTop ){.        
19ed0 20 20 6e 42 6f 75 6e 64 20 3d 20 31 3b 0a 20 20    nBound = 1;.  
19ee0 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20          wsFlags 
19ef0 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  |= WHERE_TOP_LIM
19f00 49 54 3b 0a 20 20 20 20 20 20 20 20 20 20 75 73  IT;.          us
19f10 65 64 20 7c 3d 20 70 54 6f 70 2d 3e 70 72 65 72  ed |= pTop->prer
19f20 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  eqRight;.       
19f30 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
19f40 42 74 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Btm ){.         
19f50 20 6e 42 6f 75 6e 64 2b 2b 3b 0a 20 20 20 20 20   nBound++;.     
19f60 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20       wsFlags |= 
19f70 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b  WHERE_BTM_LIMIT;
19f80 0a 20 20 20 20 20 20 20 20 20 20 75 73 65 64 20  .          used 
19f90 7c 3d 20 70 42 74 6d 2d 3e 70 72 65 72 65 71 52  |= pBtm->prereqR
19fa0 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ight;.        }.
19fb0 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20          wsFlags 
19fc0 7c 3d 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  |= (WHERE_COLUMN
19fd0 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 52 4f 57  _RANGE|WHERE_ROW
19fe0 49 44 5f 52 41 4e 47 45 29 3b 0a 20 20 20 20 20  ID_RANGE);.     
19ff0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
1a000 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72   pProbe->onError
1a010 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20  !=OE_None ){.   
1a020 20 20 20 74 65 73 74 63 61 73 65 28 20 77 73 46     testcase( wsF
1a030 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
1a040 55 4d 4e 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20  UMN_IN );.      
1a050 74 65 73 74 63 61 73 65 28 20 77 73 46 6c 61 67  testcase( wsFlag
1a060 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
1a070 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 69  _NULL );.      i
1a080 66 28 20 28 77 73 46 6c 61 67 73 20 26 20 28 57  f( (wsFlags & (W
1a090 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57  HERE_COLUMN_IN|W
1a0a0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c  HERE_COLUMN_NULL
1a0b0 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))==0 ){.       
1a0c0 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52   wsFlags |= WHER
1a0d0 45 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 20 20  E_UNIQUE;.      
1a0e0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1a0f0 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
1a100 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
1a110 6e 64 20 74 68 65 20 69 6e 64 65 78 20 62 65 69  nd the index bei
1a120 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 77 69  ng considered wi
1a130 6c 6c 0a 20 20 20 20 2a 2a 20 6e 61 74 75 72 61  ll.    ** natura
1a140 6c 6c 79 20 73 63 61 6e 20 72 6f 77 73 20 69 6e  lly scan rows in
1a150 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6f 72   the required or
1a160 64 65 72 2c 20 73 65 74 20 74 68 65 20 61 70 70  der, set the app
1a170 72 6f 70 72 69 61 74 65 20 66 6c 61 67 73 0a 20  ropriate flags. 
1a180 20 20 20 2a 2a 20 69 6e 20 77 73 46 6c 61 67 73     ** in wsFlags
1a190 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
1a1a0 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
1a1b0 52 20 42 59 20 63 6c 61 75 73 65 20 62 75 74 20  R BY clause but 
1a1c0 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a  the index.    **
1a1d0 20 77 69 6c 6c 20 73 63 61 6e 20 72 6f 77 73 20   will scan rows 
1a1e0 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f  in a different o
1a1f0 72 64 65 72 2c 20 73 65 74 20 74 68 65 20 62 53  rder, set the bS
1a200 6f 72 74 20 76 61 72 69 61 62 6c 65 2e 20 20 2a  ort variable.  *
1a210 2f 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  /.    if( pOrder
1a220 42 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  By ){.      if( 
1a230 28 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  (wsFlags & (WHER
1a240 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52  E_COLUMN_IN|WHER
1a250 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 29 3d  E_COLUMN_NULL))=
1a260 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 69 73  =0.        && is
1a270 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 70 50 61  SortingIndex(pPa
1a280 72 73 65 2c 70 57 43 2d 3e 70 4d 61 73 6b 53 65  rse,pWC->pMaskSe
1a290 74 2c 70 50 72 6f 62 65 2c 69 43 75 72 2c 70 4f  t,pProbe,iCur,pO
1a2a0 72 64 65 72 42 79 2c 6e 45 71 2c 26 72 65 76 29  rderBy,nEq,&rev)
1a2b0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
1a2c0 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45    wsFlags |= WHE
1a2d0 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 7c 57  RE_ROWID_RANGE|W
1a2e0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
1a2f0 45 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59 3b  E|WHERE_ORDERBY;
1a300 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73  .        wsFlags
1a310 20 7c 3d 20 28 72 65 76 20 3f 20 57 48 45 52 45   |= (rev ? WHERE
1a320 5f 52 45 56 45 52 53 45 20 3a 20 30 29 3b 0a 20  _REVERSE : 0);. 
1a330 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1a340 20 20 20 20 62 53 6f 72 74 20 3d 20 31 3b 0a 20      bSort = 1;. 
1a350 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1a360 20 20 2f 2a 20 49 66 20 63 75 72 72 65 6e 74 6c    /* If currentl
1a370 79 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 74 68  y calculating th
1a380 65 20 63 6f 73 74 20 6f 66 20 75 73 69 6e 67 20  e cost of using 
1a390 61 6e 20 69 6e 64 65 78 20 28 6e 6f 74 20 74 68  an index (not th
1a3a0 65 20 49 50 4b 0a 20 20 20 20 2a 2a 20 69 6e 64  e IPK.    ** ind
1a3b0 65 78 29 2c 20 64 65 74 65 72 6d 69 6e 65 20 69  ex), determine i
1a3c0 66 20 61 6c 6c 20 72 65 71 75 69 72 65 64 20 63  f all required c
1a3d0 6f 6c 75 6d 6e 20 64 61 74 61 20 6d 61 79 20 62  olumn data may b
1a3e0 65 20 6f 62 74 61 69 6e 65 64 20 77 69 74 68 6f  e obtained witho
1a3f0 75 74 20 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67  ut .    ** using
1a400 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 20   the main table 
1a410 28 69 2e 65 2e 20 69 66 20 74 68 65 20 69 6e 64  (i.e. if the ind
1a420 65 78 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67  ex is a covering
1a430 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 66 6f  .    ** index fo
1a440 72 20 74 68 69 73 20 71 75 65 72 79 29 2e 20 49  r this query). I
1a450 66 20 69 74 20 69 73 2c 20 73 65 74 20 74 68 65  f it is, set the
1a460 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
1a470 66 6c 61 67 20 69 6e 0a 20 20 20 20 2a 2a 20 77  flag in.    ** w
1a480 73 46 6c 61 67 73 2e 20 4f 74 68 65 72 77 69 73  sFlags. Otherwis
1a490 65 2c 20 73 65 74 20 74 68 65 20 62 4c 6f 6f 6b  e, set the bLook
1a4a0 75 70 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  up variable to t
1a4b0 72 75 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  rue.  */.    if(
1a4c0 20 70 49 64 78 20 26 26 20 77 73 46 6c 61 67 73   pIdx && wsFlags
1a4d0 20 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73   ){.      Bitmas
1a4e0 6b 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55  k m = pSrc->colU
1a4f0 73 65 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  sed;.      int j
1a500 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
1a510 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   j<pIdx->nColumn
1a520 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
1a530 69 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e 61 69  int x = pIdx->ai
1a540 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20  Column[j];.     
1a550 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29     if( x<BMS-1 )
1a560 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 20 26 3d  {.          m &=
1a570 20 7e 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c   ~(((Bitmask)1)<
1a580 3c 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  <x);.        }. 
1a590 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1a5a0 20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   m==0 ){.       
1a5b0 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52   wsFlags |= WHER
1a5c0 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20  E_IDX_ONLY;.    
1a5d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1a5e0 20 62 4c 6f 6f 6b 75 70 20 3d 20 31 3b 0a 20 20   bLookup = 1;.  
1a5f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1a600 20 2f 2a 0a 20 20 20 20 2a 2a 20 45 73 74 69 6d   /*.    ** Estim
1a610 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
1a620 66 20 72 6f 77 73 20 6f 66 20 6f 75 74 70 75 74  f rows of output
1a630 2e 20 20 46 6f 72 20 61 6e 20 22 78 20 49 4e 20  .  For an "x IN 
1a640 28 53 45 4c 45 43 54 2e 2e 2e 29 22 0a 20 20 20  (SELECT...)".   
1a650 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20   ** constraint, 
1a660 64 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 65  do not let the e
1a670 73 74 69 6d 61 74 65 20 65 78 63 65 65 64 20 68  stimate exceed h
1a680 61 6c 66 20 74 68 65 20 72 6f 77 73 20 69 6e 20  alf the rows in 
1a690 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  the table..    *
1a6a0 2f 0a 20 20 20 20 6e 52 6f 77 20 3d 20 28 64 6f  /.    nRow = (do
1a6b0 75 62 6c 65 29 28 61 69 52 6f 77 45 73 74 5b 6e  uble)(aiRowEst[n
1a6c0 45 71 5d 20 2a 20 6e 49 6e 4d 75 6c 29 3b 0a 20  Eq] * nInMul);. 
1a6d0 20 20 20 69 66 28 20 62 49 6e 45 73 74 20 26 26     if( bInEst &&
1a6e0 20 6e 52 6f 77 2a 32 3e 61 69 52 6f 77 45 73 74   nRow*2>aiRowEst
1a6f0 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 6e 52 6f  [0] ){.      nRo
1a700 77 20 3d 20 61 69 52 6f 77 45 73 74 5b 30 5d 2f  w = aiRowEst[0]/
1a710 32 3b 0a 20 20 20 20 20 20 6e 49 6e 4d 75 6c 20  2;.      nInMul 
1a720 3d 20 28 69 6e 74 29 28 6e 52 6f 77 20 2f 20 61  = (int)(nRow / a
1a730 69 52 6f 77 45 73 74 5b 6e 45 71 5d 29 3b 0a 20  iRowEst[nEq]);. 
1a740 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
1a750 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32  ITE_ENABLE_STAT2
1a760 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
1a770 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6f 66 20  onstraint is of 
1a780 74 68 65 20 66 6f 72 6d 20 78 3d 56 41 4c 55 45  the form x=VALUE
1a790 20 61 6e 64 20 68 69 73 74 6f 67 72 61 6d 0a 20   and histogram. 
1a7a0 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 61 76     ** data is av
1a7b0 61 69 6c 61 62 6c 65 20 66 6f 72 20 63 6f 6c 75  ailable for colu
1a7c0 6d 6e 20 78 2c 20 74 68 65 6e 20 69 74 20 6d 69  mn x, then it mi
1a7d0 67 68 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a  ght be possible.
1a7e0 20 20 20 20 2a 2a 20 74 6f 20 67 65 74 20 61 20      ** to get a 
1a7f0 62 65 74 74 65 72 20 65 73 74 69 6d 61 74 65 20  better estimate 
1a800 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  on the number of
1a810 20 72 6f 77 73 20 62 61 73 65 64 20 6f 6e 0a 20   rows based on. 
1a820 20 20 20 2a 2a 20 56 41 4c 55 45 20 61 6e 64 20     ** VALUE and 
1a830 68 6f 77 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20  how common that 
1a840 76 61 6c 75 65 20 69 73 20 61 63 63 6f 72 64 69  value is accordi
1a850 6e 67 20 74 6f 20 74 68 65 20 68 69 73 74 6f 67  ng to the histog
1a860 72 61 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ram..    */.    
1a870 69 66 28 20 6e 52 6f 77 3e 28 64 6f 75 62 6c 65  if( nRow>(double
1a880 29 31 20 26 26 20 6e 45 71 3d 3d 31 20 26 26 20  )1 && nEq==1 && 
1a890 70 46 69 72 73 74 54 65 72 6d 21 3d 30 20 29 7b  pFirstTerm!=0 ){
1a8a0 0a 20 20 20 20 20 20 69 66 28 20 70 46 69 72 73  .      if( pFirs
1a8b0 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  tTerm->eOperator
1a8c0 3d 3d 57 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20  ==WO_EQ ){.     
1a8d0 20 20 20 77 68 65 72 65 45 71 75 61 6c 53 63 61     whereEqualSca
1a8e0 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 50 72  nEst(pParse, pPr
1a8f0 6f 62 65 2c 20 70 46 69 72 73 74 54 65 72 6d 2d  obe, pFirstTerm-
1a900 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  >pExpr->pRight, 
1a910 26 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 7d 65  &nRow);.      }e
1a920 6c 73 65 20 69 66 28 20 70 46 69 72 73 74 54 65  lse if( pFirstTe
1a930 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
1a940 4f 5f 49 4e 20 26 26 20 62 49 6e 45 73 74 3d 3d  O_IN && bInEst==
1a950 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 65  0 ){.        whe
1a960 72 65 49 6e 53 63 61 6e 45 73 74 28 70 50 61 72  reInScanEst(pPar
1a970 73 65 2c 20 70 50 72 6f 62 65 2c 20 70 46 69 72  se, pProbe, pFir
1a980 73 74 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 78  stTerm->pExpr->x
1a990 2e 70 4c 69 73 74 2c 20 26 6e 52 6f 77 29 3b 0a  .pList, &nRow);.
1a9a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
1a9b0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
1a9c0 4e 41 42 4c 45 5f 53 54 41 54 32 20 2a 2f 0a 0a  NABLE_STAT2 */..
1a9d0 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 20 63 6f      /* Assume co
1a9e0 6e 73 74 61 6e 74 20 63 6f 73 74 20 74 6f 20 61  nstant cost to a
1a9f0 63 63 65 73 73 20 61 20 72 6f 77 20 61 6e 64 20  ccess a row and 
1aa00 6c 6f 67 61 72 69 74 68 6d 69 63 20 63 6f 73 74  logarithmic cost
1aa10 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 61 20   to.    ** do a 
1aa20 62 69 6e 61 72 79 20 73 65 61 72 63 68 2e 20 20  binary search.  
1aa30 48 65 6e 63 65 2c 20 74 68 65 20 69 6e 69 74 69  Hence, the initi
1aa40 61 6c 20 63 6f 73 74 20 69 73 20 74 68 65 20 6e  al cost is the n
1aa50 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 0a  umber of output.
1aa60 20 20 20 20 2a 2a 20 72 6f 77 73 20 70 6c 75 73      ** rows plus
1aa70 20 6c 6f 67 32 28 74 61 62 6c 65 2d 73 69 7a 65   log2(table-size
1aa80 29 20 74 69 6d 65 73 20 74 68 65 20 6e 75 6d 62  ) times the numb
1aa90 65 72 20 6f 66 20 62 69 6e 61 72 79 20 73 65 61  er of binary sea
1aaa0 72 63 68 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  rches..    */.  
1aab0 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2b 20    cost = nRow + 
1aac0 6e 49 6e 4d 75 6c 2a 65 73 74 4c 6f 67 28 61 69  nInMul*estLog(ai
1aad0 52 6f 77 45 73 74 5b 30 5d 29 3b 0a 0a 20 20 20  RowEst[0]);..   
1aae0 20 2f 2a 20 41 64 6a 75 73 74 20 74 68 65 20 6e   /* Adjust the n
1aaf0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 61 6e  umber of rows an
1ab00 64 20 74 68 65 20 63 6f 73 74 20 64 6f 77 6e 77  d the cost downw
1ab10 61 72 64 20 74 6f 20 72 65 66 6c 65 63 74 20 72  ard to reflect r
1ab20 6f 77 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ows.    ** that 
1ab30 61 72 65 20 65 78 63 6c 75 64 65 64 20 62 79 20  are excluded by 
1ab40 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
1ab50 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 52  s..    */.    nR
1ab60 6f 77 20 3d 20 28 6e 52 6f 77 20 2a 20 28 64 6f  ow = (nRow * (do
1ab70 75 62 6c 65 29 65 73 74 42 6f 75 6e 64 29 20 2f  uble)estBound) /
1ab80 20 28 64 6f 75 62 6c 65 29 31 30 30 3b 0a 20 20   (double)100;.  
1ab90 20 20 63 6f 73 74 20 3d 20 28 63 6f 73 74 20 2a    cost = (cost *
1aba0 20 28 64 6f 75 62 6c 65 29 65 73 74 42 6f 75 6e   (double)estBoun
1abb0 64 29 20 2f 20 28 64 6f 75 62 6c 65 29 31 30 30  d) / (double)100
1abc0 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 69 6e  ;..    /* Add in
1abd0 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 63   the estimated c
1abe0 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 74  ost of sorting t
1abf0 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2f  he result.    */
1ac00 0a 20 20 20 20 69 66 28 20 62 53 6f 72 74 20 29  .    if( bSort )
1ac10 7b 0a 20 20 20 20 20 20 63 6f 73 74 20 2b 3d 20  {.      cost += 
1ac20 63 6f 73 74 2a 65 73 74 4c 6f 67 28 63 6f 73 74  cost*estLog(cost
1ac30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
1ac40 20 49 66 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74   If all informat
1ac50 69 6f 6e 20 63 61 6e 20 62 65 20 74 61 6b 65 6e  ion can be taken
1ac60 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74   directly from t
1ac70 68 65 20 69 6e 64 65 78 2c 20 77 65 20 61 76 6f  he index, we avo
1ac80 69 64 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20  id.    ** doing 
1ac90 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 73 2e 20 20  table lookups.  
1aca0 54 68 69 73 20 72 65 64 75 63 65 73 20 74 68 65  This reduces the
1acb0 20 63 6f 73 74 20 62 79 20 68 61 6c 66 2e 20 20   cost by half.  
1acc0 28 4e 6f 74 20 72 65 61 6c 6c 79 20 2d 0a 20 20  (Not really -.  
1acd0 20 20 2a 2a 20 74 68 69 73 20 6e 65 65 64 73 20    ** this needs 
1ace0 74 6f 20 62 65 20 66 69 78 65 64 2e 29 0a 20 20  to be fixed.).  
1acf0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 64    */.    if( pId
1ad00 78 20 26 26 20 62 4c 6f 6f 6b 75 70 3d 3d 30 20  x && bLookup==0 
1ad10 29 7b 0a 20 20 20 20 20 20 63 6f 73 74 20 2f 3d  ){.      cost /=
1ad20 20 28 64 6f 75 62 6c 65 29 32 3b 0a 20 20 20 20   (double)2;.    
1ad30 7d 0a 20 20 20 20 2f 2a 2a 2a 2a 20 43 6f 73 74  }.    /**** Cost
1ad40 20 6f 66 20 75 73 69 6e 67 20 74 68 69 73 20 69   of using this i
1ad50 6e 64 65 78 20 68 61 73 20 6e 6f 77 20 62 65 65  ndex has now bee
1ad60 6e 20 63 6f 6d 70 75 74 65 64 20 2a 2a 2a 2a 2f  n computed ****/
1ad70 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
1ad80 65 20 61 72 65 20 61 64 64 69 74 69 6f 6e 61 6c  e are additional
1ad90 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20   constraints on 
1ada0 74 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20  this table that 
1adb0 63 61 6e 6e 6f 74 0a 20 20 20 20 2a 2a 20 62 65  cannot.    ** be
1adc0 20 75 73 65 64 20 77 69 74 68 20 74 68 65 20 63   used with the c
1add0 75 72 72 65 6e 74 20 69 6e 64 65 78 2c 20 62 75  urrent index, bu
1ade0 74 20 77 68 69 63 68 20 6d 69 67 68 74 20 6c 6f  t which might lo
1adf0 77 65 72 20 74 68 65 20 6e 75 6d 62 65 72 0a 20  wer the number. 
1ae00 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 20     ** of output 
1ae10 72 6f 77 73 2c 20 61 64 6a 75 73 74 20 74 68 65  rows, adjust the
1ae20 20 6e 52 6f 77 20 76 61 6c 75 65 20 61 63 63 6f   nRow value acco
1ae30 72 64 69 6e 67 6c 79 2e 20 20 54 68 69 73 20 6f  rdingly.  This o
1ae40 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 6d 61 74 74  nly .    ** matt
1ae50 65 72 73 20 69 66 20 74 68 65 20 63 75 72 72 65  ers if the curre
1ae60 6e 74 20 69 6e 64 65 78 20 69 73 20 74 68 65 20  nt index is the 
1ae70 6c 65 61 73 74 20 63 6f 73 74 6c 79 2c 20 73 6f  least costly, so
1ae80 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 0a 20   do not bother. 
1ae90 20 20 20 2a 2a 20 77 69 74 68 20 74 68 69 73 20     ** with this 
1aea0 73 74 65 70 20 69 66 20 77 65 20 61 6c 72 65 61  step if we alrea
1aeb0 64 79 20 6b 6e 6f 77 20 74 68 69 73 20 69 6e 64  dy know this ind
1aec0 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  ex will not be c
1aed0 68 6f 73 65 6e 2e 0a 20 20 20 20 2a 2a 20 41 6c  hosen..    ** Al
1aee0 73 6f 2c 20 6e 65 76 65 72 20 72 65 64 75 63 65  so, never reduce
1aef0 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f 77 20   the output row 
1af00 63 6f 75 6e 74 20 62 65 6c 6f 77 20 32 20 75 73  count below 2 us
1af10 69 6e 67 20 74 68 69 73 20 73 74 65 70 2e 0a 20  ing this step.. 
1af20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 74 20     **.    ** It 
1af30 69 73 20 63 72 69 74 69 63 61 6c 20 74 68 61 74  is critical that
1af40 20 74 68 65 20 6e 6f 74 56 61 6c 69 64 20 6d 61   the notValid ma
1af50 73 6b 20 62 65 20 75 73 65 64 20 68 65 72 65 20  sk be used here 
1af60 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a  instead of.    *
1af70 2a 20 74 68 65 20 6e 6f 74 52 65 61 64 79 20 6d  * the notReady m
1af80 61 73 6b 2e 20 20 57 68 65 6e 20 63 6f 6d 70 75  ask.  When compu
1af90 74 69 6e 67 20 61 6e 20 22 6f 70 74 69 6d 61 6c  ting an "optimal
1afa0 22 20 69 6e 64 65 78 2c 20 74 68 65 20 6e 6f 74  " index, the not
1afb0 52 65 61 64 79 0a 20 20 20 20 2a 2a 20 6d 61 73  Ready.    ** mas
1afc0 6b 20 77 69 6c 6c 20 6f 6e 6c 79 20 68 61 76 65  k will only have
1afd0 20 6f 6e 65 20 62 69 74 20 73 65 74 20 2d 20 74   one bit set - t
1afe0 68 65 20 62 69 74 20 66 6f 72 20 74 68 65 20 63  he bit for the c
1aff0 75 72 72 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20  urrent table..  
1b000 20 20 2a 2a 20 54 68 65 20 6e 6f 74 56 61 6c 69    ** The notVali
1b010 64 20 6d 61 73 6b 2c 20 6f 6e 20 74 68 65 20 6f  d mask, on the o
1b020 74 68 65 72 20 68 61 6e 64 2c 20 61 6c 77 61 79  ther hand, alway
1b030 73 20 68 61 73 20 61 6c 6c 20 62 69 74 73 20 73  s has all bits s
1b040 65 74 20 66 6f 72 0a 20 20 20 20 2a 2a 20 74 61  et for.    ** ta
1b050 62 6c 65 73 20 74 68 61 74 20 61 72 65 20 6e 6f  bles that are no
1b060 74 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73  t in outer loops
1b070 2e 20 20 49 66 20 6e 6f 74 52 65 61 64 79 20 69  .  If notReady i
1b080 73 20 75 73 65 64 20 68 65 72 65 20 69 6e 73 74  s used here inst
1b090 65 61 64 0a 20 20 20 20 2a 2a 20 6f 66 20 6e 6f  ead.    ** of no
1b0a0 74 56 61 6c 69 64 2c 20 74 68 65 6e 20 61 20 6f  tValid, then a o
1b0b0 70 74 69 6d 61 6c 20 69 6e 64 65 78 20 74 68 61  ptimal index tha
1b0c0 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 69 6e 6e  t depends on inn
1b0d0 65 72 20 6a 6f 69 6e 73 20 6c 6f 6f 70 73 0a 20  er joins loops. 
1b0e0 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 73     ** might be s
1b0f0 65 6c 65 63 74 65 64 20 65 76 65 6e 20 77 68 65  elected even whe
1b100 6e 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61  n there exists a
1b110 6e 20 6f 70 74 69 6d 61 6c 20 69 6e 64 65 78 20  n optimal index 
1b120 74 68 61 74 20 68 61 73 0a 20 20 20 20 2a 2a 20  that has.    ** 
1b130 6e 6f 20 73 75 63 68 20 64 65 70 65 6e 64 65 6e  no such dependen
1b140 63 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  cy..    */.    i
1b150 66 28 20 6e 52 6f 77 3e 32 20 26 26 20 63 6f 73  f( nRow>2 && cos
1b160 74 3c 3d 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20  t<=pCost->rCost 
1b170 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20  ){.      int k; 
1b180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b190 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
1b1a0 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69  unter */.      i
1b1b0 6e 74 20 6e 53 6b 69 70 45 71 20 3d 20 6e 45 71  nt nSkipEq = nEq
1b1c0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
1b1d0 75 6d 62 65 72 20 6f 66 20 3d 3d 20 63 6f 6e 73  umber of == cons
1b1e0 74 72 61 69 6e 74 73 20 74 6f 20 73 6b 69 70 20  traints to skip 
1b1f0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 6b  */.      int nSk
1b200 69 70 52 61 6e 67 65 20 3d 20 6e 42 6f 75 6e 64  ipRange = nBound
1b210 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
1b220 6f 66 20 3c 20 63 6f 6e 73 74 72 61 69 6e 74 73  of < constraints
1b230 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 20 20   to skip */.    
1b240 20 20 42 69 74 6d 61 73 6b 20 74 68 69 73 54 61    Bitmask thisTa
1b250 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b;             /
1b260 2a 20 42 69 74 6d 61 70 20 66 6f 72 20 70 53 72  * Bitmap for pSr
1b270 63 20 2a 2f 0a 0a 20 20 20 20 20 20 74 68 69 73  c */..      this
1b280 54 61 62 20 3d 20 67 65 74 4d 61 73 6b 28 70 57  Tab = getMask(pW
1b290 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 69 43 75  C->pMaskSet, iCu
1b2a0 72 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 54  r);.      for(pT
1b2b0 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6b 3d 70 57  erm=pWC->a, k=pW
1b2c0 43 2d 3e 6e 54 65 72 6d 3b 20 6e 52 6f 77 3e 32  C->nTerm; nRow>2
1b2d0 20 26 26 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72   && k; k--, pTer
1b2e0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
1b2f0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
1b300 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c   & (TERM_VIRTUAL
1b310 7c 54 45 52 4d 5f 4e 4f 48 45 4c 50 29 20 29 20  |TERM_NOHELP) ) 
1b320 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1b330 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
1b340 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 56 61 6c  ereqAll & notVal
1b350 69 64 29 21 3d 74 68 69 73 54 61 62 20 29 20 63  id)!=thisTab ) c
1b360 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1b370 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
1b380 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57  rator & (WO_EQ|W
1b390 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20  O_IN|WO_ISNULL) 
1b3a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1b3b0 20 6e 53 6b 69 70 45 71 20 29 7b 0a 20 20 20 20   nSkipEq ){.    
1b3c0 20 20 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72          /* Ignor
1b3d0 65 20 74 68 65 20 66 69 72 73 74 20 6e 45 71 20  e the first nEq 
1b3e0 65 71 75 61 6c 69 74 79 20 6d 61 74 63 68 65 73  equality matches
1b3f0 20 73 69 6e 63 65 20 74 68 65 20 69 6e 64 65 78   since the index
1b400 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1b410 68 61 73 20 61 6c 72 65 61 64 79 20 61 63 63 6f  has already acco
1b420 75 6e 74 65 64 20 66 6f 72 20 74 68 65 73 65 20  unted for these 
1b430 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  */.            n
1b440 53 6b 69 70 45 71 2d 2d 3b 0a 20 20 20 20 20 20  SkipEq--;.      
1b450 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b460 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
1b470 20 65 61 63 68 20 61 64 64 69 74 69 6f 6e 61 6c   each additional
1b480 20 65 71 75 61 6c 69 74 79 20 6d 61 74 63 68 20   equality match 
1b490 72 65 64 75 63 65 73 20 74 68 65 20 72 65 73 75  reduces the resu
1b4a0 6c 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  lt.            *
1b4b0 2a 20 73 65 74 20 73 69 7a 65 20 62 79 20 61 20  * set size by a 
1b4c0 66 61 63 74 6f 72 20 6f 66 20 31 30 20 2a 2f 0a  factor of 10 */.
1b4d0 20 20 20 20 20 20 20 20 20 20 20 20 6e 52 6f 77              nRow
1b4e0 20 2f 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20   /= 10;.        
1b4f0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
1b500 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70  e if( pTerm->eOp
1b510 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c  erator & (WO_LT|
1b520 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
1b530 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  E) ){.          
1b540 69 66 28 20 6e 53 6b 69 70 52 61 6e 67 65 20 29  if( nSkipRange )
1b550 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
1b560 20 49 67 6e 6f 72 65 20 74 68 65 20 66 69 72 73   Ignore the firs
1b570 74 20 6e 53 6b 69 70 52 61 6e 67 65 20 72 61 6e  t nSkipRange ran
1b580 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 73  ge constraints s
1b590 69 6e 63 65 20 74 68 65 20 69 6e 64 65 78 0a 20  ince the index. 
1b5a0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61             ** ha
1b5b0 73 20 61 6c 72 65 61 64 79 20 61 63 63 6f 75 6e  s already accoun
1b5c0 74 65 64 20 66 6f 72 20 74 68 65 73 65 20 2a 2f  ted for these */
1b5d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 53 6b  .            nSk
1b5e0 69 70 52 61 6e 67 65 2d 2d 3b 0a 20 20 20 20 20  ipRange--;.     
1b5f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1b600 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d          /* Assum
1b610 65 20 65 61 63 68 20 61 64 64 69 74 69 6f 6e 61  e each additiona
1b620 6c 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  l range constrai
1b630 6e 74 20 72 65 64 75 63 65 73 20 74 68 65 20 72  nt reduces the r
1b640 65 73 75 6c 74 0a 20 20 20 20 20 20 20 20 20 20  esult.          
1b650 20 20 2a 2a 20 73 65 74 20 73 69 7a 65 20 62 79    ** set size by
1b660 20 61 20 66 61 63 74 6f 72 20 6f 66 20 33 20 2a   a factor of 3 *
1b670 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 52  /.            nR
1b680 6f 77 20 2f 3d 20 33 3b 0a 20 20 20 20 20 20 20  ow /= 3;.       
1b690 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
1b6a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
1b6b0 20 41 6e 79 20 6f 74 68 65 72 20 65 78 70 72 65   Any other expre
1b6c0 73 73 69 6f 6e 20 6c 6f 77 65 72 73 20 74 68 65  ssion lowers the
1b6d0 20 6f 75 74 70 75 74 20 72 6f 77 20 63 6f 75 6e   output row coun
1b6e0 74 20 62 79 20 68 61 6c 66 20 2a 2f 0a 20 20 20  t by half */.   
1b6f0 20 20 20 20 20 20 20 6e 52 6f 77 20 2f 3d 20 32         nRow /= 2
1b700 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b710 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 52    }.      if( nR
1b720 6f 77 3c 32 20 29 20 6e 52 6f 77 20 3d 20 32 3b  ow<2 ) nRow = 2;
1b730 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 57 48 45  .    }...    WHE
1b740 52 45 54 52 41 43 45 28 28 0a 20 20 20 20 20 20  RETRACE((.      
1b750 22 25 73 28 25 73 29 3a 20 6e 45 71 3d 25 64 20  "%s(%s): nEq=%d 
1b760 6e 49 6e 4d 75 6c 3d 25 64 20 65 73 74 42 6f 75  nInMul=%d estBou
1b770 6e 64 3d 25 64 20 62 53 6f 72 74 3d 25 64 20 62  nd=%d bSort=%d b
1b780 4c 6f 6f 6b 75 70 3d 25 64 20 77 73 46 6c 61 67  Lookup=%d wsFlag
1b790 73 3d 30 78 25 78 5c 6e 22 0a 20 20 20 20 20 20  s=0x%x\n".      
1b7a0 22 20 20 20 20 20 20 20 20 20 6e 6f 74 52 65 61  "         notRea
1b7b0 64 79 3d 30 78 25 6c 6c 78 20 6e 52 6f 77 3d 25  dy=0x%llx nRow=%
1b7c0 2e 32 66 20 63 6f 73 74 3d 25 2e 32 66 20 75 73  .2f cost=%.2f us
1b7d0 65 64 3d 30 78 25 6c 6c 78 5c 6e 22 2c 0a 20 20  ed=0x%llx\n",.  
1b7e0 20 20 20 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e      pSrc->pTab->
1b7f0 7a 4e 61 6d 65 2c 20 28 70 49 64 78 20 3f 20 70  zName, (pIdx ? p
1b800 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 69 70  Idx->zName : "ip
1b810 6b 22 29 2c 20 0a 20 20 20 20 20 20 6e 45 71 2c  k"), .      nEq,
1b820 20 6e 49 6e 4d 75 6c 2c 20 65 73 74 42 6f 75 6e   nInMul, estBoun
1b830 64 2c 20 62 53 6f 72 74 2c 20 62 4c 6f 6f 6b 75  d, bSort, bLooku
1b840 70 2c 20 77 73 46 6c 61 67 73 2c 0a 20 20 20 20  p, wsFlags,.    
1b850 20 20 6e 6f 74 52 65 61 64 79 2c 20 6e 52 6f 77    notReady, nRow
1b860 2c 20 63 6f 73 74 2c 20 75 73 65 64 0a 20 20 20  , cost, used.   
1b870 20 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20   ));..    /* If 
1b880 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 74 68  this index is th
1b890 65 20 62 65 73 74 20 77 65 20 68 61 76 65 20 73  e best we have s
1b8a0 65 65 6e 20 73 6f 20 66 61 72 2c 20 74 68 65 6e  een so far, then
1b8b0 20 72 65 63 6f 72 64 20 74 68 69 73 0a 20 20 20   record this.   
1b8c0 20 2a 2a 20 69 6e 64 65 78 20 61 6e 64 20 69 74   ** index and it
1b8d0 73 20 63 6f 73 74 20 69 6e 20 74 68 65 20 70 43  s cost in the pC
1b8e0 6f 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a 20  ost structure.. 
1b8f0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21     */.    if( (!
1b900 70 49 64 78 20 7c 7c 20 77 73 46 6c 61 67 73 29  pIdx || wsFlags)
1b910 0a 20 20 20 20 20 26 26 20 28 63 6f 73 74 3c 70  .     && (cost<p
1b920 43 6f 73 74 2d 3e 72 43 6f 73 74 20 7c 7c 20 28  Cost->rCost || (
1b930 63 6f 73 74 3c 3d 70 43 6f 73 74 2d 3e 72 43 6f  cost<=pCost->rCo
1b940 73 74 20 26 26 20 6e 52 6f 77 3c 70 43 6f 73 74  st && nRow<pCost
1b950 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 29 29 0a 20 20  ->plan.nRow)).  
1b960 20 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 73 74    ){.      pCost
1b970 2d 3e 72 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a  ->rCost = cost;.
1b980 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 75 73 65        pCost->use
1b990 64 20 3d 20 75 73 65 64 3b 0a 20 20 20 20 20 20  d = used;.      
1b9a0 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 52 6f 77  pCost->plan.nRow
1b9b0 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 20 20 70   = nRow;.      p
1b9c0 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  Cost->plan.wsFla
1b9d0 67 73 20 3d 20 28 77 73 46 6c 61 67 73 26 77 73  gs = (wsFlags&ws
1b9e0 46 6c 61 67 4d 61 73 6b 29 3b 0a 20 20 20 20 20  FlagMask);.     
1b9f0 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 45 71   pCost->plan.nEq
1ba00 20 3d 20 6e 45 71 3b 0a 20 20 20 20 20 20 70 43   = nEq;.      pC
1ba10 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  ost->plan.u.pIdx
1ba20 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 7d 0a 0a   = pIdx;.    }..
1ba30 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1ba40 77 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42  was an INDEXED B
1ba50 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f  Y clause, then o
1ba60 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20 69 6e 64  nly that one ind
1ba70 65 78 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ex is.    ** con
1ba80 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20 20 20  sidered. */.    
1ba90 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78  if( pSrc->pIndex
1baa0 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f   ) break;..    /
1bab0 2a 20 52 65 73 65 74 20 6d 61 73 6b 73 20 66 6f  * Reset masks fo
1bac0 72 20 74 68 65 20 6e 65 78 74 20 69 6e 64 65 78  r the next index
1bad0 20 69 6e 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a   in the loop */.
1bae0 20 20 20 20 77 73 46 6c 61 67 4d 61 73 6b 20 3d      wsFlagMask =
1baf0 20 7e 28 57 48 45 52 45 5f 52 4f 57 49 44 5f 45   ~(WHERE_ROWID_E
1bb00 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  Q|WHERE_ROWID_RA
1bb10 4e 47 45 29 3b 0a 20 20 20 20 65 71 54 65 72 6d  NGE);.    eqTerm
1bb20 4d 61 73 6b 20 3d 20 69 64 78 45 71 54 65 72 6d  Mask = idxEqTerm
1bb30 4d 61 73 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Mask;.  }..  /* 
1bb40 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f  If there is no O
1bb50 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
1bb60 6e 64 20 74 68 65 20 53 51 4c 49 54 45 5f 52 65  nd the SQLITE_Re
1bb70 76 65 72 73 65 4f 72 64 65 72 20 66 6c 61 67 0a  verseOrder flag.
1bb80 20 20 2a 2a 20 69 73 20 73 65 74 2c 20 74 68 65    ** is set, the
1bb90 6e 20 72 65 76 65 72 73 65 20 74 68 65 20 6f 72  n reverse the or
1bba0 64 65 72 20 74 68 61 74 20 74 68 65 20 69 6e 64  der that the ind
1bbb0 65 78 20 77 69 6c 6c 20 62 65 20 73 63 61 6e 6e  ex will be scann
1bbc0 65 64 0a 20 20 2a 2a 20 69 6e 2e 20 54 68 69 73  ed.  ** in. This
1bbd0 20 69 73 20 75 73 65 64 20 66 6f 72 20 61 70 70   is used for app
1bbe0 6c 69 63 61 74 69 6f 6e 20 74 65 73 74 69 6e 67  lication testing
1bbf0 2c 20 74 6f 20 68 65 6c 70 20 66 69 6e 64 20 63  , to help find c
1bc00 61 73 65 73 0a 20 20 2a 2a 20 77 68 65 72 65 20  ases.  ** where 
1bc10 61 70 70 6c 69 63 61 74 69 6f 6e 20 62 65 68 61  application beha
1bc20 76 69 6f 75 72 20 64 65 70 65 6e 64 73 20 6f 6e  viour depends on
1bc30 20 74 68 65 20 28 75 6e 64 65 66 69 6e 65 64 29   the (undefined)
1bc40 20 6f 72 64 65 72 20 74 68 61 74 0a 20 20 2a 2a   order that.  **
1bc50 20 53 51 4c 69 74 65 20 6f 75 74 70 75 74 73 20   SQLite outputs 
1bc60 72 6f 77 73 20 69 6e 20 69 6e 20 74 68 65 20 61  rows in in the a
1bc70 62 73 65 6e 63 65 20 6f 66 20 61 6e 20 4f 52 44  bsence of an ORD
1bc80 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 2a  ER BY clause.  *
1bc90 2f 0a 20 20 69 66 28 20 21 70 4f 72 64 65 72 42  /.  if( !pOrderB
1bca0 79 20 26 26 20 70 50 61 72 73 65 2d 3e 64 62 2d  y && pParse->db-
1bcb0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
1bcc0 52 65 76 65 72 73 65 4f 72 64 65 72 20 29 7b 0a  ReverseOrder ){.
1bcd0 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e      pCost->plan.
1bce0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
1bcf0 5f 52 45 56 45 52 53 45 3b 0a 20 20 7d 0a 0a 20  _REVERSE;.  }.. 
1bd00 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
1bd10 79 20 7c 7c 20 28 70 43 6f 73 74 2d 3e 70 6c 61  y || (pCost->pla
1bd20 6e 2e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  n.wsFlags&WHERE_
1bd30 4f 52 44 45 52 42 59 29 3d 3d 30 20 29 3b 0a 20  ORDERBY)==0 );. 
1bd40 20 61 73 73 65 72 74 28 20 70 43 6f 73 74 2d 3e   assert( pCost->
1bd50 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 30 20 7c  plan.u.pIdx==0 |
1bd60 7c 20 28 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77  | (pCost->plan.w
1bd70 73 46 6c 61 67 73 26 57 48 45 52 45 5f 52 4f 57  sFlags&WHERE_ROW
1bd80 49 44 5f 45 51 29 3d 3d 30 20 29 3b 0a 20 20 61  ID_EQ)==0 );.  a
1bd90 73 73 65 72 74 28 20 70 53 72 63 2d 3e 70 49 6e  ssert( pSrc->pIn
1bda0 64 65 78 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c  dex==0 .       |
1bdb0 7c 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e  | pCost->plan.u.
1bdc0 70 49 64 78 3d 3d 30 20 0a 20 20 20 20 20 20 20  pIdx==0 .       
1bdd0 7c 7c 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75  || pCost->plan.u
1bde0 2e 70 49 64 78 3d 3d 70 53 72 63 2d 3e 70 49 6e  .pIdx==pSrc->pIn
1bdf0 64 65 78 20 0a 20 20 29 3b 0a 0a 20 20 57 48 45  dex .  );..  WHE
1be00 52 45 54 52 41 43 45 28 28 22 62 65 73 74 20 69  RETRACE(("best i
1be10 6e 64 65 78 20 69 73 3a 20 25 73 5c 6e 22 2c 20  ndex is: %s\n", 
1be20 0a 20 20 20 20 28 28 70 43 6f 73 74 2d 3e 70 6c  .    ((pCost->pl
1be30 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
1be40 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29  RE_NOT_FULLSCAN)
1be50 3d 3d 30 20 3f 20 22 6e 6f 6e 65 22 20 3a 20 0a  ==0 ? "none" : .
1be60 20 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e           pCost->
1be70 70 6c 61 6e 2e 75 2e 70 49 64 78 20 3f 20 70 43  plan.u.pIdx ? pC
1be80 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  ost->plan.u.pIdx
1be90 2d 3e 7a 4e 61 6d 65 20 3a 20 22 69 70 6b 22 29  ->zName : "ipk")
1bea0 0a 20 20 29 29 3b 0a 20 20 0a 20 20 62 65 73 74  .  ));.  .  best
1beb0 4f 72 43 6c 61 75 73 65 49 6e 64 65 78 28 70 50  OrClauseIndex(pP
1bec0 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c  arse, pWC, pSrc,
1bed0 20 6e 6f 74 52 65 61 64 79 2c 20 6e 6f 74 56 61   notReady, notVa
1bee0 6c 69 64 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  lid, pOrderBy, p
1bef0 43 6f 73 74 29 3b 0a 20 20 62 65 73 74 41 75 74  Cost);.  bestAut
1bf00 6f 6d 61 74 69 63 49 6e 64 65 78 28 70 50 61 72  omaticIndex(pPar
1bf10 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 6e  se, pWC, pSrc, n
1bf20 6f 74 52 65 61 64 79 2c 20 70 43 6f 73 74 29 3b  otReady, pCost);
1bf30 0a 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77  .  pCost->plan.w
1bf40 73 46 6c 61 67 73 20 7c 3d 20 65 71 54 65 72 6d  sFlags |= eqTerm
1bf50 4d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  Mask;.}../*.** F
1bf60 69 6e 64 20 74 68 65 20 71 75 65 72 79 20 70 6c  ind the query pl
1bf70 61 6e 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67  an for accessing
1bf80 20 74 61 62 6c 65 20 70 53 72 63 2d 3e 70 54 61   table pSrc->pTa
1bf90 62 2e 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20  b. Write the.** 
1bfa0 62 65 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20  best query plan 
1bfb0 61 6e 64 20 69 74 73 20 63 6f 73 74 20 69 6e 74  and its cost int
1bfc0 6f 20 74 68 65 20 57 68 65 72 65 43 6f 73 74 20  o the WhereCost 
1bfd0 6f 62 6a 65 63 74 20 73 75 70 70 6c 69 65 64 20  object supplied 
1bfe0 0a 2a 2a 20 61 73 20 74 68 65 20 6c 61 73 74 20  .** as the last 
1bff0 70 61 72 61 6d 65 74 65 72 2e 20 54 68 69 73 20  parameter. This 
1c000 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 63 61 6c  function may cal
1c010 63 75 6c 61 74 65 20 74 68 65 20 63 6f 73 74 20  culate the cost 
1c020 6f 66 0a 2a 2a 20 62 6f 74 68 20 72 65 61 6c 20  of.** both real 
1c030 61 6e 64 20 76 69 72 74 75 61 6c 20 74 61 62 6c  and virtual tabl
1c040 65 20 73 63 61 6e 73 2e 0a 2a 2f 0a 73 74 61 74  e scans..*/.stat
1c050 69 63 20 76 6f 69 64 20 62 65 73 74 49 6e 64 65  ic void bestInde
1c060 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
1c070 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
1c080 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
1c090 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
1c0a0 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
1c0b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1c0c0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
1c0d0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1c0e0 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a  _item *pSrc,  /*
1c0f0 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
1c100 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20   term to search 
1c110 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
1c120 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20  Ready,          
1c130 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73   /* Mask of curs
1c140 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  ors not availabl
1c150 65 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a  e for indexing *
1c160 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 56  /.  Bitmask notV
1c170 61 6c 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  alid,           
1c180 2f 2a 20 43 75 72 73 6f 72 73 20 6e 6f 74 20 61  /* Cursors not a
1c190 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6e 79  vailable for any
1c1a0 20 70 75 72 70 6f 73 65 20 2a 2f 0a 20 20 45 78   purpose */.  Ex
1c1b0 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
1c1c0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
1c1d0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1c1e0 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20   */.  WhereCost 
1c1f0 2a 70 43 6f 73 74 20 20 20 20 20 20 20 20 20 20  *pCost          
1c200 20 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74    /* Lowest cost
1c210 20 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 29   query plan */.)
1c220 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
1c230 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1c240 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  LE.  if( IsVirtu
1c250 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29  al(pSrc->pTab) )
1c260 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
1c270 64 65 78 5f 69 6e 66 6f 20 2a 70 20 3d 20 30 3b  dex_info *p = 0;
1c280 0a 20 20 20 20 62 65 73 74 56 69 72 74 75 61 6c  .    bestVirtual
1c290 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 57  Index(pParse, pW
1c2a0 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  C, pSrc, notRead
1c2b0 79 2c 20 6e 6f 74 56 61 6c 69 64 2c 20 70 4f 72  y, notValid, pOr
1c2c0 64 65 72 42 79 2c 20 70 43 6f 73 74 2c 26 70 29  derBy, pCost,&p)
1c2d0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 65 65  ;.    if( p->nee
1c2e0 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 7b  dToFreeIdxStr ){
1c2f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1c300 72 65 65 28 70 2d 3e 69 64 78 53 74 72 29 3b 0a  ree(p->idxStr);.
1c310 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1c320 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e  3DbFree(pParse->
1c330 64 62 2c 20 70 29 3b 0a 20 20 7d 65 6c 73 65 0a  db, p);.  }else.
1c340 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 62  #endif.  {.    b
1c350 65 73 74 42 74 72 65 65 49 6e 64 65 78 28 70 50  estBtreeIndex(pP
1c360 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c  arse, pWC, pSrc,
1c370 20 6e 6f 74 52 65 61 64 79 2c 20 6e 6f 74 56 61   notReady, notVa
1c380 6c 69 64 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  lid, pOrderBy, p
1c390 43 6f 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Cost);.  }.}../*
1c3a0 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61 20 74 65  .** Disable a te
1c3b0 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  rm in the WHERE 
1c3c0 63 6c 61 75 73 65 2e 20 20 45 78 63 65 70 74 2c  clause.  Except,
1c3d0 20 64 6f 20 6e 6f 74 20 64 69 73 61 62 6c 65 20   do not disable 
1c3e0 74 68 65 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69  the term.** if i
1c3f0 74 20 63 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46  t controls a LEF
1c400 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64  T OUTER JOIN and
1c410 20 69 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67   it did not orig
1c420 69 6e 61 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a  inate in the ON.
1c430 2a 2a 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ** or USING clau
1c440 73 65 20 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e  se of that join.
1c450 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20  .**.** Consider 
1c460 74 68 65 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f  the term t2.z='o
1c470 6b 27 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  k' in the follow
1c480 69 6e 67 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a  ing queries:.**.
1c490 2a 2a 20 20 20 28 31 29 20 20 53 45 4c 45 43 54  **   (1)  SELECT
1c4a0 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20   * FROM t1 LEFT 
1c4b0 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d  JOIN t2 ON t1.a=
1c4c0 74 32 2e 78 20 57 48 45 52 45 20 74 32 2e 7a 3d  t2.x WHERE t2.z=
1c4d0 27 6f 6b 27 0a 2a 2a 20 20 20 28 32 29 20 20 53  'ok'.**   (2)  S
1c4e0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1c4f0 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  LEFT JOIN t2 ON 
1c500 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32  t1.a=t2.x AND t2
1c510 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29  .z='ok'.**   (3)
1c520 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1c530 74 31 2c 20 74 32 20 57 48 45 52 45 20 74 31 2e  t1, t2 WHERE t1.
1c540 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d  a=t2.x AND t2.z=
1c550 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  'ok'.**.** The t
1c560 32 2e 7a 3d 27 6f 6b 27 20 69 73 20 64 69 73 61  2.z='ok' is disa
1c570 62 6c 65 64 20 69 6e 20 74 68 65 20 69 6e 20 28  bled in the in (
1c580 32 29 20 62 65 63 61 75 73 65 20 69 74 20 6f 72  2) because it or
1c590 69 67 69 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74  iginates.** in t
1c5a0 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54  he ON clause.  T
1c5b0 68 65 20 74 65 72 6d 20 69 73 20 64 69 73 61 62  he term is disab
1c5c0 6c 65 64 20 69 6e 20 28 33 29 20 62 65 63 61 75  led in (3) becau
1c5d0 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 61 72  se it is not par
1c5e0 74 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f  t.** of a LEFT O
1c5f0 55 54 45 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28  UTER JOIN.  In (
1c600 31 29 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20  1), the term is 
1c610 6e 6f 74 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a  not disabled..**
1c620 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49  .** IMPLEMENTATI
1c630 4f 4e 2d 4f 46 3a 20 52 2d 32 34 35 39 37 2d 35  ON-OF: R-24597-5
1c640 38 36 35 35 20 4e 6f 20 74 65 73 74 73 20 61 72  8655 No tests ar
1c650 65 20 64 6f 6e 65 20 66 6f 72 20 74 65 72 6d 73  e done for terms
1c660 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 6f 6d   that are.** com
1c670 70 6c 65 74 65 6c 79 20 73 61 74 69 73 66 69 65  pletely satisfie
1c680 64 20 62 79 20 69 6e 64 69 63 65 73 2e 0a 2a 2a  d by indices..**
1c690 0a 2a 2a 20 44 69 73 61 62 6c 69 6e 67 20 61 20  .** Disabling a 
1c6a0 74 65 72 6d 20 63 61 75 73 65 73 20 74 68 61 74  term causes that
1c6b0 20 74 65 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20   term to not be 
1c6c0 74 65 73 74 65 64 20 69 6e 20 74 68 65 20 69 6e  tested in the in
1c6d0 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74  ner loop.** of t
1c6e0 68 65 20 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c  he join.  Disabl
1c6f0 69 6e 67 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ing is an optimi
1c700 7a 61 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 65  zation.  When te
1c710 72 6d 73 20 61 72 65 20 73 61 74 69 73 66 69 65  rms are satisfie
1c720 64 0a 2a 2a 20 62 79 20 69 6e 64 69 63 65 73 2c  d.** by indices,
1c730 20 77 65 20 64 69 73 61 62 6c 65 20 74 68 65 6d   we disable them
1c740 20 74 6f 20 70 72 65 76 65 6e 74 20 72 65 64 75   to prevent redu
1c750 6e 64 61 6e 74 20 74 65 73 74 73 20 69 6e 20 74  ndant tests in t
1c760 68 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70  he inner.** loop
1c770 2e 20 20 57 65 20 77 6f 75 6c 64 20 67 65 74 20  .  We would get 
1c780 74 68 65 20 63 6f 72 72 65 63 74 20 72 65 73 75  the correct resu
1c790 6c 74 73 20 69 66 20 6e 6f 74 68 69 6e 67 20 77  lts if nothing w
1c7a0 65 72 65 20 65 76 65 72 20 64 69 73 61 62 6c 65  ere ever disable
1c7b0 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e 73 20  d,.** but joins 
1c7c0 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74  might run a litt
1c7d0 6c 65 20 73 6c 6f 77 65 72 2e 20 20 54 68 65 20  le slower.  The 
1c7e0 74 72 69 63 6b 20 69 73 20 74 6f 20 64 69 73 61  trick is to disa
1c7f0 62 6c 65 20 61 73 20 6d 75 63 68 0a 2a 2a 20 61  ble as much.** a
1c800 73 20 77 65 20 63 61 6e 20 77 69 74 68 6f 75 74  s we can without
1c810 20 64 69 73 61 62 6c 69 6e 67 20 74 6f 6f 20 6d   disabling too m
1c820 75 63 68 2e 20 20 49 66 20 77 65 20 64 69 73 61  uch.  If we disa
1c830 62 6c 65 64 20 69 6e 20 28 31 29 2c 20 77 65 27  bled in (1), we'
1c840 64 20 67 65 74 0a 2a 2a 20 74 68 65 20 77 72 6f  d get.** the wro
1c850 6e 67 20 61 6e 73 77 65 72 2e 20 20 53 65 65 20  ng answer.  See 
1c860 74 69 63 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a  ticket #813..*/.
1c870 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 61  static void disa
1c880 62 6c 65 54 65 72 6d 28 57 68 65 72 65 4c 65 76  bleTerm(WhereLev
1c890 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72  el *pLevel, Wher
1c8a0 65 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20  eTerm *pTerm){. 
1c8b0 20 69 66 28 20 70 54 65 72 6d 0a 20 20 20 20 20   if( pTerm.     
1c8c0 20 26 26 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c   && (pTerm->wtFl
1c8d0 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
1c8e0 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 28 70  )==0.      && (p
1c8f0 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
1c900 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61 73 50 72  ==0 || ExprHasPr
1c910 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45  operty(pTerm->pE
1c920 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
1c930 29 29 0a 20 20 29 7b 0a 20 20 20 20 70 54 65 72  )).  ){.    pTer
1c940 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
1c950 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 69 66  RM_CODED;.    if
1c960 28 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  ( pTerm->iParent
1c970 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65  >=0 ){.      Whe
1c980 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d  reTerm *pOther =
1c990 20 26 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b   &pTerm->pWC->a[
1c9a0 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b  pTerm->iParent];
1c9b0 0a 20 20 20 20 20 20 69 66 28 20 28 2d 2d 70 4f  .      if( (--pO
1c9c0 74 68 65 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30  ther->nChild)==0
1c9d0 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61   ){.        disa
1c9e0 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
1c9f0 70 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20 7d  pOther);.      }
1ca00 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1ca10 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 41  .** Code an OP_A
1ca20 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 74  ffinity opcode t
1ca30 6f 20 61 70 70 6c 79 20 74 68 65 20 63 6f 6c 75  o apply the colu
1ca40 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  mn affinity stri
1ca50 6e 67 20 7a 41 66 66 0a 2a 2a 20 74 6f 20 74 68  ng zAff.** to th
1ca60 65 20 6e 20 72 65 67 69 73 74 65 72 73 20 73 74  e n registers st
1ca70 61 72 74 69 6e 67 20 61 74 20 62 61 73 65 2e 20  arting at base. 
1ca80 0a 2a 2a 0a 2a 2a 20 41 73 20 61 6e 20 6f 70 74  .**.** As an opt
1ca90 69 6d 69 7a 61 74 69 6f 6e 2c 20 53 51 4c 49 54  imization, SQLIT
1caa0 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69  E_AFF_NONE entri
1cab0 65 73 20 28 77 68 69 63 68 20 61 72 65 20 6e 6f  es (which are no
1cac0 2d 6f 70 73 29 20 61 74 20 74 68 65 0a 2a 2a 20  -ops) at the.** 
1cad0 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 65 6e  beginning and en
1cae0 64 20 6f 66 20 7a 41 66 66 20 61 72 65 20 69 67  d of zAff are ig
1caf0 6e 6f 72 65 64 2e 20 20 49 66 20 61 6c 6c 20 65  nored.  If all e
1cb00 6e 74 72 69 65 73 20 69 6e 20 7a 41 66 66 20 61  ntries in zAff a
1cb10 72 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46  re.** SQLITE_AFF
1cb20 5f 4e 4f 4e 45 2c 20 74 68 65 6e 20 6e 6f 20 63  _NONE, then no c
1cb30 6f 64 65 20 67 65 74 73 20 67 65 6e 65 72 61 74  ode gets generat
1cb40 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
1cb50 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 69 74 73  outine makes its
1cb60 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 7a 41 66   own copy of zAf
1cb70 66 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61  f so that the ca
1cb80 6c 6c 65 72 20 69 73 20 66 72 65 65 0a 2a 2a 20  ller is free.** 
1cb90 74 6f 20 6d 6f 64 69 66 79 20 7a 41 66 66 20 61  to modify zAff a
1cba0 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
1cbb0 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74  e returns..*/.st
1cbc0 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 41 70  atic void codeAp
1cbd0 70 6c 79 41 66 66 69 6e 69 74 79 28 50 61 72 73  plyAffinity(Pars
1cbe0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 62  e *pParse, int b
1cbf0 61 73 65 2c 20 69 6e 74 20 6e 2c 20 63 68 61 72  ase, int n, char
1cc00 20 2a 7a 41 66 66 29 7b 0a 20 20 56 64 62 65 20   *zAff){.  Vdbe 
1cc10 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1cc20 62 65 3b 0a 20 20 69 66 28 20 7a 41 66 66 3d 3d  be;.  if( zAff==
1cc30 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
1cc40 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
1cc50 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
1cc60 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
1cc70 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 0a  ssert( v!=0 );..
1cc80 20 20 2f 2a 20 41 64 6a 75 73 74 20 62 61 73 65    /* Adjust base
1cc90 20 61 6e 64 20 6e 20 74 6f 20 73 6b 69 70 20 6f   and n to skip o
1cca0 76 65 72 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ver SQLITE_AFF_N
1ccb0 4f 4e 45 20 65 6e 74 72 69 65 73 20 61 74 20 74  ONE entries at t
1ccc0 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a  he beginning.  *
1ccd0 2a 20 61 6e 64 20 65 6e 64 20 6f 66 20 74 68 65  * and end of the
1cce0 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
1ccf0 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ..  */.  while( 
1cd00 6e 3e 30 20 26 26 20 7a 41 66 66 5b 30 5d 3d 3d  n>0 && zAff[0]==
1cd10 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
1cd20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20  ){.    n--;.    
1cd30 62 61 73 65 2b 2b 3b 0a 20 20 20 20 7a 41 66 66  base++;.    zAff
1cd40 2b 2b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  ++;.  }.  while(
1cd50 20 6e 3e 31 20 26 26 20 7a 41 66 66 5b 6e 2d 31   n>1 && zAff[n-1
1cd60 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  ]==SQLITE_AFF_NO
1cd70 4e 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20  NE ){.    n--;. 
1cd80 20 7d 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68   }..  /* Code th
1cd90 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70  e OP_Affinity op
1cda0 63 6f 64 65 20 69 66 20 74 68 65 72 65 20 69 73  code if there is
1cdb0 20 61 6e 79 74 68 69 6e 67 20 6c 65 66 74 20 74   anything left t
1cdc0 6f 20 64 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 6e  o do. */.  if( n
1cdd0 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >0 ){.    sqlite
1cde0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1cdf0 50 5f 41 66 66 69 6e 69 74 79 2c 20 62 61 73 65  P_Affinity, base
1ce00 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , n);.    sqlite
1ce10 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
1ce20 20 2d 31 2c 20 7a 41 66 66 2c 20 6e 29 3b 0a 20   -1, zAff, n);. 
1ce30 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1ce40 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
1ce50 65 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20  e(pParse, base, 
1ce60 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  n);.  }.}.../*.*
1ce70 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1ce80 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 65 71 75  for a single equ
1ce90 61 6c 69 74 79 20 74 65 72 6d 20 6f 66 20 74 68  ality term of th
1cea0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
1ceb0 20 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20   An equality.** 
1cec0 74 65 72 6d 20 63 61 6e 20 62 65 20 65 69 74 68  term can be eith
1ced0 65 72 20 58 3d 65 78 70 72 20 6f 72 20 58 20 49  er X=expr or X I
1cee0 4e 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d  N (...).   pTerm
1cef0 20 69 73 20 74 68 65 20 74 65 72 6d 20 74 6f 20   is the term to 
1cf00 62 65 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a  be .** coded..**
1cf10 0a 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20  .** The current 
1cf20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63 6f  value for the co
1cf30 6e 73 74 72 61 69 6e 74 20 69 73 20 6c 65 66 74  nstraint is left
1cf40 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65   in register iRe
1cf50 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63  g..**.** For a c
1cf60 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 74 68 65  onstraint of the
1cf70 20 66 6f 72 6d 20 58 3d 65 78 70 72 2c 20 74 68   form X=expr, th
1cf80 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1cf90 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 74  evaluated and it
1cfa0 73 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6c  s.** result is l
1cfb0 65 66 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  eft on the stack
1cfc0 2e 20 20 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e  .  For constrain
1cfd0 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  ts of the form X
1cfe0 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69   IN (...).** thi
1cff0 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75  s routine sets u
1d000 70 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69  p a loop that wi
1d010 6c 6c 20 69 74 65 72 61 74 65 20 6f 76 65 72 20  ll iterate over 
1d020 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 58 2e  all values of X.
1d030 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
1d040 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
1d050 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1d060 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
1d070 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1d080 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
1d090 65 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20 74 65  erm,   /* The te
1d0a0 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
1d0b0 63 6c 61 75 73 65 20 74 6f 20 62 65 20 63 6f 64  clause to be cod
1d0c0 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  ed */.  WhereLev
1d0d0 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20 57  el *pLevel, /* W
1d0e0 68 65 6e 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  hen level of the
1d0f0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 65 20   FROM clause we 
1d100 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a  are working on *
1d110 2f 0a 20 20 69 6e 74 20 69 54 61 72 67 65 74 20  /.  int iTarget 
1d120 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d          /* Attem
1d130 70 74 20 74 6f 20 6c 65 61 76 65 20 72 65 73 75  pt to leave resu
1d140 6c 74 73 20 69 6e 20 74 68 69 73 20 72 65 67 69  lts in this regi
1d150 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  ster */.){.  Exp
1d160 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pX = pTerm->p
1d170 45 78 70 72 3b 0a 20 20 56 64 62 65 20 2a 76 20  Expr;.  Vdbe *v 
1d180 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1d190 0a 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20 20  .  int iReg;    
1d1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d1b0 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
1d1c0 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20  g results */..  
1d1d0 61 73 73 65 72 74 28 20 69 54 61 72 67 65 74 3e  assert( iTarget>
1d1e0 30 20 29 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6f  0 );.  if( pX->o
1d1f0 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20  p==TK_EQ ){.    
1d200 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  iReg = sqlite3Ex
1d210 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
1d220 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c  rse, pX->pRight,
1d230 20 69 54 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c   iTarget);.  }el
1d240 73 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54  se if( pX->op==T
1d250 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  K_ISNULL ){.    
1d260 69 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a  iReg = iTarget;.
1d270 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d280 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
1d290 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23 69 66 6e  , 0, iReg);.#ifn
1d2a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1d2b0 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c 73 65  SUBQUERY.  }else
1d2c0 7b 0a 20 20 20 20 69 6e 74 20 65 54 79 70 65 3b  {.    int eType;
1d2d0 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  .    int iTab;. 
1d2e0 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70     struct InLoop
1d2f0 20 2a 70 49 6e 3b 0a 0a 20 20 20 20 61 73 73 65   *pIn;..    asse
1d300 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49  rt( pX->op==TK_I
1d310 4e 20 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20  N );.    iReg = 
1d320 69 54 61 72 67 65 74 3b 0a 20 20 20 20 65 54 79  iTarget;.    eTy
1d330 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  pe = sqlite3Find
1d340 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  InIndex(pParse, 
1d350 70 58 2c 20 30 29 3b 0a 20 20 20 20 69 54 61 62  pX, 0);.    iTab
1d360 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20   = pX->iTable;. 
1d370 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1d380 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
1d390 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20  d, iTab, 0);.   
1d3a0 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d   assert( pLevel-
1d3b0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
1d3c0 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 29 3b  WHERE_IN_ABLE );
1d3d0 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
1d3e0 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a  >u.in.nIn==0 ){.
1d3f0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64        pLevel->ad
1d400 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56  drNxt = sqlite3V
1d410 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1d420 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65  .    }.    pLeve
1d430 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20  l->u.in.nIn++;. 
1d440 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e     pLevel->u.in.
1d450 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20 20 20 20  aInLoop =.      
1d460 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
1d470 63 4f 72 46 72 65 65 28 70 50 61 72 73 65 2d 3e  cOrFree(pParse->
1d480 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  db, pLevel->u.in
1d490 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20  .aInLoop,.      
1d4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d4b0 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70          sizeof(p
1d4c0 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
1d4d0 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e  oop[0])*pLevel->
1d4e0 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20 20 20 70  u.in.nIn);.    p
1d4f0 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  In = pLevel->u.i
1d500 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69  n.aInLoop;.    i
1d510 66 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 20 20  f( pIn ){.      
1d520 70 49 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75  pIn += pLevel->u
1d530 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b 0a 20 20 20  .in.nIn - 1;.   
1d540 20 20 20 70 49 6e 2d 3e 69 43 75 72 20 3d 20 69     pIn->iCur = i
1d550 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 65  Tab;.      if( e
1d560 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52  Type==IN_INDEX_R
1d570 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20  OWID ){.        
1d580 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d  pIn->addrInTop =
1d590 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d5a0 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  p2(v, OP_Rowid, 
1d5b0 69 54 61 62 2c 20 69 52 65 67 29 3b 0a 20 20 20  iTab, iReg);.   
1d5c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d5d0 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70    pIn->addrInTop
1d5e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1d5f0 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
1d600 6e 2c 20 69 54 61 62 2c 20 30 2c 20 69 52 65 67  n, iTab, 0, iReg
1d610 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1d620 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d630 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p1(v, OP_IsNull,
1d640 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 65 6c 73   iReg);.    }els
1d650 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  e{.      pLevel-
1d660 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a 20  >u.in.nIn = 0;. 
1d670 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
1d680 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
1d690 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20  evel, pTerm);.  
1d6a0 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a  return iReg;.}..
1d6b0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1d6c0 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76  ode that will ev
1d6d0 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e  aluate all == an
1d6e0 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  d IN constraints
1d6f0 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78   for an.** index
1d700 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1d710 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 61  ple, consider ta
1d720 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65  ble t1(a,b,c,d,e
1d730 2c 66 29 20 77 69 74 68 20 69 6e 64 65 78 20 69  ,f) with index i
1d740 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70  1(a,b,c)..** Sup
1d750 70 6f 73 65 20 74 68 65 20 57 48 45 52 45 20 63  pose the WHERE c
1d760 6c 61 75 73 65 20 69 73 20 74 68 69 73 3a 20 20  lause is this:  
1d770 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20 28 31  a==5 AND b IN (1
1d780 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35 20 41 4e  ,2,3) AND c>5 AN
1d790 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e  D c<10.** The in
1d7a0 64 65 78 20 68 61 73 20 61 73 20 6d 61 6e 79 20  dex has as many 
1d7b0 61 73 20 74 68 72 65 65 20 65 71 75 61 6c 69 74  as three equalit
1d7c0 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62  y constraints, b
1d7d0 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78  ut in this.** ex
1d7e0 61 6d 70 6c 65 2c 20 74 68 65 20 74 68 69 72 64  ample, the third
1d7f0 20 22 63 22 20 76 61 6c 75 65 20 69 73 20 61 6e   "c" value is an
1d800 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 53 6f   inequality.  So
1d810 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f   only two .** co
1d820 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f  nstraints are co
1d830 64 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ded.  This routi
1d840 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65  ne will generate
1d850 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74   code to evaluat
1d860 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20  e.** a==5 and b 
1d870 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54 68 65  IN (1,2,3).  The
1d880 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20   current values 
1d890 66 6f 72 20 61 20 61 6e 64 20 62 20 77 69 6c 6c  for a and b will
1d8a0 20 62 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e   be stored.** in
1d8b0 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67   consecutive reg
1d8c0 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 69  isters and the i
1d8d0 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73  ndex of the firs
1d8e0 74 20 72 65 67 69 73 74 65 72 20 69 73 20 72 65  t register is re
1d8f0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e  turned..**.** In
1d900 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
1d910 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20  ve nEq==2.  But 
1d920 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20  this subroutine 
1d930 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61  works for any va
1d940 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e  lue.** of nEq in
1d950 63 6c 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e  cluding 0.  If n
1d960 45 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74  Eq==0, this rout
1d970 69 6e 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20  ine is nearly a 
1d980 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e  no-op..** The on
1d990 6c 79 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73  ly thing it does
1d9a0 20 69 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65   is allocate the
1d9b0 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65   pLevel->iMem me
1d9c0 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a  mory cell and.**
1d9d0 20 63 6f 6d 70 75 74 65 20 74 68 65 20 61 66 66   compute the aff
1d9e0 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a  inity string..**
1d9f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1da00 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61 74 65   always allocate
1da10 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6d  s at least one m
1da20 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72  emory cell and r
1da30 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 69 6e  eturns.** the in
1da40 64 65 78 20 6f 66 20 74 68 61 74 20 6d 65 6d 6f  dex of that memo
1da50 72 79 20 63 65 6c 6c 2e 20 54 68 65 20 63 6f 64  ry cell. The cod
1da60 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20  e that.** calls 
1da70 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
1da80 6c 20 75 73 65 20 74 68 61 74 20 6d 65 6d 6f 72  l use that memor
1da90 79 20 63 65 6c 6c 20 74 6f 20 73 74 6f 72 65 20  y cell to store 
1daa0 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a  the termination.
1dab0 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f 66 20  ** key value of 
1dac0 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e  the loop.  If on
1dad0 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65  e or more IN ope
1dae0 72 61 74 6f 72 73 20 61 70 70 65 61 72 2c 20 74  rators appear, t
1daf0 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
1db00 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e  ine allocates an
1db10 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20   additional nEq 
1db20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72  memory cells for
1db30 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65   internal.** use
1db40 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72  ..**.** Before r
1db50 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 41 66 66  eturning, *pzAff
1db60 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
1db70 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
1db80 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f 70  taining a.** cop
1db90 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  y of the column 
1dba0 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
1dbb0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6c 6c  of the index all
1dbc0 6f 63 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20  ocated using.** 
1dbd0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28  sqlite3DbMalloc(
1dbe0 29 2e 20 45 78 63 65 70 74 2c 20 65 6e 74 72 69  ). Except, entri
1dbf0 65 73 20 69 6e 20 74 68 65 20 63 6f 70 79 20 6f  es in the copy o
1dc00 66 20 74 68 65 20 73 74 72 69 6e 67 20 61 73 73  f the string ass
1dc10 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
1dc20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1dc30 69 6e 74 73 20 74 68 61 74 20 75 73 65 20 4e 4f  ints that use NO
1dc40 4e 45 20 61 66 66 69 6e 69 74 79 20 61 72 65 20  NE affinity are 
1dc50 73 65 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45  set to.** SQLITE
1dc60 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54 68 69 73 20  _AFF_NONE. This 
1dc70 69 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  is to deal with 
1dc80 53 51 4c 20 73 75 63 68 20 61 73 20 74 68 65 20  SQL such as the 
1dc90 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
1dca0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
1dcb0 74 31 28 61 20 54 45 58 54 20 50 52 49 4d 41 52  t1(a TEXT PRIMAR
1dcc0 59 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20 20 20  Y KEY, b);.**   
1dcd0 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
1dce0 74 31 20 41 53 20 74 32 2c 20 74 31 20 57 48 45  t1 AS t2, t1 WHE
1dcf0 52 45 20 74 31 2e 61 20 3d 20 74 32 2e 62 3b 0a  RE t1.a = t2.b;.
1dd00 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61  **.** In the exa
1dd10 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20  mple above, the 
1dd20 69 6e 64 65 78 20 6f 6e 20 74 31 28 61 29 20 68  index on t1(a) h
1dd30 61 73 20 54 45 58 54 20 61 66 66 69 6e 69 74 79  as TEXT affinity
1dd40 2e 20 42 75 74 20 73 69 6e 63 65 0a 2a 2a 20 74  . But since.** t
1dd50 68 65 20 72 69 67 68 74 20 68 61 6e 64 20 73 69  he right hand si
1dd60 64 65 20 6f 66 20 74 68 65 20 65 71 75 61 6c 69  de of the equali
1dd70 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 74  ty constraint (t
1dd80 32 2e 62 29 20 68 61 73 20 4e 4f 4e 45 20 61 66  2.b) has NONE af
1dd90 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63 6f  finity,.** no co
1dda0 6e 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c 64 20  nversion should 
1ddb0 62 65 20 61 74 74 65 6d 70 74 65 64 20 62 65 66  be attempted bef
1ddc0 6f 72 65 20 75 73 69 6e 67 20 61 20 74 32 2e 62  ore using a t2.b
1ddd0 20 76 61 6c 75 65 20 61 73 20 70 61 72 74 20 6f   value as part o
1dde0 66 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20 73 65  f.** a key to se
1ddf0 61 72 63 68 20 74 68 65 20 69 6e 64 65 78 2e 20  arch the index. 
1de00 48 65 6e 63 65 20 74 68 65 20 66 69 72 73 74 20  Hence the first 
1de10 62 79 74 65 20 69 6e 20 74 68 65 20 72 65 74 75  byte in the retu
1de20 72 6e 65 64 20 61 66 66 69 6e 69 74 79 0a 2a 2a  rned affinity.**
1de30 20 73 74 72 69 6e 67 20 69 6e 20 74 68 69 73 20   string in this 
1de40 65 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20 62 65  example would be
1de50 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 41   set to SQLITE_A
1de60 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74  FF_NONE..*/.stat
1de70 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45 71  ic int codeAllEq
1de80 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 50  ualityTerms(.  P
1de90 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1dea0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
1deb0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
1dec0 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
1ded0 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73 74     /* Which nest
1dee0 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46  ed loop of the F
1def0 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69 6e  ROM we are codin
1df00 67 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  g */.  WhereClau
1df10 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20  se *pWC,     /* 
1df20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
1df30 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
1df40 74 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 57  tReady,     /* W
1df50 68 69 63 68 20 70 61 72 74 73 20 6f 66 20 46 52  hich parts of FR
1df60 4f 4d 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20  OM have not yet 
1df70 62 65 65 6e 20 63 6f 64 65 64 20 2a 2f 0a 20 20  been coded */.  
1df80 69 6e 74 20 6e 45 78 74 72 61 52 65 67 2c 20 20  int nExtraReg,  
1df90 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1dfa0 6f 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65  of extra registe
1dfb0 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  rs to allocate *
1dfc0 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 41 66 66  /.  char **pzAff
1dfd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1dfe0 3a 20 53 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  : Set to point t
1dff0 6f 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  o affinity strin
1e000 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45  g */.){.  int nE
1e010 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  q = pLevel->plan
1e020 2e 6e 45 71 3b 20 20 20 2f 2a 20 54 68 65 20 6e  .nEq;   /* The n
1e030 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49  umber of == or I
1e040 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f  N constraints to
1e050 20 63 6f 64 65 20 2a 2f 0a 20 20 56 64 62 65 20   code */.  Vdbe 
1e060 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1e070 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  be;      /* The 
1e080 76 6d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  vm under constru
1e090 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78  ction */.  Index
1e0a0 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
1e0b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e0c0 69 6e 64 65 78 20 62 65 69 6e 67 20 75 73 65 64  index being used
1e0d0 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a   for this loop *
1e0e0 2f 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70  /.  int iCur = p
1e0f0 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b 20  Level->iTabCur; 
1e100 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
1e110 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  of the table */.
1e120 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
1e130 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
1e140 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73  /* A single cons
1e150 74 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20  traint term */. 
1e160 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
1e170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e180 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
1e190 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b  /.  int regBase;
1e1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1b0 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74    /* Base regist
1e1c0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67  er */.  int nReg
1e1d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e1e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1e1f0 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20  of registers to 
1e200 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68  allocate */.  ch
1e210 61 72 20 2a 7a 41 66 66 3b 20 20 20 20 20 20 20  ar *zAff;       
1e220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1e230 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 74  ffinity string t
1e240 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f  o return */..  /
1e250 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 73  * This module is
1e260 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f 6e 20   only called on 
1e270 71 75 65 72 79 20 70 6c 61 6e 73 20 74 68 61 74  query plans that
1e280 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2e 20 2a   use an index. *
1e290 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 76  /.  assert( pLev
1e2a0 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
1e2b0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
1e2c0 20 29 3b 0a 20 20 70 49 64 78 20 3d 20 70 4c 65   );.  pIdx = pLe
1e2d0 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  vel->plan.u.pIdx
1e2e0 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
1e2f0 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f  ut how many memo
1e300 72 79 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c  ry cells we will
1e310 20 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63   need then alloc
1e320 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20  ate them..  */. 
1e330 20 72 65 67 42 61 73 65 20 3d 20 70 50 61 72 73   regBase = pPars
1e340 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e  e->nMem + 1;.  n
1e350 52 65 67 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c  Reg = pLevel->pl
1e360 61 6e 2e 6e 45 71 20 2b 20 6e 45 78 74 72 61 52  an.nEq + nExtraR
1e370 65 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d  eg;.  pParse->nM
1e380 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20 20 7a  em += nReg;..  z
1e390 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62 53  Aff = sqlite3DbS
1e3a0 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  trDup(pParse->db
1e3b0 2c 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66  , sqlite3IndexAf
1e3c0 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70 49 64  finityStr(v, pId
1e3d0 78 29 29 3b 0a 20 20 69 66 28 20 21 7a 41 66 66  x));.  if( !zAff
1e3e0 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
1e3f0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1e400 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 1;.  }..  /* 
1e410 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 71 75  Evaluate the equ
1e420 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1e430 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s.  */.  assert(
1e440 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d   pIdx->nColumn>=
1e450 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 30  nEq );.  for(j=0
1e460 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20  ; j<nEq; j++){. 
1e470 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 69     int r1;.    i
1e480 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43  nt k = pIdx->aiC
1e490 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 70 54  olumn[j];.    pT
1e4a0 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  erm = findTerm(p
1e4b0 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74  WC, iCur, k, not
1e4c0 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 2d 3e 70  Ready, pLevel->p
1e4d0 6c 61 6e 2e 77 73 46 6c 61 67 73 2c 20 70 49 64  lan.wsFlags, pId
1e4e0 78 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45  x);.    if( NEVE
1e4f0 52 28 70 54 65 72 6d 3d 3d 30 29 20 29 20 62 72  R(pTerm==0) ) br
1e500 65 61 6b 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  eak;.    /* The 
1e510 66 6f 6c 6c 6f 77 69 6e 67 20 74 72 75 65 20 66  following true f
1e520 6f 72 20 69 6e 64 69 63 65 73 20 77 69 74 68 20  or indices with 
1e530 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e  redundant column
1e540 73 2e 20 0a 20 20 20 20 2a 2a 20 45 78 3a 20 43  s. .    ** Ex: C
1e550 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
1e560 4e 20 74 31 28 61 2c 62 2c 61 29 3b 20 53 45 4c  N t1(a,b,a); SEL
1e570 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
1e580 45 52 45 20 61 3d 30 20 41 4e 44 20 62 3d 30 3b  ERE a=0 AND b=0;
1e590 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73 65   */.    testcase
1e5a0 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
1e5b0 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 21  s & TERM_CODED)!
1e5c0 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =0 );.    testca
1e5d0 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  se( pTerm->wtFla
1e5e0 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
1e5f0 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30  L ); /* EV: R-30
1e600 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20  575-11662 */.   
1e610 20 72 31 20 3d 20 63 6f 64 65 45 71 75 61 6c 69   r1 = codeEquali
1e620 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  tyTerm(pParse, p
1e630 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 72 65  Term, pLevel, re
1e640 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 69 66  gBase+j);.    if
1e650 28 20 72 31 21 3d 72 65 67 42 61 73 65 2b 6a 20  ( r1!=regBase+j 
1e660 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 52 65  ){.      if( nRe
1e670 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  g==1 ){.        
1e680 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1e690 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1e6a0 67 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20  gBase);.        
1e6b0 72 65 67 42 61 73 65 20 3d 20 72 31 3b 0a 20 20  regBase = r1;.  
1e6c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e6d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e6e0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
1e6f0 2c 20 72 31 2c 20 72 65 67 42 61 73 65 2b 6a 29  , r1, regBase+j)
1e700 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1e710 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
1e720 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1e730 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20   WO_ISNULL );.  
1e740 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
1e750 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
1e760 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 69 66 28 20  O_IN );.    if( 
1e770 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
1e780 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57  r & (WO_ISNULL|W
1e790 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a 20 20 20  O_IN))==0 ){.   
1e7a0 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
1e7b0 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  = pTerm->pExpr->
1e7c0 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71  pRight;.      sq
1e7d0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e  lite3ExprCodeIsN
1e7e0 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68  ullJump(v, pRigh
1e7f0 74 2c 20 72 65 67 42 61 73 65 2b 6a 2c 20 70 4c  t, regBase+j, pL
1e800 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a  evel->addrBrk);.
1e810 20 20 20 20 20 20 69 66 28 20 7a 41 66 66 20 29        if( zAff )
1e820 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
1e830 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
1e840 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 41 66  nity(pRight, zAf
1e850 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46  f[j])==SQLITE_AF
1e860 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  F_NONE ){.      
1e870 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51      zAff[j] = SQ
1e880 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
1e890 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e8a0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
1e8b0 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
1e8c0 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 41  hange(pRight, zA
1e8d0 66 66 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20  ff[j]) ){.      
1e8e0 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51      zAff[j] = SQ
1e8f0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
1e900 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1e910 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a  .    }.  }.  *pz
1e920 41 66 66 20 3d 20 7a 41 66 66 3b 0a 20 20 72 65  Aff = zAff;.  re
1e930 74 75 72 6e 20 72 65 67 42 61 73 65 3b 0a 7d 0a  turn regBase;.}.
1e940 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e950 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a  OMIT_EXPLAIN./*.
1e960 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1e970 69 73 20 61 20 68 65 6c 70 65 72 20 66 6f 72 20  is a helper for 
1e980 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67  explainIndexRang
1e990 65 28 29 20 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20  e() below.**.** 
1e9a0 70 53 74 72 20 68 6f 6c 64 73 20 74 68 65 20 74  pStr holds the t
1e9b0 65 78 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  ext of an expres
1e9c0 73 69 6f 6e 20 74 68 61 74 20 77 65 20 61 72 65  sion that we are
1e9d0 20 62 75 69 6c 64 69 6e 67 20 75 70 20 6f 6e 65   building up one
1e9e0 20 74 65 72 6d 0a 2a 2a 20 61 74 20 61 20 74 69   term.** at a ti
1e9f0 6d 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  me.  This routin
1ea00 65 20 61 64 64 73 20 61 20 6e 65 77 20 74 65 72  e adds a new ter
1ea10 6d 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  m to the end of 
1ea20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  the expression..
1ea30 2a 2a 20 54 65 72 6d 73 20 61 72 65 20 73 65 70  ** Terms are sep
1ea40 61 72 61 74 65 64 20 62 79 20 41 4e 44 20 73 6f  arated by AND so
1ea50 20 61 64 64 20 74 68 65 20 22 41 4e 44 22 20 74   add the "AND" t
1ea60 65 78 74 20 66 6f 72 20 73 65 63 6f 6e 64 20 61  ext for second a
1ea70 6e 64 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a  nd subsequent.**
1ea80 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a   terms only..*/.
1ea90 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
1eaa0 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 0a 20  ainAppendTerm(. 
1eab0 20 53 74 72 41 63 63 75 6d 20 2a 70 53 74 72 2c   StrAccum *pStr,
1eac0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ead0 54 68 65 20 74 65 78 74 20 65 78 70 72 65 73 73  The text express
1eae0 69 6f 6e 20 62 65 69 6e 67 20 62 75 69 6c 74 20  ion being built 
1eaf0 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c 20  */.  int iTerm, 
1eb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb10 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 69   /* Index of thi
1eb20 73 20 74 65 72 6d 2e 20 20 46 69 72 73 74 20 69  s term.  First i
1eb30 73 20 7a 65 72 6f 20 2a 2f 0a 20 20 63 6f 6e 73  s zero */.  cons
1eb40 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c  t char *zColumn,
1eb50 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1eb60 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f  of the column */
1eb70 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1eb80 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  Op             /
1eb90 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70  * Name of the op
1eba0 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69  erator */.){.  i
1ebb0 66 28 20 69 54 65 72 6d 20 29 20 73 71 6c 69 74  f( iTerm ) sqlit
1ebc0 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
1ebd0 28 70 53 74 72 2c 20 22 20 41 4e 44 20 22 2c 20  (pStr, " AND ", 
1ebe0 35 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72  5);.  sqlite3Str
1ebf0 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72  AccumAppend(pStr
1ec00 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 2d 31 29 3b 0a  , zColumn, -1);.
1ec10 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
1ec20 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a 4f  mAppend(pStr, zO
1ec30 70 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  p, 1);.  sqlite3
1ec40 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70  StrAccumAppend(p
1ec50 53 74 72 2c 20 22 3f 22 2c 20 31 29 3b 0a 7d 0a  Str, "?", 1);.}.
1ec60 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
1ec70 70 4c 65 76 65 6c 20 64 65 73 63 72 69 62 65 73  pLevel describes
1ec80 20 61 20 73 74 72 61 74 65 67 79 20 66 6f 72 20   a strategy for 
1ec90 73 63 61 6e 6e 69 6e 67 20 74 61 62 6c 65 20 70  scanning table p
1eca0 54 61 62 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75  Tab. This .** fu
1ecb0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
1ecc0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
1ecd0 72 69 6e 67 20 62 75 66 66 65 72 20 63 6f 6e 74  ring buffer cont
1ece0 61 69 6e 69 6e 67 20 61 20 64 65 73 63 72 69 70  aining a descrip
1ecf0 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 73  tion.** of the s
1ed00 75 62 73 65 74 20 6f 66 20 74 61 62 6c 65 20 72  ubset of table r
1ed10 6f 77 73 20 73 63 61 6e 6e 65 64 20 62 79 20 74  ows scanned by t
1ed20 68 65 20 73 74 72 61 74 65 67 79 20 69 6e 20 74  he strategy in t
1ed30 68 65 20 66 6f 72 6d 20 6f 66 20 61 6e 0a 2a 2a  he form of an.**
1ed40 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 2e   SQL expression.
1ed50 20 4f 72 2c 20 69 66 20 61 6c 6c 20 72 6f 77 73   Or, if all rows
1ed60 20 61 72 65 20 73 63 61 6e 6e 65 64 2c 20 4e 55   are scanned, NU
1ed70 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
1ed80 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1ed90 65 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 3a  e, if the query:
1eda0 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
1edb0 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
1edc0 61 3d 31 20 41 4e 44 20 62 3e 32 3b 0a 2a 2a 0a  a=1 AND b>2;.**.
1edd0 2a 2a 20 69 73 20 72 75 6e 20 61 6e 64 20 74 68  ** is run and th
1ede0 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ere is an index 
1edf0 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68 65 6e 20  on (a, b), then 
1ee00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
1ee10 74 75 72 6e 73 20 61 0a 2a 2a 20 73 74 72 69 6e  turns a.** strin
1ee20 67 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a  g similar to:.**
1ee30 0a 2a 2a 20 20 20 22 61 3d 3f 20 41 4e 44 20 62  .**   "a=? AND b
1ee40 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  >?".**.** The re
1ee50 74 75 72 6e 65 64 20 70 6f 69 6e 74 65 72 20 70  turned pointer p
1ee60 6f 69 6e 74 73 20 74 6f 20 6d 65 6d 6f 72 79 20  oints to memory 
1ee70 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
1ee80 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e  lite3DbMalloc().
1ee90 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72 65  .** It is the re
1eea0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
1eeb0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 66 72  the caller to fr
1eec0 65 65 20 74 68 65 20 62 75 66 66 65 72 20 77 68  ee the buffer wh
1eed0 65 6e 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 20 6c  en it is.** no l
1eee0 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a  onger required..
1eef0 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
1ef00 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67  explainIndexRang
1ef10 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
1ef20 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
1ef30 6c 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  l, Table *pTab){
1ef40 0a 20 20 57 68 65 72 65 50 6c 61 6e 20 2a 70 50  .  WherePlan *pP
1ef50 6c 61 6e 20 3d 20 26 70 4c 65 76 65 6c 2d 3e 70  lan = &pLevel->p
1ef60 6c 61 6e 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  lan;.  Index *pI
1ef70 6e 64 65 78 20 3d 20 70 50 6c 61 6e 2d 3e 75 2e  ndex = pPlan->u.
1ef80 70 49 64 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20  pIdx;.  int nEq 
1ef90 3d 20 70 50 6c 61 6e 2d 3e 6e 45 71 3b 0a 20 20  = pPlan->nEq;.  
1efa0 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 43 6f 6c 75  int i, j;.  Colu
1efb0 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 54 61 62 2d  mn *aCol = pTab-
1efc0 3e 61 43 6f 6c 3b 0a 20 20 69 6e 74 20 2a 61 69  >aCol;.  int *ai
1efd0 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d  Column = pIndex-
1efe0 3e 61 69 43 6f 6c 75 6d 6e 3b 0a 20 20 53 74 72  >aiColumn;.  Str
1eff0 41 63 63 75 6d 20 74 78 74 3b 0a 0a 20 20 69 66  Accum txt;..  if
1f000 28 20 6e 45 71 3d 3d 30 20 26 26 20 28 70 50 6c  ( nEq==0 && (pPl
1f010 61 6e 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57  an->wsFlags & (W
1f020 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57  HERE_BTM_LIMIT|W
1f030 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29  HERE_TOP_LIMIT))
1f040 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1f050 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n 0;.  }.  sqlit
1f060 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26  e3StrAccumInit(&
1f070 74 78 74 2c 20 30 2c 20 30 2c 20 53 51 4c 49 54  txt, 0, 0, SQLIT
1f080 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 29 3b 0a 20  E_MAX_LENGTH);. 
1f090 20 74 78 74 2e 64 62 20 3d 20 64 62 3b 0a 20 20   txt.db = db;.  
1f0a0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
1f0b0 70 70 65 6e 64 28 26 74 78 74 2c 20 22 20 28 22  ppend(&txt, " ("
1f0c0 2c 20 32 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  , 2);.  for(i=0;
1f0d0 20 69 3c 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20 20   i<nEq; i++){.  
1f0e0 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54    explainAppendT
1f0f0 65 72 6d 28 26 74 78 74 2c 20 69 2c 20 61 43 6f  erm(&txt, i, aCo
1f100 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a  l[aiColumn[i]].z
1f110 4e 61 6d 65 2c 20 22 3d 22 29 3b 0a 20 20 7d 0a  Name, "=");.  }.
1f120 0a 20 20 6a 20 3d 20 69 3b 0a 20 20 69 66 28 20  .  j = i;.  if( 
1f130 70 50 6c 61 6e 2d 3e 77 73 46 6c 61 67 73 26 57  pPlan->wsFlags&W
1f140 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29  HERE_BTM_LIMIT )
1f150 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70  {.    explainApp
1f160 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2b  endTerm(&txt, i+
1f170 2b 2c 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e  +, aCol[aiColumn
1f180 5b 6a 5d 5d 2e 7a 4e 61 6d 65 2c 20 22 3e 22 29  [j]].zName, ">")
1f190 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 6c 61  ;.  }.  if( pPla
1f1a0 6e 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45  n->wsFlags&WHERE
1f1b0 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _TOP_LIMIT ){.  
1f1c0 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54    explainAppendT
1f1d0 65 72 6d 28 26 74 78 74 2c 20 69 2c 20 61 43 6f  erm(&txt, i, aCo
1f1e0 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a  l[aiColumn[j]].z
1f1f0 4e 61 6d 65 2c 20 22 3c 22 29 3b 0a 20 20 7d 0a  Name, "<");.  }.
1f200 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
1f210 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22 29  mAppend(&txt, ")
1f220 22 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  ", 1);.  return 
1f230 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46  sqlite3StrAccumF
1f240 69 6e 69 73 68 28 26 74 78 74 29 3b 0a 7d 0a 0a  inish(&txt);.}..
1f250 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1f260 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75  ion is a no-op u
1f270 6e 6c 65 73 73 20 63 75 72 72 65 6e 74 6c 79 20  nless currently 
1f280 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 20 45 58  processing an EX
1f290 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
1f2a0 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 49 66 20  .** command. If 
1f2b0 74 68 65 20 71 75 65 72 79 20 62 65 69 6e 67 20  the query being 
1f2c0 63 6f 6d 70 69 6c 65 64 20 69 73 20 61 6e 20 45  compiled is an E
1f2d0 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
1f2e0 4e 2c 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72  N, a single.** r
1f2f0 65 63 6f 72 64 20 69 73 20 61 64 64 65 64 20 74  ecord is added t
1f300 6f 20 74 68 65 20 6f 75 74 70 75 74 20 74 6f 20  o the output to 
1f310 64 65 73 63 72 69 62 65 20 74 68 65 20 74 61 62  describe the tab
1f320 6c 65 20 73 63 61 6e 20 73 74 72 61 74 65 67 79  le scan strategy
1f330 20 69 6e 20 0a 2a 2a 20 70 4c 65 76 65 6c 2e 0a   in .** pLevel..
1f340 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
1f350 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20  xplainOneScan(. 
1f360 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1f370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f380 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
1f390 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
1f3a0 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20  pTabList,       
1f3b0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
1f3c0 6c 69 73 74 20 74 68 69 73 20 6c 6f 6f 70 20 72  list this loop r
1f3d0 65 66 65 72 73 20 74 6f 20 2a 2f 0a 20 20 57 68  efers to */.  Wh
1f3e0 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
1f3f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1f400 20 53 63 61 6e 20 74 6f 20 77 72 69 74 65 20 4f   Scan to write O
1f410 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65  P_Explain opcode
1f420 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c   for */.  int iL
1f430 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20  evel,           
1f440 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
1f450 75 65 20 66 6f 72 20 22 6c 65 76 65 6c 22 20 63  ue for "level" c
1f460 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20  olumn of output 
1f470 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20  */.  int iFrom, 
1f480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f490 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f       /* Value fo
1f4a0 72 20 22 66 72 6f 6d 22 20 63 6f 6c 75 6d 6e 20  r "from" column 
1f4b0 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 75  of output */.  u
1f4c0 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 20 20  16 wctrlFlags   
1f4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f4e0 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
1f4f0 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
1f500 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 69 66  gin() */.){.  if
1f510 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
1f520 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 75 33 32 20  n==2 ){.    u32 
1f530 66 6c 61 67 73 20 3d 20 70 4c 65 76 65 6c 2d 3e  flags = pLevel->
1f540 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20 20  plan.wsFlags;.  
1f550 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1f560 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
1f570 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
1f580 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
1f590 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1f5a0 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a  ->pVdbe;      /*
1f5b0 20 56 4d 20 62 65 69 6e 67 20 63 6f 6e 73 74 72   VM being constr
1f5c0 75 63 74 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c  ucted */.    sql
1f5d0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1f5e0 65 2d 3e 64 62 3b 20 20 20 20 20 2f 2a 20 44 61  e->db;     /* Da
1f5f0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
1f600 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b  .    char *zMsg;
1f610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f620 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20 61 64     /* Text to ad
1f630 64 20 74 6f 20 45 51 50 20 6f 75 74 70 75 74 20  d to EQP output 
1f640 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  */.    sqlite3_i
1f650 6e 74 36 34 20 6e 52 6f 77 3b 20 20 20 20 20 20  nt64 nRow;      
1f660 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64       /* Expected
1f670 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
1f680 76 69 73 69 74 65 64 20 62 79 20 73 63 61 6e 20  visited by scan 
1f690 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 20 3d  */.    int iId =
1f6a0 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
1f6b0 49 64 3b 20 20 2f 2a 20 53 65 6c 65 63 74 20 69  Id;  /* Select i
1f6c0 64 20 28 6c 65 66 74 2d 6d 6f 73 74 20 6f 75 74  d (left-most out
1f6d0 70 75 74 20 63 6f 6c 75 6d 6e 29 20 2a 2f 0a 20  put column) */. 
1f6e0 20 20 20 69 6e 74 20 69 73 53 65 61 72 63 68 3b     int isSearch;
1f6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f700 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 53   /* True for a S
1f710 45 41 52 43 48 2e 20 46 61 6c 73 65 20 66 6f 72  EARCH. False for
1f720 20 53 43 41 4e 2e 20 2a 2f 0a 0a 20 20 20 20 69   SCAN. */..    i
1f730 66 28 20 28 66 6c 61 67 73 26 57 48 45 52 45 5f  f( (flags&WHERE_
1f740 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c 20 28 77 63  MULTI_OR) || (wc
1f750 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f  trlFlags&WHERE_O
1f760 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 29 20  NETABLE_ONLY) ) 
1f770 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 73 53  return;..    isS
1f780 65 61 72 63 68 20 3d 20 28 70 4c 65 76 65 6c 2d  earch = (pLevel-
1f790 3e 70 6c 61 6e 2e 6e 45 71 3e 30 29 0a 20 20 20  >plan.nEq>0).   
1f7a0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 66 6c            || (fl
1f7b0 61 67 73 26 28 57 48 45 52 45 5f 42 54 4d 5f 4c  ags&(WHERE_BTM_L
1f7c0 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c  IMIT|WHERE_TOP_L
1f7d0 49 4d 49 54 29 29 21 3d 30 0a 20 20 20 20 20 20  IMIT))!=0.      
1f7e0 20 20 20 20 20 20 20 7c 7c 20 28 77 63 74 72 6c         || (wctrl
1f7f0 46 6c 61 67 73 26 28 57 48 45 52 45 5f 4f 52 44  Flags&(WHERE_ORD
1f800 45 52 42 59 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f  ERBY_MIN|WHERE_O
1f810 52 44 45 52 42 59 5f 4d 41 58 29 29 3b 0a 0a 20  RDERBY_MAX));.. 
1f820 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
1f830 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
1f840 22 2c 20 69 73 53 65 61 72 63 68 3f 22 53 45 41  ", isSearch?"SEA
1f850 52 43 48 22 3a 22 53 43 41 4e 22 29 3b 0a 20 20  RCH":"SCAN");.  
1f860 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
1f870 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 4d  lect ){.      zM
1f880 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
1f890 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
1f8a0 25 73 20 53 55 42 51 55 45 52 59 20 25 64 22 2c  %s SUBQUERY %d",
1f8b0 20 7a 4d 73 67 2c 70 49 74 65 6d 2d 3e 69 53 65   zMsg,pItem->iSe
1f8c0 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 7d 65 6c  lectId);.    }el
1f8d0 73 65 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d  se{.      zMsg =
1f8e0 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
1f8f0 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 54  (db, zMsg, "%s T
1f900 41 42 4c 45 20 25 73 22 2c 20 7a 4d 73 67 2c 20  ABLE %s", zMsg, 
1f910 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
1f920 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49     }..    if( pI
1f930 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20  tem->zAlias ){. 
1f940 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
1f950 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
1f960 7a 4d 73 67 2c 20 22 25 73 20 41 53 20 25 73 22  zMsg, "%s AS %s"
1f970 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a  , zMsg, pItem->z
1f980 41 6c 69 61 73 29 3b 0a 20 20 20 20 7d 0a 20 20  Alias);.    }.  
1f990 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 57    if( (flags & W
1f9a0 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
1f9b0 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
1f9c0 7a 57 68 65 72 65 20 3d 20 65 78 70 6c 61 69 6e  zWhere = explain
1f9d0 49 6e 64 65 78 52 61 6e 67 65 28 64 62 2c 20 70  IndexRange(db, p
1f9e0 4c 65 76 65 6c 2c 20 70 49 74 65 6d 2d 3e 70 54  Level, pItem->pT
1f9f0 61 62 29 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20  ab);.      zMsg 
1fa00 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
1fa10 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
1fa20 55 53 49 4e 47 20 25 73 25 73 49 4e 44 45 58 25  USING %s%sINDEX%
1fa30 73 25 73 25 73 22 2c 20 7a 4d 73 67 2c 20 0a 20  s%s%s", zMsg, . 
1fa40 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73           ((flags
1fa50 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
1fa60 44 45 58 29 3f 22 41 55 54 4f 4d 41 54 49 43 20  DEX)?"AUTOMATIC 
1fa70 22 3a 22 22 29 2c 0a 20 20 20 20 20 20 20 20 20  ":""),.         
1fa80 20 28 28 66 6c 61 67 73 20 26 20 57 48 45 52 45   ((flags & WHERE
1fa90 5f 49 44 58 5f 4f 4e 4c 59 29 3f 22 43 4f 56 45  _IDX_ONLY)?"COVE
1faa0 52 49 4e 47 20 22 3a 22 22 29 2c 0a 20 20 20 20  RING ":""),.    
1fab0 20 20 20 20 20 20 28 28 66 6c 61 67 73 20 26 20        ((flags & 
1fac0 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58  WHERE_TEMP_INDEX
1fad0 29 3f 22 22 3a 22 20 22 29 2c 0a 20 20 20 20 20  )?"":" "),.     
1fae0 20 20 20 20 20 28 28 66 6c 61 67 73 20 26 20 57       ((flags & W
1faf0 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29  HERE_TEMP_INDEX)
1fb00 3f 22 22 3a 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  ?"": pLevel->pla
1fb10 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  n.u.pIdx->zName)
1fb20 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 57 68 65  ,.          zWhe
1fb30 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  re.      );.    
1fb40 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1fb50 64 62 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20  db, zWhere);.   
1fb60 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
1fb70 20 26 20 28 57 48 45 52 45 5f 52 4f 57 49 44 5f   & (WHERE_ROWID_
1fb80 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52  EQ|WHERE_ROWID_R
1fb90 41 4e 47 45 29 20 29 7b 0a 20 20 20 20 20 20 7a  ANGE) ){.      z
1fba0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
1fbb0 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
1fbc0 22 25 73 20 55 53 49 4e 47 20 49 4e 54 45 47 45  "%s USING INTEGE
1fbd0 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 2c 20  R PRIMARY KEY", 
1fbe0 7a 4d 73 67 29 3b 0a 0a 20 20 20 20 20 20 69 66  zMsg);..      if
1fbf0 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f 52 4f  ( flags&WHERE_RO
1fc00 57 49 44 5f 45 51 20 29 7b 0a 20 20 20 20 20 20  WID_EQ ){.      
1fc10 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
1fc20 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
1fc30 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3d 3f 29  g, "%s (rowid=?)
1fc40 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20  ", zMsg);.      
1fc50 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73  }else if( (flags
1fc60 26 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49  &WHERE_BOTH_LIMI
1fc70 54 29 3d 3d 57 48 45 52 45 5f 42 4f 54 48 5f 4c  T)==WHERE_BOTH_L
1fc80 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20  IMIT ){.        
1fc90 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
1fca0 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
1fcb0 20 22 25 73 20 28 72 6f 77 69 64 3e 3f 20 41 4e   "%s (rowid>? AN
1fcc0 44 20 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73  D rowid<?)", zMs
1fcd0 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  g);.      }else 
1fce0 69 66 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f  if( flags&WHERE_
1fcf0 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  BTM_LIMIT ){.   
1fd00 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
1fd10 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
1fd20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64  zMsg, "%s (rowid
1fd30 3e 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20  >?)", zMsg);.   
1fd40 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61     }else if( fla
1fd50 67 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  gs&WHERE_TOP_LIM
1fd60 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d  IT ){.        zM
1fd70 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
1fd80 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
1fd90 25 73 20 28 72 6f 77 69 64 3c 3f 29 22 2c 20 7a  %s (rowid<?)", z
1fda0 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Msg);.      }.  
1fdb0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1fdc0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1fdd0 41 42 4c 45 0a 20 20 20 20 65 6c 73 65 20 69 66  ABLE.    else if
1fde0 28 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45  ( (flags & WHERE
1fdf0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d  _VIRTUALTABLE)!=
1fe00 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1fe10 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
1fe20 56 74 61 62 49 64 78 20 3d 20 70 4c 65 76 65 6c  VtabIdx = pLevel
1fe30 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62 49 64  ->plan.u.pVtabId
1fe40 78 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  x;.      zMsg = 
1fe50 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
1fe60 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 56 49  db, zMsg, "%s VI
1fe70 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45  RTUAL TABLE INDE
1fe80 58 20 25 64 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a  X %d:%s", zMsg,.
1fe90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fea0 20 20 70 56 74 61 62 49 64 78 2d 3e 69 64 78 4e    pVtabIdx->idxN
1feb0 75 6d 2c 20 70 56 74 61 62 49 64 78 2d 3e 69 64  um, pVtabIdx->id
1fec0 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  xStr);.    }.#en
1fed0 64 69 66 0a 20 20 20 20 69 66 28 20 77 63 74 72  dif.    if( wctr
1fee0 6c 46 6c 61 67 73 26 28 57 48 45 52 45 5f 4f 52  lFlags&(WHERE_OR
1fef0 44 45 52 42 59 5f 4d 49 4e 7c 57 48 45 52 45 5f  DERBY_MIN|WHERE_
1ff00 4f 52 44 45 52 42 59 5f 4d 41 58 29 20 29 7b 0a  ORDERBY_MAX) ){.
1ff10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ff20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
1ff30 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 29  RE_ORDERBY_MIN )
1ff40 3b 0a 20 20 20 20 20 20 6e 52 6f 77 20 3d 20 31  ;.      nRow = 1
1ff50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1ff60 20 20 20 6e 52 6f 77 20 3d 20 28 73 71 6c 69 74     nRow = (sqlit
1ff70 65 33 5f 69 6e 74 36 34 29 70 4c 65 76 65 6c 2d  e3_int64)pLevel-
1ff80 3e 70 6c 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20  >plan.nRow;.    
1ff90 7d 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c  }.    zMsg = sql
1ffa0 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
1ffb0 20 7a 4d 73 67 2c 20 22 25 73 20 28 7e 25 6c 6c   zMsg, "%s (~%ll
1ffc0 64 20 72 6f 77 73 29 22 2c 20 7a 4d 73 67 2c 20  d rows)", zMsg, 
1ffd0 6e 52 6f 77 29 3b 0a 20 20 20 20 73 71 6c 69 74  nRow);.    sqlit
1ffe0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1fff0 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69 49 64 2c  OP_Explain, iId,
20000 20 69 4c 65 76 65 6c 2c 20 69 46 72 6f 6d 2c 20   iLevel, iFrom, 
20010 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zMsg, P4_DYNAMIC
20020 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
20030 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 4f   define explainO
20040 6e 65 53 63 61 6e 28 75 2c 76 2c 77 2c 78 2c 79  neScan(u,v,w,x,y
20050 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ,z).#endif /* SQ
20060 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
20070 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  N */.../*.** Gen
20080 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
20090 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
200a0 69 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69  iLevel-th loop i
200b0 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
200c0 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  se.** implementa
200d0 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62  tion described b
200e0 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61  y pWInfo..*/.sta
200f0 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 64 65  tic Bitmask code
20100 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20 20  OneLoopStart(.  
20110 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
20120 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65  o,   /* Complete
20130 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
20140 75 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ut the WHERE cla
20150 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  use */.  int iLe
20160 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  vel,          /*
20170 20 57 68 69 63 68 20 6c 65 76 65 6c 20 6f 66 20   Which level of 
20180 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75  pWInfo->a[] shou
20190 6c 64 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  ld be coded */. 
201a0 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c   u16 wctrlFlags,
201b0 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
201c0 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67  the WHERE_* flag
201d0 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c  s defined in sql
201e0 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 42 69  iteInt.h */.  Bi
201f0 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20  tmask notReady  
20200 20 20 20 2f 2a 20 57 68 69 63 68 20 74 61 62 6c     /* Which tabl
20210 65 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  es are currently
20220 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 29 7b   available */.){
20230 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20 20  .  int j, k;    
20240 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
20250 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
20260 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20  t iCur;         
20270 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63     /* The VDBE c
20280 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61  ursor for the ta
20290 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ble */.  int add
202a0 72 4e 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  rNxt;         /*
202b0 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20 74   Where to jump t
202c0 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
202d0 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61 73 65  the next IN case
202e0 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 54 61   */.  int omitTa
202f0 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 72  ble;       /* Tr
20300 75 65 20 69 66 20 77 65 20 75 73 65 20 74 68 65  ue if we use the
20310 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20   index only */. 
20320 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20   int bRev;      
20330 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
20340 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63 61 6e   we need to scan
20350 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
20360 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  r */.  WhereLeve
20370 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a 20 54  l *pLevel;  /* T
20380 68 65 20 77 68 65 72 65 20 6c 65 76 65 6c 20 74  he where level t
20390 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
203a0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
203b0 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73  ;    /* Decompos
203c0 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e 74  ition of the ent
203d0 69 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ire WHERE clause
203e0 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
203f0 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
20400 20 20 20 20 20 20 2f 2a 20 41 20 57 48 45 52 45        /* A WHERE
20410 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a   clause term */.
20420 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
20430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20440 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
20450 74 65 78 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  text */.  Vdbe *
20460 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
20470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
20480 20 70 72 65 70 61 72 65 64 20 73 74 6d 74 20 75   prepared stmt u
20490 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
204a0 6e 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ns */.  struct S
204b0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61  rcList_item *pTa
204c0 62 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20  bItem;  /* FROM 
204d0 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e  clause term bein
204e0 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  g coded */.  int
204f0 20 61 64 64 72 42 72 6b 3b 20 20 20 20 20 20 20   addrBrk;       
20500 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20510 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65  Jump here to bre
20520 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f  ak out of the lo
20530 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  op */.  int addr
20540 43 6f 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  Cont;           
20550 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
20560 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65  here to continue
20570 20 77 69 74 68 20 6e 65 78 74 20 63 79 63 6c 65   with next cycle
20580 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64   */.  int iRowid
20590 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Reg = 0;        
205a0 2f 2a 20 52 6f 77 69 64 20 69 73 20 73 74 6f 72  /* Rowid is stor
205b0 65 64 20 69 6e 20 74 68 69 73 20 72 65 67 69 73  ed in this regis
205c0 74 65 72 2c 20 69 66 20 6e 6f 74 20 7a 65 72 6f  ter, if not zero
205d0 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 6c 65 61   */.  int iRelea
205e0 73 65 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20  seReg = 0;      
205f0 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65 72  /* Temp register
20600 20 74 6f 20 66 72 65 65 20 62 65 66 6f 72 65 20   to free before 
20610 72 65 74 75 72 6e 69 6e 67 20 2a 2f 0a 0a 20 20  returning */..  
20620 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
20630 3e 70 50 61 72 73 65 3b 0a 20 20 76 20 3d 20 70  >pParse;.  v = p
20640 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
20650 70 57 43 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 57  pWC = pWInfo->pW
20660 43 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26 70  C;.  pLevel = &p
20670 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d  WInfo->a[iLevel]
20680 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26  ;.  pTabItem = &
20690 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
206a0 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
206b0 6d 5d 3b 0a 20 20 69 43 75 72 20 3d 20 70 54 61  m];.  iCur = pTa
206c0 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bItem->iCursor;.
206d0 20 20 62 52 65 76 20 3d 20 28 70 4c 65 76 65 6c    bRev = (pLevel
206e0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
206f0 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 29 21   WHERE_REVERSE)!
20700 3d 30 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20  =0;.  omitTable 
20710 3d 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  = (pLevel->plan.
20720 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
20730 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20 20  IDX_ONLY)!=0 .  
20740 20 20 20 20 20 20 20 20 20 26 26 20 28 77 63 74           && (wct
20750 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
20760 46 4f 52 43 45 5f 54 41 42 4c 45 29 3d 3d 30 3b  FORCE_TABLE)==0;
20770 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61  ..  /* Create la
20780 62 65 6c 73 20 66 6f 72 20 74 68 65 20 22 62 72  bels for the "br
20790 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e  eak" and "contin
207a0 75 65 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ue" instructions
207b0 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 75  .  ** for the cu
207c0 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d  rrent loop.  Jum
207d0 70 20 74 6f 20 61 64 64 72 42 72 6b 20 74 6f 20  p to addrBrk to 
207e0 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c  break out of a l
207f0 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20 74  oop..  ** Jump t
20800 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d  o cont to go imm
20810 65 64 69 61 74 65 6c 79 20 74 6f 20 74 68 65 20  ediately to the 
20820 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
20830 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e  f the.  ** loop.
20840 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
20850 74 68 65 72 65 20 69 73 20 61 6e 20 49 4e 20 6f  there is an IN o
20860 70 65 72 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f  perator, we also
20870 20 68 61 76 65 20 61 20 22 61 64 64 72 4e 78 74   have a "addrNxt
20880 22 20 6c 61 62 65 6c 20 74 68 61 74 0a 20 20 2a  " label that.  *
20890 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69  * means to conti
208a0 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78  nue with the nex
208b0 74 20 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69  t IN value combi
208c0 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20  nation.  When.  
208d0 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  ** there are no 
208e0 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20  IN operators in 
208f0 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  the constraints,
20900 20 74 68 65 20 22 61 64 64 72 4e 78 74 22 20 6c   the "addrNxt" l
20910 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20 74 68 65  abel.  ** is the
20920 20 73 61 6d 65 20 61 73 20 22 61 64 64 72 42 72   same as "addrBr
20930 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 42  k"..  */.  addrB
20940 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  rk = pLevel->add
20950 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  rBrk = pLevel->a
20960 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33  ddrNxt = sqlite3
20970 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
20980 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 70  ;.  addrCont = p
20990 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20  Level->addrCont 
209a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
209b0 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a  eLabel(v);..  /*
209c0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
209d0 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61  right table of a
209e0 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
209f0 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20  , allocate and. 
20a00 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61   ** initialize a
20a10 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61   memory cell tha
20a20 74 20 72 65 63 6f 72 64 73 20 69 66 20 74 68 69  t records if thi
20a30 73 20 74 61 62 6c 65 20 6d 61 74 63 68 65 73 20  s table matches 
20a40 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  any.  ** row of 
20a50 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f  the left table o
20a60 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f  f the join..  */
20a70 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69  .  if( pLevel->i
20a80 46 72 6f 6d 3e 30 20 26 26 20 28 70 54 61 62 49  From>0 && (pTabI
20a90 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20  tem[0].jointype 
20aa0 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b  & JT_LEFT)!=0 ){
20ab0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  .    pLevel->iLe
20ac0 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73  ftJoin = ++pPars
20ad0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
20ae0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
20af0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
20b00 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
20b10 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  in);.    VdbeCom
20b20 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69 74 20 4c  ment((v, "init L
20b30 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63  EFT JOIN no-matc
20b40 68 20 66 6c 61 67 22 29 29 3b 0a 20 20 7d 0a 0a  h flag"));.  }..
20b50 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
20b60 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
20b70 0a 20 20 69 66 28 20 20 28 70 4c 65 76 65 6c 2d  .  if(  (pLevel-
20b80 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
20b90 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
20ba0 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  LE)!=0 ){.    /*
20bb0 20 43 61 73 65 20 30 3a 20 20 54 68 65 20 74 61   Case 0:  The ta
20bc0 62 6c 65 20 69 73 20 61 20 76 69 72 74 75 61 6c  ble is a virtual
20bd0 2d 74 61 62 6c 65 2e 20 20 55 73 65 20 74 68 65  -table.  Use the
20be0 20 56 46 69 6c 74 65 72 20 61 6e 64 20 56 4e 65   VFilter and VNe
20bf0 78 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  xt.    **       
20c00 20 20 20 74 6f 20 61 63 63 65 73 73 20 74 68 65     to access the
20c10 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20   data..    */.  
20c20 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a    int iReg;   /*
20c30 20 50 33 20 56 61 6c 75 65 20 66 6f 72 20 4f 50   P3 Value for OP
20c40 5f 56 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20  _VFilter */.    
20c50 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
20c60 66 6f 20 2a 70 56 74 61 62 49 64 78 20 3d 20 70  fo *pVtabIdx = p
20c70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 56  Level->plan.u.pV
20c80 74 61 62 49 64 78 3b 0a 20 20 20 20 69 6e 74 20  tabIdx;.    int 
20c90 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 56  nConstraint = pV
20ca0 74 61 62 49 64 78 2d 3e 6e 43 6f 6e 73 74 72 61  tabIdx->nConstra
20cb0 69 6e 74 3b 0a 20 20 20 20 73 74 72 75 63 74 20  int;.    struct 
20cc0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
20cd0 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a  nstraint_usage *
20ce0 61 55 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20  aUsage =.       
20cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d10 20 20 20 20 20 20 20 20 20 70 56 74 61 62 49 64           pVtabId
20d20 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  x->aConstraintUs
20d30 61 67 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73  age;.    const s
20d40 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
20d50 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a  dex_constraint *
20d60 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 0a 20 20  aConstraint =.  
20d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56                pV
20da0 74 61 62 49 64 78 2d 3e 61 43 6f 6e 73 74 72 61  tabIdx->aConstra
20db0 69 6e 74 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  int;..    sqlite
20dc0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
20dd0 50 61 72 73 65 29 3b 0a 20 20 20 20 69 52 65 67  Parse);.    iReg
20de0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
20df0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
20e00 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20  Constraint+2);. 
20e10 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 6e     for(j=1; j<=n
20e20 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29  Constraint; j++)
20e30 7b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b  {.      for(k=0;
20e40 20 6b 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20   k<nConstraint; 
20e50 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  k++){.        if
20e60 28 20 61 55 73 61 67 65 5b 6b 5d 2e 61 72 67 76  ( aUsage[k].argv
20e70 49 6e 64 65 78 3d 3d 6a 20 29 7b 0a 20 20 20 20  Index==j ){.    
20e80 20 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d 20        int iTerm 
20e90 3d 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 6b 5d  = aConstraint[k]
20ea0 2e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20  .iTermOffset;.  
20eb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
20ec0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
20ed0 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45  pWC->a[iTerm].pE
20ee0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 52 65  xpr->pRight, iRe
20ef0 67 2b 6a 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  g+j+1);.        
20f00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
20f10 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
20f20 20 69 66 28 20 6b 3d 3d 6e 43 6f 6e 73 74 72 61   if( k==nConstra
20f30 69 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  int ) break;.   
20f40 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
20f50 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
20f60 6e 74 65 67 65 72 2c 20 70 56 74 61 62 49 64 78  nteger, pVtabIdx
20f70 2d 3e 69 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b  ->idxNum, iReg);
20f80 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
20f90 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
20fa0 65 67 65 72 2c 20 6a 2d 31 2c 20 69 52 65 67 2b  eger, j-1, iReg+
20fb0 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
20fc0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
20fd0 56 46 69 6c 74 65 72 2c 20 69 43 75 72 2c 20 61  VFilter, iCur, a
20fe0 64 64 72 42 72 6b 2c 20 69 52 65 67 2c 20 70 56  ddrBrk, iReg, pV
20ff0 74 61 62 49 64 78 2d 3e 69 64 78 53 74 72 2c 0a  tabIdx->idxStr,.
21000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21010 20 20 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e        pVtabIdx->
21020 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
21030 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46 20 3a 20   ? P4_MPRINTF : 
21040 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P4_STATIC);.    
21050 70 56 74 61 62 49 64 78 2d 3e 6e 65 65 64 54 6f  pVtabIdx->needTo
21060 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a  FreeIdxStr = 0;.
21070 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
21080 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29  Constraint; j++)
21090 7b 0a 20 20 20 20 20 20 69 66 28 20 61 55 73 61  {.      if( aUsa
210a0 67 65 5b 6a 5d 2e 6f 6d 69 74 20 29 7b 0a 20 20  ge[j].omit ){.  
210b0 20 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d 20        int iTerm 
210c0 3d 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 6a 5d  = aConstraint[j]
210d0 2e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20  .iTermOffset;.  
210e0 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
210f0 6d 28 70 4c 65 76 65 6c 2c 20 26 70 57 43 2d 3e  m(pLevel, &pWC->
21100 61 5b 69 54 65 72 6d 5d 29 3b 0a 20 20 20 20 20  a[iTerm]);.     
21110 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65   }.    }.    pLe
21120 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65  vel->op = OP_VNe
21130 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  xt;.    pLevel->
21140 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70  p1 = iCur;.    p
21150 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69  Level->p2 = sqli
21160 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
21170 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  dr(v);.    sqlit
21180 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
21190 67 65 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c  ge(pParse, iReg,
211a0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b   nConstraint+2);
211b0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
211c0 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c  CachePop(pParse,
211d0 20 31 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e   1);.  }else.#en
211e0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
211f0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
21200 2a 2f 0a 0a 20 20 69 66 28 20 70 4c 65 76 65 6c  */..  if( pLevel
21210 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
21220 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20   WHERE_ROWID_EQ 
21230 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 31  ){.    /* Case 1
21240 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65 63 74  :  We can direct
21250 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61 20 73  ly reference a s
21260 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20  ingle row using 
21270 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  an.    **       
21280 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70     equality comp
21290 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74  arison against t
212a0 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 20  he ROWID field. 
212b0 20 4f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   Or.    **      
212c0 20 20 20 20 77 65 20 72 65 66 65 72 65 6e 63 65      we reference
212d0 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 75   multiple rows u
212e0 73 69 6e 67 20 61 20 22 72 6f 77 69 64 20 49 4e  sing a "rowid IN
212f0 20 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 20   (...)".    **  
21300 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63          construc
21310 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 52  t..    */.    iR
21320 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69  eleaseReg = sqli
21330 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
21340 61 72 73 65 29 3b 0a 20 20 20 20 70 54 65 72 6d  arse);.    pTerm
21350 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
21360 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65   iCur, -1, notRe
21370 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  ady, WO_EQ|WO_IN
21380 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
21390 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20  ( pTerm!=0 );.  
213a0 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
213b0 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20  >pExpr!=0 );.   
213c0 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
213d0 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
213e0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
213f0 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a  omitTable==0 );.
21400 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
21410 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
21420 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f  ERM_VIRTUAL ); /
21430 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31  * EV: R-30575-11
21440 36 36 32 20 2a 2f 0a 20 20 20 20 69 52 6f 77 69  662 */.    iRowi
21450 64 52 65 67 20 3d 20 63 6f 64 65 45 71 75 61 6c  dReg = codeEqual
21460 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20  ityTerm(pParse, 
21470 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 69  pTerm, pLevel, i
21480 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 20 20 20  ReleaseReg);.   
21490 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65   addrNxt = pLeve
214a0 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20 20  l->addrNxt;.    
214b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
214c0 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  2(v, OP_MustBeIn
214d0 74 2c 20 69 52 6f 77 69 64 52 65 67 2c 20 61 64  t, iRowidReg, ad
214e0 64 72 4e 78 74 29 3b 0a 20 20 20 20 73 71 6c 69  drNxt);.    sqli
214f0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
21500 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69   OP_NotExists, i
21510 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 69 52  Cur, addrNxt, iR
21520 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 73 71  owidReg);.    sq
21530 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74  lite3ExprCacheSt
21540 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72  ore(pParse, iCur
21550 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29  , -1, iRowidReg)
21560 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
21570 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20  t((v, "pk"));.  
21580 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
21590 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 20  P_Noop;.  }else 
215a0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
215b0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
215c0 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20 29 7b 0a  _ROWID_RANGE ){.
215d0 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20      /* Case 2:  
215e0 57 65 20 68 61 76 65 20 61 6e 20 69 6e 65 71 75  We have an inequ
215f0 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e  ality comparison
21600 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57   against the ROW
21610 49 44 20 66 69 65 6c 64 2e 0a 20 20 20 20 2a 2f  ID field..    */
21620 0a 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70 20  .    int testOp 
21630 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69  = OP_Noop;.    i
21640 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20 69 6e  nt start;.    in
21650 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20  t memEndValue = 
21660 30 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  0;.    WhereTerm
21670 20 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b   *pStart, *pEnd;
21680 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d  ..    assert( om
21690 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  itTable==0 );.  
216a0 20 20 70 53 74 61 72 74 20 3d 20 66 69 6e 64 54    pStart = findT
216b0 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d  erm(pWC, iCur, -
216c0 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  1, notReady, WO_
216d0 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a 20 20  GT|WO_GE, 0);.  
216e0 20 20 70 45 6e 64 20 3d 20 66 69 6e 64 54 65 72    pEnd = findTer
216f0 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c  m(pWC, iCur, -1,
21700 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54   notReady, WO_LT
21710 7c 57 4f 5f 4c 45 2c 20 30 29 3b 0a 20 20 20 20  |WO_LE, 0);.    
21720 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20  if( bRev ){.    
21730 20 20 70 54 65 72 6d 20 3d 20 70 53 74 61 72 74    pTerm = pStart
21740 3b 0a 20 20 20 20 20 20 70 53 74 61 72 74 20 3d  ;.      pStart =
21750 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 45 6e   pEnd;.      pEn
21760 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d  d = pTerm;.    }
21770 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20  .    if( pStart 
21780 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
21790 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  X;             /
217a0 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
217b0 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
217c0 65 20 73 74 61 72 74 20 62 6f 75 6e 64 20 2a 2f  e start bound */
217d0 0a 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72  .      int r1, r
217e0 54 65 6d 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  Temp;        /* 
217f0 52 65 67 69 73 74 65 72 73 20 66 6f 72 20 68 6f  Registers for ho
21800 6c 64 69 6e 67 20 74 68 65 20 73 74 61 72 74 20  lding the start 
21810 62 6f 75 6e 64 61 72 79 20 2a 2f 0a 0a 20 20 20  boundary */..   
21820 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
21830 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20 6d 61 70  ing constant map
21840 73 20 54 4b 5f 78 78 20 63 6f 64 65 73 20 69 6e  s TK_xx codes in
21850 74 6f 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  to corresponding
21860 20 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 6b 20   .      ** seek 
21870 6f 70 63 6f 64 65 73 2e 20 20 49 74 20 64 65 70  opcodes.  It dep
21880 65 6e 64 73 20 6f 6e 20 61 20 70 61 72 74 69 63  ends on a partic
21890 75 6c 61 72 20 6f 72 64 65 72 69 6e 67 20 6f 66  ular ordering of
218a0 20 54 4b 5f 78 78 0a 20 20 20 20 20 20 2a 2f 0a   TK_xx.      */.
218b0 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 61        const u8 a
218c0 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20  MoveOp[] = {.   
218d0 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 54          /* TK_GT
218e0 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 74 2c 0a   */  OP_SeekGt,.
218f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b             /* TK
21900 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c  _LE */  OP_SeekL
21910 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,.           /*
21920 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f 50 5f 53 65   TK_LT */  OP_Se
21930 65 6b 4c 74 2c 0a 20 20 20 20 20 20 20 20 20 20  ekLt,.          
21940 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20 20 4f 50   /* TK_GE */  OP
21950 5f 53 65 65 6b 47 65 0a 20 20 20 20 20 20 7d 3b  _SeekGe.      };
21960 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
21970 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b  K_LE==TK_GT+1 );
21980 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
21990 72 65 20 74 68 65 20 6f 72 64 65 72 69 6e 67 2e  re the ordering.
219a0 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
219b0 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b  t( TK_LT==TK_GT+
219c0 32 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e  2 );      /*  ..
219d0 2e 20 6f 66 20 74 68 65 20 54 4b 5f 78 78 20 76  . of the TK_xx v
219e0 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20  alues... */.    
219f0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d    assert( TK_GE=
21a00 3d 54 4b 5f 47 54 2b 33 20 29 3b 20 20 20 20 20  =TK_GT+3 );     
21a10 20 2f 2a 20 20 2e 2e 2e 20 69 73 20 63 6f 72 72   /*  ... is corr
21a20 65 63 63 74 2e 20 2a 2f 0a 0a 20 20 20 20 20 20  ecct. */..      
21a30 74 65 73 74 63 61 73 65 28 20 70 53 74 61 72 74  testcase( pStart
21a40 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
21a50 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45  _VIRTUAL ); /* E
21a60 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32  V: R-30575-11662
21a70 20 2a 2f 0a 20 20 20 20 20 20 70 58 20 3d 20 70   */.      pX = p
21a80 53 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20  Start->pExpr;.  
21a90 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21 3d      assert( pX!=
21aa0 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
21ab0 74 28 20 70 53 74 61 72 74 2d 3e 6c 65 66 74 43  t( pStart->leftC
21ac0 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20  ursor==iCur );. 
21ad0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
21ae0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
21af0 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74  arse, pX->pRight
21b00 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20 20 20 20  , &rTemp);.     
21b10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21b20 70 33 28 76 2c 20 61 4d 6f 76 65 4f 70 5b 70 58  p3(v, aMoveOp[pX
21b30 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69 43 75  ->op-TK_GT], iCu
21b40 72 2c 20 61 64 64 72 42 72 6b 2c 20 72 31 29 3b  r, addrBrk, r1);
21b50 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
21b60 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20  nt((v, "pk"));. 
21b70 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
21b80 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
21b90 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20  nge(pParse, r1, 
21ba0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
21bb0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
21bc0 70 50 61 72 73 65 2c 20 72 54 65 6d 70 29 3b 0a  pParse, rTemp);.
21bd0 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
21be0 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61 72 74  m(pLevel, pStart
21bf0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
21c00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21c10 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20 3f 20  ddOp2(v, bRev ? 
21c20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77  OP_Last : OP_Rew
21c30 69 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72 42  ind, iCur, addrB
21c40 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  rk);.    }.    i
21c50 66 28 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  f( pEnd ){.     
21c60 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20   Expr *pX;.     
21c70 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70   pX = pEnd->pExp
21c80 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
21c90 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20   pX!=0 );.      
21ca0 61 73 73 65 72 74 28 20 70 45 6e 64 2d 3e 6c 65  assert( pEnd->le
21cb0 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29  ftCursor==iCur )
21cc0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
21cd0 28 20 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20  ( pEnd->wtFlags 
21ce0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
21cf0 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35  ; /* EV: R-30575
21d00 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 20 20  -11662 */.      
21d10 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 2b 2b  memEndValue = ++
21d20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
21d30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
21d40 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  ode(pParse, pX->
21d50 70 52 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56 61  pRight, memEndVa
21d60 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  lue);.      if( 
21d70 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c  pX->op==TK_LT ||
21d80 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29   pX->op==TK_GT )
21d90 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70  {.        testOp
21da0 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20   = bRev ? OP_Le 
21db0 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 7d  : OP_Ge;.      }
21dc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65  else{.        te
21dd0 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  stOp = bRev ? OP
21de0 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20 20  _Lt : OP_Gt;.   
21df0 20 20 20 7d 0a 20 20 20 20 20 20 64 69 73 61 62     }.      disab
21e00 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
21e10 45 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  End);.    }.    
21e20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  start = sqlite3V
21e30 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
21e40 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  );.    pLevel->o
21e50 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72  p = bRev ? OP_Pr
21e60 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  ev : OP_Next;.  
21e70 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69    pLevel->p1 = i
21e80 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  Cur;.    pLevel-
21e90 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20  >p2 = start;.   
21ea0 20 69 66 28 20 70 53 74 61 72 74 3d 3d 30 20 26   if( pStart==0 &
21eb0 26 20 70 45 6e 64 3d 3d 30 20 29 7b 0a 20 20 20  & pEnd==0 ){.   
21ec0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20     pLevel->p5 = 
21ed0 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
21ee0 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b  S_FULLSCAN_STEP;
21ef0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21f00 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c    assert( pLevel
21f10 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  ->p5==0 );.    }
21f20 0a 20 20 20 20 69 66 28 20 74 65 73 74 4f 70 21  .    if( testOp!
21f30 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20  =OP_Noop ){.    
21f40 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 69 52    iRowidReg = iR
21f50 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69  eleaseReg = sqli
21f60 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
21f70 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
21f80 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
21f90 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75 72  , OP_Rowid, iCur
21fa0 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
21fb0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
21fc0 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65  acheStore(pParse
21fd0 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77  , iCur, -1, iRow
21fe0 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71  idReg);.      sq
21ff0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
22000 76 2c 20 74 65 73 74 4f 70 2c 20 6d 65 6d 45 6e  v, testOp, memEn
22010 64 56 61 6c 75 65 2c 20 61 64 64 72 42 72 6b 2c  dValue, addrBrk,
22020 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
22030 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
22040 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
22050 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 20 53  _AFF_NUMERIC | S
22060 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
22070 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
22080 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61   if( pLevel->pla
22090 6e 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  n.wsFlags & (WHE
220a0 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c  RE_COLUMN_RANGE|
220b0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29  WHERE_COLUMN_EQ)
220c0 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
220d0 33 3a 20 41 20 73 63 61 6e 20 75 73 69 6e 67 20  3: A scan using 
220e0 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a  an index..    **
220f0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
22100 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
22110 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65 72   may contain zer
22120 6f 20 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c 69  o or more equali
22130 74 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ty .    **      
22140 20 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20 6f     terms ("==" o
22150 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73  r "IN" operators
22160 29 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  ) that refer to 
22170 74 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20 20  the N.    **    
22180 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20 63       left-most c
22190 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e  olumns of the in
221a0 64 65 78 2e 20 49 74 20 6d 61 79 20 61 6c 73 6f  dex. It may also
221b0 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20   contain.    ** 
221c0 20 20 20 20 20 20 20 20 69 6e 65 71 75 61 6c 69          inequali
221d0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28  ty constraints (
221e0 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20  >, <, >= or <=) 
221f0 6f 6e 20 74 68 65 20 69 6e 64 65 78 65 64 0a 20  on the indexed. 
22200 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f     **         co
22210 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64 69  lumn that immedi
22220 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68  ately follows th
22230 65 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e 20  e N equalities. 
22240 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20 20  Only .    **    
22250 20 20 20 20 20 74 68 65 20 72 69 67 68 74 2d 6d       the right-m
22260 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62  ost column can b
22270 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20  e an inequality 
22280 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73 74 0a  - the rest must.
22290 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 75      **         u
222a0 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64 20  se the "==" and 
222b0 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 20  "IN" operators. 
222c0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
222d0 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  the .    **     
222e0 20 20 20 20 69 6e 64 65 78 20 69 73 20 6f 6e 20      index is on 
222f0 28 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74 68  (x,y,z), then th
22300 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61 75  e following clau
22310 73 65 73 20 61 72 65 20 61 6c 6c 20 0a 20 20 20  ses are all .   
22320 20 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 74 69   **         opti
22330 6d 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20 20  mized:.    **.  
22340 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
22350 78 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  x=5.    **      
22360 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d        x=5 AND y=
22370 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  10.    **       
22380 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c 31       x=5 AND y<1
22390 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  0.    **        
223a0 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3e 35 20      x=5 AND y>5 
223b0 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20  AND y<10.    ** 
223c0 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
223d0 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31 30  ND y=5 AND z<=10
223e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
223f0 20 20 20 20 20 20 20 54 68 65 20 7a 3c 31 30 20         The z<10 
22400 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c  term of the foll
22410 6f 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20  owing cannot be 
22420 75 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a  used, only.    *
22430 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 78 3d  *         the x=
22440 35 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20  5 term:.    **. 
22450 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
22460 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20 20   x=5 AND z<10.  
22470 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
22480 20 20 20 20 4e 20 6d 61 79 20 62 65 20 7a 65 72      N may be zer
22490 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69  o if there are i
224a0 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
224b0 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20 20  aints..    **   
224c0 20 20 20 20 20 20 49 66 20 74 68 65 72 65 20 61        If there a
224d0 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74 79  re no inequality
224e0 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68   constraints, th
224f0 65 6e 20 4e 20 69 73 20 61 74 0a 20 20 20 20 2a  en N is at.    *
22500 2a 20 20 20 20 20 20 20 20 20 6c 65 61 73 74 20  *         least 
22510 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  one..    **.    
22520 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69 73 20  **         This 
22530 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73 65  case is also use
22540 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65  d when there are
22550 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
22560 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
22570 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74 20  constraints but 
22580 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c 65  an index is sele
22590 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e 20  cted anyway, in 
225a0 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 20 20 20  order.    **    
225b0 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74 68       to force th
225c0 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 74  e output order t
225d0 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20  o conform to an 
225e0 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20 2a 2f  ORDER BY..    */
225f0 20 20 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f    .    static co
22600 6e 73 74 20 75 38 20 61 53 74 61 72 74 4f 70 5b  nst u8 aStartOp[
22610 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c 0a 20  ] = {.      0,. 
22620 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 4f 50       0,.      OP
22630 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20 20  _Rewind,        
22640 20 20 20 2f 2a 20 32 3a 20 28 21 73 74 61 72 74     /* 2: (!start
22650 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
22660 73 74 61 72 74 45 71 20 26 26 20 20 21 62 52 65  startEq &&  !bRe
22670 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 4c  v) */.      OP_L
22680 61 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ast,            
22690 20 2f 2a 20 33 3a 20 28 21 73 74 61 72 74 5f 63   /* 3: (!start_c
226a0 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73 74  onstraints && st
226b0 61 72 74 45 71 20 26 26 20 20 20 62 52 65 76 29  artEq &&   bRev)
226c0 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65   */.      OP_See
226d0 6b 47 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  kGt,           /
226e0 2a 20 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73  * 4: (start_cons
226f0 74 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61  traints  && !sta
22700 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20 2a  rtEq && !bRev) *
22710 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c  /.      OP_SeekL
22720 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
22730 35 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  5: (start_constr
22740 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72 74  aints  && !start
22750 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a  Eq &&  bRev) */.
22760 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 65 2c        OP_SeekGe,
22770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36 3a             /* 6:
22780 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69   (start_constrai
22790 6e 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71  nts  &&  startEq
227a0 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20   && !bRev) */.  
227b0 20 20 20 20 4f 50 5f 53 65 65 6b 4c 65 20 20 20      OP_SeekLe   
227c0 20 20 20 20 20 20 20 20 20 2f 2a 20 37 3a 20 28           /* 7: (
227d0 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
227e0 73 20 20 26 26 20 20 73 74 61 72 74 45 71 20 26  s  &&  startEq &
227f0 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  &  bRev) */.    
22800 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  };.    static co
22810 6e 73 74 20 75 38 20 61 45 6e 64 4f 70 5b 5d 20  nst u8 aEndOp[] 
22820 3d 20 7b 0a 20 20 20 20 20 20 4f 50 5f 4e 6f 6f  = {.      OP_Noo
22830 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
22840 2a 20 30 3a 20 28 21 65 6e 64 5f 63 6f 6e 73 74  * 0: (!end_const
22850 72 61 69 6e 74 73 29 20 2a 2f 0a 20 20 20 20 20  raints) */.     
22860 20 4f 50 5f 49 64 78 47 45 2c 20 20 20 20 20 20   OP_IdxGE,      
22870 20 20 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e 64        /* 1: (end
22880 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
22890 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
228a0 4f 50 5f 49 64 78 4c 54 20 20 20 20 20 20 20 20  OP_IdxLT        
228b0 20 20 20 20 20 2f 2a 20 32 3a 20 28 65 6e 64 5f       /* 2: (end_
228c0 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 62  constraints && b
228d0 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20  Rev) */.    };. 
228e0 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65     int nEq = pLe
228f0 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3b 20 20  vel->plan.nEq;  
22900 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20  /* Number of == 
22910 6f 72 20 49 4e 20 74 65 72 6d 73 20 2a 2f 0a 20  or IN terms */. 
22920 20 20 20 69 6e 74 20 69 73 4d 69 6e 51 75 65 72     int isMinQuer
22930 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  y = 0;          
22940 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
22950 20 6f 70 74 69 6d 69 7a 65 64 20 53 45 4c 45 43   optimized SELEC
22960 54 20 6d 69 6e 28 78 29 2e 2e 20 2a 2f 0a 20 20  T min(x).. */.  
22970 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20    int regBase;  
22980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22990 2a 20 42 61 73 65 20 72 65 67 69 73 74 65 72 20  * Base register 
229a0 68 6f 6c 64 69 6e 67 20 63 6f 6e 73 74 72 61 69  holding constrai
229b0 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20  nt values */.   
229c0 20 69 6e 74 20 72 31 3b 20 20 20 20 20 20 20 20   int r1;        
229d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
229e0 20 54 65 6d 70 20 72 65 67 69 73 74 65 72 20 2a   Temp register *
229f0 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  /.    WhereTerm 
22a00 2a 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 30  *pRangeStart = 0
22a10 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79  ;  /* Inequality
22a20 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72   constraint at r
22a30 61 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a 20 20  ange start */.  
22a40 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61    WhereTerm *pRa
22a50 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20 20 20 2f  ngeEnd = 0;    /
22a60 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  * Inequality con
22a70 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65  straint at range
22a80 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20   end */.    int 
22a90 73 74 61 72 74 45 71 3b 20 20 20 20 20 20 20 20  startEq;        
22aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
22ab0 20 69 66 20 72 61 6e 67 65 20 73 74 61 72 74 20   if range start 
22ac0 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c  uses ==, >= or <
22ad0 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e 64  = */.    int end
22ae0 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
22af0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
22b00 20 72 61 6e 67 65 20 65 6e 64 20 75 73 65 73 20   range end uses 
22b10 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a  ==, >= or <= */.
22b20 20 20 20 20 69 6e 74 20 73 74 61 72 74 5f 63 6f      int start_co
22b30 6e 73 74 72 61 69 6e 74 73 3b 20 20 20 20 20 20  nstraints;      
22b40 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 72 61 6e   /* Start of ran
22b50 67 65 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65  ge is constraine
22b60 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f  d */.    int nCo
22b70 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20 20  nstraint;       
22b80 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
22b90 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  of constraint te
22ba0 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78  rms */.    Index
22bb0 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
22bc0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
22bd0 6e 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65 20  ndex we will be 
22be0 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  using */.    int
22bf0 20 69 49 64 78 43 75 72 3b 20 20 20 20 20 20 20   iIdxCur;       
22c00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
22c10 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72   VDBE cursor for
22c20 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
22c30 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67 20    int nExtraReg 
22c40 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
22c50 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72  * Number of extr
22c60 61 20 72 65 67 69 73 74 65 72 73 20 6e 65 65 64  a registers need
22c70 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70  ed */.    int op
22c80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22c90 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75         /* Instru
22ca0 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a  ction opcode */.
22cb0 20 20 20 20 63 68 61 72 20 2a 7a 53 74 61 72 74      char *zStart
22cc0 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Aff;            
22cd0 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72   /* Affinity for
22ce0 20 73 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20   start of range 
22cf0 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
22d00 20 20 63 68 61 72 20 2a 7a 45 6e 64 41 66 66 3b    char *zEndAff;
22d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22d20 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20 65  * Affinity for e
22d30 6e 64 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73  nd of range cons
22d40 74 72 61 69 6e 74 20 2a 2f 0a 0a 20 20 20 20 70  traint */..    p
22d50 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c  Idx = pLevel->pl
22d60 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20 69  an.u.pIdx;.    i
22d70 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d  IdxCur = pLevel-
22d80 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 6b 20  >iIdxCur;.    k 
22d90 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
22da0 5b 6e 45 71 5d 3b 20 20 20 20 20 2f 2a 20 43 6f  [nEq];     /* Co
22db0 6c 75 6d 6e 20 66 6f 72 20 69 6e 65 71 75 61 6c  lumn for inequal
22dc0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
22dd0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  */..    /* If th
22de0 69 73 20 6c 6f 6f 70 20 73 61 74 69 73 66 69 65  is loop satisfie
22df0 73 20 61 20 73 6f 72 74 20 6f 72 64 65 72 20 28  s a sort order (
22e00 70 4f 72 64 65 72 42 79 29 20 72 65 71 75 65 73  pOrderBy) reques
22e10 74 20 74 68 61 74 20 0a 20 20 20 20 2a 2a 20 77  t that .    ** w
22e20 61 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  as passed to thi
22e30 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d  s function to im
22e40 70 6c 65 6d 65 6e 74 20 61 20 22 53 45 4c 45 43  plement a "SELEC
22e50 54 20 6d 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20  T min(x) ..." . 
22e60 20 20 20 2a 2a 20 71 75 65 72 79 2c 20 74 68 65     ** query, the
22e70 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  n the caller wil
22e80 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65  l only allow the
22e90 20 6c 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72   loop to run for
22ea0 0a 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65  .    ** a single
22eb0 20 69 74 65 72 61 74 69 6f 6e 2e 20 54 68 69 73   iteration. This
22ec0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
22ed0 66 69 72 73 74 20 72 6f 77 20 72 65 74 75 72 6e  first row return
22ee0 65 64 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64  ed.    ** should
22ef0 20 6e 6f 74 20 68 61 76 65 20 61 20 4e 55 4c 4c   not have a NULL
22f00 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
22f10 20 27 78 27 2e 20 49 66 20 63 6f 6c 75 6d 6e 20   'x'. If column 
22f20 27 78 27 20 69 73 0a 20 20 20 20 2a 2a 20 74 68  'x' is.    ** th
22f30 65 20 66 69 72 73 74 20 6f 6e 65 20 61 66 74 65  e first one afte
22f40 72 20 74 68 65 20 6e 45 71 20 65 71 75 61 6c 69  r the nEq equali
22f50 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69  ty constraints i
22f60 6e 20 74 68 65 20 69 6e 64 65 78 2c 0a 20 20 20  n the index,.   
22f70 20 2a 2a 20 74 68 69 73 20 72 65 71 75 69 72 65   ** this require
22f80 73 20 73 6f 6d 65 20 73 70 65 63 69 61 6c 20 68  s some special h
22f90 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a  andling..    */.
22fa0 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c      if( (wctrlFl
22fb0 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42  ags&WHERE_ORDERB
22fc0 59 5f 4d 49 4e 29 21 3d 30 0a 20 20 20 20 20 26  Y_MIN)!=0.     &
22fd0 26 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  & (pLevel->plan.
22fe0 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52  wsFlags&WHERE_OR
22ff0 44 45 52 42 59 29 0a 20 20 20 20 20 26 26 20 28  DERBY).     && (
23000 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45  pIdx->nColumn>nE
23010 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  q).    ){.      
23020 2f 2a 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  /* assert( pOrde
23030 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b  rBy->nExpr==1 );
23040 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 61 73 73   */.      /* ass
23050 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 61  ert( pOrderBy->a
23060 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75  [0].pExpr->iColu
23070 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75  mn==pIdx->aiColu
23080 6d 6e 5b 6e 45 71 5d 20 29 3b 20 2a 2f 0a 20 20  mn[nEq] ); */.  
23090 20 20 20 20 69 73 4d 69 6e 51 75 65 72 79 20 3d      isMinQuery =
230a0 20 31 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61   1;.      nExtra
230b0 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  Reg = 1;.    }..
230c0 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79 20      /* Find any 
230d0 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
230e0 72 61 69 6e 74 20 74 65 72 6d 73 20 66 6f 72 20  raint terms for 
230f0 74 68 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e  the start and en
23100 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  d .    ** of the
23110 20 72 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f 0a   range. .    */.
23120 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
23130 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
23140 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29  HERE_TOP_LIMIT )
23150 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65 45 6e  {.      pRangeEn
23160 64 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  d = findTerm(pWC
23170 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65  , iCur, k, notRe
23180 61 64 79 2c 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c  ady, (WO_LT|WO_L
23190 45 29 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  E), pIdx);.     
231a0 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a   nExtraReg = 1;.
231b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
231c0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
231d0 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c  gs & WHERE_BTM_L
231e0 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52  IMIT ){.      pR
231f0 61 6e 67 65 53 74 61 72 74 20 3d 20 66 69 6e 64  angeStart = find
23200 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
23210 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 28 57 4f  k, notReady, (WO
23220 5f 47 54 7c 57 4f 5f 47 45 29 2c 20 70 49 64 78  _GT|WO_GE), pIdx
23230 29 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52  );.      nExtraR
23240 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  eg = 1;.    }.. 
23250 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
23260 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ode to evaluate 
23270 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  all constraint t
23280 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72  erms using == or
23290 20 49 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73   IN.    ** and s
232a0 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 73 20  tore the values 
232b0 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20 69  of those terms i
232c0 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  n an array of re
232d0 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73  gisters.    ** s
232e0 74 61 72 74 69 6e 67 20 61 74 20 72 65 67 42 61  tarting at regBa
232f0 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  se..    */.    r
23300 65 67 42 61 73 65 20 3d 20 63 6f 64 65 41 6c 6c  egBase = codeAll
23310 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20  EqualityTerms(. 
23320 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70         pParse, p
23330 4c 65 76 65 6c 2c 20 70 57 43 2c 20 6e 6f 74 52  Level, pWC, notR
23340 65 61 64 79 2c 20 6e 45 78 74 72 61 52 65 67 2c  eady, nExtraReg,
23350 20 26 7a 53 74 61 72 74 41 66 66 0a 20 20 20 20   &zStartAff.    
23360 29 3b 0a 20 20 20 20 7a 45 6e 64 41 66 66 20 3d  );.    zEndAff =
23370 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
23380 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 53 74  (pParse->db, zSt
23390 61 72 74 41 66 66 29 3b 0a 20 20 20 20 61 64 64  artAff);.    add
233a0 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  rNxt = pLevel->a
233b0 64 64 72 4e 78 74 3b 0a 0a 20 20 20 20 2f 2a 20  ddrNxt;..    /* 
233c0 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20  If we are doing 
233d0 61 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  a reverse order 
233e0 73 63 61 6e 20 6f 6e 20 61 6e 20 61 73 63 65 6e  scan on an ascen
233f0 64 69 6e 67 20 69 6e 64 65 78 2c 20 6f 72 0a 20  ding index, or. 
23400 20 20 20 2a 2a 20 61 20 66 6f 72 77 61 72 64 20     ** a forward 
23410 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 20  order scan on a 
23420 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78  descending index
23430 2c 20 69 6e 74 65 72 63 68 61 6e 67 65 20 74 68  , interchange th
23440 65 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 20  e .    ** start 
23450 61 6e 64 20 65 6e 64 20 74 65 72 6d 73 20 28 70  and end terms (p
23460 52 61 6e 67 65 53 74 61 72 74 20 61 6e 64 20 70  RangeStart and p
23470 52 61 6e 67 65 45 6e 64 29 2e 0a 20 20 20 20 2a  RangeEnd)..    *
23480 2f 0a 20 20 20 20 69 66 28 20 6e 45 71 3c 70 49  /.    if( nEq<pI
23490 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 62  dx->nColumn && b
234a0 52 65 76 3d 3d 28 70 49 64 78 2d 3e 61 53 6f 72  Rev==(pIdx->aSor
234b0 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c  tOrder[nEq]==SQL
234c0 49 54 45 5f 53 4f 5f 41 53 43 29 20 29 7b 0a 20  ITE_SO_ASC) ){. 
234d0 20 20 20 20 20 53 57 41 50 28 57 68 65 72 65 54       SWAP(WhereT
234e0 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64  erm *, pRangeEnd
234f0 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a  , pRangeStart);.
23500 20 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74 63      }..    testc
23510 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74  ase( pRangeStart
23520 20 26 26 20 70 52 61 6e 67 65 53 74 61 72 74 2d   && pRangeStart-
23530 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
23540 4c 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  LE );.    testca
23550 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20  se( pRangeStart 
23560 26 26 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  && pRangeStart->
23570 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47  eOperator & WO_G
23580 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  E );.    testcas
23590 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20  e( pRangeEnd && 
235a0 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72  pRangeEnd->eOper
235b0 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a  ator & WO_LE );.
235c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
235d0 61 6e 67 65 45 6e 64 20 26 26 20 70 52 61 6e 67  angeEnd && pRang
235e0 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20  eEnd->eOperator 
235f0 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 73  & WO_GE );.    s
23600 74 61 72 74 45 71 20 3d 20 21 70 52 61 6e 67 65  tartEq = !pRange
23610 53 74 61 72 74 20 7c 7c 20 70 52 61 6e 67 65 53  Start || pRangeS
23620 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20  tart->eOperator 
23630 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b  & (WO_LE|WO_GE);
23640 0a 20 20 20 20 65 6e 64 45 71 20 3d 20 20 20 21  .    endEq =   !
23650 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52 61  pRangeEnd || pRa
23660 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f  ngeEnd->eOperato
23670 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45  r & (WO_LE|WO_GE
23680 29 3b 0a 20 20 20 20 73 74 61 72 74 5f 63 6f 6e  );.    start_con
23690 73 74 72 61 69 6e 74 73 20 3d 20 70 52 61 6e 67  straints = pRang
236a0 65 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b  eStart || nEq>0;
236b0 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68  ..    /* Seek th
236c0 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 74  e index cursor t
236d0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
236e0 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20  he range. */.   
236f0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e   nConstraint = n
23700 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e  Eq;.    if( pRan
23710 67 65 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20  geStart ){.     
23720 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
23730 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 70 45 78  pRangeStart->pEx
23740 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
23750 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
23760 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  e(pParse, pRight
23770 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a  , regBase+nEq);.
23780 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
23790 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28  rCodeIsNullJump(
237a0 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61  v, pRight, regBa
237b0 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29  se+nEq, addrNxt)
237c0 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 53 74 61  ;.      if( zSta
237d0 72 74 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20  rtAff ){.       
237e0 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70   if( sqlite3Comp
237f0 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67  areAffinity(pRig
23800 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45  ht, zStartAff[nE
23810 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  q])==SQLITE_AFF_
23820 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20 20 20  NONE){.         
23830 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f   /* Since the co
23840 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62  mparison is to b
23850 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68  e performed with
23860 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a   no conversions.
23870 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70            ** app
23880 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72  lied to the oper
23890 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61 66  ands, set the af
238a0 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20  finity to apply 
238b0 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20  to pRight to .  
238c0 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54          ** SQLIT
238d0 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a  E_AFF_NONE.  */.
238e0 20 20 20 20 20 20 20 20 20 20 7a 53 74 61 72 74            zStart
238f0 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54  Aff[nEq] = SQLIT
23900 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
23910 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
23920 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65  ( sqlite3ExprNee
23930 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e  dsNoAffinityChan
23940 67 65 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72  ge(pRight, zStar
23950 74 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20  tAff[nEq]) ){.  
23960 20 20 20 20 20 20 20 20 7a 53 74 61 72 74 41 66          zStartAf
23970 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f  f[nEq] = SQLITE_
23980 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
23990 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20    }.      }  .  
239a0 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b      nConstraint+
239b0 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  +;.      testcas
239c0 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  e( pRangeStart->
239d0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
239e0 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a  IRTUAL ); /* EV:
239f0 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a   R-30575-11662 *
23a00 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  /.    }else if( 
23a10 69 73 4d 69 6e 51 75 65 72 79 20 29 7b 0a 20 20  isMinQuery ){.  
23a20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
23a30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
23a40 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  , 0, regBase+nEq
23a50 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72  );.      nConstr
23a60 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 74  aint++;.      st
23a70 61 72 74 45 71 20 3d 20 30 3b 0a 20 20 20 20 20  artEq = 0;.     
23a80 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e   start_constrain
23a90 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ts = 1;.    }.  
23aa0 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e    codeApplyAffin
23ab0 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67 42  ity(pParse, regB
23ac0 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ase, nConstraint
23ad0 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20  , zStartAff);.  
23ae0 20 20 6f 70 20 3d 20 61 53 74 61 72 74 4f 70 5b    op = aStartOp[
23af0 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
23b00 74 73 3c 3c 32 29 20 2b 20 28 73 74 61 72 74 45  ts<<2) + (startE
23b10 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20  q<<1) + bRev];. 
23b20 20 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 30     assert( op!=0
23b30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
23b40 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20  ( op==OP_Rewind 
23b50 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
23b60 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a   op==OP_Last );.
23b70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
23b80 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29 3b 0a 20  ==OP_SeekGt );. 
23b90 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
23ba0 3d 4f 50 5f 53 65 65 6b 47 65 20 29 3b 0a 20 20  =OP_SeekGe );.  
23bb0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
23bc0 4f 50 5f 53 65 65 6b 4c 65 20 29 3b 0a 20 20 20  OP_SeekLe );.   
23bd0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
23be0 50 5f 53 65 65 6b 4c 74 20 29 3b 0a 20 20 20 20  P_SeekLt );.    
23bf0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23c00 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78  4Int(v, op, iIdx
23c10 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65  Cur, addrNxt, re
23c20 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  gBase, nConstrai
23c30 6e 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61  nt);..    /* Loa
23c40 64 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  d the value for 
23c50 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63  the inequality c
23c60 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 74 68 65  onstraint at the
23c70 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20   end of the.    
23c80 2a 2a 20 72 61 6e 67 65 20 28 69 66 20 61 6e 79  ** range (if any
23c90 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43  )..    */.    nC
23ca0 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b  onstraint = nEq;
23cb0 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 45  .    if( pRangeE
23cc0 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  nd ){.      Expr
23cd0 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67   *pRight = pRang
23ce0 65 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69  eEnd->pExpr->pRi
23cf0 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ght;.      sqlit
23d00 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
23d10 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
23d20 65 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20 20 20  e+nEq, 1);.     
23d30 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
23d40 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
23d50 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
23d60 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
23d70 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76  CodeIsNullJump(v
23d80 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73  , pRight, regBas
23d90 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b  e+nEq, addrNxt);
23da0 0a 20 20 20 20 20 20 69 66 28 20 7a 45 6e 64 41  .      if( zEndA
23db0 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ff ){.        if
23dc0 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  ( sqlite3Compare
23dd0 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c  Affinity(pRight,
23de0 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 29 3d 3d   zEndAff[nEq])==
23df0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29  SQLITE_AFF_NONE)
23e00 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  {.          /* S
23e10 69 6e 63 65 20 74 68 65 20 63 6f 6d 70 61 72 69  ince the compari
23e20 73 6f 6e 20 69 73 20 74 6f 20 62 65 20 70 65 72  son is to be per
23e30 66 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f 20 63  formed with no c
23e40 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20 20 20  onversions.     
23e50 20 20 20 20 20 2a 2a 20 61 70 70 6c 69 65 64 20       ** applied 
23e60 74 6f 20 74 68 65 20 6f 70 65 72 61 6e 64 73 2c  to the operands,
23e70 20 73 65 74 20 74 68 65 20 61 66 66 69 6e 69 74   set the affinit
23e80 79 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 52  y to apply to pR
23e90 69 67 68 74 20 74 6f 20 0a 20 20 20 20 20 20 20  ight to .       
23ea0 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46     ** SQLITE_AFF
23eb0 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20 20  _NONE.  */.     
23ec0 20 20 20 20 20 7a 45 6e 64 41 66 66 5b 6e 45 71       zEndAff[nEq
23ed0 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ] = SQLITE_AFF_N
23ee0 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ONE;.        }. 
23ef0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
23f00 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66  e3ExprNeedsNoAff
23f10 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69 67  inityChange(pRig
23f20 68 74 2c 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d  ht, zEndAff[nEq]
23f30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ) ){.          z
23f40 45 6e 64 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51  EndAff[nEq] = SQ
23f50 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
23f60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23f70 20 20 0a 20 20 20 20 20 20 63 6f 64 65 41 70 70    .      codeApp
23f80 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61 72 73  lyAffinity(pPars
23f90 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 71 2b  e, regBase, nEq+
23fa0 31 2c 20 7a 45 6e 64 41 66 66 29 3b 0a 20 20 20  1, zEndAff);.   
23fb0 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b     nConstraint++
23fc0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
23fd0 28 20 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46  ( pRangeEnd->wtF
23fe0 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
23ff0 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d  UAL ); /* EV: R-
24000 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20  30575-11662 */. 
24010 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
24020 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
24030 62 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20  b, zStartAff);. 
24040 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
24050 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 45 6e  (pParse->db, zEn
24060 64 41 66 66 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  dAff);..    /* T
24070 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 62  op of the loop b
24080 6f 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65  ody */.    pLeve
24090 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56  l->p2 = sqlite3V
240a0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
240b0 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  );..    /* Check
240c0 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 63 75   if the index cu
240d0 72 73 6f 72 20 69 73 20 70 61 73 74 20 74 68 65  rsor is past the
240e0 20 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67   end of the rang
240f0 65 2e 20 2a 2f 0a 20 20 20 20 6f 70 20 3d 20 61  e. */.    op = a
24100 45 6e 64 4f 70 5b 28 70 52 61 6e 67 65 45 6e 64  EndOp[(pRangeEnd
24110 20 7c 7c 20 6e 45 71 29 20 2a 20 28 31 20 2b 20   || nEq) * (1 + 
24120 62 52 65 76 29 5d 3b 0a 20 20 20 20 74 65 73 74  bRev)];.    test
24130 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f  case( op==OP_Noo
24140 70 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  p );.    testcas
24150 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20  e( op==OP_IdxGE 
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 49 64 78 4c 54 20 29 3b   op==OP_IdxLT );
24180 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 4f 50 5f  .    if( op!=OP_
24190 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71  Noop ){.      sq
241a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
241b0 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75  nt(v, op, iIdxCu
241c0 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42  r, addrNxt, regB
241d0 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ase, nConstraint
241e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
241f0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
24200 65 6e 64 45 71 21 3d 62 52 65 76 20 3f 31 3a 30  endEq!=bRev ?1:0
24210 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
24220 20 49 66 20 74 68 65 72 65 20 61 72 65 20 69 6e   If there are in
24230 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
24240 69 6e 74 73 2c 20 63 68 65 63 6b 20 74 68 61 74  ints, check that
24250 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 2a   the value.    *
24260 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  * of the table c
24270 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20 69  olumn that the i
24280 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 74 72 61  nequality contra
24290 69 6e 73 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e  ins is not NULL.
242a0 0a 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73  .    ** If it is
242b0 2c 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e 65  , jump to the ne
242c0 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  xt iteration of 
242d0 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  the loop..    */
242e0 0a 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65  .    r1 = sqlite
242f0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
24300 73 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  se);.    testcas
24310 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  e( pLevel->plan.
24320 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
24330 42 54 4d 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20  BTM_LIMIT );.   
24340 20 74 65 73 74 63 61 73 65 28 20 70 4c 65 76 65   testcase( pLeve
24350 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
24360 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
24370 54 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 4c  T );.    if( (pL
24380 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
24390 67 73 20 26 20 28 57 48 45 52 45 5f 42 54 4d 5f  gs & (WHERE_BTM_
243a0 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f  LIMIT|WHERE_TOP_
243b0 4c 49 4d 49 54 29 29 21 3d 30 20 29 7b 0a 20 20  LIMIT))!=0 ){.  
243c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
243d0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
243e0 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6e 45 71  mn, iIdxCur, nEq
243f0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
24400 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
24410 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c  , OP_IsNull, r1,
24420 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20   addrCont);.    
24430 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  }.    sqlite3Rel
24440 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
24450 73 65 2c 20 72 31 29 3b 0a 0a 20 20 20 20 2f 2a  se, r1);..    /*
24460 20 53 65 65 6b 20 74 68 65 20 74 61 62 6c 65 20   Seek the table 
24470 63 75 72 73 6f 72 2c 20 69 66 20 72 65 71 75 69  cursor, if requi
24480 72 65 64 20 2a 2f 0a 20 20 20 20 64 69 73 61 62  red */.    disab
24490 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
244a0 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20  RangeStart);.   
244b0 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
244c0 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b  vel, pRangeEnd);
244d0 0a 20 20 20 20 69 66 28 20 21 6f 6d 69 74 54 61  .    if( !omitTa
244e0 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 52 6f  ble ){.      iRo
244f0 77 69 64 52 65 67 20 3d 20 69 52 65 6c 65 61 73  widReg = iReleas
24500 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65  eReg = sqlite3Ge
24510 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
24520 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
24530 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
24540 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75  IdxRowid, iIdxCu
24550 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  r, iRowidReg);. 
24560 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
24570 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73  CacheStore(pPars
24580 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f  e, iCur, -1, iRo
24590 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73  widReg);.      s
245a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
245b0 28 76 2c 20 4f 50 5f 53 65 65 6b 2c 20 69 43 75  (v, OP_Seek, iCu
245c0 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 20 20  r, iRowidReg);  
245d0 2f 2a 20 44 65 66 65 72 72 65 64 20 73 65 65 6b  /* Deferred seek
245e0 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   */.    }..    /
245f0 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69 6e 73  * Record the ins
24600 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20 74 6f  truction used to
24610 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
24620 6f 6f 70 2e 20 44 69 73 61 62 6c 65 20 0a 20 20  oop. Disable .  
24630 20 20 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73    ** WHERE claus
24640 65 20 74 65 72 6d 73 20 6d 61 64 65 20 72 65 64  e terms made red
24650 75 6e 64 61 6e 74 20 62 79 20 74 68 65 20 69 6e  undant by the in
24660 64 65 78 20 72 61 6e 67 65 20 73 63 61 6e 2e 0a  dex range scan..
24670 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65      */.    pLeve
24680 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f  l->op = bRev ? O
24690 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74  P_Prev : OP_Next
246a0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  ;.    pLevel->p1
246b0 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 7d 65   = iIdxCur;.  }e
246c0 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  lse..#ifndef SQL
246d0 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49  ITE_OMIT_OR_OPTI
246e0 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 70  MIZATION.  if( p
246f0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
24700 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54  ags & WHERE_MULT
24710 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a 20 43  I_OR ){.    /* C
24720 61 73 65 20 34 3a 20 20 54 77 6f 20 6f 72 20 6d  ase 4:  Two or m
24730 6f 72 65 20 73 65 70 61 72 61 74 65 6c 79 20 69  ore separately i
24740 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e  ndexed terms con
24750 6e 65 63 74 65 64 20 62 79 20 4f 52 0a 20 20 20  nected by OR.   
24760 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70   **.    ** Examp
24770 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le:.    **.    *
24780 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
24790 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20 20   t1(a,b,c,d);.  
247a0 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e    **   CREATE IN
247b0 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29 3b  DEX i1 ON t1(a);
247c0 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45  .    **   CREATE
247d0 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 31 28   INDEX i2 ON t1(
247e0 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45  b);.    **   CRE
247f0 41 54 45 20 49 4e 44 45 58 20 69 33 20 4f 4e 20  ATE INDEX i3 ON 
24800 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  t1(c);.    **.  
24810 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20    **   SELECT * 
24820 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d  FROM t1 WHERE a=
24830 35 20 4f 52 20 62 3d 37 20 4f 52 20 28 63 3d 31  5 OR b=7 OR (c=1
24840 31 20 41 4e 44 20 64 3d 31 33 29 0a 20 20 20 20  1 AND d=13).    
24850 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 65  **.    ** In the
24860 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 72 65 20   example, there 
24870 61 72 65 20 74 68 72 65 65 20 69 6e 64 65 78 65  are three indexe
24880 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65  d terms connecte
24890 64 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a 2a 20  d by OR..    ** 
248a0 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c  The top of the l
248b0 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74  oop looks like t
248c0 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  his:.    **.    
248d0 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c  **          Null
248e0 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
248f0 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74          # Zero t
24900 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67  he rowset in reg
24910 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a   1.    **.    **
24920 20 54 68 65 6e 2c 20 66 6f 72 20 65 61 63 68 20   Then, for each 
24930 69 6e 64 65 78 65 64 20 74 65 72 6d 2c 20 74 68  indexed term, th
24940 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68 65  e following. The
24950 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20   arguments to.  
24960 20 20 2a 2a 20 52 6f 77 53 65 74 54 65 73 74 20    ** RowSetTest 
24970 61 72 65 20 73 75 63 68 20 74 68 61 74 20 74 68  are such that th
24980 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 63  e rowid of the c
24990 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 69 6e  urrent row is in
249a0 73 65 72 74 65 64 0a 20 20 20 20 2a 2a 20 69 6e  serted.    ** in
249b0 74 6f 20 74 68 65 20 52 6f 77 53 65 74 2e 20 49  to the RowSet. I
249c0 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
249d0 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74 72 6f 6c  present, control
249e0 20 73 6b 69 70 73 20 74 68 65 0a 20 20 20 20 2a   skips the.    *
249f0 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64 65 20 61  * Gosub opcode a
24a00 6e 64 20 6a 75 6d 70 73 20 73 74 72 61 69 67 68  nd jumps straigh
24a10 74 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65  t to the code ge
24a20 6e 65 72 61 74 65 64 20 62 79 20 57 68 65 72 65  nerated by Where
24a30 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  End()..    **.  
24a40 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69    **        sqli
24a50 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 3c 74  te3WhereBegin(<t
24a60 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20 20 20 20  erm>).    **    
24a70 20 20 20 20 20 20 52 6f 77 53 65 74 54 65 73 74        RowSetTest
24a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a90 20 20 23 20 49 6e 73 65 72 74 20 72 6f 77 69 64    # Insert rowid
24aa0 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a 20 20 20   into rowset.   
24ab0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f 73   **          Gos
24ac0 75 62 20 20 20 20 20 20 32 20 41 0a 20 20 20 20  ub      2 A.    
24ad0 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  **        sqlite
24ae0 33 57 68 65 72 65 45 6e 64 28 29 0a 20 20 20 20  3WhereEnd().    
24af0 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f 77  **.    ** Follow
24b00 69 6e 67 20 74 68 65 20 61 62 6f 76 65 2c 20 63  ing the above, c
24b10 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  ode to terminate
24b20 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c   the loop. Label
24b30 20 41 2c 20 74 68 65 20 74 61 72 67 65 74 0a 20   A, the target. 
24b40 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 47 6f 73     ** of the Gos
24b50 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d 70 73 20  ub above, jumps 
24b60 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63 74 69  to the instructi
24b70 6f 6e 20 72 69 67 68 74 20 61 66 74 65 72 20 74  on right after t
24b80 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a 0a  he Goto..    **.
24b90 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
24ba0 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20  Null       1    
24bb0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 5a 65              # Ze
24bc0 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e  ro the rowset in
24bd0 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 20 20 20   reg 1.    **   
24be0 20 20 20 20 20 20 20 47 6f 74 6f 20 20 20 20 20         Goto     
24bf0 20 20 42 20 20 20 20 20 20 20 20 20 20 20 20 20    B             
24c00 20 20 20 23 20 54 68 65 20 6c 6f 6f 70 20 69 73     # The loop is
24c10 20 66 69 6e 69 73 68 65 64 2e 0a 20 20 20 20 2a   finished..    *
24c20 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41  *.    **       A
24c30 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20 20 20  : <loop body>   
24c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
24c50 52 65 74 75 72 6e 20 64 61 74 61 2c 20 77 68 61  Return data, wha
24c60 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20  tever..    **.  
24c70 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 65    **          Re
24c80 74 75 72 6e 20 20 20 20 20 32 20 20 20 20 20 20  turn     2      
24c90 20 20 20 20 20 20 20 20 20 20 23 20 4a 75 6d 70            # Jump
24ca0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 47 6f 73   back to the Gos
24cb0 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ub.    **.    **
24cc0 20 20 20 20 20 20 20 42 3a 20 3c 61 66 74 65 72         B: <after
24cd0 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20 20 20 2a   the loop>.    *
24ce0 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20 57 68 65  *.    */.    Whe
24cf0 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b  reClause *pOrWc;
24d00 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63 6c      /* The OR-cl
24d10 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20  ause broken out 
24d20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f  into subterms */
24d30 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
24d40 70 46 69 6e 61 6c 3b 20 20 20 20 20 2f 2a 20 46  pFinal;     /* F
24d50 69 6e 61 6c 20 73 75 62 74 65 72 6d 20 77 69 74  inal subterm wit
24d60 68 69 6e 20 74 68 65 20 4f 52 2d 63 6c 61 75 73  hin the OR-claus
24d70 65 2e 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73  e. */.    SrcLis
24d80 74 20 2a 70 4f 72 54 61 62 3b 20 20 20 20 20 20  t *pOrTab;      
24d90 20 2f 2a 20 53 68 6f 72 74 65 6e 65 64 20 74 61   /* Shortened ta
24da0 62 6c 65 20 6c 69 73 74 20 6f 72 20 4f 52 2d 63  ble list or OR-c
24db0 6c 61 75 73 65 20 67 65 6e 65 72 61 74 69 6f 6e  lause generation
24dc0 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 72 65 67   */..    int reg
24dd0 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
24de0 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20  e->nMem;        
24df0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 75     /* Register u
24e00 73 65 64 20 77 69 74 68 20 4f 50 5f 47 6f 73 75  sed with OP_Gosu
24e10 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67  b */.    int reg
24e20 52 6f 77 73 65 74 20 3d 20 30 3b 20 20 20 20 20  Rowset = 0;     
24e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e40 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66     /* Register f
24e50 6f 72 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74  or RowSet object
24e60 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52   */.    int regR
24e70 6f 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20 20  owid = 0;       
24e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e90 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
24ea0 6c 64 69 6e 67 20 72 6f 77 69 64 20 2a 2f 0a 20  lding rowid */. 
24eb0 20 20 20 69 6e 74 20 69 4c 6f 6f 70 42 6f 64 79     int iLoopBody
24ec0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
24ed0 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20  keLabel(v);  /* 
24ee0 53 74 61 72 74 20 6f 66 20 6c 6f 6f 70 20 62 6f  Start of loop bo
24ef0 64 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52  dy */.    int iR
24f00 65 74 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20  etInit;         
24f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
24f30 66 20 72 65 67 52 65 74 75 72 6e 20 69 6e 69 74  f regReturn init
24f40 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 6e 74 65   */.    int unte
24f50 73 74 65 64 54 65 72 6d 73 20 3d 20 30 3b 20 20  stedTerms = 0;  
24f60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f             /* So
24f70 6d 65 20 74 65 72 6d 73 20 6e 6f 74 20 63 6f 6d  me terms not com
24f80 70 6c 65 74 65 6c 79 20 74 65 73 74 65 64 20 2a  pletely tested *
24f90 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  /.    int ii;.  
24fa0 20 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c   .    pTerm = pL
24fb0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 54 65  evel->plan.u.pTe
24fc0 72 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  rm;.    assert( 
24fd0 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20  pTerm!=0 );.    
24fe0 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65  assert( pTerm->e
24ff0 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20  Operator==WO_OR 
25000 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
25010 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
25020 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30   TERM_ORINFO)!=0
25030 20 29 3b 0a 20 20 20 20 70 4f 72 57 63 20 3d 20   );.    pOrWc = 
25040 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66  &pTerm->u.pOrInf
25050 6f 2d 3e 77 63 3b 0a 20 20 20 20 70 46 69 6e 61  o->wc;.    pFina
25060 6c 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 70 4f  l = &pOrWc->a[pO
25070 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 5d 3b 0a 20  rWc->nTerm-1];. 
25080 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
25090 4f 50 5f 52 65 74 75 72 6e 3b 0a 20 20 20 20 70  OP_Return;.    p
250a0 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 72 65 67 52  Level->p1 = regR
250b0 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 53  eturn;..    /* S
250c0 65 74 20 75 70 20 61 20 6e 65 77 20 53 72 63 4c  et up a new SrcL
250d0 69 73 74 20 6e 69 20 70 4f 72 54 61 62 20 63 6f  ist ni pOrTab co
250e0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
250f0 6c 65 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 64  le being scanned
25100 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20  .    ** by this 
25110 6c 6f 6f 70 20 69 6e 20 74 68 65 20 61 5b 30 5d  loop in the a[0]
25120 20 73 6c 6f 74 20 61 6e 64 20 61 6c 6c 20 6e 6f   slot and all no
25130 74 52 65 61 64 79 20 74 61 62 6c 65 73 20 69 6e  tReady tables in
25140 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74 73 2e 0a 20   a[1..] slots.. 
25150 20 20 20 2a 2a 20 54 68 69 73 20 62 65 63 6f 6d     ** This becom
25160 65 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 69  es the SrcList i
25170 6e 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  n the recursive 
25180 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57  call to sqlite3W
25190 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 20 20 20  hereBegin()..   
251a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 49 6e   */.    if( pWIn
251b0 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 7b 0a  fo->nLevel>1 ){.
251c0 20 20 20 20 20 20 69 6e 74 20 6e 4e 6f 74 52 65        int nNotRe
251d0 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ady;            
251e0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
251f0 65 72 20 6f 66 20 6e 6f 74 52 65 61 64 79 20 74  er of notReady t
25200 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 73  ables */.      s
25210 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
25220 65 6d 20 2a 6f 72 69 67 53 72 63 3b 20 20 20 20  em *origSrc;    
25230 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 69 73   /* Original lis
25240 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
25250 20 20 20 20 20 6e 4e 6f 74 52 65 61 64 79 20 3d       nNotReady =
25260 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20   pWInfo->nLevel 
25270 2d 20 69 4c 65 76 65 6c 20 2d 20 31 3b 0a 20 20  - iLevel - 1;.  
25280 20 20 20 20 70 4f 72 54 61 62 20 3d 20 73 71 6c      pOrTab = sql
25290 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61  ite3StackAllocRa
252a0 77 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20  w(pParse->db,.  
252b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252c0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
252d0 28 2a 70 4f 72 54 61 62 29 2b 20 6e 4e 6f 74 52  (*pOrTab)+ nNotR
252e0 65 61 64 79 2a 73 69 7a 65 6f 66 28 70 4f 72 54  eady*sizeof(pOrT
252f0 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20  ab->a[0]));.    
25300 20 20 69 66 28 20 70 4f 72 54 61 62 3d 3d 30 20    if( pOrTab==0 
25310 29 20 72 65 74 75 72 6e 20 6e 6f 74 52 65 61 64  ) return notRead
25320 79 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d  y;.      pOrTab-
25330 3e 6e 41 6c 6c 6f 63 20 3d 20 28 69 31 36 29 28  >nAlloc = (i16)(
25340 6e 4e 6f 74 52 65 61 64 79 20 2b 20 31 29 3b 0a  nNotReady + 1);.
25350 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 53        pOrTab->nS
25360 72 63 20 3d 20 70 4f 72 54 61 62 2d 3e 6e 41 6c  rc = pOrTab->nAl
25370 6c 6f 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  loc;.      memcp
25380 79 28 70 4f 72 54 61 62 2d 3e 61 2c 20 70 54 61  y(pOrTab->a, pTa
25390 62 49 74 65 6d 2c 20 73 69 7a 65 6f 66 28 2a 70  bItem, sizeof(*p
253a0 54 61 62 49 74 65 6d 29 29 3b 0a 20 20 20 20 20  TabItem));.     
253b0 20 6f 72 69 67 53 72 63 20 3d 20 70 57 49 6e 66   origSrc = pWInf
253c0 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a  o->pTabList->a;.
253d0 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b        for(k=1; k
253e0 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b 20 6b 2b 2b  <=nNotReady; k++
253f0 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
25400 79 28 26 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 2c  y(&pOrTab->a[k],
25410 20 26 6f 72 69 67 53 72 63 5b 70 4c 65 76 65 6c   &origSrc[pLevel
25420 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a 65  [k].iFrom], size
25430 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 29  of(pOrTab->a[k])
25440 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
25450 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 72 54  else{.      pOrT
25460 61 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  ab = pWInfo->pTa
25470 62 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  bList;.    }..  
25480 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
25490 74 68 65 20 72 6f 77 73 65 74 20 72 65 67 69 73  the rowset regis
254a0 74 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20 4e  ter to contain N
254b0 55 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e 55 4c 4c  ULL. An SQL NULL
254c0 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 71 75 69   is .    ** equi
254d0 76 61 6c 65 6e 74 20 74 6f 20 61 6e 20 65 6d 70  valent to an emp
254e0 74 79 20 72 6f 77 73 65 74 2e 0a 20 20 20 20 2a  ty rowset..    *
254f0 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 20 69 6e  *.    ** Also in
25500 69 74 69 61 6c 69 7a 65 20 72 65 67 52 65 74 75  itialize regRetu
25510 72 6e 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  rn to contain th
25520 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
25530 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a 20 20   instruction .  
25540 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79    ** immediately
25550 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4f   following the O
25560 50 5f 52 65 74 75 72 6e 20 61 74 20 74 68 65 20  P_Return at the 
25570 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f  bottom of the lo
25580 6f 70 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20  op. This.    ** 
25590 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 61  is required in a
255a0 20 66 65 77 20 6f 62 73 63 75 72 65 20 4c 45 46   few obscure LEF
255b0 54 20 4a 4f 49 4e 20 63 61 73 65 73 20 77 68 65  T JOIN cases whe
255c0 72 65 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73  re control jumps
255d0 0a 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 68 65  .    ** over the
255e0 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70   top of the loop
255f0 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f   into the body o
25600 66 20 69 74 2e 20 49 6e 20 74 68 69 73 20 63 61  f it. In this ca
25610 73 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63  se the .    ** c
25620 6f 72 72 65 63 74 20 72 65 73 70 6f 6e 73 65 20  orrect response 
25630 66 6f 72 20 74 68 65 20 65 6e 64 2d 6f 66 2d 6c  for the end-of-l
25640 6f 6f 70 20 63 6f 64 65 20 28 74 68 65 20 4f 50  oop code (the OP
25650 5f 52 65 74 75 72 6e 29 20 69 73 20 74 6f 20 0a  _Return) is to .
25660 20 20 20 20 2a 2a 20 66 61 6c 6c 20 74 68 72 6f      ** fall thro
25670 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
25680 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 6a 75 73  instruction, jus
25690 74 20 61 73 20 61 6e 20 4f 50 5f 4e 65 78 74 20  t as an OP_Next 
256a0 64 6f 65 73 20 69 66 0a 20 20 20 20 2a 2a 20 63  does if.    ** c
256b0 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e  alled on an unin
256c0 69 74 69 61 6c 69 7a 65 64 20 63 75 72 73 6f 72  itialized cursor
256d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
256e0 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
256f0 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f  HERE_DUPLICATES_
25700 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  OK)==0 ){.      
25710 72 65 67 52 6f 77 73 65 74 20 3d 20 2b 2b 70 50  regRowset = ++pP
25720 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
25730 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70    regRowid = ++p
25740 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
25750 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
25760 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
25770 20 30 2c 20 72 65 67 52 6f 77 73 65 74 29 3b 0a   0, regRowset);.
25780 20 20 20 20 7d 0a 20 20 20 20 69 52 65 74 49 6e      }.    iRetIn
25790 69 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  it = sqlite3Vdbe
257a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
257b0 65 67 65 72 2c 20 30 2c 20 72 65 67 52 65 74 75  eger, 0, regRetu
257c0 72 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69  rn);..    for(ii
257d0 3d 30 3b 20 69 69 3c 70 4f 72 57 63 2d 3e 6e 54  =0; ii<pOrWc->nT
257e0 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  erm; ii++){.    
257f0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72    WhereTerm *pOr
25800 54 65 72 6d 20 3d 20 26 70 4f 72 57 63 2d 3e 61  Term = &pOrWc->a
25810 5b 69 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  [ii];.      if( 
25820 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
25830 73 6f 72 3d 3d 69 43 75 72 20 7c 7c 20 70 4f 72  sor==iCur || pOr
25840 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  Term->eOperator=
25850 3d 57 4f 5f 41 4e 44 20 29 7b 0a 20 20 20 20 20  =WO_AND ){.     
25860 20 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 53     WhereInfo *pS
25870 75 62 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  ubWInfo;        
25880 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 73 69    /* Info for si
25890 6e 67 6c 65 20 4f 52 2d 74 65 72 6d 20 73 63 61  ngle OR-term sca
258a0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 2f 2a 20  n */.        /* 
258b0 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62  Loop through tab
258c0 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  le entries that 
258d0 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65  match term pOrTe
258e0 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  rm. */.        p
258f0 53 75 62 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74  SubWInfo = sqlit
25900 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
25910 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 70 4f 72  rse, pOrTab, pOr
25920 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 30 2c 0a  Term->pExpr, 0,.
25930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25940 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 4f 4d          WHERE_OM
25950 49 54 5f 4f 50 45 4e 20 7c 20 57 48 45 52 45 5f  IT_OPEN | WHERE_
25960 4f 4d 49 54 5f 43 4c 4f 53 45 20 7c 0a 20 20 20  OMIT_CLOSE |.   
25970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25980 20 20 20 20 20 57 48 45 52 45 5f 46 4f 52 43 45       WHERE_FORCE
25990 5f 54 41 42 4c 45 20 7c 20 57 48 45 52 45 5f 4f  _TABLE | WHERE_O
259a0 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 3b 0a 20  NETABLE_ONLY);. 
259b0 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57         if( pSubW
259c0 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
259d0 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e    explainOneScan
259e0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
259f0 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20  pParse, pOrTab, 
25a00 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d  &pSubWInfo->a[0]
25a10 2c 20 69 4c 65 76 65 6c 2c 20 70 4c 65 76 65 6c  , iLevel, pLevel
25a20 2d 3e 69 46 72 6f 6d 2c 20 30 0a 20 20 20 20 20  ->iFrom, 0.     
25a30 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
25a40 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
25a50 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43  s & WHERE_DUPLIC
25a60 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20  ATES_OK)==0 ){. 
25a70 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
25a80 53 65 74 20 3d 20 28 28 69 69 3d 3d 70 4f 72 57  Set = ((ii==pOrW
25a90 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31 3a 69  c->nTerm-1)?-1:i
25aa0 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
25ab0 69 6e 74 20 72 3b 0a 20 20 20 20 20 20 20 20 20  int r;.         
25ac0 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33 45 78     r = sqlite3Ex
25ad0 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
25ae0 70 50 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d  pParse, pTabItem
25af0 2d 3e 70 54 61 62 2c 20 2d 31 2c 20 69 43 75 72  ->pTab, -1, iCur
25b00 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
25b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52              regR
25b30 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20  owid);.         
25b40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
25b50 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 52 6f  dOp4Int(v, OP_Ro
25b60 77 53 65 74 54 65 73 74 2c 20 72 65 67 52 6f 77  wSetTest, regRow
25b70 73 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  set,.           
25b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
25ba0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
25bb0 32 2c 20 72 2c 20 69 53 65 74 29 3b 0a 20 20 20  2, r, iSet);.   
25bc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25bd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
25be0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
25bf0 2c 20 72 65 67 52 65 74 75 72 6e 2c 20 69 4c 6f  , regReturn, iLo
25c00 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 20 20  opBody);..      
25c10 20 20 20 20 2f 2a 20 54 68 65 20 70 53 75 62 57      /* The pSubW
25c20 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
25c30 72 6d 73 20 66 6c 61 67 20 6d 65 61 6e 73 20 74  rms flag means t
25c40 68 61 74 20 74 68 69 73 20 4f 52 20 74 65 72 6d  hat this OR term
25c50 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
25c60 6e 74 61 69 6e 65 64 20 6f 6e 65 20 6f 72 20 6d  ntained one or m
25c70 6f 72 65 20 41 4e 44 20 74 65 72 6d 20 66 72 6f  ore AND term fro
25c80 6d 20 61 20 6e 6f 74 52 65 61 64 79 20 74 61 62  m a notReady tab
25c90 6c 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20  le.  The.       
25ca0 20 20 20 2a 2a 20 74 65 72 6d 73 20 66 72 6f 6d     ** terms from
25cb0 20 74 68 65 20 6e 6f 74 52 65 61 64 79 20 74 61   the notReady ta
25cc0 62 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ble could not be
25cd0 20 74 65 73 74 65 64 20 61 6e 64 20 77 69 6c 6c   tested and will
25ce0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65  .          ** ne
25cf0 65 64 20 74 6f 20 62 65 20 74 65 73 74 65 64 20  ed to be tested 
25d00 6c 61 74 65 72 2e 0a 20 20 20 20 20 20 20 20 20  later..         
25d10 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
25d20 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74  ( pSubWInfo->unt
25d30 65 73 74 65 64 54 65 72 6d 73 20 29 20 75 6e 74  estedTerms ) unt
25d40 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a  estedTerms = 1;.
25d50 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  .          /* Fi
25d60 6e 69 73 68 20 74 68 65 20 6c 6f 6f 70 20 74 68  nish the loop th
25d70 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72  rough table entr
25d80 69 65 73 20 74 68 61 74 20 6d 61 74 63 68 20 74  ies that match t
25d90 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a  erm pOrTerm. */.
25da0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
25db0 33 57 68 65 72 65 45 6e 64 28 70 53 75 62 57 49  3WhereEnd(pSubWI
25dc0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nfo);.        }.
25dd0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
25de0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
25df0 6e 67 65 50 31 28 76 2c 20 69 52 65 74 49 6e 69  ngeP1(v, iRetIni
25e00 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  t, sqlite3VdbeCu
25e10 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20  rrentAddr(v));. 
25e20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
25e30 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
25e40 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72   0, pLevel->addr
25e50 42 72 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Brk);.    sqlite
25e60 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
25e70 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b  l(v, iLoopBody);
25e80 0a 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ..    if( pWInfo
25e90 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 20 73 71 6c  ->nLevel>1 ) sql
25ea0 69 74 65 33 53 74 61 63 6b 46 72 65 65 28 70 50  ite3StackFree(pP
25eb0 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 54 61 62  arse->db, pOrTab
25ec0 29 3b 0a 20 20 20 20 69 66 28 20 21 75 6e 74 65  );.    if( !unte
25ed0 73 74 65 64 54 65 72 6d 73 20 29 20 64 69 73 61  stedTerms ) disa
25ee0 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
25ef0 70 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a  pTerm);.  }else.
25f00 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
25f10 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
25f20 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20  ATION */..  {.  
25f30 20 20 2f 2a 20 43 61 73 65 20 35 3a 20 20 54 68    /* Case 5:  Th
25f40 65 72 65 20 69 73 20 6e 6f 20 75 73 61 62 6c 65  ere is no usable
25f50 20 69 6e 64 65 78 2e 20 20 57 65 20 6d 75 73 74   index.  We must
25f60 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20   do a complete. 
25f70 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 73     **          s
25f80 63 61 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72  can of the entir
25f90 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  e table..    */.
25fa0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
25fb0 20 75 38 20 61 53 74 65 70 5b 5d 20 3d 20 7b 20   u8 aStep[] = { 
25fc0 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76  OP_Next, OP_Prev
25fd0 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63   };.    static c
25fe0 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74 5b 5d  onst u8 aStart[]
25ff0 20 3d 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20   = { OP_Rewind, 
26000 4f 50 5f 4c 61 73 74 20 7d 3b 0a 20 20 20 20 61  OP_Last };.    a
26010 73 73 65 72 74 28 20 62 52 65 76 3d 3d 30 20 7c  ssert( bRev==0 |
26020 7c 20 62 52 65 76 3d 3d 31 20 29 3b 0a 20 20 20  | bRev==1 );.   
26030 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62   assert( omitTab
26040 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 65  le==0 );.    pLe
26050 76 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65 70 5b  vel->op = aStep[
26060 62 52 65 76 5d 3b 0a 20 20 20 20 70 4c 65 76 65  bRev];.    pLeve
26070 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20  l->p1 = iCur;.  
26080 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31    pLevel->p2 = 1
26090 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   + sqlite3VdbeAd
260a0 64 4f 70 32 28 76 2c 20 61 53 74 61 72 74 5b 62  dOp2(v, aStart[b
260b0 52 65 76 5d 2c 20 69 43 75 72 2c 20 61 64 64 72  Rev], iCur, addr
260c0 42 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Brk);.    pLevel
260d0 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54  ->p5 = SQLITE_ST
260e0 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41  MTSTATUS_FULLSCA
260f0 4e 5f 53 54 45 50 3b 0a 20 20 7d 0a 20 20 6e 6f  N_STEP;.  }.  no
26100 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61  tReady &= ~getMa
26110 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74  sk(pWC->pMaskSet
26120 2c 20 69 43 75 72 29 3b 0a 0a 20 20 2f 2a 20 49  , iCur);..  /* I
26130 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65  nsert code to te
26140 73 74 20 65 76 65 72 79 20 73 75 62 65 78 70 72  st every subexpr
26150 65 73 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20  ession that can 
26160 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20  be completely.  
26170 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75 73 69 6e  ** computed usin
26180 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  g the current se
26190 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20 2a  t of tables..  *
261a0 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54  *.  ** IMPLEMENT
261b0 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 34 39 35 32  ATION-OF: R-4952
261c0 35 2d 35 30 39 33 35 20 54 65 72 6d 73 20 74 68  5-50935 Terms th
261d0 61 74 20 63 61 6e 6e 6f 74 20 62 65 20 73 61 74  at cannot be sat
261e0 69 73 66 69 65 64 20 74 68 72 6f 75 67 68 0a 20  isfied through. 
261f0 20 2a 2a 20 74 68 65 20 75 73 65 20 6f 66 20 69   ** the use of i
26200 6e 64 69 63 65 73 20 62 65 63 6f 6d 65 20 74 65  ndices become te
26210 73 74 73 20 74 68 61 74 20 61 72 65 20 65 76 61  sts that are eva
26220 6c 75 61 74 65 64 20 61 67 61 69 6e 73 74 20 65  luated against e
26230 61 63 68 20 72 6f 77 20 6f 66 0a 20 20 2a 2a 20  ach row of.  ** 
26240 74 68 65 20 72 65 6c 65 76 61 6e 74 20 69 6e 70  the relevant inp
26250 75 74 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  ut tables..  */.
26260 20 20 6b 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70    k = 0;.  for(p
26270 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70  Term=pWC->a, j=p
26280 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20  WC->nTerm; j>0; 
26290 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j--, pTerm++){. 
262a0 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20     Expr *pE;.   
262b0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
262c0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
262d0 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 49  _VIRTUAL ); /* I
262e0 4d 50 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36  MP: R-30575-1166
262f0 32 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73  2 */.    testcas
26300 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  e( pTerm->wtFlag
26310 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29  s & TERM_CODED )
26320 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
26330 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
26340 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f  _VIRTUAL|TERM_CO
26350 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DED) ) continue;
26360 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
26370 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74  >prereqAll & not
26380 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20  Ready)!=0 ){.   
26390 20 20 20 74 65 73 74 63 61 73 65 28 20 70 57 49     testcase( pWI
263a0 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72  nfo->untestedTer
263b0 6d 73 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ms==0.          
263c0 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
263d0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
263e0 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
263f0 59 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  Y)!=0 );.      p
26400 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54  WInfo->untestedT
26410 65 72 6d 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  erms = 1;.      
26420 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
26430 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e      pE = pTerm->
26440 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  pExpr;.    asser
26450 74 28 20 70 45 21 3d 30 20 29 3b 0a 20 20 20 20  t( pE!=0 );.    
26460 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  if( pLevel->iLef
26470 74 4a 6f 69 6e 20 26 26 20 21 45 78 70 72 48 61  tJoin && !ExprHa
26480 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50  sProperty(pE, EP
26490 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20  _FromJoin) ){.  
264a0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
264b0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
264c0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
264d0 65 2c 20 70 45 2c 20 61 64 64 72 43 6f 6e 74 2c  e, pE, addrCont,
264e0 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
264f0 4c 4c 29 3b 0a 20 20 20 20 6b 20 3d 20 31 3b 0a  LL);.    k = 1;.
26500 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
26510 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
26520 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20  ;.  }..  /* For 
26530 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
26540 4e 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  N, generate code
26550 20 74 68 61 74 20 77 69 6c 6c 20 72 65 63 6f 72   that will recor
26560 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 0a  d the fact that.
26570 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e    ** at least on
26580 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 69 67  e row of the rig
26590 68 74 20 74 61 62 6c 65 20 68 61 73 20 6d 61 74  ht table has mat
265a0 63 68 65 64 20 74 68 65 20 6c 65 66 74 20 74 61  ched the left ta
265b0 62 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66  ble.  .  */.  if
265c0 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  ( pLevel->iLeftJ
265d0 6f 69 6e 20 29 7b 0a 20 20 20 20 70 4c 65 76 65  oin ){.    pLeve
265e0 6c 2d 3e 61 64 64 72 46 69 72 73 74 20 3d 20 73  l->addrFirst = s
265f0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
26600 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71  tAddr(v);.    sq
26610 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
26620 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
26630 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  , pLevel->iLeftJ
26640 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  oin);.    VdbeCo
26650 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 63 6f 72  mment((v, "recor
26660 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74 22  d LEFT JOIN hit"
26670 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ));.    sqlite3E
26680 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
26690 61 72 73 65 29 3b 0a 20 20 20 20 66 6f 72 28 70  arse);.    for(p
266a0 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30  Term=pWC->a, j=0
266b0 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; j<pWC->nTerm; 
266c0 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j++, pTerm++){. 
266d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
266e0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
266f0 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20  TERM_VIRTUAL ); 
26700 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 30 35 37 35   /* IMP: R-30575
26710 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 20 20  -11662 */.      
26720 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
26730 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
26740 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 20 20 69  CODED );.      i
26750 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
26760 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41  s & (TERM_VIRTUA
26770 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20  L|TERM_CODED) ) 
26780 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
26790 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
267a0 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64 79  eqAll & notReady
267b0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
267c0 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
267d0 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29 3b  untestedTerms );
267e0 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
267f0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
26800 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
26810 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 73  pExpr );.      s
26820 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
26830 65 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d  e(pParse, pTerm-
26840 3e 70 45 78 70 72 2c 20 61 64 64 72 43 6f 6e 74  >pExpr, addrCont
26850 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
26860 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70 54 65 72  ULL);.      pTer
26870 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
26880 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a  RM_CODED;.    }.
26890 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
268a0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
268b0 73 65 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29  se, iReleaseReg)
268c0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 6e 6f 74 52  ;..  return notR
268d0 65 61 64 79 3b 0a 7d 0a 0a 23 69 66 20 64 65 66  eady;.}..#if def
268e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
268f0 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  )./*.** The foll
26900 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20 68  owing variable h
26910 6f 6c 64 73 20 61 20 74 65 78 74 20 64 65 73 63  olds a text desc
26920 72 69 70 74 69 6f 6e 20 6f 66 20 71 75 65 72 79  ription of query
26930 20 70 6c 61 6e 20 67 65 6e 65 72 61 74 65 64 0a   plan generated.
26940 2a 2a 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72  ** by the most r
26950 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71  ecent call to sq
26960 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
26970 29 2e 20 20 45 61 63 68 20 63 61 6c 6c 20 74 6f  ).  Each call to
26980 20 57 68 65 72 65 42 65 67 69 6e 0a 2a 2a 20 6f   WhereBegin.** o
26990 76 65 72 77 72 69 74 65 73 20 74 68 65 20 70 72  verwrites the pr
269a0 65 76 69 6f 75 73 2e 20 20 54 68 69 73 20 69 6e  evious.  This in
269b0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
269c0 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
269d0 64 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 20 6f 6e  d.** analysis on
269e0 6c 79 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69  ly..*/.char sqli
269f0 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 42  te3_query_plan[B
26a00 4d 53 2a 32 2a 34 30 5d 3b 20 20 2f 2a 20 54 65  MS*2*40];  /* Te
26a10 78 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a  xt of the join *
26a20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 51 50  /.static int nQP
26a30 6c 61 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  lan = 0;        
26a40 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 72        /* Next fr
26a50 65 65 20 73 6c 6f 77 20 69 6e 20 5f 71 75 65 72  ee slow in _quer
26a60 79 5f 70 6c 61 6e 5b 5d 20 2a 2f 0a 0a 23 65 6e  y_plan[] */..#en
26a70 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45  dif /* SQLITE_TE
26a80 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72  ST */.../*.** Fr
26a90 65 65 20 61 20 57 68 65 72 65 49 6e 66 6f 20 73  ee a WhereInfo s
26aa0 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74  tructure.*/.stat
26ab0 69 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e 66  ic void whereInf
26ac0 6f 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64  oFree(sqlite3 *d
26ad0 62 2c 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  b, WhereInfo *pW
26ae0 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20 41 4c 57  Info){.  if( ALW
26af0 41 59 53 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20  AYS(pWInfo) ){. 
26b00 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
26b10 72 28 69 3d 30 3b 20 69 3c 70 57 49 6e 66 6f 2d  r(i=0; i<pWInfo-
26b20 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20  >nLevel; i++){. 
26b30 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64       sqlite3_ind
26b40 65 78 5f 69 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d  ex_info *pInfo =
26b50 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 49   pWInfo->a[i].pI
26b60 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66  dxInfo;.      if
26b70 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  ( pInfo ){.     
26b80 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 49     /* assert( pI
26b90 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
26ba0 64 78 53 74 72 3d 3d 30 20 7c 7c 20 64 62 2d 3e  dxStr==0 || db->
26bb0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 20  mallocFailed ); 
26bc0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
26bd0 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
26be0 49 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20 20  IdxStr ){.      
26bf0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
26c00 28 70 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b  (pInfo->idxStr);
26c10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
26c20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
26c30 28 64 62 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 20  (db, pInfo);.   
26c40 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
26c50 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 6c 61 6e  WInfo->a[i].plan
26c60 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
26c70 5f 54 45 4d 50 5f 49 4e 44 45 58 20 29 7b 0a 20  _TEMP_INDEX ){. 
26c80 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49         Index *pI
26c90 64 78 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 69  dx = pWInfo->a[i
26ca0 5d 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20  ].plan.u.pIdx;. 
26cb0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 20         if( pIdx 
26cc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
26cd0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
26ce0 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20  Idx->zColAff);. 
26cf0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
26d00 44 62 46 72 65 65 28 64 62 2c 20 70 49 64 78 29  DbFree(db, pIdx)
26d10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
26d20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 77 68    }.    }.    wh
26d30 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 70  ereClauseClear(p
26d40 57 49 6e 66 6f 2d 3e 70 57 43 29 3b 0a 20 20 20  WInfo->pWC);.   
26d50 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
26d60 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a  b, pWInfo);.  }.
26d70 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
26d80 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  te the beginning
26d90 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65   of the loop use
26da0 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75  d for WHERE clau
26db0 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
26dc0 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
26dd0 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ue is a pointer 
26de0 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74 72  to an opaque str
26df0 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74  ucture that cont
26e00 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  ains.** informat
26e10 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74 65  ion needed to te
26e20 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
26e30 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63 61  .  Later, the ca
26e40 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a  lling routine.**
26e50 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73   should invoke s
26e60 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
26e70 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e   with the return
26e80 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
26e90 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72  unction.** in or
26ea0 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  der to complete 
26eb0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
26ec0 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
26ed0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
26ee0 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75 74  ccurs, this rout
26ef0 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  ine returns NULL
26f00 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69  ..**.** The basi
26f10 63 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f 20  c idea is to do 
26f20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f  a nested loop, o
26f30 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68  ne loop for each
26f40 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65   table in.** the
26f50 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
26f60 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53 45  a select.  (INSE
26f70 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 73 74  RT and UPDATE st
26f80 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65  atements are the
26f90 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53 45  .** same as a SE
26fa0 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20 61  LECT with only a
26fb0 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e   single table in
26fc0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
26fd0 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70  .)  For.** examp
26fe0 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20 69  le, if the SQL i
26ff0 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  s this:.**.**   
27000 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
27010 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45  M t1, t2, t3 WHE
27020 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68  RE ...;.**.** Th
27030 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  en the code gene
27040 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70 74  rated is concept
27050 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20 66  ually like the f
27060 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
27070 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
27080 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20 20  1 in t1 do      
27090 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72   \    Code gener
270a0 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66  ated.**        f
270b0 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74  oreach row2 in t
270c0 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79  2 do      |-- by
270d0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
270e0 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  in().**         
270f0 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69 6e   foreach row3 in
27100 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20   t3 do   /.**   
27110 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20           ....** 
27120 20 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20           end    
27130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27140 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72   \    Code gener
27150 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 65  ated.**        e
27160 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
27170 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62 79            |-- by
27180 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
27190 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20 20  ().**      end  
271a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271b0 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e         /.**.** N
271c0 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f 6f  ote that the loo
271d0 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  ps might not be 
271e0 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f 72  nested in the or
271f0 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65  der in which the
27200 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20 74  y.** appear in t
27210 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
27220 66 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72  f a different or
27230 64 65 72 20 69 73 20 62 65 74 74 65 72 20 61 62  der is better ab
27240 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73  le to make.** us
27250 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 4e  e of indices.  N
27260 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77 68  ote also that wh
27270 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  en the IN operat
27280 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a  or appears in.**
27290 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
272a0 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73 75  e, it might resu
272b0 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c  lt in additional
272c0 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f   nested loops fo
272d0 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68  r.** scanning th
272e0 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73  rough all values
272f0 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61   on the right-ha
27300 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49  nd side of the I
27310 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61  N..**.** There a
27320 72 65 20 42 74 72 65 65 20 63 75 72 73 6f 72 73  re Btree cursors
27330 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
27340 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74 31   each table.  t1
27350 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20   uses cursor.** 
27360 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74 2d  number pTabList-
27370 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20  >a[0].iCursor.  
27380 74 32 20 75 73 65 73 20 74 68 65 20 63 75 72 73  t2 uses the curs
27390 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31  or pTabList->a[1
273a0 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e  ].iCursor..** An
273b0 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 69  d so forth.  Thi
273c0 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
273d0 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e  tes code to open
273e0 20 74 68 6f 73 65 20 56 44 42 45 20 63 75 72 73   those VDBE curs
273f0 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ors.** and sqlit
27400 65 33 57 68 65 72 65 45 6e 64 28 29 20 67 65 6e  e3WhereEnd() gen
27410 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
27420 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a  to close them..*
27430 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68  *.** The code th
27440 61 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  at sqlite3WhereB
27450 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65 73  egin() generates
27460 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73   leaves the curs
27470 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20  ors named.** in 
27480 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e  pTabList pointin
27490 67 20 61 74 20 74 68 65 69 72 20 61 70 70 72 6f  g at their appro
274a0 70 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e 20  priate entries. 
274b0 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a   The [...] code.
274c0 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f  ** can use OP_Co
274d0 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69  lumn and OP_Rowi
274e0 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65  d opcodes on the
274f0 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65 78  se cursors to ex
27500 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66 72  tract.** data fr
27510 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20 74  om the various t
27520 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f  ables of the loo
27530 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  p..**.** If the 
27540 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
27550 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65 61  empty, the forea
27560 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61  ch loops must ea
27570 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a  ch scan their.**
27580 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e 20   entire tables. 
27590 20 54 68 75 73 20 61 20 74 68 72 65 65 2d 77 61   Thus a three-wa
275a0 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e  y join is an O(N
275b0 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ^3) operation.  
275c0 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74 61  But if.** the ta
275d0 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63 65  bles have indice
275e0 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  s and there are 
275f0 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45  terms in the WHE
27600 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a 2a  RE clause that.*
27610 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73 65  * refer to those
27620 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d 70   indices, a comp
27630 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e 20  lete table scan 
27640 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20 61  can be avoided a
27650 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77  nd the.** code w
27660 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61 73  ill run much fas
27670 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68  ter.  Most of th
27680 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 72  e work of this r
27690 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b 69  outine is checki
276a0 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  ng.** to see if 
276b0 74 68 65 72 65 20 61 72 65 20 69 6e 64 69 63 65  there are indice
276c0 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  s that can be us
276d0 65 64 20 74 6f 20 73 70 65 65 64 20 75 70 20 74  ed to speed up t
276e0 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  he loop..**.** T
276f0 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
27700 45 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 73  E clause are als
27710 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20  o used to limit 
27720 77 68 69 63 68 20 72 6f 77 73 20 61 63 74 75 61  which rows actua
27730 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74  lly.** make it t
27740 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74  o the "..." in t
27750 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65  he middle of the
27760 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65 61   loop.  After ea
27770 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a  ch "foreach",.**
27780 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
27790 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
277a0 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69  use only terms i
277b0 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20  n that loop and 
277c0 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61  outer.** loops a
277d0 72 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  re evaluated and
277e0 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d 70   if false a jump
277f0 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64 20   is made around 
27800 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a  all subsequent.*
27810 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f  * inner loops (o
27820 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e  r around the "..
27830 2e 22 20 69 66 20 74 68 65 20 74 65 73 74 20 6f  ." if the test o
27840 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
27850 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20   inner-.** most 
27860 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45  loop).**.** OUTE
27870 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e  R JOINS.**.** An
27880 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74   outer join of t
27890 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32 20  ables t1 and t2 
278a0 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63  is conceptally c
278b0 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  oded as follows:
278c0 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63  .**.**    foreac
278d0 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a  h row1 in t1 do.
278e0 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20 30  **      flag = 0
278f0 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68  .**      foreach
27900 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a   row2 in t2 do.*
27910 2a 20 20 20 20 20 20 20 20 73 74 61 72 74 3a 0a  *        start:.
27920 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a  **          ....
27930 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  **          flag
27940 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64   = 1.**      end
27950 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61 67  .**      if flag
27960 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20  ==0 then.**     
27970 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32     move the row2
27980 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c   cursor to a nul
27990 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  l row.**        
279a0 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20  goto start.**   
279b0 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a     fi.**    end.
279c0 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 43  **.** ORDER BY C
279d0 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e 47  LAUSE PROCESSING
279e0 0a 2a 2a 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42  .**.** *ppOrderB
279f0 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  y is a pointer t
27a00 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
27a10 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
27a20 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20  T statement,.** 
27a30 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
27a40 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f    If there is no
27a50 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
27a60 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74   or if this rout
27a70 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
27a80 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45 20   from an UPDATE 
27a90 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
27aa0 65 6e 74 2c 20 74 68 65 6e 20 70 70 4f 72 64 65  ent, then ppOrde
27ab0 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  rBy is NULL..**.
27ac0 2a 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63  ** If an index c
27ad0 61 6e 20 62 65 20 75 73 65 64 20 73 6f 20 74 68  an be used so th
27ae0 61 74 20 74 68 65 20 6e 61 74 75 72 61 6c 20 6f  at the natural o
27af0 75 74 70 75 74 20 6f 72 64 65 72 20 6f 66 20 74  utput order of t
27b00 68 65 20 74 61 62 6c 65 0a 2a 2a 20 73 63 61 6e  he table.** scan
27b10 20 69 73 20 63 6f 72 72 65 63 74 20 66 6f 72 20   is correct for 
27b20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
27b30 75 73 65 2c 20 74 68 65 6e 20 74 68 61 74 20 69  use, then that i
27b40 6e 64 65 78 20 69 73 20 75 73 65 64 20 61 6e 64  ndex is used and
27b50 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79 20 69  .** *ppOrderBy i
27b60 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20 20  s set to NULL.  
27b70 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
27b80 69 7a 61 74 69 6f 6e 20 74 68 61 74 20 70 72 65  ization that pre
27b90 76 65 6e 74 73 20 61 6e 0a 2a 2a 20 75 6e 6e 65  vents an.** unne
27ba0 63 65 73 73 61 72 79 20 73 6f 72 74 20 6f 66 20  cessary sort of 
27bb0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 69  the result set i
27bc0 66 20 61 6e 20 69 6e 64 65 78 20 61 70 70 72 6f  f an index appro
27bd0 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 0a 2a  priate for the.*
27be0 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  * ORDER BY claus
27bf0 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
27c00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77  ..**.** If the w
27c10 68 65 72 65 20 63 6c 61 75 73 65 20 6c 6f 6f 70  here clause loop
27c20 73 20 63 61 6e 6e 6f 74 20 62 65 20 61 72 72 61  s cannot be arra
27c30 6e 67 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20  nged to provide 
27c40 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 6f  the correct.** o
27c50 75 74 70 75 74 20 6f 72 64 65 72 2c 20 74 68 65  utput order, the
27c60 6e 20 74 68 65 20 2a 70 70 4f 72 64 65 72 42 79  n the *ppOrderBy
27c70 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a   is unchanged..*
27c80 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c  /.WhereInfo *sql
27c90 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a  ite3WhereBegin(.
27ca0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
27cb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
27cc0 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
27cd0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
27ce0 4c 69 73 74 2c 20 20 20 20 2f 2a 20 41 20 6c 69  List,    /* A li
27cf0 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73  st of all tables
27d00 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a   to be scanned *
27d10 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
27d20 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
27d30 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
27d40 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70  .  ExprList **pp
27d50 4f 72 64 65 72 42 79 2c 20 2f 2a 20 41 6e 20 4f  OrderBy, /* An O
27d60 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
27d70 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 75 31 36  or NULL */.  u16
27d80 20 77 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20   wctrlFlags     
27d90 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
27da0 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64   WHERE_* flags d
27db0 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65  efined in sqlite
27dc0 49 6e 74 2e 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e  Int.h */.){.  in
27dd0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
27de0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
27df0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
27e00 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20 20  t nByteWInfo;   
27e10 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e           /* Num.
27e20 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64   bytes allocated
27e30 20 66 6f 72 20 57 68 65 72 65 49 6e 66 6f 20 73   for WhereInfo s
27e40 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  truct */.  int n
27e50 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20  TabList;        
27e60 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
27e70 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70  of elements in p
27e80 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65  TabList */.  Whe
27e90 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
27ea0 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20          /* Will 
27eb0 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72  become the retur
27ec0 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  n value of this 
27ed0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64  function */.  Vd
27ee0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
27ef0 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20  pVdbe;   /* The 
27f00 76 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65  virtual database
27f10 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74   engine */.  Bit
27f20 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20  mask notReady;  
27f30 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
27f40 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
27f50 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a  yet positioned *
27f60 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74  /.  WhereMaskSet
27f70 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f   *pMaskSet;    /
27f80 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
27f90 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57   mask set */.  W
27fa0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
27fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27fc0 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20  * Decomposition 
27fd0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
27fe0 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
27ff0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
28000 61 62 49 74 65 6d 3b 20 20 2f 2a 20 41 20 73 69  abItem;  /* A si
28010 6e 67 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20  ngle entry from 
28020 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68  pTabList */.  Wh
28030 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
28040 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
28050 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20   A single level 
28060 69 6e 20 74 68 65 20 70 57 49 6e 66 6f 20 6c 69  in the pWInfo li
28070 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f  st */.  int iFro
28080 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
28090 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
280a0 20 75 6e 75 73 65 64 20 46 52 4f 4d 20 63 6c 61   unused FROM cla
280b0 75 73 65 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  use element */. 
280c0 20 69 6e 74 20 61 6e 64 46 6c 61 67 73 3b 20 20   int andFlags;  
280d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
280e0 4e 44 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f  ND-ed combinatio
280f0 6e 20 6f 66 20 61 6c 6c 20 70 57 43 2d 3e 61 5b  n of all pWC->a[
28100 5d 2e 77 74 46 6c 61 67 73 20 2a 2f 0a 20 20 73  ].wtFlags */.  s
28110 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
28120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
28130 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
28140 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75   */..  /* The nu
28150 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69  mber of tables i
28160 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
28170 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20  e is limited by 
28180 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
28190 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69 74  ** bits in a Bit
281a0 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73  mask .  */.  tes
281b0 74 63 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d  tcase( pTabList-
281c0 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20  >nSrc==BMS );.  
281d0 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  if( pTabList->nS
281e0 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71  rc>BMS ){.    sq
281f0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
28200 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25  arse, "at most %
28210 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f  d tables in a jo
28220 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72  in", BMS);.    r
28230 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
28240 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
28250 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61   normally genera
28260 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f  tes a nested loo
28270 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  p for all tables
28280 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69   in .  ** pTabLi
28290 73 74 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  st.  But if the 
282a0 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
282b0 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74 2c  NLY flag is set,
282c0 20 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a   then we should.
282d0 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61    ** only genera
282e0 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
282f0 66 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70  first table in p
28300 54 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75  TabList and assu
28310 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79  me that.  ** any
28320 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61   cursors associa
28330 74 65 64 20 77 69 74 68 20 73 75 62 73 65 71 75  ted with subsequ
28340 65 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20 75  ent tables are u
28350 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20  ninitialized..  
28360 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20  */.  nTabList = 
28370 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
28380 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
28390 59 29 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73  Y) ? 1 : pTabLis
283a0 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41  t->nSrc;..  /* A
283b0 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
283c0 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65  ialize the Where
283d0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
283e0 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  hat will become 
283f0 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  the.  ** return 
28400 76 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20  value. A single 
28410 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73  allocation is us
28420 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
28430 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73  WhereInfo.  ** s
28440 74 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65  truct, the conte
28450 6e 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f  nts of WhereInfo
28460 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43  .a[], the WhereC
28470 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a  lause structure.
28480 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65    ** and the Whe
28490 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74  reMaskSet struct
284a0 75 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65  ure. Since Where
284b0 43 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  Clause contains 
284c0 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66  an 8-byte.  ** f
284d0 69 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61  ield (type Bitma
284e0 73 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20 61  sk) it must be a
284f0 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62  ligned on an 8-b
28500 79 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a  yte boundary on.
28510 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74    ** some archit
28520 65 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74  ectures. Hence t
28530 68 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f  he ROUND8() belo
28540 77 2e 0a 20 20 2a 2f 0a 20 20 64 62 20 3d 20 70  w..  */.  db = p
28550 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 42 79  Parse->db;.  nBy
28560 74 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38  teWInfo = ROUND8
28570 28 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66  (sizeof(WhereInf
28580 6f 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a  o)+(nTabList-1)*
28590 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65  sizeof(WhereLeve
285a0 6c 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20  l));.  pWInfo = 
285b0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
285c0 65 72 6f 28 64 62 2c 20 0a 20 20 20 20 20 20 6e  ero(db, .      n
285d0 42 79 74 65 57 49 6e 66 6f 20 2b 20 0a 20 20 20  ByteWInfo + .   
285e0 20 20 20 73 69 7a 65 6f 66 28 57 68 65 72 65 43     sizeof(WhereC
285f0 6c 61 75 73 65 29 20 2b 0a 20 20 20 20 20 20 73  lause) +.      s
28600 69 7a 65 6f 66 28 57 68 65 72 65 4d 61 73 6b 53  izeof(WhereMaskS
28610 65 74 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 64  et).  );.  if( d
28620 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
28630 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
28640 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29  Free(db, pWInfo)
28650 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 30  ;.    pWInfo = 0
28660 3b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65  ;.    goto where
28670 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a  BeginError;.  }.
28680 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c    pWInfo->nLevel
28690 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70   = nTabList;.  p
286a0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20  WInfo->pParse = 
286b0 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f  pParse;.  pWInfo
286c0 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61  ->pTabList = pTa
286d0 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d  bList;.  pWInfo-
286e0 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65  >iBreak = sqlite
286f0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
28700 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 57 43  );.  pWInfo->pWC
28710 20 3d 20 70 57 43 20 3d 20 28 57 68 65 72 65 43   = pWC = (WhereC
28720 6c 61 75 73 65 20 2a 29 26 28 28 75 38 20 2a 29  lause *)&((u8 *)
28730 70 57 49 6e 66 6f 29 5b 6e 42 79 74 65 57 49 6e  pWInfo)[nByteWIn
28740 66 6f 5d 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77  fo];.  pWInfo->w
28750 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74 72  ctrlFlags = wctr
28760 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f  lFlags;.  pWInfo
28770 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  ->savedNQueryLoo
28780 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  p = pParse->nQue
28790 72 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61 73 6b 53  ryLoop;.  pMaskS
287a0 65 74 20 3d 20 28 57 68 65 72 65 4d 61 73 6b 53  et = (WhereMaskS
287b0 65 74 2a 29 26 70 57 43 5b 31 5d 3b 0a 0a 20 20  et*)&pWC[1];..  
287c0 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57 48 45  /* Split the WHE
287d0 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 73  RE clause into s
287e0 65 70 61 72 61 74 65 20 73 75 62 65 78 70 72 65  eparate subexpre
287f0 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65 61 63  ssions where eac
28800 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72 65 73  h.  ** subexpres
28810 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65  sion is separate
28820 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72  d by an AND oper
28830 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69  ator..  */.  ini
28840 74 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b 53 65  tMaskSet(pMaskSe
28850 74 29 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73  t);.  whereClaus
28860 65 49 6e 69 74 28 70 57 43 2c 20 70 50 61 72 73  eInit(pWC, pPars
28870 65 2c 20 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20  e, pMaskSet);.  
28880 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43  sqlite3ExprCodeC
28890 6f 6e 73 74 61 6e 74 73 28 70 50 61 72 73 65 2c  onstants(pParse,
288a0 20 70 57 68 65 72 65 29 3b 0a 20 20 77 68 65 72   pWhere);.  wher
288b0 65 53 70 6c 69 74 28 70 57 43 2c 20 70 57 68 65  eSplit(pWC, pWhe
288c0 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 20 20 20 2f  re, TK_AND);   /
288d0 2a 20 49 4d 50 3a 20 52 2d 31 35 38 34 32 2d 35  * IMP: R-15842-5
288e0 33 32 39 36 20 2a 2f 0a 20 20 20 20 0a 20 20 2f  3296 */.    .  /
288f0 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20  * Special case: 
28900 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  a WHERE clause t
28910 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e  hat is constant.
28920 20 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20    Evaluate the. 
28930 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61   ** expression a
28940 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f  nd either jump o
28950 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63  ver all of the c
28960 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75  ode or fall thru
28970 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 68  ..  */.  if( pWh
28980 65 72 65 20 26 26 20 28 6e 54 61 62 4c 69 73 74  ere && (nTabList
28990 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78  ==0 || sqlite3Ex
289a0 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a  prIsConstantNotJ
289b0 6f 69 6e 28 70 57 68 65 72 65 29 29 20 29 7b 0a  oin(pWhere)) ){.
289c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
289d0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
289e0 57 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69  Where, pWInfo->i
289f0 42 72 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a 55  Break, SQLITE_JU
28a00 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70  MPIFNULL);.    p
28a10 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Where = 0;.  }..
28a20 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 62 69    /* Assign a bi
28a30 74 20 66 72 6f 6d 20 74 68 65 20 62 69 74 6d 61  t from the bitma
28a40 73 6b 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d  sk to every term
28a50 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
28a60 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  use..  **.  ** W
28a70 68 65 6e 20 61 73 73 69 67 6e 69 6e 67 20 62 69  hen assigning bi
28a80 74 6d 61 73 6b 20 76 61 6c 75 65 73 20 74 6f 20  tmask values to 
28a90 46 52 4f 4d 20 63 6c 61 75 73 65 20 63 75 72 73  FROM clause curs
28aa0 6f 72 73 2c 20 69 74 20 6d 75 73 74 20 62 65 0a  ors, it must be.
28ab0 20 20 2a 2a 20 74 68 65 20 63 61 73 65 20 74 68    ** the case th
28ac0 61 74 20 69 66 20 58 20 69 73 20 74 68 65 20 62  at if X is the b
28ad0 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 4e  itmask for the N
28ae0 2d 74 68 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  -th FROM clause 
28af0 74 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20 74  term then.  ** t
28b00 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61  he bitmask for a
28b10 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  ll FROM clause t
28b20 65 72 6d 73 20 74 6f 20 74 68 65 20 6c 65 66 74  erms to the left
28b30 20 6f 66 20 74 68 65 20 4e 2d 74 68 20 74 65 72   of the N-th ter
28b40 6d 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31 29 2e  m.  ** is (X-1).
28b50 20 20 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e     An expression
28b60 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61   from the ON cla
28b70 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  use of a LEFT JO
28b80 49 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20  IN can use.  ** 
28b90 69 74 73 20 45 78 70 72 2e 69 52 69 67 68 74 4a  its Expr.iRightJ
28ba0 6f 69 6e 54 61 62 6c 65 20 76 61 6c 75 65 20 74  oinTable value t
28bb0 6f 20 66 69 6e 64 20 74 68 65 20 62 69 74 6d 61  o find the bitma
28bc0 73 6b 20 6f 66 20 74 68 65 20 72 69 67 68 74 20  sk of the right 
28bd0 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74 68  table.  ** of th
28be0 65 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61 63  e join.  Subtrac
28bf0 74 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74 68  ting one from th
28c00 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 62 69  e right table bi
28c10 74 6d 61 73 6b 20 67 69 76 65 73 20 61 0a 20 20  tmask gives a.  
28c20 2a 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61  ** bitmask for a
28c30 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  ll tables to the
28c40 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69   left of the joi
28c50 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20  n.  Knowing the 
28c60 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f 72  bitmask.  ** for
28c70 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74   all tables to t
28c80 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66  he left of a lef
28c90 74 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72 74  t join is import
28ca0 61 6e 74 2e 20 20 54 69 63 6b 65 74 20 23 33 30  ant.  Ticket #30
28cb0 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f  15..  **.  ** Co
28cc0 6e 66 69 67 75 72 65 20 74 68 65 20 57 68 65 72  nfigure the Wher
28cd0 65 43 6c 61 75 73 65 2e 76 6d 61 73 6b 20 76 61  eClause.vmask va
28ce0 72 69 61 62 6c 65 20 73 6f 20 74 68 61 74 20 62  riable so that b
28cf0 69 74 73 20 74 68 61 74 20 63 6f 72 72 65 73 70  its that corresp
28d00 6f 6e 64 0a 20 20 2a 2a 20 74 6f 20 76 69 72 74  ond.  ** to virt
28d10 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72  ual table cursor
28d20 73 20 61 72 65 20 73 65 74 2e 20 54 68 69 73 20  s are set. This 
28d30 69 73 20 75 73 65 64 20 74 6f 20 73 65 6c 65 63  is used to selec
28d40 74 69 76 65 6c 79 20 64 69 73 61 62 6c 65 20 0a  tively disable .
28d50 20 20 2a 2a 20 74 68 65 20 4f 52 2d 74 6f 2d 49    ** the OR-to-I
28d60 4e 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  N transformation
28d70 20 69 6e 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f   in exprAnalyzeO
28d80 72 54 65 72 6d 28 29 2e 20 49 74 20 69 73 20 6e  rTerm(). It is n
28d90 6f 74 20 68 65 6c 70 66 75 6c 20 0a 20 20 2a 2a  ot helpful .  **
28da0 20 77 69 74 68 20 76 69 72 74 75 61 6c 20 74 61   with virtual ta
28db0 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  bles..  **.  ** 
28dc0 4e 6f 74 65 20 74 68 61 74 20 62 69 74 6d 61 73  Note that bitmas
28dd0 6b 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66  ks are created f
28de0 6f 72 20 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d  or all pTabList-
28df0 3e 6e 53 72 63 20 74 61 62 6c 65 73 20 69 6e 0a  >nSrc tables in.
28e00 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e    ** pTabList, n
28e10 6f 74 20 6a 75 73 74 20 74 68 65 20 66 69 72 73  ot just the firs
28e20 74 20 6e 54 61 62 4c 69 73 74 20 74 61 62 6c 65  t nTabList table
28e30 73 2e 20 20 6e 54 61 62 4c 69 73 74 20 69 73 20  s.  nTabList is 
28e40 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71  normally.  ** eq
28e50 75 61 6c 20 74 6f 20 70 54 61 62 4c 69 73 74 2d  ual to pTabList-
28e60 3e 6e 53 72 63 20 62 75 74 20 6d 69 67 68 74 20  >nSrc but might 
28e70 62 65 20 73 68 6f 72 74 65 6e 65 64 20 74 6f 20  be shortened to 
28e80 31 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 57 48  1 if the.  ** WH
28e90 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
28ea0 59 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 20  Y flag is set.. 
28eb0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 57   */.  assert( pW
28ec0 43 2d 3e 76 6d 61 73 6b 3d 3d 30 20 26 26 20 70  C->vmask==0 && p
28ed0 4d 61 73 6b 53 65 74 2d 3e 6e 3d 3d 30 20 29 3b  MaskSet->n==0 );
28ee0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
28ef0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
28f00 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d 61  +){.    createMa
28f10 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61  sk(pMaskSet, pTa
28f20 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  bList->a[i].iCur
28f30 73 6f 72 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  sor);.#ifndef SQ
28f40 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
28f50 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 41  LTABLE.    if( A
28f60 4c 57 41 59 53 28 70 54 61 62 4c 69 73 74 2d 3e  LWAYS(pTabList->
28f70 61 5b 69 5d 2e 70 54 61 62 29 20 26 26 20 49 73  a[i].pTab) && Is
28f80 56 69 72 74 75 61 6c 28 70 54 61 62 4c 69 73 74  Virtual(pTabList
28f90 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 20 29 7b 0a  ->a[i].pTab) ){.
28fa0 20 20 20 20 20 20 70 57 43 2d 3e 76 6d 61 73 6b        pWC->vmask
28fb0 20 7c 3d 20 28 28 42 69 74 6d 61 73 6b 29 31 20   |= ((Bitmask)1 
28fc0 3c 3c 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  << i);.    }.#en
28fd0 64 69 66 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  dif.  }.#ifndef 
28fe0 4e 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 42  NDEBUG.  {.    B
28ff0 69 74 6d 61 73 6b 20 74 6f 54 68 65 4c 65 66 74  itmask toTheLeft
29000 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
29010 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  0; i<pTabList->n
29020 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
29030 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 67 65 74   Bitmask m = get
29040 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
29050 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43  TabList->a[i].iC
29060 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 61 73  ursor);.      as
29070 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d 74 6f 54  sert( (m-1)==toT
29080 68 65 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20  heLeft );.      
29090 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a  toTheLeft |= m;.
290a0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
290b0 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61  ..  /* Analyze a
290c0 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65 78 70  ll of the subexp
290d0 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20  ressions.  Note 
290e0 74 68 61 74 20 65 78 70 72 41 6e 61 6c 79 7a 65  that exprAnalyze
290f0 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64  () might.  ** ad
29100 64 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65  d new virtual te
29110 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  rms onto the end
29120 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
29130 61 75 73 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74  ause.  We do not
29140 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e  .  ** want to an
29150 61 6c 79 7a 65 20 74 68 65 73 65 20 76 69 72 74  alyze these virt
29160 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f 20 73 74  ual terms, so st
29170 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74  art analyzing at
29180 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e   the end.  ** an
29190 64 20 77 6f 72 6b 20 66 6f 72 77 61 72 64 20 73  d work forward s
291a0 6f 20 74 68 61 74 20 74 68 65 20 61 64 64 65 64  o that the added
291b0 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 61   virtual terms a
291c0 72 65 20 6e 65 76 65 72 20 70 72 6f 63 65 73 73  re never process
291d0 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 78 70 72 41  ed..  */.  exprA
291e0 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61 62 4c 69  nalyzeAll(pTabLi
291f0 73 74 2c 20 70 57 43 29 3b 0a 20 20 69 66 28 20  st, pWC);.  if( 
29200 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
29210 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65   ){.    goto whe
29220 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
29230 7d 0a 0a 20 20 2f 2a 20 43 68 6f 73 65 20 74 68  }..  /* Chose th
29240 65 20 62 65 73 74 20 69 6e 64 65 78 20 74 6f 20  e best index to 
29250 75 73 65 20 66 6f 72 20 65 61 63 68 20 74 61 62  use for each tab
29260 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
29270 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lause..  **.  **
29280 20 54 68 69 73 20 6c 6f 6f 70 20 66 69 6c 6c 73   This loop fills
29290 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
292a0 67 20 66 69 65 6c 64 73 3a 0a 20 20 2a 2a 0a 20  g fields:.  **. 
292b0 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b   **   pWInfo->a[
292c0 5d 2e 70 49 64 78 20 20 20 20 20 20 54 68 65 20  ].pIdx      The 
292d0 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72  index to use for
292e0 20 74 68 69 73 20 6c 65 76 65 6c 20 6f 66 20 74   this level of t
292f0 68 65 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 20 20  he loop..  **   
29300 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 77 73 46 6c  pWInfo->a[].wsFl
29310 61 67 73 20 20 20 57 48 45 52 45 5f 78 78 78 20  ags   WHERE_xxx 
29320 66 6c 61 67 73 20 61 73 73 6f 63 69 61 74 65 64  flags associated
29330 20 77 69 74 68 20 70 49 64 78 0a 20 20 2a 2a 20   with pIdx.  ** 
29340 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 6e 45    pWInfo->a[].nE
29350 71 20 20 20 20 20 20 20 54 68 65 20 6e 75 6d 62  q       The numb
29360 65 72 20 6f 66 20 3d 3d 20 61 6e 64 20 49 4e 20  er of == and IN 
29370 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a  constraints.  **
29380 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69     pWInfo->a[].i
29390 46 72 6f 6d 20 20 20 20 20 57 68 69 63 68 20 74  From     Which t
293a0 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  erm of the FROM 
293b0 63 6c 61 75 73 65 20 69 73 20 62 65 69 6e 67 20  clause is being 
293c0 63 6f 64 65 64 0a 20 20 2a 2a 20 20 20 70 57 49  coded.  **   pWI
293d0 6e 66 6f 2d 3e 61 5b 5d 2e 69 54 61 62 43 75 72  nfo->a[].iTabCur
293e0 20 20 20 54 68 65 20 56 44 42 45 20 63 75 72 73     The VDBE curs
293f0 6f 72 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  or for the datab
29400 61 73 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 20  ase table.  **  
29410 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 49 64   pWInfo->a[].iId
29420 78 43 75 72 20 20 20 54 68 65 20 56 44 42 45 20  xCur   The VDBE 
29430 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69  cursor for the i
29440 6e 64 65 78 0a 20 20 2a 2a 20 20 20 70 57 49 6e  ndex.  **   pWIn
29450 66 6f 2d 3e 61 5b 5d 2e 70 54 65 72 6d 20 20 20  fo->a[].pTerm   
29460 20 20 57 68 65 6e 20 77 73 46 6c 61 67 73 3d 3d    When wsFlags==
29470 57 4f 5f 4f 52 2c 20 74 68 65 20 4f 52 2d 63 6c  WO_OR, the OR-cl
29480 61 75 73 65 20 74 65 72 6d 0a 20 20 2a 2a 0a 20  ause term.  **. 
29490 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c   ** This loop al
294a0 73 6f 20 66 69 67 75 72 65 73 20 6f 75 74 20 74  so figures out t
294b0 68 65 20 6e 65 73 74 69 6e 67 20 6f 72 64 65 72  he nesting order
294c0 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
294d0 65 20 46 52 4f 4d 0a 20 20 2a 2a 20 63 6c 61 75  e FROM.  ** clau
294e0 73 65 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65  se..  */.  notRe
294f0 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29  ady = ~(Bitmask)
29500 30 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20  0;.  pTabItem = 
29510 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70  pTabList->a;.  p
29520 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e  Level = pWInfo->
29530 61 3b 0a 20 20 61 6e 64 46 6c 61 67 73 20 3d 20  a;.  andFlags = 
29540 7e 30 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45  ~0;.  WHERETRACE
29550 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  (("*** Optimizer
29560 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b   Start ***\n"));
29570 0a 20 20 66 6f 72 28 69 3d 69 46 72 6f 6d 3d 30  .  for(i=iFrom=0
29580 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d  , pLevel=pWInfo-
29590 3e 61 3b 20 69 3c 6e 54 61 62 4c 69 73 74 3b 20  >a; i<nTabList; 
295a0 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
295b0 20 20 20 20 57 68 65 72 65 43 6f 73 74 20 62 65      WhereCost be
295c0 73 74 50 6c 61 6e 3b 20 20 20 20 20 20 20 20 20  stPlan;         
295d0 2f 2a 20 4d 6f 73 74 20 65 66 66 69 63 69 65 6e  /* Most efficien
295e0 74 20 70 6c 61 6e 20 73 65 65 6e 20 73 6f 20 66  t plan seen so f
295f0 61 72 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20  ar */.    Index 
29600 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
29610 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 66        /* Index f
29620 6f 72 20 46 52 4f 4d 20 74 61 62 6c 65 20 61 74  or FROM table at
29630 20 70 54 61 62 49 74 65 6d 20 2a 2f 0a 20 20 20   pTabItem */.   
29640 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
29650 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29660 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
29670 20 46 52 4f 4d 20 74 61 62 6c 65 73 20 2a 2f 0a   FROM tables */.
29680 20 20 20 20 69 6e 74 20 62 65 73 74 4a 20 3d 20      int bestJ = 
29690 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  -1;             
296a0 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  /* The value of 
296b0 6a 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b  j */.    Bitmask
296c0 20 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   m;             
296d0 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20       /* Bitmask 
296e0 76 61 6c 75 65 20 66 6f 72 20 6a 20 6f 72 20 62  value for j or b
296f0 65 73 74 4a 20 2a 2f 0a 20 20 20 20 69 6e 74 20  estJ */.    int 
29700 69 73 4f 70 74 69 6d 61 6c 3b 20 20 20 20 20 20  isOptimal;      
29710 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
29720 74 6f 72 20 66 6f 72 20 6f 70 74 69 6d 61 6c 2f  tor for optimal/
29730 6e 6f 6e 2d 6f 70 74 69 6d 61 6c 20 73 65 61 72  non-optimal sear
29740 63 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 55  ch */.    int nU
29750 6e 63 6f 6e 73 74 72 61 69 6e 65 64 3b 20 20 20  nconstrained;   
29760 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
29770 74 61 62 6c 65 73 20 77 69 74 68 6f 75 74 20 49  tables without I
29780 4e 44 45 58 45 44 20 42 59 20 2a 2f 0a 20 20 20  NDEXED BY */.   
29790 20 42 69 74 6d 61 73 6b 20 6e 6f 74 49 6e 64 65   Bitmask notInde
297a0 78 65 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  xed;         /* 
297b0 4d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 74  Mask of tables t
297c0 68 61 74 20 63 61 6e 6e 6f 74 20 75 73 65 20 61  hat cannot use a
297d0 6e 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 20 20  n index */..    
297e0 6d 65 6d 73 65 74 28 26 62 65 73 74 50 6c 61 6e  memset(&bestPlan
297f0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 62 65 73 74  , 0, sizeof(best
29800 50 6c 61 6e 29 29 3b 0a 20 20 20 20 62 65 73 74  Plan));.    best
29810 50 6c 61 6e 2e 72 43 6f 73 74 20 3d 20 53 51 4c  Plan.rCost = SQL
29820 49 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 20 20 20  ITE_BIG_DBL;.   
29830 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a   WHERETRACE(("**
29840 2a 20 42 65 67 69 6e 20 73 65 61 72 63 68 20 66  * Begin search f
29850 6f 72 20 6c 6f 6f 70 20 25 64 20 2a 2a 2a 5c 6e  or loop %d ***\n
29860 22 2c 20 69 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  ", i));..    /* 
29870 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65  Loop through the
29880 20 72 65 6d 61 69 6e 69 6e 67 20 65 6e 74 72 69   remaining entri
29890 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
298a0 6c 61 75 73 65 20 74 6f 20 66 69 6e 64 20 74 68  lause to find th
298b0 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20 6e 65  e.    ** next ne
298c0 73 74 65 64 20 6c 6f 6f 70 2e 20 54 68 65 20 6c  sted loop. The l
298d0 6f 6f 70 20 74 65 73 74 73 20 61 6c 6c 20 46 52  oop tests all FR
298e0 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 69 65  OM clause entrie
298f0 73 0a 20 20 20 20 2a 2a 20 65 69 74 68 65 72 20  s.    ** either 
29900 6f 6e 63 65 20 6f 72 20 74 77 69 63 65 2e 20 0a  once or twice. .
29910 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
29920 65 20 66 69 72 73 74 20 74 65 73 74 20 69 73 20  e first test is 
29930 61 6c 77 61 79 73 20 70 65 72 66 6f 72 6d 65 64  always performed
29940 20 69 66 20 74 68 65 72 65 20 61 72 65 20 74 77   if there are tw
29950 6f 20 6f 72 20 6d 6f 72 65 20 65 6e 74 72 69 65  o or more entrie
29960 73 0a 20 20 20 20 2a 2a 20 72 65 6d 61 69 6e 69  s.    ** remaini
29970 6e 67 20 61 6e 64 20 6e 65 76 65 72 20 70 65 72  ng and never per
29980 66 6f 72 6d 65 64 20 69 66 20 74 68 65 72 65 20  formed if there 
29990 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 46 52 4f 4d  is only one FROM
299a0 20 63 6c 61 75 73 65 20 65 6e 74 72 79 0a 20 20   clause entry.  
299b0 20 20 2a 2a 20 74 6f 20 63 68 6f 6f 73 65 20 66    ** to choose f
299c0 72 6f 6d 2e 20 20 54 68 65 20 66 69 72 73 74 20  rom.  The first 
299d0 74 65 73 74 20 6c 6f 6f 6b 73 20 66 6f 72 20 61  test looks for a
299e0 6e 20 22 6f 70 74 69 6d 61 6c 22 20 73 63 61 6e  n "optimal" scan
299f0 2e 20 20 49 6e 0a 20 20 20 20 2a 2a 20 74 68 69  .  In.    ** thi
29a00 73 20 63 6f 6e 74 65 78 74 20 61 6e 20 6f 70 74  s context an opt
29a10 69 6d 61 6c 20 73 63 61 6e 20 69 73 20 6f 6e 65  imal scan is one
29a20 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20 73   that uses the s
29a30 61 6d 65 20 73 74 72 61 74 65 67 79 0a 20 20 20  ame strategy.   
29a40 20 2a 2a 20 66 6f 72 20 74 68 65 20 67 69 76 65   ** for the give
29a50 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e  n FROM clause en
29a60 74 72 79 20 61 73 20 77 6f 75 6c 64 20 62 65 20  try as would be 
29a70 73 65 6c 65 63 74 65 64 20 69 66 20 74 68 65 20  selected if the 
29a80 65 6e 74 72 79 0a 20 20 20 20 2a 2a 20 77 65 72  entry.    ** wer
29a90 65 20 75 73 65 64 20 61 73 20 74 68 65 20 69 6e  e used as the in
29aa0 6e 65 72 6d 6f 73 74 20 6e 65 73 74 65 64 20 6c  nermost nested l
29ab0 6f 6f 70 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  oop.  In other w
29ac0 6f 72 64 73 2c 20 61 20 74 61 62 6c 65 0a 20 20  ords, a table.  
29ad0 20 20 2a 2a 20 69 73 20 63 68 6f 73 65 6e 20 73    ** is chosen s
29ae0 75 63 68 20 74 68 61 74 20 74 68 65 20 63 6f 73  uch that the cos
29af0 74 20 6f 66 20 72 75 6e 6e 69 6e 67 20 74 68 61  t of running tha
29b00 74 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62  t table cannot b
29b10 65 20 72 65 64 75 63 65 64 0a 20 20 20 20 2a 2a  e reduced.    **
29b20 20 62 79 20 77 61 69 74 69 6e 67 20 66 6f 72 20   by waiting for 
29b30 6f 74 68 65 72 20 74 61 62 6c 65 73 20 74 6f 20  other tables to 
29b40 72 75 6e 20 66 69 72 73 74 2e 20 20 54 68 69 73  run first.  This
29b50 20 22 6f 70 74 69 6d 61 6c 22 20 74 65 73 74 20   "optimal" test 
29b60 77 6f 72 6b 73 0a 20 20 20 20 2a 2a 20 62 79 20  works.    ** by 
29b70 66 69 72 73 74 20 61 73 73 75 6d 69 6e 67 20 74  first assuming t
29b80 68 61 74 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  hat the FROM cla
29b90 75 73 65 20 69 73 20 6f 6e 20 74 68 65 20 69 6e  use is on the in
29ba0 6e 65 72 20 6c 6f 6f 70 20 61 6e 64 20 66 69 6e  ner loop and fin
29bb0 64 69 6e 67 0a 20 20 20 20 2a 2a 20 69 74 73 20  ding.    ** its 
29bc0 71 75 65 72 79 20 70 6c 61 6e 2c 20 74 68 65 6e  query plan, then
29bd0 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 73 65 65   checking to see
29be0 20 69 66 20 74 68 61 74 20 71 75 65 72 79 20 70   if that query p
29bf0 6c 61 6e 20 75 73 65 73 20 61 6e 79 0a 20 20 20  lan uses any.   
29c00 20 2a 2a 20 6f 74 68 65 72 20 46 52 4f 4d 20 63   ** other FROM c
29c10 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 74  lause terms that
29c20 20 61 72 65 20 6e 6f 74 52 65 61 64 79 2e 20 20   are notReady.  
29c30 49 66 20 6e 6f 20 6e 6f 74 52 65 61 64 79 20 74  If no notReady t
29c40 65 72 6d 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  erms are.    ** 
29c50 75 73 65 64 20 74 68 65 6e 20 74 68 65 20 22 6f  used then the "o
29c60 70 74 69 6d 61 6c 22 20 71 75 65 72 79 20 70 6c  ptimal" query pl
29c70 61 6e 20 77 6f 72 6b 73 2e 0a 20 20 20 20 2a 2a  an works..    **
29c80 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  .    ** Note tha
29c90 74 20 74 68 65 20 57 68 65 72 65 43 6f 73 74 2e  t the WhereCost.
29ca0 6e 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20 66  nRow parameter f
29cb0 6f 72 20 61 6e 20 6f 70 74 69 6d 61 6c 20 73 63  or an optimal sc
29cc0 61 6e 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20  an might.    ** 
29cd0 6e 6f 74 20 62 65 20 61 73 20 73 6d 61 6c 6c 20  not be as small 
29ce0 61 73 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69  as it would be i
29cf0 66 20 74 68 65 20 74 61 62 6c 65 20 72 65 61 6c  f the table real
29d00 6c 79 20 77 65 72 65 20 74 68 65 20 69 6e 6e 65  ly were the inne
29d10 72 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 6a 6f 69  rmost.    ** joi
29d20 6e 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c  n.  The nRow val
29d30 75 65 20 63 61 6e 20 62 65 20 72 65 64 75 63 65  ue can be reduce
29d40 64 20 62 79 20 57 48 45 52 45 20 63 6c 61 75 73  d by WHERE claus
29d50 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  e constraints.  
29d60 20 20 2a 2a 20 74 68 61 74 20 64 6f 20 6e 6f 74    ** that do not
29d70 20 75 73 65 20 69 6e 64 69 63 65 73 2e 20 20 42   use indices.  B
29d80 75 74 20 74 68 69 73 20 6e 52 6f 77 20 72 65 64  ut this nRow red
29d90 75 63 74 69 6f 6e 20 6f 6e 6c 79 20 68 61 70 70  uction only happ
29da0 65 6e 73 20 69 66 20 74 68 65 0a 20 20 20 20 2a  ens if the.    *
29db0 2a 20 74 61 62 6c 65 20 72 65 61 6c 6c 79 20 69  * table really i
29dc0 73 20 74 68 65 20 69 6e 6e 65 72 6d 6f 73 74 20  s the innermost 
29dd0 6a 6f 69 6e 2e 20 20 0a 20 20 20 20 2a 2a 0a 20  join.  .    **. 
29de0 20 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64     ** The second
29df0 20 6c 6f 6f 70 20 69 74 65 72 61 74 69 6f 6e 20   loop iteration 
29e00 69 73 20 6f 6e 6c 79 20 70 65 72 66 6f 72 6d 65  is only performe
29e10 64 20 69 66 20 6e 6f 20 6f 70 74 69 6d 61 6c 20  d if no optimal 
29e20 73 63 61 6e 0a 20 20 20 20 2a 2a 20 73 74 72 61  scan.    ** stra
29e30 74 65 67 69 65 73 20 77 65 72 65 20 66 6f 75 6e  tegies were foun
29e40 64 20 62 79 20 74 68 65 20 66 69 72 73 74 20 69  d by the first i
29e50 74 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 73  teration. This s
29e60 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 0a  econd iteration.
29e70 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64 20 74      ** is used t
29e80 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65  o search for the
29e90 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 73 63 61   lowest cost sca
29ea0 6e 20 6f 76 65 72 61 6c 6c 2e 0a 20 20 20 20 2a  n overall..    *
29eb0 2a 0a 20 20 20 20 2a 2a 20 50 72 65 76 69 6f 75  *.    ** Previou
29ec0 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  s versions of SQ
29ed0 4c 69 74 65 20 70 65 72 66 6f 72 6d 65 64 20 6f  Lite performed o
29ee0 6e 6c 79 20 74 68 65 20 73 65 63 6f 6e 64 20 69  nly the second i
29ef0 74 65 72 61 74 69 6f 6e 20 2d 0a 20 20 20 20 2a  teration -.    *
29f00 2a 20 74 68 65 20 6e 65 78 74 20 6f 75 74 65 72  * the next outer
29f10 6d 6f 73 74 20 6c 6f 6f 70 20 77 61 73 20 61 6c  most loop was al
29f20 77 61 79 73 20 74 68 61 74 20 77 69 74 68 20 74  ways that with t
29f30 68 65 20 6c 6f 77 65 73 74 20 6f 76 65 72 61 6c  he lowest overal
29f40 6c 0a 20 20 20 20 2a 2a 20 63 6f 73 74 2e 20 48  l.    ** cost. H
29f50 6f 77 65 76 65 72 2c 20 74 68 69 73 20 6d 65 61  owever, this mea
29f60 6e 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 63  nt that SQLite c
29f70 6f 75 6c 64 20 73 65 6c 65 63 74 20 74 68 65 20  ould select the 
29f80 77 72 6f 6e 67 20 70 6c 61 6e 0a 20 20 20 20 2a  wrong plan.    *
29f90 2a 20 66 6f 72 20 73 63 72 69 70 74 73 20 73 75  * for scripts su
29fa0 63 68 20 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77  ch as the follow
29fb0 69 6e 67 3a 0a 20 20 20 20 2a 2a 20 20 20 0a 20  ing:.    **   . 
29fc0 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54     **   CREATE T
29fd0 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 20 0a  ABLE t1(a, b); .
29fe0 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
29ff0 54 41 42 4c 45 20 74 32 28 63 2c 20 64 29 3b 0a  TABLE t2(c, d);.
2a000 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
2a010 2a 20 46 52 4f 4d 20 74 32 2c 20 74 31 20 57 48  * FROM t2, t1 WH
2a020 45 52 45 20 74 32 2e 72 6f 77 69 64 20 3d 20 74  ERE t2.rowid = t
2a030 31 2e 61 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  1.a;.    **.    
2a040 2a 2a 20 54 68 65 20 62 65 73 74 20 73 74 72 61  ** The best stra
2a050 74 65 67 79 20 69 73 20 74 6f 20 69 74 65 72 61  tegy is to itera
2a060 74 65 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65  te through table
2a070 20 74 31 20 66 69 72 73 74 2e 20 48 6f 77 65 76   t1 first. Howev
2a080 65 72 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20  er it.    ** is 
2a090 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
2a0a0 64 65 74 65 72 6d 69 6e 65 20 74 68 69 73 20 77  determine this w
2a0b0 69 74 68 20 61 20 73 69 6d 70 6c 65 20 67 72 65  ith a simple gre
2a0c0 65 64 79 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20  edy algorithm.. 
2a0d0 20 20 20 2a 2a 20 53 69 6e 63 65 20 74 68 65 20     ** Since the 
2a0e0 63 6f 73 74 20 6f 66 20 61 20 6c 69 6e 65 61 72  cost of a linear
2a0f0 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 61   scan through ta
2a100 62 6c 65 20 74 32 20 69 73 20 74 68 65 20 73 61  ble t2 is the sa
2a110 6d 65 20 0a 20 20 20 20 2a 2a 20 61 73 20 74 68  me .    ** as th
2a120 65 20 63 6f 73 74 20 6f 66 20 61 20 6c 69 6e 65  e cost of a line
2a130 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20  ar scan through 
2a140 74 61 62 6c 65 20 74 31 2c 20 61 20 73 69 6d 70  table t1, a simp
2a150 6c 65 20 67 72 65 65 64 79 20 0a 20 20 20 20 2a  le greedy .    *
2a160 2a 20 61 6c 67 6f 72 69 74 68 6d 20 6d 61 79 20  * algorithm may 
2a170 63 68 6f 6f 73 65 20 74 6f 20 75 73 65 20 74 32  choose to use t2
2a180 20 66 6f 72 20 74 68 65 20 6f 75 74 65 72 20 6c   for the outer l
2a190 6f 6f 70 2c 20 77 68 69 63 68 20 69 73 20 61 20  oop, which is a 
2a1a0 6d 75 63 68 0a 20 20 20 20 2a 2a 20 63 6f 73 74  much.    ** cost
2a1b0 6c 69 65 72 20 61 70 70 72 6f 61 63 68 2e 0a 20  lier approach.. 
2a1c0 20 20 20 2a 2f 0a 20 20 20 20 6e 55 6e 63 6f 6e     */.    nUncon
2a1d0 73 74 72 61 69 6e 65 64 20 3d 20 30 3b 0a 20 20  strained = 0;.  
2a1e0 20 20 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 30    notIndexed = 0
2a1f0 3b 0a 20 20 20 20 66 6f 72 28 69 73 4f 70 74 69  ;.    for(isOpti
2a200 6d 61 6c 3d 28 69 46 72 6f 6d 3c 6e 54 61 62 4c  mal=(iFrom<nTabL
2a210 69 73 74 2d 31 29 3b 20 69 73 4f 70 74 69 6d 61  ist-1); isOptima
2a220 6c 3e 3d 30 20 26 26 20 62 65 73 74 4a 3c 30 3b  l>=0 && bestJ<0;
2a230 20 69 73 4f 70 74 69 6d 61 6c 2d 2d 29 7b 0a 20   isOptimal--){. 
2a240 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 61 73       Bitmask mas
2a250 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k;             /
2a260 2a 20 4d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73  * Mask of tables
2a270 20 6e 6f 74 20 79 65 74 20 72 65 61 64 79 20 2a   not yet ready *
2a280 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 46  /.      for(j=iF
2a290 72 6f 6d 2c 20 70 54 61 62 49 74 65 6d 3d 26 70  rom, pTabItem=&p
2a2a0 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 3b 20 6a  TabList->a[j]; j
2a2b0 3c 6e 54 61 62 4c 69 73 74 3b 20 6a 2b 2b 2c 20  <nTabList; j++, 
2a2c0 70 54 61 62 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  pTabItem++){.   
2a2d0 20 20 20 20 20 69 6e 74 20 64 6f 4e 6f 74 52 65       int doNotRe
2a2e0 6f 72 64 65 72 3b 20 20 20 20 2f 2a 20 54 72 75  order;    /* Tru
2a2f0 65 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20  e if this table 
2a300 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65  should not be re
2a310 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20  ordered */.     
2a320 20 20 20 57 68 65 72 65 43 6f 73 74 20 73 43 6f     WhereCost sCo
2a330 73 74 3b 20 20 20 20 20 2f 2a 20 43 6f 73 74 20  st;     /* Cost 
2a340 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
2a350 20 62 65 73 74 5b 56 69 72 74 75 61 6c 5d 49 6e   best[Virtual]In
2a360 64 65 78 28 29 20 2a 2f 0a 20 20 20 20 20 20 20  dex() */.       
2a370 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
2a380 72 42 79 3b 20 20 2f 2a 20 4f 52 44 45 52 20 42  rBy;  /* ORDER B
2a390 59 20 63 6c 61 75 73 65 20 66 6f 72 20 69 6e 64  Y clause for ind
2a3a0 65 78 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 2a  ex to optimize *
2a3b0 2f 0a 20 20 0a 20 20 20 20 20 20 20 20 64 6f 4e  /.  .        doN
2a3c0 6f 74 52 65 6f 72 64 65 72 20 3d 20 20 28 70 54  otReorder =  (pT
2a3d0 61 62 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  abItem->jointype
2a3e0 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43   & (JT_LEFT|JT_C
2a3f0 52 4f 53 53 29 29 21 3d 30 3b 0a 20 20 20 20 20  ROSS))!=0;.     
2a400 20 20 20 69 66 28 20 6a 21 3d 69 46 72 6f 6d 20     if( j!=iFrom 
2a410 26 26 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20  && doNotReorder 
2a420 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
2a430 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61   m = getMask(pMa
2a440 73 6b 53 65 74 2c 20 70 54 61 62 49 74 65 6d 2d  skSet, pTabItem-
2a450 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
2a460 20 20 20 69 66 28 20 28 6d 20 26 20 6e 6f 74 52     if( (m & notR
2a470 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20  eady)==0 ){.    
2a480 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 69 46 72        if( j==iFr
2a490 6f 6d 20 29 20 69 46 72 6f 6d 2b 2b 3b 0a 20 20  om ) iFrom++;.  
2a4a0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
2a4b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2a4c0 20 20 20 20 6d 61 73 6b 20 3d 20 28 69 73 4f 70      mask = (isOp
2a4d0 74 69 6d 61 6c 20 3f 20 6d 20 3a 20 6e 6f 74 52  timal ? m : notR
2a4e0 65 61 64 79 29 3b 0a 20 20 20 20 20 20 20 20 70  eady);.        p
2a4f0 4f 72 64 65 72 42 79 20 3d 20 28 28 69 3d 3d 30  OrderBy = ((i==0
2a500 20 26 26 20 70 70 4f 72 64 65 72 42 79 20 29 3f   && ppOrderBy )?
2a510 2a 70 70 4f 72 64 65 72 42 79 3a 30 29 3b 0a 20  *ppOrderBy:0);. 
2a520 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62 49         if( pTabI
2a530 74 65 6d 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 29  tem->pIndex==0 )
2a540 20 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65 64 2b   nUnconstrained+
2a550 2b 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 57 48  +;.  .        WH
2a560 45 52 45 54 52 41 43 45 28 28 22 3d 3d 3d 20 74  ERETRACE(("=== t
2a570 72 79 69 6e 67 20 74 61 62 6c 65 20 25 64 20 77  rying table %d w
2a580 69 74 68 20 69 73 4f 70 74 69 6d 61 6c 3d 25 64  ith isOptimal=%d
2a590 20 3d 3d 3d 5c 6e 22 2c 0a 20 20 20 20 20 20 20   ===\n",.       
2a5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 2c 20               j, 
2a5b0 69 73 4f 70 74 69 6d 61 6c 29 29 3b 0a 20 20 20  isOptimal));.   
2a5c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
2a5d0 62 49 74 65 6d 2d 3e 70 54 61 62 20 29 3b 0a 23  bItem->pTab );.#
2a5e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2a5f0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
2a600 20 20 20 20 20 20 20 20 69 66 28 20 49 73 56 69          if( IsVi
2a610 72 74 75 61 6c 28 70 54 61 62 49 74 65 6d 2d 3e  rtual(pTabItem->
2a620 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
2a630 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78     sqlite3_index
2a640 5f 69 6e 66 6f 20 2a 2a 70 70 20 3d 20 26 70 57  _info **pp = &pW
2a650 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e 70 49 64 78 49  Info->a[j].pIdxI
2a660 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 62  nfo;.          b
2a670 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28  estVirtualIndex(
2a680 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 54 61  pParse, pWC, pTa
2a690 62 49 74 65 6d 2c 20 6d 61 73 6b 2c 20 6e 6f 74  bItem, mask, not
2a6a0 52 65 61 64 79 2c 20 70 4f 72 64 65 72 42 79 2c  Ready, pOrderBy,
2a6b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a6c0 20 20 20 20 20 20 20 20 20 20 20 20 26 73 43 6f              &sCo
2a6d0 73 74 2c 20 70 70 29 3b 0a 20 20 20 20 20 20 20  st, pp);.       
2a6e0 20 7d 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20   }else .#endif. 
2a6f0 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
2a700 20 20 20 62 65 73 74 42 74 72 65 65 49 6e 64 65     bestBtreeInde
2a710 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70  x(pParse, pWC, p
2a720 54 61 62 49 74 65 6d 2c 20 6d 61 73 6b 2c 20 6e  TabItem, mask, n
2a730 6f 74 52 65 61 64 79 2c 20 70 4f 72 64 65 72 42  otReady, pOrderB
2a740 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
2a750 20 20 20 20 20 20 20 20 20 20 20 20 26 73 43 6f              &sCo
2a760 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  st);.        }. 
2a770 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
2a780 73 4f 70 74 69 6d 61 6c 20 7c 7c 20 28 73 43 6f  sOptimal || (sCo
2a790 73 74 2e 75 73 65 64 26 6e 6f 74 52 65 61 64 79  st.used&notReady
2a7a0 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 20  )==0 );..       
2a7b0 20 2f 2a 20 49 66 20 61 6e 20 49 4e 44 45 58 45   /* If an INDEXE
2a7c0 44 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 70  D BY clause is p
2a7d0 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65  resent, then the
2a7e0 20 70 6c 61 6e 20 6d 75 73 74 20 75 73 65 20 74   plan must use t
2a7f0 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  hat.        ** i
2a800 6e 64 65 78 20 69 66 20 69 74 20 75 73 65 73 20  ndex if it uses 
2a810 61 6e 79 20 69 6e 64 65 78 20 61 74 20 61 6c 6c  any index at all
2a820 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
2a830 72 74 28 20 70 54 61 62 49 74 65 6d 2d 3e 70 49  rt( pTabItem->pI
2a840 6e 64 65 78 3d 3d 30 20 0a 20 20 20 20 20 20 20  ndex==0 .       
2a850 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 73             || (s
2a860 43 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  Cost.plan.wsFlag
2a870 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55  s & WHERE_NOT_FU
2a880 4c 4c 53 43 41 4e 29 3d 3d 30 0a 20 20 20 20 20  LLSCAN)==0.     
2a890 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
2a8a0 73 43 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 49 64  sCost.plan.u.pId
2a8b0 78 3d 3d 70 54 61 62 49 74 65 6d 2d 3e 70 49 6e  x==pTabItem->pIn
2a8c0 64 65 78 20 29 3b 0a 0a 20 20 20 20 20 20 20 20  dex );..        
2a8d0 69 66 28 20 69 73 4f 70 74 69 6d 61 6c 20 26 26  if( isOptimal &&
2a8e0 20 28 73 43 6f 73 74 2e 70 6c 61 6e 2e 77 73 46   (sCost.plan.wsF
2a8f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54  lags & WHERE_NOT
2a900 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d 30 20 29 7b  _FULLSCAN)==0 ){
2a910 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 74 49 6e  .          notIn
2a920 64 65 78 65 64 20 7c 3d 20 6d 3b 0a 20 20 20 20  dexed |= m;.    
2a930 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
2a940 2a 20 43 6f 6e 64 69 74 69 6f 6e 73 20 75 6e 64  * Conditions und
2a950 65 72 20 77 68 69 63 68 20 74 68 69 73 20 74 61  er which this ta
2a960 62 6c 65 20 62 65 63 6f 6d 65 73 20 74 68 65 20  ble becomes the 
2a970 62 65 73 74 20 73 6f 20 66 61 72 3a 0a 20 20 20  best so far:.   
2a980 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2a990 2a 2a 20 20 20 28 31 29 20 54 68 65 20 74 61 62  **   (1) The tab
2a9a0 6c 65 20 6d 75 73 74 20 6e 6f 74 20 64 65 70 65  le must not depe
2a9b0 6e 64 20 6f 6e 20 6f 74 68 65 72 20 74 61 62 6c  nd on other tabl
2a9c0 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 74  es that have not
2a9d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
2a9e0 20 20 79 65 74 20 72 75 6e 2e 0a 20 20 20 20 20    yet run..     
2a9f0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
2aa00 20 20 20 28 32 29 20 41 20 66 75 6c 6c 2d 74 61     (2) A full-ta
2aa10 62 6c 65 2d 73 63 61 6e 20 70 6c 61 6e 20 63 61  ble-scan plan ca
2aa20 6e 6e 6f 74 20 73 75 70 65 72 63 65 64 65 20 61  nnot supercede a
2aa30 6e 6f 74 68 65 72 20 70 6c 61 6e 20 75 6e 6c 65  nother plan unle
2aa40 73 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ss.        **   
2aa50 20 20 20 20 69 74 20 69 73 20 61 6e 20 22 6f 70      it is an "op
2aa60 74 69 6d 61 6c 22 20 70 6c 61 6e 20 61 73 20 64  timal" plan as d
2aa70 65 66 69 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20  efined above..  
2aa80 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2aa90 20 2a 2a 20 20 20 28 33 29 20 41 6c 6c 20 74 61   **   (3) All ta
2aaa0 62 6c 65 73 20 68 61 76 65 20 61 6e 20 49 4e 44  bles have an IND
2aab0 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 6f  EXED BY clause o
2aac0 72 20 74 68 69 73 20 74 61 62 6c 65 20 6c 61 63  r this table lac
2aad0 6b 73 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ks an.        **
2aae0 20 20 20 20 20 20 20 49 4e 44 45 58 45 44 20 42         INDEXED B
2aaf0 59 20 63 6c 61 75 73 65 20 6f 72 20 74 68 69 73  Y clause or this
2ab00 20 74 61 62 6c 65 20 75 73 65 73 20 74 68 65 20   table uses the 
2ab10 73 70 65 63 69 66 69 63 0a 20 20 20 20 20 20 20  specific.       
2ab20 20 2a 2a 20 20 20 20 20 20 20 69 6e 64 65 78 20   **       index 
2ab30 73 70 65 63 69 66 69 65 64 20 62 79 20 69 74 73  specified by its
2ab40 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
2ab50 73 65 2e 20 20 54 68 69 73 20 72 75 6c 65 20 65  se.  This rule e
2ab60 6e 73 75 72 65 73 0a 20 20 20 20 20 20 20 20 2a  nsures.        *
2ab70 2a 20 20 20 20 20 20 20 74 68 61 74 20 61 20 62  *       that a b
2ab80 65 73 74 2d 73 6f 2d 66 61 72 20 69 73 20 61 6c  est-so-far is al
2ab90 77 61 79 73 20 73 65 6c 65 63 74 65 64 20 65 76  ways selected ev
2aba0 65 6e 20 69 66 20 61 6e 20 69 6d 70 6f 73 73 69  en if an impossi
2abb0 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  ble.        **  
2abc0 20 20 20 20 20 63 6f 6d 62 69 6e 61 74 69 6f 6e       combination
2abd0 20 6f 66 20 49 4e 44 45 58 45 44 20 42 59 20 63   of INDEXED BY c
2abe0 6c 61 75 73 65 73 20 61 72 65 20 67 69 76 65 6e  lauses are given
2abf0 2e 20 20 54 68 65 20 65 72 72 6f 72 0a 20 20 20  .  The error.   
2ac00 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 77 69       **       wi
2ac10 6c 6c 20 62 65 20 64 65 74 65 63 74 65 64 20 61  ll be detected a
2ac20 6e 64 20 72 65 6c 61 79 65 64 20 62 61 63 6b 20  nd relayed back 
2ac30 74 6f 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  to the applicati
2ac40 6f 6e 20 6c 61 74 65 72 2e 0a 20 20 20 20 20 20  on later..      
2ac50 20 20 2a 2a 20 20 20 20 20 20 20 54 68 65 20 4e    **       The N
2ac60 45 56 45 52 28 29 20 63 6f 6d 65 73 20 61 62 6f  EVER() comes abo
2ac70 75 74 20 62 65 63 61 75 73 65 20 72 75 6c 65 20  ut because rule 
2ac80 28 32 29 20 61 62 6f 76 65 20 70 72 65 76 65 6e  (2) above preven
2ac90 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ts.        **   
2aca0 20 20 20 20 41 6e 20 69 6e 64 65 78 61 62 6c 65      An indexable
2acb0 20 66 75 6c 6c 2d 74 61 62 6c 65 2d 73 63 61 6e   full-table-scan
2acc0 20 66 72 6f 6d 20 72 65 61 63 68 69 6e 67 20 72   from reaching r
2acd0 75 6c 65 20 28 33 29 2e 0a 20 20 20 20 20 20 20  ule (3)..       
2ace0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
2acf0 20 28 34 29 20 54 68 65 20 70 6c 61 6e 20 63 6f   (4) The plan co
2ad00 73 74 20 6d 75 73 74 20 62 65 20 6c 6f 77 65 72  st must be lower
2ad10 20 74 68 61 6e 20 70 72 69 6f 72 20 70 6c 61 6e   than prior plan
2ad20 73 20 6f 72 20 65 6c 73 65 20 74 68 65 0a 20 20  s or else the.  
2ad30 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 63        **       c
2ad40 6f 73 74 20 6d 75 73 74 20 62 65 20 74 68 65 20  ost must be the 
2ad50 73 61 6d 65 20 61 6e 64 20 74 68 65 20 6e 75 6d  same and the num
2ad60 62 65 72 20 6f 66 20 72 6f 77 73 20 6d 75 73 74  ber of rows must
2ad70 20 62 65 20 6c 6f 77 65 72 2e 0a 20 20 20 20 20   be lower..     
2ad80 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
2ad90 28 20 28 73 43 6f 73 74 2e 75 73 65 64 26 6e 6f  ( (sCost.used&no
2ada0 74 52 65 61 64 79 29 3d 3d 30 20 20 20 20 20 20  tReady)==0      
2adb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2adc0 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20   /* (1) */.     
2add0 20 20 20 20 20 20 20 26 26 20 28 62 65 73 74 4a         && (bestJ
2ade0 3c 30 20 7c 7c 20 28 6e 6f 74 49 6e 64 65 78 65  <0 || (notIndexe
2adf0 64 26 6d 29 21 3d 30 20 20 20 20 20 20 20 20 20  d&m)!=0         
2ae00 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a        /* (2) */.
2ae10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae20 7c 7c 20 28 73 43 6f 73 74 2e 70 6c 61 6e 2e 77  || (sCost.plan.w
2ae30 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e  sFlags & WHERE_N
2ae40 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 21 3d 30 29  OT_FULLSCAN)!=0)
2ae50 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
2ae60 28 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65 64 3d  (nUnconstrained=
2ae70 3d 30 20 7c 7c 20 70 54 61 62 49 74 65 6d 2d 3e  =0 || pTabItem->
2ae80 70 49 6e 64 65 78 3d 3d 30 20 20 20 2f 2a 20 28  pIndex==0   /* (
2ae90 33 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  3) */.          
2aea0 20 20 20 20 20 20 7c 7c 20 4e 45 56 45 52 28 28        || NEVER((
2aeb0 73 43 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61  sCost.plan.wsFla
2aec0 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46  gs & WHERE_NOT_F
2aed0 55 4c 4c 53 43 41 4e 29 21 3d 30 29 29 0a 20 20  ULLSCAN)!=0)).  
2aee0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 62 65            && (be
2aef0 73 74 4a 3c 30 20 7c 7c 20 73 43 6f 73 74 2e 72  stJ<0 || sCost.r
2af00 43 6f 73 74 3c 62 65 73 74 50 6c 61 6e 2e 72 43  Cost<bestPlan.rC
2af10 6f 73 74 20 20 20 20 20 20 2f 2a 20 28 34 29 20  ost      /* (4) 
2af20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
2af30 20 20 20 7c 7c 20 28 73 43 6f 73 74 2e 72 43 6f     || (sCost.rCo
2af40 73 74 3c 3d 62 65 73 74 50 6c 61 6e 2e 72 43 6f  st<=bestPlan.rCo
2af50 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  st .            
2af60 20 20 20 20 20 26 26 20 73 43 6f 73 74 2e 70 6c       && sCost.pl
2af70 61 6e 2e 6e 52 6f 77 3c 62 65 73 74 50 6c 61 6e  an.nRow<bestPlan
2af80 2e 70 6c 61 6e 2e 6e 52 6f 77 29 29 0a 20 20 20  .plan.nRow)).   
2af90 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2afa0 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 3d    WHERETRACE(("=
2afb0 3d 3d 20 74 61 62 6c 65 20 25 64 20 69 73 20 62  == table %d is b
2afc0 65 73 74 20 73 6f 20 66 61 72 22 0a 20 20 20 20  est so far".    
2afd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afe0 20 20 22 20 77 69 74 68 20 63 6f 73 74 3d 25 67    " with cost=%g
2aff0 20 61 6e 64 20 6e 52 6f 77 3d 25 67 5c 6e 22 2c   and nRow=%g\n",
2b000 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b010 20 20 20 20 20 20 20 6a 2c 20 73 43 6f 73 74 2e         j, sCost.
2b020 72 43 6f 73 74 2c 20 73 43 6f 73 74 2e 70 6c 61  rCost, sCost.pla
2b030 6e 2e 6e 52 6f 77 29 29 3b 0a 20 20 20 20 20 20  n.nRow));.      
2b040 20 20 20 20 62 65 73 74 50 6c 61 6e 20 3d 20 73      bestPlan = s
2b050 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Cost;.          
2b060 62 65 73 74 4a 20 3d 20 6a 3b 0a 20 20 20 20 20  bestJ = j;.     
2b070 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2b080 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29 20   doNotReorder ) 
2b090 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
2b0a0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2b0b0 20 62 65 73 74 4a 3e 3d 30 20 29 3b 0a 20 20 20   bestJ>=0 );.   
2b0c0 20 61 73 73 65 72 74 28 20 6e 6f 74 52 65 61 64   assert( notRead
2b0d0 79 20 26 20 67 65 74 4d 61 73 6b 28 70 4d 61 73  y & getMask(pMas
2b0e0 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e  kSet, pTabList->
2b0f0 61 5b 62 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72  a[bestJ].iCursor
2b100 29 20 29 3b 0a 20 20 20 20 57 48 45 52 45 54 52  ) );.    WHERETR
2b110 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69  ACE(("*** Optimi
2b120 7a 65 72 20 73 65 6c 65 63 74 73 20 74 61 62 6c  zer selects tabl
2b130 65 20 25 64 20 66 6f 72 20 6c 6f 6f 70 20 25 64  e %d for loop %d
2b140 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
2b150 20 20 22 20 77 69 74 68 20 63 6f 73 74 3d 25 67    " with cost=%g
2b160 20 61 6e 64 20 6e 52 6f 77 3d 25 67 5c 6e 22 2c   and nRow=%g\n",
2b170 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b180 20 62 65 73 74 4a 2c 20 70 4c 65 76 65 6c 2d 70   bestJ, pLevel-p
2b190 57 49 6e 66 6f 2d 3e 61 2c 20 62 65 73 74 50 6c  WInfo->a, bestPl
2b1a0 61 6e 2e 72 43 6f 73 74 2c 20 62 65 73 74 50 6c  an.rCost, bestPl
2b1b0 61 6e 2e 70 6c 61 6e 2e 6e 52 6f 77 29 29 3b 0a  an.plan.nRow));.
2b1c0 20 20 20 20 69 66 28 20 28 62 65 73 74 50 6c 61      if( (bestPla
2b1d0 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  n.plan.wsFlags &
2b1e0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 29 21   WHERE_ORDERBY)!
2b1f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 4f  =0 ){.      *ppO
2b200 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
2b210 7d 0a 20 20 20 20 61 6e 64 46 6c 61 67 73 20 26  }.    andFlags &
2b220 3d 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e  = bestPlan.plan.
2b230 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65  wsFlags;.    pLe
2b240 76 65 6c 2d 3e 70 6c 61 6e 20 3d 20 62 65 73 74  vel->plan = best
2b250 50 6c 61 6e 2e 70 6c 61 6e 3b 0a 20 20 20 20 74  Plan.plan;.    t
2b260 65 73 74 63 61 73 65 28 20 62 65 73 74 50 6c 61  estcase( bestPla
2b270 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  n.plan.wsFlags &
2b280 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29   WHERE_INDEXED )
2b290 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
2b2a0 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73  bestPlan.plan.ws
2b2b0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 45  Flags & WHERE_TE
2b2c0 4d 50 5f 49 4e 44 45 58 20 29 3b 0a 20 20 20 20  MP_INDEX );.    
2b2d0 69 66 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61  if( bestPlan.pla
2b2e0 6e 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  n.wsFlags & (WHE
2b2f0 52 45 5f 49 4e 44 45 58 45 44 7c 57 48 45 52 45  RE_INDEXED|WHERE
2b300 5f 54 45 4d 50 5f 49 4e 44 45 58 29 20 29 7b 0a  _TEMP_INDEX) ){.
2b310 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49        pLevel->iI
2b320 64 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e  dxCur = pParse->
2b330 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  nTab++;.    }els
2b340 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  e{.      pLevel-
2b350 3e 69 49 64 78 43 75 72 20 3d 20 2d 31 3b 0a 20  >iIdxCur = -1;. 
2b360 20 20 20 7d 0a 20 20 20 20 6e 6f 74 52 65 61 64     }.    notRead
2b370 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 70 4d  y &= ~getMask(pM
2b380 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74  askSet, pTabList
2b390 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69 43 75 72 73  ->a[bestJ].iCurs
2b3a0 6f 72 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  or);.    pLevel-
2b3b0 3e 69 46 72 6f 6d 20 3d 20 28 75 38 29 62 65 73  >iFrom = (u8)bes
2b3c0 74 4a 3b 0a 20 20 20 20 69 66 28 20 62 65 73 74  tJ;.    if( best
2b3d0 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 52 6f 77 3e 3d  Plan.plan.nRow>=
2b3e0 28 64 6f 75 62 6c 65 29 31 20 29 7b 0a 20 20 20  (double)1 ){.   
2b3f0 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
2b400 79 4c 6f 6f 70 20 2a 3d 20 62 65 73 74 50 6c 61  yLoop *= bestPla
2b410 6e 2e 70 6c 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20  n.plan.nRow;.   
2b420 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
2b430 20 74 68 61 74 20 69 66 20 74 68 65 20 74 61 62   that if the tab
2b440 6c 65 20 73 63 61 6e 6e 65 64 20 62 79 20 74 68  le scanned by th
2b450 69 73 20 6c 6f 6f 70 20 69 74 65 72 61 74 69 6f  is loop iteratio
2b460 6e 20 68 61 64 20 61 6e 0a 20 20 20 20 2a 2a 20  n had an.    ** 
2b470 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
2b480 65 20 61 74 74 61 63 68 65 64 20 74 6f 20 69 74  e attached to it
2b490 2c 20 74 68 61 74 20 74 68 65 20 6e 61 6d 65 64  , that the named
2b4a0 20 69 6e 64 65 78 20 69 73 20 62 65 69 6e 67 0a   index is being.
2b4b0 20 20 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20      ** used for 
2b4c0 74 68 65 20 73 63 61 6e 2e 20 49 66 20 6e 6f 74  the scan. If not
2b4d0 2c 20 74 68 65 6e 20 71 75 65 72 79 20 63 6f 6d  , then query com
2b4e0 70 69 6c 61 74 69 6f 6e 20 68 61 73 20 66 61 69  pilation has fai
2b4f0 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 52 65 74 75  led..    ** Retu
2b500 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20  rn an error..   
2b510 20 2a 2f 0a 20 20 20 20 70 49 64 78 20 3d 20 70   */.    pIdx = p
2b520 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a  TabList->a[bestJ
2b530 5d 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66  ].pIndex;.    if
2b540 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ( pIdx ){.      
2b550 69 66 28 20 28 62 65 73 74 50 6c 61 6e 2e 70 6c  if( (bestPlan.pl
2b560 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
2b570 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20 29  RE_INDEXED)==0 )
2b580 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2b590 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2b5a0 2c 20 22 63 61 6e 6e 6f 74 20 75 73 65 20 69 6e  , "cannot use in
2b5b0 64 65 78 3a 20 25 73 22 2c 20 70 49 64 78 2d 3e  dex: %s", pIdx->
2b5c0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
2b5d0 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
2b5e0 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rror;.      }els
2b5f0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  e{.        /* If
2b600 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   an INDEXED BY c
2b610 6c 61 75 73 65 20 69 73 20 75 73 65 64 2c 20 74  lause is used, t
2b620 68 65 20 62 65 73 74 49 6e 64 65 78 28 29 20 66  he bestIndex() f
2b630 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20 20 20 20  unction is.     
2b640 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64     ** guaranteed
2b650 20 74 6f 20 66 69 6e 64 20 74 68 65 20 69 6e 64   to find the ind
2b660 65 78 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  ex specified in 
2b670 74 68 65 20 49 4e 44 45 58 45 44 20 42 59 20 63  the INDEXED BY c
2b680 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a  lause.        **
2b690 20 69 66 20 69 74 20 66 69 6e 64 20 61 6e 20 69   if it find an i
2b6a0 6e 64 65 78 20 61 74 20 61 6c 6c 2e 20 2a 2f 0a  ndex at all. */.
2b6b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2b6c0 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 75 2e  bestPlan.plan.u.
2b6d0 70 49 64 78 3d 3d 70 49 64 78 20 29 3b 0a 20 20  pIdx==pIdx );.  
2b6e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2b6f0 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2a    WHERETRACE(("*
2b700 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e  ** Optimizer Fin
2b710 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a  ished ***\n"));.
2b720 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
2b730 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
2b740 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
2b750 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
2b760 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  or;.  }..  /* If
2b770 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79   the total query
2b780 20 6f 6e 6c 79 20 73 65 6c 65 63 74 73 20 61 20   only selects a 
2b790 73 69 6e 67 6c 65 20 72 6f 77 2c 20 74 68 65 6e  single row, then
2b7a0 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20   the ORDER BY.  
2b7b0 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 69 72 72  ** clause is irr
2b7c0 65 6c 65 76 61 6e 74 2e 0a 20 20 2a 2f 0a 20 20  elevant..  */.  
2b7d0 69 66 28 20 28 61 6e 64 46 6c 61 67 73 20 26 20  if( (andFlags & 
2b7e0 57 48 45 52 45 5f 55 4e 49 51 55 45 29 21 3d 30  WHERE_UNIQUE)!=0
2b7f0 20 26 26 20 70 70 4f 72 64 65 72 42 79 20 29 7b   && ppOrderBy ){
2b800 0a 20 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20  .    *ppOrderBy 
2b810 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  = 0;.  }..  /* I
2b820 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  f the caller is 
2b830 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  an UPDATE or DEL
2b840 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ETE statement th
2b850 61 74 20 69 73 20 72 65 71 75 65 73 74 69 6e 67  at is requesting
2b860 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f  .  ** to use a o
2b870 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68  ne-pass algorith
2b880 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  m, determine if 
2b890 74 68 69 73 20 69 73 20 61 70 70 72 6f 70 72 69  this is appropri
2b8a0 61 74 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6f 6e  ate..  ** The on
2b8b0 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d  e-pass algorithm
2b8c0 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20 74   only works if t
2b8d0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2b8e0 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a  constraints.  **
2b8f0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
2b900 6f 20 75 70 64 61 74 65 20 61 20 73 69 6e 67 6c  o update a singl
2b910 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61 73  e row..  */.  as
2b920 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67  sert( (wctrlFlag
2b930 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
2b940 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c  S_DESIRED)==0 ||
2b950 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d   pWInfo->nLevel=
2b960 3d 31 20 29 3b 0a 20 20 69 66 28 20 28 77 63 74  =1 );.  if( (wct
2b970 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2b980 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29  ONEPASS_DESIRED)
2b990 21 3d 30 20 26 26 20 28 61 6e 64 46 6c 61 67 73  !=0 && (andFlags
2b9a0 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45 29   & WHERE_UNIQUE)
2b9b0 21 3d 30 20 29 7b 0a 20 20 20 20 70 57 49 6e 66  !=0 ){.    pWInf
2b9c0 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d 20 31  o->okOnePass = 1
2b9d0 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b  ;.    pWInfo->a[
2b9e0 30 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  0].plan.wsFlags 
2b9f0 26 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e  &= ~WHERE_IDX_ON
2ba00 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70  LY;.  }..  /* Op
2ba10 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  en all tables in
2ba20 20 74 68 65 20 70 54 61 62 4c 69 73 74 20 61 6e   the pTabList an
2ba30 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73 65  d any indices se
2ba40 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20  lected for.  ** 
2ba50 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65 20  searching those 
2ba60 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 73  tables..  */.  s
2ba70 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
2ba80 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 2d  Schema(pParse, -
2ba90 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74 68  1); /* Insert th
2baa0 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 65  e cookie verifie
2bab0 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 6e 6f 74 52  r Goto */.  notR
2bac0 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b  eady = ~(Bitmask
2bad0 29 30 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52  )0;.  pWInfo->nR
2bae0 6f 77 4f 75 74 20 3d 20 28 64 6f 75 62 6c 65 29  owOut = (double)
2baf0 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c  1;.  for(i=0, pL
2bb00 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20  evel=pWInfo->a; 
2bb10 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 2b 2b 2c  i<nTabList; i++,
2bb20 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
2bb30 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
2bb40 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65   /* Table to ope
2bb50 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62  n */.    int iDb
2bb60 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ;         /* Ind
2bb70 65 78 20 6f 66 20 64 61 74 61 62 61 73 65 20 63  ex of database c
2bb80 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f  ontaining table/
2bb90 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 20 20 70 54  index */..    pT
2bba0 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  abItem = &pTabLi
2bbb0 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
2bbc0 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d  rom];.    pTab =
2bbd0 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b   pTabItem->pTab;
2bbe0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61  .    pLevel->iTa
2bbf0 62 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d  bCur = pTabItem-
2bc00 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 57  >iCursor;.    pW
2bc10 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 2a 3d  Info->nRowOut *=
2bc20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 52   pLevel->plan.nR
2bc30 6f 77 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  ow;.    iDb = sq
2bc40 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
2bc50 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
2bc60 68 65 6d 61 29 3b 0a 20 20 20 20 69 66 28 20 28  hema);.    if( (
2bc70 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
2bc80 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d   TF_Ephemeral)!=
2bc90 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65  0 || pTab->pSele
2bca0 63 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44  ct ){.      /* D
2bcb0 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20  o nothing */.   
2bcc0 20 7d 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53   }else.#ifndef S
2bcd0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2bce0 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ALTABLE.    if( 
2bcf0 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
2bd00 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
2bd10 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29  RTUALTABLE)!=0 )
2bd20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
2bd30 61 72 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e  ar *pVTab = (con
2bd40 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65  st char *)sqlite
2bd50 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70  3GetVTable(db, p
2bd60 54 61 62 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  Tab);.      int 
2bd70 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d  iCur = pTabItem-
2bd80 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  >iCursor;.      
2bd90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2bda0 34 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69  4(v, OP_VOpen, i
2bdb0 43 75 72 2c 20 30 2c 20 30 2c 20 70 56 54 61 62  Cur, 0, 0, pVTab
2bdc0 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20  , P4_VTAB);.    
2bdd0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
2bde0 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c   if( (pLevel->pl
2bdf0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
2be00 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a  RE_IDX_ONLY)==0.
2be10 20 20 20 20 20 20 20 20 20 26 26 20 28 77 63 74           && (wct
2be20 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2be30 4f 4d 49 54 5f 4f 50 45 4e 29 3d 3d 30 20 29 7b  OMIT_OPEN)==0 ){
2be40 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  .      int op = 
2be50 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
2be60 73 20 3f 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  s ? OP_OpenWrite
2be70 20 3a 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a   : OP_OpenRead;.
2be80 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
2be90 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  nTable(pParse, p
2bea0 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
2beb0 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 6f 70 29  , iDb, pTab, op)
2bec0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2bed0 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d  ( pTab->nCol==BM
2bee0 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  S-1 );.      tes
2bef0 74 63 61 73 65 28 20 70 54 61 62 2d 3e 6e 43 6f  tcase( pTab->nCo
2bf00 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20  l==BMS );.      
2bf10 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f  if( !pWInfo->okO
2bf20 6e 65 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e  nePass && pTab->
2bf30 6e 43 6f 6c 3c 42 4d 53 20 29 7b 0a 20 20 20 20  nCol<BMS ){.    
2bf40 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20      Bitmask b = 
2bf50 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  pTabItem->colUse
2bf60 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  d;.        int n
2bf70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
2bf80 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e  r(; b; b=b>>1, n
2bf90 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 73 71  ++){}.        sq
2bfa0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2bfb0 34 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65  4(v, sqlite3Vdbe
2bfc0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31  CurrentAddr(v)-1
2bfd0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
2bfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
2bff0 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
2c000 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a  (n), P4_INT32);.
2c010 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2c020 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  n<=pTab->nCol );
2c030 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2c040 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
2c050 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
2c060 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e  e, iDb, pTab->tn
2c070 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  um, 0, pTab->zNa
2c080 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  me);.    }.#ifnd
2c090 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2c0a0 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20  UTOMATIC_INDEX. 
2c0b0 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e     if( (pLevel->
2c0c0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
2c0d0 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29  HERE_TEMP_INDEX)
2c0e0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  !=0 ){.      con
2c0f0 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49  structAutomaticI
2c100 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 57 43  ndex(pParse, pWC
2c110 2c 20 70 54 61 62 49 74 65 6d 2c 20 6e 6f 74 52  , pTabItem, notR
2c120 65 61 64 79 2c 20 70 4c 65 76 65 6c 29 3b 0a 20  eady, pLevel);. 
2c130 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
2c140 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d      if( (pLevel-
2c150 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
2c160 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
2c170 30 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  0 ){.      Index
2c180 20 2a 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e   *pIx = pLevel->
2c190 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20 20  plan.u.pIdx;.   
2c1a0 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
2c1b0 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b   = sqlite3IndexK
2c1c0 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyinfo(pParse, p
2c1d0 49 78 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Ix);.      int i
2c1e0 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d  IdxCur = pLevel-
2c1f0 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20  >iIdxCur;.      
2c200 61 73 73 65 72 74 28 20 70 49 78 2d 3e 70 53 63  assert( pIx->pSc
2c210 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68  hema==pTab->pSch
2c220 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ema );.      ass
2c230 65 72 74 28 20 69 49 64 78 43 75 72 3e 3d 30 20  ert( iIdxCur>=0 
2c240 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2c250 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
2c260 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49 64 78 43  _OpenRead, iIdxC
2c270 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69  ur, pIx->tnum, i
2c280 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
2c290 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
2c2a0 72 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49  r*)pKey, P4_KEYI
2c2b0 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
2c2c0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2c2d0 28 76 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a  (v, "%s", pIx->z
2c2e0 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Name));.    }.  
2c2f0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
2c300 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
2c310 2c 20 69 44 62 29 3b 0a 20 20 20 20 6e 6f 74 52  , iDb);.    notR
2c320 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b  eady &= ~getMask
2c330 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20  (pWC->pMaskSet, 
2c340 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
2c350 72 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f  r);.  }.  pWInfo
2c360 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ->iTop = sqlite3
2c370 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2c380 76 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  v);.  if( db->ma
2c390 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
2c3a0 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
2c3b0 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  r;..  /* Generat
2c3c0 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 64 6f  e the code to do
2c3d0 20 74 68 65 20 73 65 61 72 63 68 2e 20 20 45 61   the search.  Ea
2c3e0 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  ch iteration of 
2c3f0 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f  the for.  ** loo
2c400 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 65  p below generate
2c410 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e  s code for a sin
2c420 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20  gle nested loop 
2c430 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70  of the VM.  ** p
2c440 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e  rogram..  */.  n
2c450 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d  otReady = ~(Bitm
2c460 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d 30  ask)0;.  for(i=0
2c470 3b 20 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 2b  ; i<nTabList; i+
2c480 2b 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d  +){.    pLevel =
2c490 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a   &pWInfo->a[i];.
2c4a0 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63      explainOneSc
2c4b0 61 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  an(pParse, pTabL
2c4c0 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 69 2c 20  ist, pLevel, i, 
2c4d0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 77  pLevel->iFrom, w
2c4e0 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20  ctrlFlags);.    
2c4f0 6e 6f 74 52 65 61 64 79 20 3d 20 63 6f 64 65 4f  notReady = codeO
2c500 6e 65 4c 6f 6f 70 53 74 61 72 74 28 70 57 49 6e  neLoopStart(pWIn
2c510 66 6f 2c 20 69 2c 20 77 63 74 72 6c 46 6c 61 67  fo, i, wctrlFlag
2c520 73 2c 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20  s, notReady);.  
2c530 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69    pWInfo->iConti
2c540 6e 75 65 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  nue = pLevel->ad
2c550 64 72 43 6f 6e 74 3b 0a 20 20 7d 0a 0a 23 69 66  drCont;.  }..#if
2c560 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20  def SQLITE_TEST 
2c570 20 2f 2a 20 46 6f 72 20 74 65 73 74 69 6e 67 20   /* For testing 
2c580 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75 73  and debugging us
2c590 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 2f 2a 20 52  e only */.  /* R
2c5a0 65 63 6f 72 64 20 69 6e 20 74 68 65 20 71 75 65  ecord in the que
2c5b0 72 79 20 70 6c 61 6e 20 69 6e 66 6f 72 6d 61 74  ry plan informat
2c5c0 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 75  ion about the cu
2c5d0 72 72 65 6e 74 20 74 61 62 6c 65 0a 20 20 2a 2a  rrent table.  **
2c5e0 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 75   and the index u
2c5f0 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 69 74  sed to access it
2c600 20 28 69 66 20 61 6e 79 29 2e 20 20 49 66 20 74   (if any).  If t
2c610 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66 0a  he table itself.
2c620 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65 64    ** is not used
2c630 2c 20 69 74 73 20 6e 61 6d 65 20 69 73 20 6a 75  , its name is ju
2c640 73 74 20 27 7b 7d 27 2e 20 20 49 66 20 6e 6f 20  st '{}'.  If no 
2c650 69 6e 64 65 78 20 69 73 20 75 73 65 64 0a 20 20  index is used.  
2c660 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  ** the index is 
2c670 6c 69 73 74 65 64 20 61 73 20 22 7b 7d 22 2e 20  listed as "{}". 
2c680 20 49 66 20 74 68 65 20 70 72 69 6d 61 72 79 20   If the primary 
2c690 6b 65 79 20 69 73 20 75 73 65 64 20 74 68 65 0a  key is used the.
2c6a0 20 20 2a 2a 20 69 6e 64 65 78 20 6e 61 6d 65 20    ** index name 
2c6b0 69 73 20 27 2a 27 2e 0a 20 20 2a 2f 0a 20 20 66  is '*'..  */.  f
2c6c0 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 61 62 4c 69  or(i=0; i<nTabLi
2c6d0 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68  st; i++){.    ch
2c6e0 61 72 20 2a 7a 3b 0a 20 20 20 20 69 6e 74 20 6e  ar *z;.    int n
2c6f0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26  ;.    pLevel = &
2c700 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20  pWInfo->a[i];.  
2c710 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54    pTabItem = &pT
2c720 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
2c730 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 7a 20  ->iFrom];.    z 
2c740 3d 20 70 54 61 62 49 74 65 6d 2d 3e 7a 41 6c 69  = pTabItem->zAli
2c750 61 73 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30  as;.    if( z==0
2c760 20 29 20 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d   ) z = pTabItem-
2c770 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  >pTab->zName;.  
2c780 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72    n = sqlite3Str
2c790 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69 66  len30(z);.    if
2c7a0 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a  ( n+nQPlan < siz
2c7b0 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75 65 72  eof(sqlite3_quer
2c7c0 79 5f 70 6c 61 6e 29 2d 31 30 20 29 7b 0a 20 20  y_plan)-10 ){.  
2c7d0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
2c7e0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
2c7f0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b  HERE_IDX_ONLY ){
2c800 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
2c810 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  &sqlite3_query_p
2c820 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d  lan[nQPlan], "{}
2c830 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 6e  ", 2);.        n
2c840 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20  QPlan += 2;.    
2c850 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2c860 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33   memcpy(&sqlite3
2c870 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
2c880 61 6e 5d 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  an], z, n);.    
2c890 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b      nQPlan += n;
2c8a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
2c8b0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
2c8c0 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20  n[nQPlan++] = ' 
2c8d0 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73  ';.    }.    tes
2c8e0 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70  tcase( pLevel->p
2c8f0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
2c900 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 3b 0a  ERE_ROWID_EQ );.
2c910 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c      testcase( pL
2c920 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
2c930 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44  gs & WHERE_ROWID
2c940 5f 52 41 4e 47 45 20 29 3b 0a 20 20 20 20 69 66  _RANGE );.    if
2c950 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
2c960 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
2c970 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52  ROWID_EQ|WHERE_R
2c980 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20  OWID_RANGE) ){. 
2c990 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c       memcpy(&sql
2c9a0 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
2c9b0 6e 51 50 6c 61 6e 5d 2c 20 22 2a 20 22 2c 20 32  nQPlan], "* ", 2
2c9c0 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e 20  );.      nQPlan 
2c9d0 2b 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20  += 2;.    }else 
2c9e0 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  if( (pLevel->pla
2c9f0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
2ca00 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 7b  E_INDEXED)!=0 ){
2ca10 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  .      n = sqlit
2ca20 65 33 53 74 72 6c 65 6e 33 30 28 70 4c 65 76 65  e3Strlen30(pLeve
2ca30 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e  l->plan.u.pIdx->
2ca40 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  zName);.      if
2ca50 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a  ( n+nQPlan < siz
2ca60 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75 65 72  eof(sqlite3_quer
2ca70 79 5f 70 6c 61 6e 29 2d 32 20 29 7b 0a 20 20 20  y_plan)-2 ){.   
2ca80 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c       memcpy(&sql
2ca90 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
2caa0 6e 51 50 6c 61 6e 5d 2c 20 70 4c 65 76 65 6c 2d  nQPlan], pLevel-
2cab0 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e  >plan.u.pIdx->zN
2cac0 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20  ame, n);.       
2cad0 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20   nQPlan += n;.  
2cae0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75        sqlite3_qu
2caf0 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b  ery_plan[nQPlan+
2cb00 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  +] = ' ';.      
2cb10 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
2cb20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74     memcpy(&sqlit
2cb30 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
2cb40 50 6c 61 6e 5d 2c 20 22 7b 7d 20 22 2c 20 33 29  Plan], "{} ", 3)
2cb50 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b  ;.      nQPlan +
2cb60 3d 20 33 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 3;.    }.  }. 
2cb70 20 77 68 69 6c 65 28 20 6e 51 50 6c 61 6e 3e 30   while( nQPlan>0
2cb80 20 26 26 20 73 71 6c 69 74 65 33 5f 71 75 65 72   && sqlite3_quer
2cb90 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2d 31 5d  y_plan[nQPlan-1]
2cba0 3d 3d 27 20 27 20 29 7b 0a 20 20 20 20 73 71 6c  ==' ' ){.    sql
2cbb0 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
2cbc0 2d 2d 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20  --nQPlan] = 0;. 
2cbd0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 71 75 65   }.  sqlite3_que
2cbe0 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 20  ry_plan[nQPlan] 
2cbf0 3d 20 30 3b 0a 20 20 6e 51 50 6c 61 6e 20 3d 20  = 0;.  nQPlan = 
2cc00 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  0;.#endif /* SQL
2cc10 49 54 45 5f 54 45 53 54 20 2f 2f 20 54 65 73 74  ITE_TEST // Test
2cc20 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
2cc30 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 0a 20  g use only */.. 
2cc40 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 63   /* Record the c
2cc50 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 61 64 64 72  ontinuation addr
2cc60 65 73 73 20 69 6e 20 74 68 65 20 57 68 65 72 65  ess in the Where
2cc70 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  Info structure. 
2cc80 20 54 68 65 6e 0a 20 20 2a 2a 20 63 6c 65 61 6e   Then.  ** clean
2cc90 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a   up and return..
2cca0 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 57    */.  return pW
2ccb0 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  Info;..  /* Jump
2ccc0 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20   here if malloc 
2ccd0 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65  fails */.whereBe
2cce0 67 69 6e 45 72 72 6f 72 3a 0a 20 20 69 66 28 20  ginError:.  if( 
2ccf0 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70 50  pWInfo ){.    pP
2cd00 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
2cd10 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64   = pWInfo->saved
2cd20 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20  NQueryLoop;.    
2cd30 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62  whereInfoFree(db
2cd40 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20  , pWInfo);.  }. 
2cd50 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
2cd60 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65  .** Generate the
2cd70 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52   end of the WHER
2cd80 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d  E loop.  See com
2cd90 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c  ments on .** sql
2cda0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
2cdb0 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
2cdc0 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
2cdd0 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65 72  void sqlite3Wher
2cde0 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f 20 2a  eEnd(WhereInfo *
2cdf0 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72 73 65  pWInfo){.  Parse
2ce00 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66   *pParse = pWInf
2ce10 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56 64 62  o->pParse;.  Vdb
2ce20 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
2ce30 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
2ce40 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
2ce50 76 65 6c 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  vel;.  SrcList *
2ce60 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66  pTabList = pWInf
2ce70 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73  o->pTabList;.  s
2ce80 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
2ce90 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47  rse->db;..  /* G
2cea0 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74 65 72  enerate loop ter
2ceb0 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20  mination code.. 
2cec0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70   */.  sqlite3Exp
2ced0 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
2cee0 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57 49  se);.  for(i=pWI
2cef0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69  nfo->nLevel-1; i
2cf00 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70  >=0; i--){.    p
2cf10 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
2cf20 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 71 6c 69 74  >a[i];.    sqlit
2cf30 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
2cf40 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  el(v, pLevel->ad
2cf50 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 69 66 28  drCont);.    if(
2cf60 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f   pLevel->op!=OP_
2cf70 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71  Noop ){.      sq
2cf80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2cf90 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70  v, pLevel->op, p
2cfa0 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65  Level->p1, pLeve
2cfb0 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 20 20 73 71  l->p2);.      sq
2cfc0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2cfd0 35 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70 35 29  5(v, pLevel->p5)
2cfe0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2cff0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
2d000 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f  lags & WHERE_IN_
2d010 41 42 4c 45 20 26 26 20 70 4c 65 76 65 6c 2d 3e  ABLE && pLevel->
2d020 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20  u.in.nIn>0 ){.  
2d030 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f      struct InLoo
2d040 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e  p *pIn;.      in
2d050 74 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t j;.      sqlit
2d060 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
2d070 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  el(v, pLevel->ad
2d080 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 66 6f  drNxt);.      fo
2d090 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  r(j=pLevel->u.in
2d0a0 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76 65  .nIn, pIn=&pLeve
2d0b0 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b  l->u.in.aInLoop[
2d0c0 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20  j-1]; j>0; j--, 
2d0d0 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  pIn--){.        
2d0e0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2d0f0 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72  ere(v, pIn->addr
2d100 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20  InTop+1);.      
2d110 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2d120 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
2d130 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e  pIn->iCur, pIn->
2d140 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20  addrInTop);.    
2d150 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
2d160 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e  umpHere(v, pIn->
2d170 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20  addrInTop-1);.  
2d180 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
2d190 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c  te3DbFree(db, pL
2d1a0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
2d1b0 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  op);.    }.    s
2d1c0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
2d1d0 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
2d1e0 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  ->addrBrk);.    
2d1f0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  if( pLevel->iLef
2d200 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 69  tJoin ){.      i
2d210 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61  nt addr;.      a
2d220 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
2d230 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
2d240 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  Pos, pLevel->iLe
2d250 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 61  ftJoin);.      a
2d260 73 73 65 72 74 28 20 28 70 4c 65 76 65 6c 2d 3e  ssert( (pLevel->
2d270 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
2d280 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
2d290 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  0.           || 
2d2a0 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
2d2b0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
2d2c0 44 45 58 45 44 29 21 3d 30 20 29 3b 0a 20 20 20  DEXED)!=0 );.   
2d2d0 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e     if( (pLevel->
2d2e0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
2d2f0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
2d300 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
2d310 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
2d320 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54  , OP_NullRow, pT
2d330 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  abList->a[i].iCu
2d340 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rsor);.      }. 
2d350 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d       if( pLevel-
2d360 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 7b 0a 20  >iIdxCur>=0 ){. 
2d370 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2d380 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
2d390 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e  ullRow, pLevel->
2d3a0 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20  iIdxCur);.      
2d3b0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76  }.      if( pLev
2d3c0 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72  el->op==OP_Retur
2d3d0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  n ){.        sql
2d3e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2d3f0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76  , OP_Gosub, pLev
2d400 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e  el->p1, pLevel->
2d410 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20  addrFirst);.    
2d420 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2d430 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2d440 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
2d450 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69  , pLevel->addrFi
2d460 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rst);.      }.  
2d470 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
2d480 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
2d490 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
2d4a0 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20 70 6f  * The "break" po
2d4b0 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75 73  int is here, jus
2d4c0 74 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  t past the end o
2d4d0 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70  f the outer loop
2d4e0 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20  ..  ** Set it.. 
2d4f0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
2d500 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
2d510 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29   pWInfo->iBreak)
2d520 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c  ;..  /* Close al
2d530 6c 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73  l of the cursors
2d540 20 74 68 61 74 20 77 65 72 65 20 6f 70 65 6e 65   that were opene
2d550 64 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  d by sqlite3Wher
2d560 65 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20 61  eBegin..  */.  a
2d570 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e  ssert( pWInfo->n
2d580 4c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 57 49 6e  Level==1 || pWIn
2d590 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 70 54 61 62  fo->nLevel==pTab
2d5a0 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  List->nSrc );.  
2d5b0 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d  for(i=0, pLevel=
2d5c0 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57 49  pWInfo->a; i<pWI
2d5d0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b  nfo->nLevel; i++
2d5e0 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20  , pLevel++){.   
2d5f0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2d600 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d  item *pTabItem =
2d610 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
2d620 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
2d630 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
2d640 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pTabItem->pTab;.
2d650 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
2d660 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28  !=0 );.    if( (
2d670 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
2d680 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d   TF_Ephemeral)==
2d690 30 0a 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e  0.     && pTab->
2d6a0 70 53 65 6c 65 63 74 3d 3d 30 0a 20 20 20 20 20  pSelect==0.     
2d6b0 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
2d6c0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2d6d0 4d 49 54 5f 43 4c 4f 53 45 29 3d 3d 30 0a 20 20  MIT_CLOSE)==0.  
2d6e0 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 77    ){.      int w
2d6f0 73 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  s = pLevel->plan
2d700 2e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 20 20  .wsFlags;.      
2d710 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f  if( !pWInfo->okO
2d720 6e 65 50 61 73 73 20 26 26 20 28 77 73 20 26 20  nePass && (ws & 
2d730 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
2d740 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
2d750 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
2d760 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61  v, OP_Close, pTa
2d770 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  bItem->iCursor);
2d780 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2d790 66 28 20 28 77 73 20 26 20 57 48 45 52 45 5f 49  f( (ws & WHERE_I
2d7a0 4e 44 45 58 45 44 29 21 3d 30 20 26 26 20 28 77  NDEXED)!=0 && (w
2d7b0 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49  s & WHERE_TEMP_I
2d7c0 4e 44 45 58 29 3d 3d 30 20 29 7b 0a 20 20 20 20  NDEX)==0 ){.    
2d7d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2d7e0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
2d7f0 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  e, pLevel->iIdxC
2d800 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ur);.      }.   
2d810 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
2d820 69 73 20 73 63 61 6e 20 75 73 65 73 20 61 6e 20  is scan uses an 
2d830 69 6e 64 65 78 2c 20 6d 61 6b 65 20 63 6f 64 65  index, make code
2d840 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 74   substitutions t
2d850 6f 20 72 65 61 64 20 64 61 74 61 0a 20 20 20 20  o read data.    
2d860 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65  ** from the inde
2d870 78 20 69 6e 20 70 72 65 66 65 72 65 6e 63 65 20  x in preference 
2d880 74 6f 20 74 68 65 20 74 61 62 6c 65 2e 20 53 6f  to the table. So
2d890 6d 65 74 69 6d 65 73 2c 20 74 68 69 73 20 6d 65  metimes, this me
2d8a0 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 74  ans.    ** the t
2d8b0 61 62 6c 65 20 6e 65 65 64 20 6e 65 76 65 72 20  able need never 
2d8c0 62 65 20 72 65 61 64 20 66 72 6f 6d 2e 20 54 68  be read from. Th
2d8d0 69 73 20 69 73 20 61 20 70 65 72 66 6f 72 6d 61  is is a performa
2d8e0 6e 63 65 20 62 6f 6f 73 74 2c 0a 20 20 20 20 2a  nce boost,.    *
2d8f0 2a 20 61 73 20 74 68 65 20 76 64 62 65 20 6c 65  * as the vdbe le
2d900 76 65 6c 20 77 61 69 74 73 20 75 6e 74 69 6c 20  vel waits until 
2d910 74 68 65 20 74 61 62 6c 65 20 69 73 20 72 65 61  the table is rea
2d920 64 20 62 65 66 6f 72 65 20 61 63 74 75 61 6c 6c  d before actuall
2d930 79 0a 20 20 20 20 2a 2a 20 73 65 65 6b 69 6e 67  y.    ** seeking
2d940 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f   the table curso
2d950 72 20 74 6f 20 74 68 65 20 72 65 63 6f 72 64 20  r to the record 
2d960 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
2d970 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20   the current.   
2d980 20 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20   ** position in 
2d990 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a  the index..    *
2d9a0 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20  * .    ** Calls 
2d9b0 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  to the code gene
2d9c0 72 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e  rator in between
2d9d0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2d9e0 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71  in and.    ** sq
2d9f0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 20 77 69  lite3WhereEnd wi
2da00 6c 6c 20 68 61 76 65 20 63 72 65 61 74 65 64 20  ll have created 
2da10 63 6f 64 65 20 74 68 61 74 20 72 65 66 65 72 65  code that refere
2da20 6e 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20  nces the table. 
2da30 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20     ** directly. 
2da40 20 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73   This loop scans
2da50 20 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c   all that code l
2da60 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64  ooking for opcod
2da70 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72  es.    ** that r
2da80 65 66 65 72 65 6e 63 65 20 74 68 65 20 74 61 62  eference the tab
2da90 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20  le and converts 
2daa0 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65  them into opcode
2dab0 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65  s that.    ** re
2dac0 66 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65  ference the inde
2dad0 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  x..    */.    if
2dae0 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
2daf0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2db00 49 4e 44 45 58 45 44 29 21 3d 30 20 26 26 20 21  INDEXED)!=0 && !
2db10 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2db20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 2c 20  ){.      int k, 
2db30 6a 2c 20 6c 61 73 74 3b 0a 20 20 20 20 20 20 56  j, last;.      V
2db40 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20  dbeOp *pOp;.    
2db50 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20    Index *pIdx = 
2db60 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70  pLevel->plan.u.p
2db70 49 64 78 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  Idx;..      asse
2db80 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20  rt( pIdx!=0 );. 
2db90 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74       pOp = sqlit
2dba0 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
2dbb0 57 49 6e 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20  WInfo->iTop);.  
2dbc0 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74      last = sqlit
2dbd0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2dbe0 72 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  r(v);.      for(
2dbf0 6b 3d 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20  k=pWInfo->iTop; 
2dc00 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70  k<last; k++, pOp
2dc10 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
2dc20 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c   pOp->p1!=pLevel
2dc30 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74  ->iTabCur ) cont
2dc40 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
2dc50 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
2dc60 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  P_Column ){.    
2dc70 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2dc80 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
2dc90 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
2dca0 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70    if( pOp->p2==p
2dcb0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
2dcc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2dcd0 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20    pOp->p2 = j;. 
2dce0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70               pOp
2dcf0 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  ->p1 = pLevel->i
2dd00 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
2dd10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2dd20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2dd30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2dd40 20 61 73 73 65 72 74 28 20 28 70 4c 65 76 65 6c   assert( (pLevel
2dd50 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
2dd60 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
2dd70 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
2dd80 20 20 20 7c 7c 20 6a 3c 70 49 64 78 2d 3e 6e 43     || j<pIdx->nC
2dd90 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20  olumn );.       
2dda0 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
2ddb0 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64  opcode==OP_Rowid
2ddc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
2ddd0 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e  p->p1 = pLevel->
2dde0 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20  iIdxCur;.       
2ddf0 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
2de00 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20   OP_IdxRowid;.  
2de10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2de20 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2de30 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20  Final cleanup.  
2de40 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 6e 51 75  */.  pParse->nQu
2de50 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f  eryLoop = pWInfo
2de60 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  ->savedNQueryLoo
2de70 70 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72  p;.  whereInfoFr
2de80 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
2de90 20 20 72 65 74 75 72 6e 3b 0a 7d 0a                return;.}.