/ Hex Artifact Content
Login

Artifact fa22d45b2577c77146f2e894d58011d472d64103:


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 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  /../*.** An inst
14b0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
14c0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
14d0: 68 6f 6c 64 73 20 61 6c 6c 20 69 6e 66 6f 72 6d  holds all inform
14e0: 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 0a 2a 2a  ation about a.**
14f0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
1500: 4d 6f 73 74 6c 79 20 74 68 69 73 20 69 73 20 61  Mostly this is a
1510: 20 63 6f 6e 74 61 69 6e 65 72 20 66 6f 72 20 6f   container for o
1520: 6e 65 20 6f 72 20 6d 6f 72 65 20 57 68 65 72 65  ne or more Where
1530: 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  Terms..*/.struct
1540: 20 57 68 65 72 65 43 6c 61 75 73 65 20 7b 0a 20   WhereClause {. 
1550: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
1560: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1570: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
1580: 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
1590: 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 2f 2a  t *pMaskSet;  /*
15a0: 20 4d 61 70 70 69 6e 67 20 6f 66 20 74 61 62 6c   Mapping of tabl
15b0: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
15c0: 20 74 6f 20 62 69 74 6d 61 73 6b 73 20 2a 2f 0a   to bitmasks */.
15d0: 20 20 42 69 74 6d 61 73 6b 20 76 6d 61 73 6b 3b    Bitmask vmask;
15e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
15f0: 74 6d 61 73 6b 20 69 64 65 6e 74 69 66 79 69 6e  tmask identifyin
1600: 67 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  g virtual table 
1610: 63 75 72 73 6f 72 73 20 2a 2f 0a 20 20 75 38 20  cursors */.  u8 
1620: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
1630: 20 20 20 20 20 20 2f 2a 20 53 70 6c 69 74 20 6f        /* Split o
1640: 70 65 72 61 74 6f 72 2e 20 20 54 4b 5f 41 4e 44  perator.  TK_AND
1650: 20 6f 72 20 54 4b 5f 4f 52 20 2a 2f 0a 20 20 69   or TK_OR */.  i
1660: 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
1670: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1680: 72 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20  r of terms */.  
1690: 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20  int nSlot;      
16a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
16b0: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
16c0: 20 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54   a[] */.  WhereT
16d0: 65 72 6d 20 2a 61 3b 20 20 20 20 20 20 20 20 20  erm *a;         
16e0: 20 20 20 2f 2a 20 45 61 63 68 20 61 5b 5d 20 64     /* Each a[] d
16f0: 65 73 63 72 69 62 65 73 20 61 20 74 65 72 6d 20  escribes a term 
1700: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 75  of the WHERE clu
1710: 61 73 65 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ase */.#if defin
1720: 65 64 28 53 51 4c 49 54 45 5f 53 4d 41 4c 4c 5f  ed(SQLITE_SMALL_
1730: 53 54 41 43 4b 29 0a 20 20 57 68 65 72 65 54 65  STACK).  WhereTe
1740: 72 6d 20 61 53 74 61 74 69 63 5b 31 5d 3b 20 20  rm aStatic[1];  
1750: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74 61    /* Initial sta
1760: 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 5b  tic space for a[
1770: 5d 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 57 68 65  ] */.#else.  Whe
1780: 72 65 54 65 72 6d 20 61 53 74 61 74 69 63 5b 38  reTerm aStatic[8
1790: 5d 3b 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  ];    /* Initial
17a0: 20 73 74 61 74 69 63 20 73 70 61 63 65 20 66 6f   static space fo
17b0: 72 20 61 5b 5d 20 2a 2f 0a 23 65 6e 64 69 66 0a  r a[] */.#endif.
17c0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72  };../*.** A Wher
17d0: 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65 72  eTerm with eOper
17e0: 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 68 61 73 20  ator==WO_OR has 
17f0: 69 74 73 20 75 2e 70 4f 72 49 6e 66 6f 20 70 6f  its u.pOrInfo po
1800: 69 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20  inter set to.** 
1810: 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  a dynamically al
1820: 6c 6f 63 61 74 65 64 20 69 6e 73 74 61 6e 63 65  located instance
1830: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1840: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  g structure..*/.
1850: 73 74 72 75 63 74 20 57 68 65 72 65 4f 72 49 6e  struct WhereOrIn
1860: 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61 75  fo {.  WhereClau
1870: 73 65 20 77 63 3b 20 20 20 20 20 20 20 20 20 20  se wc;          
1880: 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e  /* Decomposition
1890: 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
18a0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65  /.  Bitmask inde
18b0: 78 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  xable;       /* 
18c0: 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 69  Bitmask of all i
18d0: 6e 64 65 78 61 62 6c 65 20 74 61 62 6c 65 73 20  ndexable tables 
18e0: 69 6e 20 74 68 65 20 63 6c 61 75 73 65 20 2a 2f  in the clause */
18f0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65  .};../*.** A Whe
1900: 72 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65  reTerm with eOpe
1910: 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 68 61  rator==WO_AND ha
1920: 73 20 69 74 73 20 75 2e 70 41 6e 64 49 6e 66 6f  s its u.pAndInfo
1930: 20 70 6f 69 6e 74 65 72 20 73 65 74 20 74 6f 0a   pointer set to.
1940: 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  ** a dynamically
1950: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 73 74 61   allocated insta
1960: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
1970: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
1980: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 41  */.struct WhereA
1990: 6e 64 49 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65  ndInfo {.  Where
19a0: 43 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20 20  Clause wc;      
19b0: 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 65 78      /* The subex
19c0: 70 72 65 73 73 69 6f 6e 20 62 72 6f 6b 65 6e 20  pression broken 
19d0: 6f 75 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  out */.};../*.**
19e0: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
19f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
1a00: 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 74 72  ructure keeps tr
1a10: 61 63 6b 20 6f 66 20 61 20 6d 61 70 70 69 6e 67  ack of a mapping
1a20: 0a 2a 2a 20 62 65 74 77 65 65 6e 20 56 44 42 45  .** between VDBE
1a30: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
1a40: 61 6e 64 20 62 69 74 73 20 6f 66 20 74 68 65 20  and bits of the 
1a50: 62 69 74 6d 61 73 6b 73 20 69 6e 20 57 68 65 72  bitmasks in Wher
1a60: 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  eTerm..**.** The
1a70: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
1a80: 62 65 72 73 20 61 72 65 20 73 6d 61 6c 6c 20 69  bers are small i
1a90: 6e 74 65 67 65 72 73 20 63 6f 6e 74 61 69 6e 65  ntegers containe
1aa0: 64 20 69 6e 20 0a 2a 2a 20 53 72 63 4c 69 73 74  d in .** SrcList
1ab0: 5f 69 74 65 6d 2e 69 43 75 72 73 6f 72 20 61 6e  _item.iCursor an
1ac0: 64 20 45 78 70 72 2e 69 54 61 62 6c 65 20 66 69  d Expr.iTable fi
1ad0: 65 6c 64 73 2e 20 20 46 6f 72 20 61 6e 79 20 67  elds.  For any g
1ae0: 69 76 65 6e 20 57 48 45 52 45 20 0a 2a 2a 20 63  iven WHERE .** c
1af0: 6c 61 75 73 65 2c 20 74 68 65 20 63 75 72 73 6f  lause, the curso
1b00: 72 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20  r numbers might 
1b10: 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  not begin with 0
1b20: 20 61 6e 64 20 74 68 65 79 20 6d 69 67 68 74 0a   and they might.
1b30: 2a 2a 20 63 6f 6e 74 61 69 6e 20 67 61 70 73 20  ** contain gaps 
1b40: 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 69 6e 67  in the numbering
1b50: 20 73 65 71 75 65 6e 63 65 2e 20 20 42 75 74 20   sequence.  But 
1b60: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
1b70: 6d 61 78 69 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f  maximum.** use o
1b80: 66 20 74 68 65 20 62 69 74 73 20 69 6e 20 6f 75  f the bits in ou
1b90: 72 20 62 69 74 6d 61 73 6b 73 2e 20 20 54 68 69  r bitmasks.  Thi
1ba0: 73 20 73 74 72 75 63 74 75 72 65 20 70 72 6f 76  s structure prov
1bb0: 69 64 65 73 20 61 20 6d 61 70 70 69 6e 67 0a 2a  ides a mapping.*
1bc0: 2a 20 66 72 6f 6d 20 74 68 65 20 73 70 61 72 73  * from the spars
1bd0: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
1be0: 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69 76   into consecutiv
1bf0: 65 20 69 6e 74 65 67 65 72 73 20 62 65 67 69 6e  e integers begin
1c00: 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20 30 2e 0a  ning.** with 0..
1c10: 2a 2a 0a 2a 2a 20 49 66 20 57 68 65 72 65 4d 61  **.** If WhereMa
1c20: 73 6b 53 65 74 2e 69 78 5b 41 5d 3d 3d 42 20 69  skSet.ix[A]==B i
1c30: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 54 68 65  t means that The
1c40: 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 42   A-th bit of a B
1c50: 69 74 6d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73  itmask.** corres
1c60: 70 6f 6e 64 73 20 56 44 42 45 20 63 75 72 73 6f  ponds VDBE curso
1c70: 72 20 6e 75 6d 62 65 72 20 42 2e 20 20 54 68 65  r number B.  The
1c80: 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 62   A-th bit of a b
1c90: 69 74 6d 61 73 6b 20 69 73 20 31 3c 3c 41 2e 0a  itmask is 1<<A..
1ca0: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1cb0: 65 2c 20 69 66 20 74 68 65 20 57 48 45 52 45 20  e, if the WHERE 
1cc0: 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69 6f  clause expressio
1cd0: 6e 20 75 73 65 64 20 74 68 65 73 65 20 56 44 42  n used these VDB
1ce0: 45 0a 2a 2a 20 63 75 72 73 6f 72 73 3a 20 20 34  E.** cursors:  4
1cf0: 2c 20 35 2c 20 38 2c 20 32 39 2c 20 35 37 2c 20  , 5, 8, 29, 57, 
1d00: 37 33 2e 20 20 54 68 65 6e 20 74 68 65 20 20 57  73.  Then the  W
1d10: 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75  hereMaskSet stru
1d20: 63 74 75 72 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d  cture.** would m
1d30: 61 70 20 74 68 6f 73 65 20 63 75 72 73 6f 72 20  ap those cursor 
1d40: 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74  numbers into bit
1d50: 73 20 30 20 74 68 72 6f 75 67 68 20 35 2e 0a 2a  s 0 through 5..*
1d60: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
1d70: 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f  he mapping is no
1d80: 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 6f 72  t necessarily or
1d90: 64 65 72 65 64 2e 20 20 49 6e 20 74 68 65 20 65  dered.  In the e
1da0: 78 61 6d 70 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c  xample.** above,
1db0: 20 74 68 65 20 6d 61 70 70 69 6e 67 20 6d 69 67   the mapping mig
1dc0: 68 74 20 67 6f 20 6c 69 6b 65 20 74 68 69 73 3a  ht go like this:
1dd0: 20 20 34 2d 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d    4->3, 5->1, 8-
1de0: 3e 32 2c 20 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37  >2, 29->0,.** 57
1df0: 2d 3e 35 2c 20 37 33 2d 3e 34 2e 20 20 4f 72 20  ->5, 73->4.  Or 
1e00: 6f 6e 65 20 6f 66 20 37 31 39 20 6f 74 68 65 72  one of 719 other
1e10: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6d 69   combinations mi
1e20: 67 68 74 20 62 65 20 75 73 65 64 2e 20 49 74 0a  ght be used. It.
1e30: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 6c  ** does not real
1e40: 6c 79 20 6d 61 74 74 65 72 2e 20 20 57 68 61 74  ly matter.  What
1e50: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 73   is important is
1e60: 20 74 68 61 74 20 73 70 61 72 73 65 20 63 75 72   that sparse cur
1e70: 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 61  sor.** numbers a
1e80: 6c 6c 20 67 65 74 20 6d 61 70 70 65 64 20 69 6e  ll get mapped in
1e90: 74 6f 20 62 69 74 20 6e 75 6d 62 65 72 73 20 74  to bit numbers t
1ea0: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  hat begin with 0
1eb0: 20 61 6e 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20   and contain.** 
1ec0: 6e 6f 20 67 61 70 73 2e 0a 2a 2f 0a 73 74 72 75  no gaps..*/.stru
1ed0: 63 74 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  ct WhereMaskSet 
1ee0: 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  {.  int n;      
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f00: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
1f10: 73 73 69 67 6e 65 64 20 63 75 72 73 6f 72 20 76  ssigned cursor v
1f20: 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  alues */.  int i
1f30: 78 5b 42 4d 53 5d 3b 20 20 20 20 20 20 20 20 20  x[BMS];         
1f40: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
1f50: 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65  or assigned to e
1f60: 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b 0a 0a 2f  ach bit */.};../
1f70: 2a 0a 2a 2a 20 41 20 57 68 65 72 65 43 6f 73 74  *.** A WhereCost
1f80: 20 6f 62 6a 65 63 74 20 72 65 63 6f 72 64 73 20   object records 
1f90: 61 20 6c 6f 6f 6b 75 70 20 73 74 72 61 74 65 67  a lookup strateg
1fa0: 79 20 61 6e 64 20 74 68 65 20 65 73 74 69 6d 61  y and the estima
1fb0: 74 65 64 0a 2a 2a 20 63 6f 73 74 20 6f 66 20 70  ted.** cost of p
1fc0: 75 72 73 75 69 6e 67 20 74 68 61 74 20 73 74 72  ursuing that str
1fd0: 61 74 65 67 79 2e 0a 2a 2f 0a 73 74 72 75 63 74  ategy..*/.struct
1fe0: 20 57 68 65 72 65 43 6f 73 74 20 7b 0a 20 20 57   WhereCost {.  W
1ff0: 68 65 72 65 50 6c 61 6e 20 70 6c 61 6e 3b 20 20  herePlan plan;  
2000: 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20    /* The lookup 
2010: 73 74 72 61 74 65 67 79 20 2a 2f 0a 20 20 64 6f  strategy */.  do
2020: 75 62 6c 65 20 72 43 6f 73 74 3b 20 20 20 20 20  uble rCost;     
2030: 20 2f 2a 20 4f 76 65 72 61 6c 6c 20 63 6f 73 74   /* Overall cost
2040: 20 6f 66 20 70 75 72 73 75 69 6e 67 20 74 68 69   of pursuing thi
2050: 73 20 73 65 61 72 63 68 20 73 74 72 61 74 65 67  s search strateg
2060: 79 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 75  y */.  Bitmask u
2070: 73 65 64 3b 20 20 20 20 20 20 2f 2a 20 42 69 74  sed;      /* Bit
2080: 6d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20  mask of cursors 
2090: 75 73 65 64 20 62 79 20 74 68 69 73 20 70 6c 61  used by this pla
20a0: 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42  n */.};../*.** B
20b0: 69 74 6d 61 73 6b 73 20 66 6f 72 20 74 68 65 20  itmasks for the 
20c0: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 69  operators that i
20d0: 6e 64 69 63 65 73 20 61 72 65 20 61 62 6c 65 20  ndices are able 
20e0: 74 6f 20 65 78 70 6c 6f 69 74 2e 20 20 41 6e 0a  to exploit.  An.
20f0: 2a 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61  ** OR-ed combina
2100: 74 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 76 61  tion of these va
2110: 6c 75 65 73 20 63 61 6e 20 62 65 20 75 73 65 64  lues can be used
2120: 20 77 68 65 6e 20 73 65 61 72 63 68 69 6e 67 20   when searching 
2130: 66 6f 72 0a 2a 2a 20 74 65 72 6d 73 20 69 6e 20  for.** terms in 
2140: 74 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65  the where clause
2150: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f  ..*/.#define WO_
2160: 49 4e 20 20 20 20 20 30 78 30 30 31 0a 23 64 65  IN     0x001.#de
2170: 66 69 6e 65 20 57 4f 5f 45 51 20 20 20 20 20 30  fine WO_EQ     0
2180: 78 30 30 32 0a 23 64 65 66 69 6e 65 20 57 4f 5f  x002.#define WO_
2190: 4c 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28  LT     (WO_EQ<<(
21a0: 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29 0a 23 64  TK_LT-TK_EQ)).#d
21b0: 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20 20 20 20  efine WO_LE     
21c0: 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d 54  (WO_EQ<<(TK_LE-T
21d0: 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57  K_EQ)).#define W
21e0: 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f 45 51 3c  O_GT     (WO_EQ<
21f0: 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51 29 29 0a  <(TK_GT-TK_EQ)).
2200: 23 64 65 66 69 6e 65 20 57 4f 5f 47 45 20 20 20  #define WO_GE   
2210: 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 45    (WO_EQ<<(TK_GE
2220: 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65  -TK_EQ)).#define
2230: 20 57 4f 5f 4d 41 54 43 48 20 20 30 78 30 34 30   WO_MATCH  0x040
2240: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49 53 4e 55  .#define WO_ISNU
2250: 4c 4c 20 30 78 30 38 30 0a 23 64 65 66 69 6e 65  LL 0x080.#define
2260: 20 57 4f 5f 4f 52 20 20 20 20 20 30 78 31 30 30   WO_OR     0x100
2270: 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72         /* Two or
2280: 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74   more OR-connect
2290: 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23 64 65 66  ed terms */.#def
22a0: 69 6e 65 20 57 4f 5f 41 4e 44 20 20 20 20 30 78  ine WO_AND    0x
22b0: 32 30 30 20 20 20 20 20 20 20 2f 2a 20 54 77 6f  200       /* Two
22c0: 20 6f 72 20 6d 6f 72 65 20 41 4e 44 2d 63 6f 6e   or more AND-con
22d0: 6e 65 63 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a  nected terms */.
22e0: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 41 4c 4c 20  .#define WO_ALL 
22f0: 20 20 20 30 78 66 66 66 20 20 20 20 20 20 20 2f     0xfff       /
2300: 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 70 6f  * Mask of all po
2310: 73 73 69 62 6c 65 20 57 4f 5f 2a 20 76 61 6c 75  ssible WO_* valu
2320: 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f  es */.#define WO
2330: 5f 53 49 4e 47 4c 45 20 30 78 30 66 66 20 20 20  _SINGLE 0x0ff   
2340: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61      /* Mask of a
2350: 6c 6c 20 6e 6f 6e 2d 63 6f 6d 70 6f 75 6e 64 20  ll non-compound 
2360: 57 4f 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 0a  WO_* values */..
2370: 2f 2a 0a 2a 2a 20 56 61 6c 75 65 20 66 6f 72 20  /*.** Value for 
2380: 77 73 46 6c 61 67 73 20 72 65 74 75 72 6e 65 64  wsFlags returned
2390: 20 62 79 20 62 65 73 74 49 6e 64 65 78 28 29 20   by bestIndex() 
23a0: 61 6e 64 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a  and stored in.**
23b0: 20 57 68 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c   WhereLevel.wsFl
23c0: 61 67 73 2e 20 20 54 68 65 73 65 20 66 6c 61 67  ags.  These flag
23d0: 73 20 64 65 74 65 72 6d 69 6e 65 20 77 68 69 63  s determine whic
23e0: 68 20 73 65 61 72 63 68 0a 2a 2a 20 73 74 72 61  h search.** stra
23f0: 74 65 67 69 65 73 20 61 72 65 20 61 70 70 72 6f  tegies are appro
2400: 70 72 69 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  priate..**.** Th
2410: 65 20 6c 65 61 73 74 20 73 69 67 6e 69 66 69 63  e least signific
2420: 61 6e 74 20 31 32 20 62 69 74 73 20 69 73 20 72  ant 12 bits is r
2430: 65 73 65 72 76 65 64 20 61 73 20 61 20 6d 61 73  eserved as a mas
2440: 6b 20 66 6f 72 20 57 4f 5f 20 76 61 6c 75 65 73  k for WO_ values
2450: 20 61 62 6f 76 65 2e 0a 2a 2a 20 54 68 65 20 57   above..** The W
2460: 68 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67  hereLevel.wsFlag
2470: 73 20 66 69 65 6c 64 20 69 73 20 75 73 75 61 6c  s field is usual
2480: 6c 79 20 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c  ly set to WO_IN|
2490: 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2e  WO_EQ|WO_ISNULL.
24a0: 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 74  .** But if the t
24b0: 61 62 6c 65 20 69 73 20 74 68 65 20 72 69 67 68  able is the righ
24c0: 74 20 74 61 62 6c 65 20 6f 66 20 61 20 6c 65 66  t table of a lef
24d0: 74 20 6a 6f 69 6e 2c 20 57 68 65 72 65 4c 65 76  t join, WhereLev
24e0: 65 6c 2e 77 73 46 6c 61 67 73 0a 2a 2a 20 69 73  el.wsFlags.** is
24f0: 20 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f   set to WO_IN|WO
2500: 5f 45 51 2e 20 20 54 68 65 20 57 68 65 72 65 4c  _EQ.  The WhereL
2510: 65 76 65 6c 2e 77 73 46 6c 61 67 73 20 66 69 65  evel.wsFlags fie
2520: 6c 64 20 63 61 6e 20 74 68 65 6e 20 62 65 20 75  ld can then be u
2530: 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 22 6f  sed as.** the "o
2540: 70 22 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  p" parameter to 
2550: 66 69 6e 64 54 65 72 6d 20 77 68 65 6e 20 77 65  findTerm when we
2560: 20 61 72 65 20 72 65 73 6f 6c 76 69 6e 67 20 65   are resolving e
2570: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
2580: 6e 74 73 2e 0a 2a 2a 20 49 53 4e 55 4c 4c 20 63  nts..** ISNULL c
2590: 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20  onstraints will 
25a0: 74 68 65 6e 20 6e 6f 74 20 62 65 20 75 73 65 64  then not be used
25b0: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 74 61   on the right ta
25c0: 62 6c 65 20 6f 66 20 61 20 6c 65 66 74 0a 2a 2a  ble of a left.**
25d0: 20 6a 6f 69 6e 2e 20 20 54 69 63 6b 65 74 73 20   join.  Tickets 
25e0: 23 32 31 37 37 20 61 6e 64 20 23 32 31 38 39 2e  #2177 and #2189.
25f0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52  .*/.#define WHER
2600: 45 5f 52 4f 57 49 44 5f 45 51 20 20 20 20 20 30  E_ROWID_EQ     0
2610: 78 30 30 30 30 31 30 30 30 20 20 2f 2a 20 72 6f  x00001000  /* ro
2620: 77 69 64 3d 45 58 50 52 20 6f 72 20 72 6f 77 69  wid=EXPR or rowi
2630: 64 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64  d IN (...) */.#d
2640: 65 66 69 6e 65 20 57 48 45 52 45 5f 52 4f 57 49  efine WHERE_ROWI
2650: 44 5f 52 41 4e 47 45 20 20 30 78 30 30 30 30 32  D_RANGE  0x00002
2660: 30 30 30 20 20 2f 2a 20 72 6f 77 69 64 3c 45 58  000  /* rowid<EX
2670: 50 52 20 61 6e 64 2f 6f 72 20 72 6f 77 69 64 3e  PR and/or rowid>
2680: 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20  EXPR */.#define 
2690: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20  WHERE_COLUMN_EQ 
26a0: 20 20 20 30 78 30 30 30 31 30 30 30 30 20 20 2f     0x00010000  /
26b0: 2a 20 78 3d 45 58 50 52 20 6f 72 20 78 20 49 4e  * x=EXPR or x IN
26c0: 20 28 2e 2e 2e 29 20 6f 72 20 78 20 49 53 20 4e   (...) or x IS N
26d0: 55 4c 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ULL */.#define W
26e0: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
26f0: 45 20 30 78 30 30 30 32 30 30 30 30 20 20 2f 2a  E 0x00020000  /*
2700: 20 78 3c 45 58 50 52 20 61 6e 64 2f 6f 72 20 78   x<EXPR and/or x
2710: 3e 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65  >EXPR */.#define
2720: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
2730: 20 20 20 20 30 78 30 30 30 34 30 30 30 30 20 20      0x00040000  
2740: 2f 2a 20 78 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f  /* x IN (...) */
2750: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43  .#define WHERE_C
2760: 4f 4c 55 4d 4e 5f 4e 55 4c 4c 20 20 30 78 30 30  OLUMN_NULL  0x00
2770: 30 38 30 30 30 30 20 20 2f 2a 20 78 20 49 53 20  080000  /* x IS 
2780: 4e 55 4c 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20  NULL */.#define 
2790: 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 20 20  WHERE_INDEXED   
27a0: 20 20 20 30 78 30 30 30 66 30 30 30 30 20 20 2f     0x000f0000  /
27b0: 2a 20 41 6e 79 74 68 69 6e 67 20 74 68 61 74 20  * Anything that 
27c0: 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f  uses an index */
27d0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4e  .#define WHERE_N
27e0: 4f 54 5f 46 55 4c 4c 53 43 41 4e 20 30 78 31 30  OT_FULLSCAN 0x10
27f0: 30 66 33 30 30 30 20 20 2f 2a 20 44 6f 65 73 20  0f3000  /* Does 
2800: 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 74 61  not do a full ta
2810: 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 23 64 65 66  ble scan */.#def
2820: 69 6e 65 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c  ine WHERE_IN_ABL
2830: 45 20 20 20 20 20 20 30 78 30 30 30 66 31 30 30  E      0x000f100
2840: 30 20 20 2f 2a 20 41 62 6c 65 20 74 6f 20 73 75  0  /* Able to su
2850: 70 70 6f 72 74 20 61 6e 20 49 4e 20 6f 70 65 72  pport an IN oper
2860: 61 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ator */.#define 
2870: 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
2880: 20 20 20 30 78 30 30 31 30 30 30 30 30 20 20 2f     0x00100000  /
2890: 2a 20 78 3c 45 58 50 52 20 6f 72 20 78 3c 3d 45  * x<EXPR or x<=E
28a0: 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  XPR constraint *
28b0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
28c0: 42 54 4d 5f 4c 49 4d 49 54 20 20 20 20 30 78 30  BTM_LIMIT    0x0
28d0: 30 32 30 30 30 30 30 20 20 2f 2a 20 78 3e 45 58  0200000  /* x>EX
28e0: 50 52 20 6f 72 20 78 3e 3d 45 58 50 52 20 63 6f  PR or x>=EXPR co
28f0: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66  nstraint */.#def
2900: 69 6e 65 20 57 48 45 52 45 5f 42 4f 54 48 5f 4c  ine WHERE_BOTH_L
2910: 49 4d 49 54 20 20 20 30 78 30 30 33 30 30 30 30  IMIT   0x0030000
2920: 30 20 20 2f 2a 20 42 6f 74 68 20 78 3e 45 58 50  0  /* Both x>EXP
2930: 52 20 61 6e 64 20 78 3c 45 58 50 52 20 2a 2f 0a  R and x<EXPR */.
2940: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49 44  #define WHERE_ID
2950: 58 5f 4f 4e 4c 59 20 20 20 20 20 30 78 30 30 38  X_ONLY     0x008
2960: 30 30 30 30 30 20 20 2f 2a 20 55 73 65 20 69 6e  00000  /* Use in
2970: 64 65 78 20 6f 6e 6c 79 20 2d 20 6f 6d 69 74 20  dex only - omit 
2980: 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65  table */.#define
2990: 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 20 20   WHERE_ORDERBY  
29a0: 20 20 20 20 30 78 30 31 30 30 30 30 30 30 20 20      0x01000000  
29b0: 2f 2a 20 4f 75 74 70 75 74 20 77 69 6c 6c 20 61  /* Output will a
29c0: 70 70 65 61 72 20 69 6e 20 63 6f 72 72 65 63 74  ppear in correct
29d0: 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e   order */.#defin
29e0: 65 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 20  e WHERE_REVERSE 
29f0: 20 20 20 20 20 30 78 30 32 30 30 30 30 30 30 20       0x02000000 
2a00: 20 2f 2a 20 53 63 61 6e 20 69 6e 20 72 65 76 65   /* Scan in reve
2a10: 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65  rse order */.#de
2a20: 66 69 6e 65 20 57 48 45 52 45 5f 55 4e 49 51 55  fine WHERE_UNIQU
2a30: 45 20 20 20 20 20 20 20 30 78 30 34 30 30 30 30  E       0x040000
2a40: 30 30 20 20 2f 2a 20 53 65 6c 65 63 74 73 20 6e  00  /* Selects n
2a50: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
2a60: 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  row */.#define W
2a70: 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
2a80: 45 20 30 78 30 38 30 30 30 30 30 30 20 20 2f 2a  E 0x08000000  /*
2a90: 20 55 73 65 20 76 69 72 74 75 61 6c 2d 74 61 62   Use virtual-tab
2aa0: 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  le processing */
2ab0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4d  .#define WHERE_M
2ac0: 55 4c 54 49 5f 4f 52 20 20 20 20 20 30 78 31 30  ULTI_OR     0x10
2ad0: 30 30 30 30 30 30 20 20 2f 2a 20 4f 52 20 75 73  000000  /* OR us
2ae0: 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 69 6e 64  ing multiple ind
2af0: 69 63 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ices */.#define 
2b00: 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58  WHERE_TEMP_INDEX
2b10: 20 20 20 30 78 32 30 30 30 30 30 30 30 20 20 2f     0x20000000  /
2b20: 2a 20 55 73 65 73 20 61 6e 20 65 70 68 65 6d 65  * Uses an epheme
2b30: 72 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 2f 2a  ral index */../*
2b40: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
2b50: 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 57 68   preallocated Wh
2b60: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
2b70: 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ure..*/.static v
2b80: 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 49  oid whereClauseI
2b90: 6e 69 74 28 0a 20 20 57 68 65 72 65 43 6c 61 75  nit(.  WhereClau
2ba0: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
2bb0: 2f 2a 20 54 68 65 20 57 68 65 72 65 43 6c 61 75  /* The WhereClau
2bc0: 73 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61 6c  se to be initial
2bd0: 69 7a 65 64 20 2a 2f 0a 20 20 50 61 72 73 65 20  ized */.  Parse 
2be0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
2bf0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
2c00: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
2c10: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
2c20: 73 6b 53 65 74 20 20 20 2f 2a 20 4d 61 70 70 69  skSet   /* Mappi
2c30: 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65 20 63 75  ng from table cu
2c40: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 74 6f 20  rsor numbers to 
2c50: 62 69 74 6d 61 73 6b 73 20 2a 2f 0a 29 7b 0a 20  bitmasks */.){. 
2c60: 20 70 57 43 2d 3e 70 50 61 72 73 65 20 3d 20 70   pWC->pParse = p
2c70: 50 61 72 73 65 3b 0a 20 20 70 57 43 2d 3e 70 4d  Parse;.  pWC->pM
2c80: 61 73 6b 53 65 74 20 3d 20 70 4d 61 73 6b 53 65  askSet = pMaskSe
2c90: 74 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72 6d 20  t;.  pWC->nTerm 
2ca0: 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53 6c 6f  = 0;.  pWC->nSlo
2cb0: 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28 70 57  t = ArraySize(pW
2cc0: 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20 20 70  C->aStatic);.  p
2cd0: 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61 53 74  WC->a = pWC->aSt
2ce0: 61 74 69 63 3b 0a 20 20 70 57 43 2d 3e 76 6d 61  atic;.  pWC->vma
2cf0: 73 6b 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f  sk = 0;.}../* Fo
2d00: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
2d10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
2d20: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
2d30: 57 68 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a 0a  WhereClause*);..
2d40: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
2d50: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
2d60: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68  ciated with a Wh
2d70: 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74  ereOrInfo object
2d80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2d90: 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65   whereOrInfoDele
2da0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
2db0: 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29 7b  WhereOrInfo *p){
2dc0: 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  .  whereClauseCl
2dd0: 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73  ear(&p->wc);.  s
2de0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2df0: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   p);.}../*.** De
2e00: 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d  allocate all mem
2e10: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
2e20: 69 74 68 20 61 20 57 68 65 72 65 41 6e 64 49 6e  ith a WhereAndIn
2e30: 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  fo object..*/.st
2e40: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 41  atic void whereA
2e50: 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c  ndInfoDelete(sql
2e60: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 41  ite3 *db, WhereA
2e70: 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68  ndInfo *p){.  wh
2e80: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
2e90: 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65  p->wc);.  sqlite
2ea0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
2eb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
2ec0: 61 74 65 20 61 20 57 68 65 72 65 43 6c 61 75 73  ate a WhereClaus
2ed0: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
2ee0: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
2ef0: 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c  ructure.** itsel
2f00: 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20  f is not freed. 
2f10: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2f20: 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20   the inverse of 
2f30: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
2f40: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
2f50: 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65  d whereClauseCle
2f60: 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  ar(WhereClause *
2f70: 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  pWC){.  int i;. 
2f80: 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20   WhereTerm *a;. 
2f90: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
2fa0: 57 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  WC->pParse->db;.
2fb0: 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65    for(i=pWC->nTe
2fc0: 72 6d 2d 31 2c 20 61 3d 70 57 43 2d 3e 61 3b 20  rm-1, a=pWC->a; 
2fd0: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 61 2b 2b 29 7b  i>=0; i--, a++){
2fe0: 0a 20 20 20 20 69 66 28 20 61 2d 3e 77 74 46 6c  .    if( a->wtFl
2ff0: 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d  ags & TERM_DYNAM
3000: 49 43 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  IC ){.      sqli
3010: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
3020: 2c 20 61 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  , a->pExpr);.   
3030: 20 7d 0a 20 20 20 20 69 66 28 20 61 2d 3e 77 74   }.    if( a->wt
3040: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49  Flags & TERM_ORI
3050: 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65  NFO ){.      whe
3060: 72 65 4f 72 49 6e 66 6f 44 65 6c 65 74 65 28 64  reOrInfoDelete(d
3070: 62 2c 20 61 2d 3e 75 2e 70 4f 72 49 6e 66 6f 29  b, a->u.pOrInfo)
3080: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
3090: 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  a->wtFlags & TER
30a0: 4d 5f 41 4e 44 49 4e 46 4f 20 29 7b 0a 20 20 20  M_ANDINFO ){.   
30b0: 20 20 20 77 68 65 72 65 41 6e 64 49 6e 66 6f 44     whereAndInfoD
30c0: 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70  elete(db, a->u.p
30d0: 41 6e 64 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a  AndInfo);.    }.
30e0: 20 20 7d 0a 20 20 69 66 28 20 70 57 43 2d 3e 61    }.  if( pWC->a
30f0: 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20 29  !=pWC->aStatic )
3100: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
3110: 72 65 65 28 64 62 2c 20 70 57 43 2d 3e 61 29 3b  ree(db, pWC->a);
3120: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
3130: 64 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 57  d a single new W
3140: 68 65 72 65 54 65 72 6d 20 65 6e 74 72 79 20 74  hereTerm entry t
3150: 6f 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  o the WhereClaus
3160: 65 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a 2a 2a  e object pWC..**
3170: 20 54 68 65 20 6e 65 77 20 57 68 65 72 65 54 65   The new WhereTe
3180: 72 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e  rm object is con
3190: 73 74 72 75 63 74 65 64 20 66 72 6f 6d 20 45 78  structed from Ex
31a0: 70 72 20 70 20 61 6e 64 20 77 69 74 68 20 77 74  pr p and with wt
31b0: 46 6c 61 67 73 2e 0a 2a 2a 20 54 68 65 20 69 6e  Flags..** The in
31c0: 64 65 78 20 69 6e 20 70 57 43 2d 3e 61 5b 5d 20  dex in pWC->a[] 
31d0: 6f 66 20 74 68 65 20 6e 65 77 20 57 68 65 72 65  of the new Where
31e0: 54 65 72 6d 20 69 73 20 72 65 74 75 72 6e 65 64  Term is returned
31f0: 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 20   on success..** 
3200: 30 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  0 is returned if
3210: 20 74 68 65 20 6e 65 77 20 57 68 65 72 65 54 65   the new WhereTe
3220: 72 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  rm could not be 
3230: 61 64 64 65 64 20 64 75 65 20 74 6f 20 61 20 6d  added due to a m
3240: 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  emory.** allocat
3250: 69 6f 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 20  ion error.  The 
3260: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
3270: 6e 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 62  n failure will b
3280: 65 20 72 65 63 6f 72 64 65 64 20 69 6e 0a 2a 2a  e recorded in.**
3290: 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   the db->mallocF
32a0: 61 69 6c 65 64 20 66 6c 61 67 20 73 6f 20 74 68  ailed flag so th
32b0: 61 74 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20  at higher-level 
32c0: 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 64 65  functions can de
32d0: 74 65 63 74 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  tect it..**.** T
32e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
32f0: 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 73 69   increase the si
3300: 7a 65 20 6f 66 20 74 68 65 20 70 57 43 2d 3e 61  ze of the pWC->a
3310: 5b 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63 65  [] array as nece
3320: 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssary..**.** If 
3330: 74 68 65 20 77 74 46 6c 61 67 73 20 61 72 67 75  the wtFlags argu
3340: 6d 65 6e 74 20 69 6e 63 6c 75 64 65 73 20 54 45  ment includes TE
3350: 52 4d 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e  RM_DYNAMIC, then
3360: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a   responsibility.
3370: 2a 2a 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74  ** for freeing t
3380: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20  he expression p 
3390: 69 73 20 61 73 73 75 6d 65 64 20 62 79 20 74 68  is assumed by th
33a0: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62  e WhereClause ob
33b0: 6a 65 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68 69  ject pWC..** Thi
33c0: 73 20 69 73 20 74 72 75 65 20 65 76 65 6e 20 69  s is true even i
33d0: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  f this routine f
33e0: 61 69 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ails to allocate
33f0: 20 61 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d   a new WhereTerm
3400: 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a  ..**.** WARNING:
3410: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
3420: 69 67 68 74 20 72 65 61 6c 6c 6f 63 61 74 65 20  ight reallocate 
3430: 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20 74  the space used t
3440: 6f 20 73 74 6f 72 65 0a 2a 2a 20 57 68 65 72 65  o store.** Where
3450: 54 65 72 6d 73 2e 20 20 41 6c 6c 20 70 6f 69 6e  Terms.  All poin
3460: 74 65 72 73 20 74 6f 20 57 68 65 72 65 54 65 72  ters to WhereTer
3470: 6d 73 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76  ms should be inv
3480: 61 6c 69 64 61 74 65 64 20 61 66 74 65 72 0a 2a  alidated after.*
3490: 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  * calling this r
34a0: 6f 75 74 69 6e 65 2e 20 20 53 75 63 68 20 70 6f  outine.  Such po
34b0: 69 6e 74 65 72 73 20 6d 61 79 20 62 65 20 72 65  inters may be re
34c0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 72  initialized by r
34d0: 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 74 68  eferencing.** th
34e0: 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79  e pWC->a[] array
34f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3500: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
3510: 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  t(WhereClause *p
3520: 57 43 2c 20 45 78 70 72 20 2a 70 2c 20 75 38 20  WC, Expr *p, u8 
3530: 77 74 46 6c 61 67 73 29 7b 0a 20 20 57 68 65 72  wtFlags){.  Wher
3540: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
3550: 69 6e 74 20 69 64 78 3b 0a 20 20 74 65 73 74 63  int idx;.  testc
3560: 61 73 65 28 20 77 74 46 6c 61 67 73 20 26 20 54  ase( wtFlags & T
3570: 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 20  ERM_VIRTUAL );  
3580: 2f 2a 20 45 56 3a 20 52 2d 30 30 32 31 31 2d 31  /* EV: R-00211-1
3590: 35 31 30 30 20 2a 2f 0a 20 20 69 66 28 20 70 57  5100 */.  if( pW
35a0: 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e  C->nTerm>=pWC->n
35b0: 53 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72  Slot ){.    Wher
35c0: 65 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57  eTerm *pOld = pW
35d0: 43 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69 74 65  C->a;.    sqlite
35e0: 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 50 61  3 *db = pWC->pPa
35f0: 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70 57 43  rse->db;.    pWC
3600: 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ->a = sqlite3DbM
3610: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
3620: 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70  eof(pWC->a[0])*p
3630: 57 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29 3b 0a 20  WC->nSlot*2 );. 
3640: 20 20 20 69 66 28 20 70 57 43 2d 3e 61 3d 3d 30     if( pWC->a==0
3650: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77 74   ){.      if( wt
3660: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e  Flags & TERM_DYN
3670: 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 20 20  AMIC ){.        
3680: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
3690: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  e(db, p);.      
36a0: 7d 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 20 3d  }.      pWC->a =
36b0: 20 70 4f 6c 64 3b 0a 20 20 20 20 20 20 72 65 74   pOld;.      ret
36c0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
36d0: 20 6d 65 6d 63 70 79 28 70 57 43 2d 3e 61 2c 20   memcpy(pWC->a, 
36e0: 70 4f 6c 64 2c 20 73 69 7a 65 6f 66 28 70 57 43  pOld, sizeof(pWC
36f0: 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 54 65  ->a[0])*pWC->nTe
3700: 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c  rm);.    if( pOl
3710: 64 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20  d!=pWC->aStatic 
3720: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
3730: 44 62 46 72 65 65 28 64 62 2c 20 70 4f 6c 64 29  DbFree(db, pOld)
3740: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 43 2d  ;.    }.    pWC-
3750: 3e 6e 53 6c 6f 74 20 3d 20 73 71 6c 69 74 65 33  >nSlot = sqlite3
3760: 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c  DbMallocSize(db,
3770: 20 70 57 43 2d 3e 61 29 2f 73 69 7a 65 6f 66 28   pWC->a)/sizeof(
3780: 70 57 43 2d 3e 61 5b 30 5d 29 3b 0a 20 20 7d 0a  pWC->a[0]);.  }.
3790: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
37a0: 61 5b 69 64 78 20 3d 20 70 57 43 2d 3e 6e 54 65  a[idx = pWC->nTe
37b0: 72 6d 2b 2b 5d 3b 0a 20 20 70 54 65 72 6d 2d 3e  rm++];.  pTerm->
37c0: 70 45 78 70 72 20 3d 20 70 3b 0a 20 20 70 54 65  pExpr = p;.  pTe
37d0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 3d 20 77 74  rm->wtFlags = wt
37e0: 46 6c 61 67 73 3b 0a 20 20 70 54 65 72 6d 2d 3e  Flags;.  pTerm->
37f0: 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 54 65  pWC = pWC;.  pTe
3800: 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31  rm->iParent = -1
3810: 3b 0a 20 20 72 65 74 75 72 6e 20 69 64 78 3b 0a  ;.  return idx;.
3820: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
3830: 75 74 69 6e 65 20 69 64 65 6e 74 69 66 69 65 73  utine identifies
3840: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20   subexpressions 
3850: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
3860: 75 73 65 20 77 68 65 72 65 0a 2a 2a 20 65 61 63  use where.** eac
3870: 68 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  h subexpression 
3880: 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20  is separated by 
3890: 74 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72  the AND operator
38a0: 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a   or some other.*
38b0: 2a 20 6f 70 65 72 61 74 6f 72 20 73 70 65 63 69  * operator speci
38c0: 66 69 65 64 20 69 6e 20 74 68 65 20 6f 70 20 70  fied in the op p
38d0: 61 72 61 6d 65 74 65 72 2e 20 20 54 68 65 20 57  arameter.  The W
38e0: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
38f0: 74 75 72 65 0a 2a 2a 20 69 73 20 66 69 6c 6c 65  ture.** is fille
3900: 64 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20  d with pointers 
3910: 74 6f 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  to subexpression
3920: 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  s.  For example:
3930: 0a 2a 2a 0a 2a 2a 20 20 20 20 57 48 45 52 45 20  .**.**    WHERE 
3940: 20 61 3d 3d 27 68 65 6c 6c 6f 27 20 41 4e 44 20   a=='hello' AND 
3950: 63 6f 61 6c 65 73 63 65 28 62 2c 31 31 29 3c 31  coalesce(b,11)<1
3960: 30 20 41 4e 44 20 28 63 2b 31 32 21 3d 64 20 4f  0 AND (c+12!=d O
3970: 52 20 63 3d 3d 32 32 29 0a 2a 2a 20 20 20 20 20  R c==22).**     
3980: 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f        \________/
3990: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
39a0: 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f  _____/     \____
39b0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a  ____________/.**
39c0: 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74              slot
39d0: 5b 30 5d 20 20 20 20 20 20 20 20 20 20 20 20 73  [0]            s
39e0: 6c 6f 74 5b 31 5d 20 20 20 20 20 20 20 20 20 20  lot[1]          
39f0: 20 20 20 20 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a       slot[2].**.
3a00: 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** The original 
3a10: 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20  WHERE clause in 
3a20: 70 45 78 70 72 20 69 73 20 75 6e 61 6c 74 65 72  pExpr is unalter
3a30: 65 64 2e 20 20 41 6c 6c 20 74 68 69 73 20 72 6f  ed.  All this ro
3a40: 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 69 73  utine.** does is
3a50: 20 6d 61 6b 65 20 73 6c 6f 74 5b 5d 20 65 6e 74   make slot[] ent
3a60: 72 69 65 73 20 70 6f 69 6e 74 20 74 6f 20 73 75  ries point to su
3a70: 62 73 74 72 75 63 74 75 72 65 20 77 69 74 68 69  bstructure withi
3a80: 6e 20 70 45 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 49  n pExpr..**.** I
3a90: 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  n the previous s
3aa0: 65 6e 74 65 6e 63 65 20 61 6e 64 20 69 6e 20 74  entence and in t
3ab0: 68 65 20 64 69 61 67 72 61 6d 2c 20 22 73 6c 6f  he diagram, "slo
3ac0: 74 5b 5d 22 20 72 65 66 65 72 73 20 74 6f 0a 2a  t[]" refers to.*
3ad0: 2a 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  * the WhereClaus
3ae0: 65 2e 61 5b 5d 20 61 72 72 61 79 2e 20 20 54 68  e.a[] array.  Th
3af0: 65 20 73 6c 6f 74 5b 5d 20 61 72 72 61 79 20 67  e slot[] array g
3b00: 72 6f 77 73 20 61 73 20 6e 65 65 64 65 64 20 74  rows as needed t
3b10: 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c  o contain.** all
3b20: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
3b30: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73  ERE clause..*/.s
3b40: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
3b50: 53 70 6c 69 74 28 57 68 65 72 65 43 6c 61 75 73  Split(WhereClaus
3b60: 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 45  e *pWC, Expr *pE
3b70: 78 70 72 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20  xpr, int op){.  
3b80: 70 57 43 2d 3e 6f 70 20 3d 20 28 75 38 29 6f 70  pWC->op = (u8)op
3b90: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ;.  if( pExpr==0
3ba0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
3bb0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29   pExpr->op!=op )
3bc0: 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73  {.    whereClaus
3bd0: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 45 78  eInsert(pWC, pEx
3be0: 70 72 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  pr, 0);.  }else{
3bf0: 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28  .    whereSplit(
3c00: 70 57 43 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  pWC, pExpr->pLef
3c10: 74 2c 20 6f 70 29 3b 0a 20 20 20 20 77 68 65 72  t, op);.    wher
3c20: 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70  eSplit(pWC, pExp
3c30: 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 29 3b 0a  r->pRight, op);.
3c40: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69    }.}../*.** Ini
3c50: 74 69 61 6c 69 7a 65 20 61 6e 20 65 78 70 72 65  tialize an expre
3c60: 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 28  ssion mask set (
3c70: 61 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 6f  a WhereMaskSet o
3c80: 62 6a 65 63 74 29 0a 2a 2f 0a 23 64 65 66 69 6e  bject).*/.#defin
3c90: 65 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 50 29  e initMaskSet(P)
3ca0: 20 20 6d 65 6d 73 65 74 28 50 2c 20 30 2c 20 73    memset(P, 0, s
3cb0: 69 7a 65 6f 66 28 2a 50 29 29 0a 0a 2f 2a 0a 2a  izeof(*P))../*.*
3cc0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62 69 74  * Return the bit
3cd0: 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 67 69 76  mask for the giv
3ce0: 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  en cursor number
3cf0: 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 0a 2a  .  Return 0 if.*
3d00: 2a 20 69 43 75 72 73 6f 72 20 69 73 20 6e 6f 74  * iCursor is not
3d10: 20 69 6e 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a   in the set..*/.
3d20: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 67  static Bitmask g
3d30: 65 74 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b  etMask(WhereMask
3d40: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69  Set *pMaskSet, i
3d50: 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 69  nt iCursor){.  i
3d60: 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
3d70: 70 4d 61 73 6b 53 65 74 2d 3e 6e 3c 3d 73 69 7a  pMaskSet->n<=siz
3d80: 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29  eof(Bitmask)*8 )
3d90: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
3da0: 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29  MaskSet->n; i++)
3db0: 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73 6b 53  {.    if( pMaskS
3dc0: 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73  et->ix[i]==iCurs
3dd0: 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  or ){.      retu
3de0: 72 6e 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c  rn ((Bitmask)1)<
3df0: 3c 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  <i;.    }.  }.  
3e00: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
3e10: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
3e20: 6d 61 73 6b 20 66 6f 72 20 63 75 72 73 6f 72 20  mask for cursor 
3e30: 69 43 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  iCursor..**.** T
3e40: 68 65 72 65 20 69 73 20 6f 6e 65 20 63 75 72 73  here is one curs
3e50: 6f 72 20 70 65 72 20 74 61 62 6c 65 20 69 6e 20  or per table in 
3e60: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
3e70: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a    The number of.
3e80: 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ** tables in the
3e90: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
3ea0: 6c 69 6d 69 74 65 64 20 62 79 20 61 20 74 65 73  limited by a tes
3eb0: 74 20 65 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a  t early in the.*
3ec0: 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  * sqlite3WhereBe
3ed0: 67 69 6e 28 29 20 72 6f 75 74 69 6e 65 2e 20 20  gin() routine.  
3ee0: 53 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  So we know that 
3ef0: 74 68 65 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78  the pMaskSet->ix
3f00: 5b 5d 0a 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c  [].** array will
3f10: 20 6e 65 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e   never overflow.
3f20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3f30: 63 72 65 61 74 65 4d 61 73 6b 28 57 68 65 72 65  createMask(Where
3f40: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
3f50: 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b  t, int iCursor){
3f60: 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b  .  assert( pMask
3f70: 53 65 74 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69  Set->n < ArraySi
3f80: 7a 65 28 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29  ze(pMaskSet->ix)
3f90: 20 29 3b 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e   );.  pMaskSet->
3fa0: 69 78 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b  ix[pMaskSet->n++
3fb0: 5d 20 3d 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a  ] = iCursor;.}..
3fc0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
3fd0: 6e 65 20 77 61 6c 6b 73 20 28 72 65 63 75 72 73  ne walks (recurs
3fe0: 69 76 65 6c 79 29 20 61 6e 20 65 78 70 72 65 73  ively) an expres
3ff0: 73 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 67 65  sion tree and ge
4000: 6e 65 72 61 74 65 73 0a 2a 2a 20 61 20 62 69 74  nerates.** a bit
4010: 6d 61 73 6b 20 69 6e 64 69 63 61 74 69 6e 67 20  mask indicating 
4020: 77 68 69 63 68 20 74 61 62 6c 65 73 20 61 72 65  which tables are
4030: 20 75 73 65 64 20 69 6e 20 74 68 61 74 20 65 78   used in that ex
4040: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65  pression.** tree
4050: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72  ..**.** In order
4060: 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e   for this routin
4070: 65 20 74 6f 20 77 6f 72 6b 2c 20 74 68 65 20 63  e to work, the c
4080: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
4090: 6d 75 73 74 20 68 61 76 65 0a 2a 2a 20 70 72 65  must have.** pre
40a0: 76 69 6f 75 73 6c 79 20 69 6e 76 6f 6b 65 64 20  viously invoked 
40b0: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
40c0: 70 72 4e 61 6d 65 73 28 29 20 6f 6e 20 74 68 65  prNames() on the
40d0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 53 65   expression.  Se
40e0: 65 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20  e.** the header 
40f0: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20  comment on that 
4100: 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69  routine for addi
4110: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
4120: 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  on..** The sqlit
4130: 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d  e3ResolveExprNam
4140: 65 73 28 29 20 72 6f 75 74 69 6e 65 73 20 6c 6f  es() routines lo
4150: 6f 6b 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e  oks for column n
4160: 61 6d 65 73 20 61 6e 64 0a 2a 2a 20 73 65 74 73  ames and.** sets
4170: 20 74 68 65 69 72 20 6f 70 63 6f 64 65 73 20 74   their opcodes t
4180: 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20  o TK_COLUMN and 
4190: 74 68 65 69 72 20 45 78 70 72 2e 69 54 61 62 6c  their Expr.iTabl
41a0: 65 20 66 69 65 6c 64 73 20 74 6f 0a 2a 2a 20 74  e fields to.** t
41b0: 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  he VDBE cursor n
41c0: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 61 62  umber of the tab
41d0: 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  le.  This routin
41e0: 65 20 6a 75 73 74 20 68 61 73 20 74 6f 0a 2a 2a  e just has to.**
41f0: 20 74 72 61 6e 73 6c 61 74 65 20 74 68 65 20 63   translate the c
4200: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e  ursor numbers in
4210: 74 6f 20 62 69 74 6d 61 73 6b 20 76 61 6c 75 65  to bitmask value
4220: 73 20 61 6e 64 20 4f 52 20 61 6c 6c 0a 2a 2a 20  s and OR all.** 
4230: 74 68 65 20 62 69 74 6d 61 73 6b 73 20 74 6f 67  the bitmasks tog
4240: 65 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  ether..*/.static
4250: 20 42 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73   Bitmask exprLis
4260: 74 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72  tTableUsage(Wher
4270: 65 4d 61 73 6b 53 65 74 2a 2c 20 45 78 70 72 4c  eMaskSet*, ExprL
4280: 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 42 69  ist*);.static Bi
4290: 74 6d 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74  tmask exprSelect
42a0: 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65  TableUsage(Where
42b0: 4d 61 73 6b 53 65 74 2a 2c 20 53 65 6c 65 63 74  MaskSet*, Select
42c0: 2a 29 3b 0a 73 74 61 74 69 63 20 42 69 74 6d 61  *);.static Bitma
42d0: 73 6b 20 65 78 70 72 54 61 62 6c 65 55 73 61 67  sk exprTableUsag
42e0: 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a  e(WhereMaskSet *
42f0: 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 20 2a  pMaskSet, Expr *
4300: 70 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61  p){.  Bitmask ma
4310: 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 3d  sk = 0;.  if( p=
4320: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
4330: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
4340: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 6d 61 73  OLUMN ){.    mas
4350: 6b 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73  k = getMask(pMas
4360: 6b 53 65 74 2c 20 70 2d 3e 69 54 61 62 6c 65 29  kSet, p->iTable)
4370: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 61 73  ;.    return mas
4380: 6b 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b 20 3d 20  k;.  }.  mask = 
4390: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
43a0: 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 52 69 67  MaskSet, p->pRig
43b0: 68 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20 65  ht);.  mask |= e
43c0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
43d0: 61 73 6b 53 65 74 2c 20 70 2d 3e 70 4c 65 66 74  askSet, p->pLeft
43e0: 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  );.  if( ExprHas
43f0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
4400: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
4410: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c   mask |= exprSel
4420: 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  ectTableUsage(pM
4430: 61 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 53 65  askSet, p->x.pSe
4440: 6c 65 63 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  lect);.  }else{.
4450: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
4460: 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70  ListTableUsage(p
4470: 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 4c  MaskSet, p->x.pL
4480: 69 73 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ist);.  }.  retu
4490: 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69  rn mask;.}.stati
44a0: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 4c 69  c Bitmask exprLi
44b0: 73 74 54 61 62 6c 65 55 73 61 67 65 28 57 68 65  stTableUsage(Whe
44c0: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
44d0: 53 65 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  Set, ExprList *p
44e0: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
44f0: 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d    Bitmask mask =
4500: 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   0;.  if( pList 
4510: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
4520: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
4530: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6d 61 73 6b  i++){.      mask
4540: 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61   |= exprTableUsa
4550: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69  ge(pMaskSet, pLi
4560: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
4570: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4580: 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74  urn mask;.}.stat
4590: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 53  ic Bitmask exprS
45a0: 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28  electTableUsage(
45b0: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
45c0: 61 73 6b 53 65 74 2c 20 53 65 6c 65 63 74 20 2a  askSet, Select *
45d0: 70 53 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  pS){.  Bitmask m
45e0: 61 73 6b 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  ask = 0;.  while
45f0: 28 20 70 53 20 29 7b 0a 20 20 20 20 6d 61 73 6b  ( pS ){.    mask
4600: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
4610: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
4620: 20 70 53 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20   pS->pEList);.  
4630: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
4640: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
4650: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 47 72 6f 75  skSet, pS->pGrou
4660: 70 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  pBy);.    mask |
4670: 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  = exprListTableU
4680: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
4690: 53 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  S->pOrderBy);.  
46a0: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61    mask |= exprTa
46b0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
46c0: 74 2c 20 70 53 2d 3e 70 57 68 65 72 65 29 3b 0a  t, pS->pWhere);.
46d0: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
46e0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
46f0: 53 65 74 2c 20 70 53 2d 3e 70 48 61 76 69 6e 67  Set, pS->pHaving
4700: 29 3b 0a 20 20 20 20 70 53 20 3d 20 70 53 2d 3e  );.    pS = pS->
4710: 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65  pPrior;.  }.  re
4720: 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a  turn mask;.}../*
4730: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
4740: 69 66 20 74 68 65 20 67 69 76 65 6e 20 6f 70 65  if the given ope
4750: 72 61 74 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20  rator is one of 
4760: 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 74 68  the operators th
4770: 61 74 20 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64  at is.** allowed
4780: 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 61 62 6c   for an indexabl
4790: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
47a0: 65 72 6d 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65  erm.  The allowe
47b0: 64 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 0a  d operators are.
47c0: 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22  ** "=", "<", ">"
47d0: 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22 2c 20 61 6e  , "<=", ">=", an
47e0: 64 20 22 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 49 4d  d "IN"..**.** IM
47f0: 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
4800: 20 52 2d 35 39 39 32 36 2d 32 36 33 39 33 20 54   R-59926-26393 T
4810: 6f 20 62 65 20 75 73 61 62 6c 65 20 62 79 20 61  o be usable by a
4820: 6e 20 69 6e 64 65 78 20 61 20 74 65 72 6d 20 6d  n index a term m
4830: 75 73 74 20 62 65 0a 2a 2a 20 6f 66 20 6f 6e 65  ust be.** of one
4840: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
4850: 67 20 66 6f 72 6d 73 3a 20 63 6f 6c 75 6d 6e 20  g forms: column 
4860: 3d 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c  = expression col
4870: 75 6d 6e 20 3e 20 65 78 70 72 65 73 73 69 6f 6e  umn > expression
4880: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 3e 3d 20 65 78  .** column >= ex
4890: 70 72 65 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e 20  pression column 
48a0: 3c 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c  < expression col
48b0: 75 6d 6e 20 3c 3d 20 65 78 70 72 65 73 73 69 6f  umn <= expressio
48c0: 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
48d0: 3d 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73  = column express
48e0: 69 6f 6e 20 3e 20 63 6f 6c 75 6d 6e 20 65 78 70  ion > column exp
48f0: 72 65 73 73 69 6f 6e 20 3e 3d 20 63 6f 6c 75 6d  ression >= colum
4900: 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
4910: 3c 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73  < column express
4920: 69 6f 6e 20 3c 3d 20 63 6f 6c 75 6d 6e 20 63 6f  ion <= column co
4930: 6c 75 6d 6e 20 49 4e 0a 2a 2a 20 28 65 78 70 72  lumn IN.** (expr
4940: 65 73 73 69 6f 6e 2d 6c 69 73 74 29 20 63 6f 6c  ession-list) col
4950: 75 6d 6e 20 49 4e 20 28 73 75 62 71 75 65 72 79  umn IN (subquery
4960: 29 20 63 6f 6c 75 6d 6e 20 49 53 20 4e 55 4c 4c  ) column IS NULL
4970: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
4980: 6c 6c 6f 77 65 64 4f 70 28 69 6e 74 20 6f 70 29  llowedOp(int op)
4990: 7b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47  {.  assert( TK_G
49a0: 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54  T>TK_EQ && TK_GT
49b0: 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65  <TK_GE );.  asse
49c0: 72 74 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20  rt( TK_LT>TK_EQ 
49d0: 26 26 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29  && TK_LT<TK_GE )
49e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c  ;.  assert( TK_L
49f0: 45 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45  E>TK_EQ && TK_LE
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 47 45 3d 3d 54 4b 5f 45 51  rt( TK_GE==TK_EQ
4a20: 2b 34 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f  +4 );.  return o
4a30: 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e  p==TK_IN || (op>
4a40: 3d 54 4b 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b  =TK_EQ && op<=TK
4a50: 5f 47 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49  _GE) || op==TK_I
4a60: 53 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  SNULL;.}../*.** 
4a70: 53 77 61 70 20 74 77 6f 20 6f 62 6a 65 63 74 73  Swap two objects
4a80: 20 6f 66 20 74 79 70 65 20 54 59 50 45 2e 0a 2a   of type TYPE..*
4a90: 2f 0a 23 64 65 66 69 6e 65 20 53 57 41 50 28 54  /.#define SWAP(T
4aa0: 59 50 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74  YPE,A,B) {TYPE t
4ab0: 3d 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a  =A; A=B; B=t;}..
4ac0: 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20  /*.** Commute a 
4ad0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
4ae0: 74 6f 72 2e 20 20 45 78 70 72 65 73 73 69 6f 6e  tor.  Expression
4af0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58  s of the form "X
4b00: 20 6f 70 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f   op Y".** are co
4b10: 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 22 59 20  nverted into "Y 
4b20: 6f 70 20 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  op X"..**.** If 
4b30: 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  a collation sequ
4b40: 65 6e 63 65 20 69 73 20 61 73 73 6f 63 69 61 74  ence is associat
4b50: 65 64 20 77 69 74 68 20 65 69 74 68 65 72 20 74  ed with either t
4b60: 68 65 20 6c 65 66 74 20 6f 72 20 72 69 67 68 74  he left or right
4b70: 0a 2a 2a 20 73 69 64 65 20 6f 66 20 74 68 65 20  .** side of the 
4b80: 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 69 74 20 72  comparison, it r
4b90: 65 6d 61 69 6e 73 20 61 73 73 6f 63 69 61 74 65  emains associate
4ba0: 64 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  d with the same 
4bb0: 73 69 64 65 20 61 66 74 65 72 0a 2a 2a 20 74 68  side after.** th
4bc0: 65 20 63 6f 6d 6d 75 74 61 74 69 6f 6e 2e 20 53  e commutation. S
4bd0: 6f 20 22 59 20 63 6f 6c 6c 61 74 65 20 4e 4f 43  o "Y collate NOC
4be0: 41 53 45 20 6f 70 20 58 22 20 62 65 63 6f 6d 65  ASE op X" become
4bf0: 73 20 0a 2a 2a 20 22 58 20 63 6f 6c 6c 61 74 65  s .** "X collate
4c00: 20 4e 4f 43 41 53 45 20 6f 70 20 59 22 2e 20 54   NOCASE op Y". T
4c10: 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 61  his is because a
4c20: 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ny collation seq
4c30: 75 65 6e 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20  uence on.** the 
4c40: 6c 65 66 74 20 68 61 6e 64 20 73 69 64 65 20 6f  left hand side o
4c50: 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  f a comparison o
4c60: 76 65 72 72 69 64 65 73 20 61 6e 79 20 63 6f 6c  verrides any col
4c70: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
4c80: 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 74 6f 20  .** attached to 
4c90: 74 68 65 20 72 69 67 68 74 2e 20 46 6f 72 20 74  the right. For t
4ca0: 68 65 20 73 61 6d 65 20 72 65 61 73 6f 6e 20 74  he same reason t
4cb0: 68 65 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65  he EP_ExpCollate
4cc0: 20 66 6c 61 67 0a 2a 2a 20 69 73 20 6e 6f 74 20   flag.** is not 
4cd0: 63 6f 6d 6d 75 74 65 64 2e 0a 2a 2f 0a 73 74 61  commuted..*/.sta
4ce0: 74 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 6d  tic void exprCom
4cf0: 6d 75 74 65 28 50 61 72 73 65 20 2a 70 50 61 72  mute(Parse *pPar
4d00: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
4d10: 7b 0a 20 20 75 31 36 20 65 78 70 52 69 67 68 74  {.  u16 expRight
4d20: 20 3d 20 28 70 45 78 70 72 2d 3e 70 52 69 67 68   = (pExpr->pRigh
4d30: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  t->flags & EP_Ex
4d40: 70 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 75 31 36  pCollate);.  u16
4d50: 20 65 78 70 4c 65 66 74 20 3d 20 28 70 45 78 70   expLeft = (pExp
4d60: 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  r->pLeft->flags 
4d70: 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29  & EP_ExpCollate)
4d80: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f  ;.  assert( allo
4d90: 77 65 64 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29  wedOp(pExpr->op)
4da0: 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54   && pExpr->op!=T
4db0: 4b 5f 49 4e 20 29 3b 0a 20 20 70 45 78 70 72 2d  K_IN );.  pExpr-
4dc0: 3e 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 20 3d  >pRight->pColl =
4dd0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
4de0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
4df0: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70 45  r->pRight);.  pE
4e00: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c  xpr->pLeft->pCol
4e10: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
4e20: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
4e30: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
4e40: 53 57 41 50 28 43 6f 6c 6c 53 65 71 2a 2c 70 45  SWAP(CollSeq*,pE
4e50: 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 70 43 6f  xpr->pRight->pCo
4e60: 6c 6c 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  ll,pExpr->pLeft-
4e70: 3e 70 43 6f 6c 6c 29 3b 0a 20 20 70 45 78 70 72  >pColl);.  pExpr
4e80: 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20  ->pRight->flags 
4e90: 3d 20 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  = (pExpr->pRight
4ea0: 2d 3e 66 6c 61 67 73 20 26 20 7e 45 50 5f 45 78  ->flags & ~EP_Ex
4eb0: 70 43 6f 6c 6c 61 74 65 29 20 7c 20 65 78 70 4c  pCollate) | expL
4ec0: 65 66 74 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c  eft;.  pExpr->pL
4ed0: 65 66 74 2d 3e 66 6c 61 67 73 20 3d 20 28 70 45  eft->flags = (pE
4ee0: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  xpr->pLeft->flag
4ef0: 73 20 26 20 7e 45 50 5f 45 78 70 43 6f 6c 6c 61  s & ~EP_ExpColla
4f00: 74 65 29 20 7c 20 65 78 70 52 69 67 68 74 3b 0a  te) | expRight;.
4f10: 20 20 53 57 41 50 28 45 78 70 72 2a 2c 70 45 78    SWAP(Expr*,pEx
4f20: 70 72 2d 3e 70 52 69 67 68 74 2c 70 45 78 70 72  pr->pRight,pExpr
4f30: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
4f40: 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54  pExpr->op>=TK_GT
4f50: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
4f60: 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29  TK_LT==TK_GT+2 )
4f70: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b  ;.    assert( TK
4f80: 5f 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a  _GE==TK_LE+2 );.
4f90: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
4fa0: 54 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61  T>TK_EQ );.    a
4fb0: 73 73 65 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f  ssert( TK_GT<TK_
4fc0: 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  LE );.    assert
4fd0: 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f  ( pExpr->op>=TK_
4fe0: 47 54 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c  GT && pExpr->op<
4ff0: 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 70 45  =TK_GE );.    pE
5000: 78 70 72 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70  xpr->op = ((pExp
5010: 72 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b  r->op-TK_GT)^2)+
5020: 54 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TK_GT;.  }.}../*
5030: 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72  .** Translate fr
5040: 6f 6d 20 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f  om TK_xx operato
5050: 72 20 74 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61  r to WO_xx bitma
5060: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31  sk..*/.static u1
5070: 36 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 69  6 operatorMask(i
5080: 6e 74 20 6f 70 29 7b 0a 20 20 75 31 36 20 63 3b  nt op){.  u16 c;
5090: 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77  .  assert( allow
50a0: 65 64 4f 70 28 6f 70 29 20 29 3b 0a 20 20 69 66  edOp(op) );.  if
50b0: 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20  ( op==TK_IN ){. 
50c0: 20 20 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20     c = WO_IN;.  
50d0: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
50e0: 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63  _ISNULL ){.    c
50f0: 20 3d 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20   = WO_ISNULL;.  
5100: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
5110: 74 28 20 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54  t( (WO_EQ<<(op-T
5120: 4b 5f 45 51 29 29 20 3c 20 30 78 37 66 66 66 20  K_EQ)) < 0x7fff 
5130: 29 3b 0a 20 20 20 20 63 20 3d 20 28 75 31 36 29  );.    c = (u16)
5140: 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45  (WO_EQ<<(op-TK_E
5150: 51 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  Q));.  }.  asser
5160: 74 28 20 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c  t( op!=TK_ISNULL
5170: 20 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c   || c==WO_ISNULL
5180: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
5190: 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f  !=TK_IN || c==WO
51a0: 5f 49 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _IN );.  assert(
51b0: 20 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d   op!=TK_EQ || c=
51c0: 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 61 73 73 65  =WO_EQ );.  asse
51d0: 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c  rt( op!=TK_LT ||
51e0: 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61   c==WO_LT );.  a
51f0: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45  ssert( op!=TK_LE
5200: 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a   || c==WO_LE );.
5210: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
5220: 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20  _GT || c==WO_GT 
5230: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
5240: 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_GE || c==WO_
5250: 47 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 63  GE );.  return c
5260: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
5270: 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e 20  h for a term in 
5280: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
5290: 20 74 68 61 74 20 69 73 20 6f 66 20 74 68 65 20   that is of the 
52a0: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78  form "X <op> <ex
52b0: 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58 20  pr>".** where X 
52c0: 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  is a reference t
52d0: 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66  o the iColumn of
52e0: 20 74 61 62 6c 65 20 69 43 75 72 20 61 6e 64 20   table iCur and 
52f0: 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 0a 2a  <op> is one of.*
5300: 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f 70 65 72  * the WO_xx oper
5310: 61 74 6f 72 20 63 6f 64 65 73 20 73 70 65 63 69  ator codes speci
5320: 66 69 65 64 20 62 79 20 74 68 65 20 6f 70 20 70  fied by the op p
5330: 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52 65 74  arameter..** Ret
5340: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
5350: 20 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74 75   the term.  Retu
5360: 72 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e  rn 0 if not foun
5370: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65  d..*/.static Whe
5380: 72 65 54 65 72 6d 20 2a 66 69 6e 64 54 65 72 6d  reTerm *findTerm
5390: 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  (.  WhereClause 
53a0: 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68 65  *pWC,     /* The
53b0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
53c0: 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a   be searched */.
53d0: 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20    int iCur,     
53e0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
53f0: 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20  r number of LHS 
5400: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
5410: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ,          /* Co
5420: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 4c  lumn number of L
5430: 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  HS */.  Bitmask 
5440: 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f 2a  notReady,     /*
5450: 20 52 48 53 20 6d 75 73 74 20 6e 6f 74 20 6f 76   RHS must not ov
5460: 65 72 6c 61 70 20 77 69 74 68 20 74 68 69 73 20  erlap with this 
5470: 6d 61 73 6b 20 2a 2f 0a 20 20 75 33 32 20 6f 70  mask */.  u32 op
5480: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5490: 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f 5f 78 78  /* Mask of WO_xx
54a0: 20 76 61 6c 75 65 73 20 64 65 73 63 72 69 62 69   values describi
54b0: 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  ng operator */. 
54c0: 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20   Index *pIdx    
54d0: 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62         /* Must b
54e0: 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  e compatible wit
54f0: 68 20 74 68 69 73 20 69 6e 64 65 78 2c 20 69 66  h this index, if
5500: 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a   not NULL */.){.
5510: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
5520: 72 6d 3b 0a 20 20 69 6e 74 20 6b 3b 0a 20 20 61  rm;.  int k;.  a
5530: 73 73 65 72 74 28 20 69 43 75 72 3e 3d 30 20 29  ssert( iCur>=0 )
5540: 3b 0a 20 20 6f 70 20 26 3d 20 57 4f 5f 41 4c 4c  ;.  op &= WO_ALL
5550: 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  ;.  for(pTerm=pW
5560: 43 2d 3e 61 2c 20 6b 3d 70 57 43 2d 3e 6e 54 65  C->a, k=pWC->nTe
5570: 72 6d 3b 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72  rm; k; k--, pTer
5580: 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54  m++){.    if( pT
5590: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
55a0: 3d 69 43 75 72 0a 20 20 20 20 20 20 20 26 26 20  =iCur.       && 
55b0: 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
55c0: 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 3d  ght & notReady)=
55d0: 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 54 65  =0.       && pTe
55e0: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
55f0: 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20  ==iColumn.      
5600: 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65   && (pTerm->eOpe
5610: 72 61 74 6f 72 20 26 20 6f 70 29 21 3d 30 0a 20  rator & op)!=0. 
5620: 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20     ){.      if( 
5630: 70 49 64 78 20 26 26 20 70 54 65 72 6d 2d 3e 65  pIdx && pTerm->e
5640: 4f 70 65 72 61 74 6f 72 21 3d 57 4f 5f 49 53 4e  Operator!=WO_ISN
5650: 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 45  ULL ){.        E
5660: 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
5670: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
5680: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
5690: 20 20 20 20 20 20 20 20 63 68 61 72 20 69 64 78          char idx
56a0: 61 66 66 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  aff;.        int
56b0: 20 6a 3b 0a 20 20 20 20 20 20 20 20 50 61 72 73   j;.        Pars
56c0: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d  e *pParse = pWC-
56d0: 3e 70 50 61 72 73 65 3b 0a 0a 20 20 20 20 20 20  >pParse;..      
56e0: 20 20 69 64 78 61 66 66 20 3d 20 70 49 64 78 2d    idxaff = pIdx-
56f0: 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43  >pTable->aCol[iC
5700: 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b  olumn].affinity;
5710: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71  .        if( !sq
5720: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
5730: 74 79 4f 6b 28 70 58 2c 20 69 64 78 61 66 66 29  tyOk(pX, idxaff)
5740: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
5750: 20 20 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20        /* Figure 
5760: 6f 75 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  out the collatio
5770: 6e 20 73 65 71 75 65 6e 63 65 20 72 65 71 75 69  n sequence requi
5780: 72 65 64 20 66 72 6f 6d 20 61 6e 20 69 6e 64 65  red from an inde
5790: 78 20 66 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a  x for.        **
57a0: 20 69 74 20 74 6f 20 62 65 20 75 73 65 66 75 6c   it to be useful
57b0: 20 66 6f 72 20 6f 70 74 69 6d 69 73 69 6e 67 20   for optimising 
57c0: 65 78 70 72 65 73 73 69 6f 6e 20 70 58 2e 20 53  expression pX. S
57d0: 74 6f 72 65 20 74 68 69 73 0a 20 20 20 20 20 20  tore this.      
57e0: 20 20 2a 2a 20 76 61 6c 75 65 20 69 6e 20 76 61    ** value in va
57f0: 72 69 61 62 6c 65 20 70 43 6f 6c 6c 2e 0a 20 20  riable pColl..  
5800: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
5810: 20 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65 66   assert(pX->pLef
5820: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  t);.        pCol
5830: 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  l = sqlite3Binar
5840: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
5850: 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66  pParse, pX->pLef
5860: 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a  t, pX->pRight);.
5870: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70          assert(p
5880: 43 6f 6c 6c 20 7c 7c 20 70 50 61 72 73 65 2d 3e  Coll || pParse->
5890: 6e 45 72 72 29 3b 0a 0a 20 20 20 20 20 20 20 20  nErr);..        
58a0: 66 6f 72 28 6a 3d 30 3b 20 70 49 64 78 2d 3e 61  for(j=0; pIdx->a
58b0: 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c  iColumn[j]!=iCol
58c0: 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  umn; j++){.     
58d0: 20 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 6a       if( NEVER(j
58e0: 3e 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29  >=pIdx->nColumn)
58f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
5900: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
5910: 66 28 20 70 43 6f 6c 6c 20 26 26 20 73 71 6c 69  f( pColl && sqli
5920: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c  te3StrICmp(pColl
5930: 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61  ->zName, pIdx->a
5940: 7a 43 6f 6c 6c 5b 6a 5d 29 20 29 20 63 6f 6e 74  zColl[j]) ) cont
5950: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
5960: 20 20 20 20 72 65 74 75 72 6e 20 70 54 65 72 6d      return pTerm
5970: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
5980: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f  turn 0;.}../* Fo
5990: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
59a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
59b0: 78 70 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c 69  xprAnalyze(SrcLi
59c0: 73 74 2a 2c 20 57 68 65 72 65 43 6c 61 75 73 65  st*, WhereClause
59d0: 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *, int);../*.** 
59e0: 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c 79 7a 65  Call exprAnalyze
59f0: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 69 6e   on all terms in
5a00: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
5a10: 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74    .**.**.*/.stat
5a20: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
5a30: 79 7a 65 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73  yzeAll(.  SrcLis
5a40: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20  t *pTabList,    
5a50: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
5a60: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
5a70: 43 6c 61 75 73 65 20 2a 70 57 43 20 20 20 20 20  Clause *pWC     
5a80: 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45      /* the WHERE
5a90: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 61 6e   clause to be an
5aa0: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69  alyzed */.){.  i
5ab0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57  nt i;.  for(i=pW
5ac0: 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30  C->nTerm-1; i>=0
5ad0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72  ; i--){.    expr
5ae0: 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74  Analyze(pTabList
5af0: 2c 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d  , pWC, i);.  }.}
5b00: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
5b10: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
5b20: 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68  IZATION./*.** Ch
5b30: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
5b40: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
5b50: 6f 6e 20 69 73 20 61 20 4c 49 4b 45 20 6f 72 20  on is a LIKE or 
5b60: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 74 68  GLOB operator th
5b70: 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74  at.** can be opt
5b80: 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 69 6e 65  imized using ine
5b90: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
5ba0: 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55  nts.  Return TRU
5bb0: 45 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f  E if it is.** so
5bc0: 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f   and false if no
5bd0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65  t..**.** In orde
5be0: 72 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74  r for the operat
5bf0: 6f 72 20 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a  or to be optimiz
5c00: 69 62 6c 65 2c 20 74 68 65 20 52 48 53 20 6d 75  ible, the RHS mu
5c10: 73 74 20 62 65 20 61 20 73 74 72 69 6e 67 0a 2a  st be a string.*
5c20: 2a 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 64  * literal that d
5c30: 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69  oes not begin wi
5c40: 74 68 20 61 20 77 69 6c 64 63 61 72 64 2e 20 20  th a wildcard.  
5c50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
5c60: 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50  sLikeOrGlob(.  P
5c70: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
5c80: 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
5c90: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
5ca0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
5cb0: 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f  r *pExpr,      /
5cc0: 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70 72  * Test this expr
5cd0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ession */.  Expr
5ce0: 20 2a 2a 70 70 50 72 65 66 69 78 2c 20 20 2f 2a   **ppPrefix,  /*
5cf0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53   Pointer to TK_S
5d00: 54 52 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e  TRING expression
5d10: 20 77 69 74 68 20 70 61 74 74 65 72 6e 20 70 72   with pattern pr
5d20: 65 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  efix */.  int *p
5d30: 69 73 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54  isComplete, /* T
5d40: 72 75 65 20 69 66 20 74 68 65 20 6f 6e 6c 79 20  rue if the only 
5d50: 77 69 6c 64 63 61 72 64 20 69 73 20 25 20 69 6e  wildcard is % in
5d60: 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61 63   the last charac
5d70: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ter */.  int *pn
5d80: 6f 43 61 73 65 20 20 20 20 20 20 2f 2a 20 54 72  oCase      /* Tr
5d90: 75 65 20 69 66 20 75 70 70 65 72 63 61 73 65 20  ue if uppercase 
5da0: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
5db0: 20 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b   lowercase */.){
5dc0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5dd0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
5de0: 20 53 74 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f   String on RHS o
5df0: 66 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20  f LIKE operator 
5e00: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  */.  Expr *pRigh
5e10: 74 2c 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  t, *pLeft;      
5e20: 2f 2a 20 52 69 67 68 74 20 61 6e 64 20 6c 65 66  /* Right and lef
5e30: 74 20 73 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f  t size of LIKE o
5e40: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70  perator */.  Exp
5e50: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20  rList *pList;   
5e60: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
5e70: 6f 66 20 6f 70 65 72 61 6e 64 73 20 74 6f 20 74  of operands to t
5e80: 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  he LIKE operator
5e90: 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20 20   */.  int c;    
5ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5eb0: 20 2f 2a 20 4f 6e 65 20 63 68 61 72 61 63 74 65   /* One characte
5ec0: 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e  r in z[] */.  in
5ed0: 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20  t cnt;          
5ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5ef0: 65 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61  er of non-wildca
5f00: 72 64 20 70 72 65 66 69 78 20 63 68 61 72 61 63  rd prefix charac
5f10: 74 65 72 73 20 2a 2f 0a 20 20 63 68 61 72 20 77  ters */.  char w
5f20: 63 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20  c[3];           
5f30: 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64       /* Wildcard
5f40: 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20   characters */. 
5f50: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
5f60: 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44  Parse->db;  /* D
5f70: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
5f80: 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  on */.  sqlite3_
5f90: 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b  value *pVal = 0;
5fa0: 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
5fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5fc0: 20 4f 70 63 6f 64 65 20 6f 66 20 70 52 69 67 68   Opcode of pRigh
5fd0: 74 20 2a 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c  t */..  if( !sql
5fe0: 69 74 65 33 49 73 4c 69 6b 65 46 75 6e 63 74 69  ite3IsLikeFuncti
5ff0: 6f 6e 28 64 62 2c 20 70 45 78 70 72 2c 20 70 6e  on(db, pExpr, pn
6000: 6f 43 61 73 65 2c 20 77 63 29 20 29 7b 0a 20 20  oCase, wc) ){.  
6010: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
6020: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 42  #ifdef SQLITE_EB
6030: 43 44 49 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43  CDIC.  if( *pnoC
6040: 61 73 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ase ) return 0;.
6050: 23 65 6e 64 69 66 0a 20 20 70 4c 69 73 74 20 3d  #endif.  pList =
6060: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
6070: 0a 20 20 70 4c 65 66 74 20 3d 20 70 4c 69 73 74  .  pLeft = pList
6080: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
6090: 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54  if( pLeft->op!=T
60a0: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 73 71 6c 69  K_COLUMN || sqli
60b0: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
60c0: 70 4c 65 66 74 29 21 3d 53 51 4c 49 54 45 5f 41  pLeft)!=SQLITE_A
60d0: 46 46 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 2f  FF_TEXT ){.    /
60e0: 2a 20 49 4d 50 3a 20 52 2d 30 32 30 36 35 2d 34  * IMP: R-02065-4
60f0: 39 34 36 35 20 54 68 65 20 6c 65 66 74 2d 68 61  9465 The left-ha
6100: 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 4c  nd side of the L
6110: 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72  IKE or GLOB oper
6120: 61 74 6f 72 20 6d 75 73 74 0a 20 20 20 20 2a 2a  ator must.    **
6130: 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   be the name of 
6140: 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d  an indexed colum
6150: 6e 20 77 69 74 68 20 54 45 58 54 20 61 66 66 69  n with TEXT affi
6160: 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74  nity. */.    ret
6170: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 0;.  }.  ass
6180: 65 72 74 28 20 70 4c 65 66 74 2d 3e 69 43 6f 6c  ert( pLeft->iCol
6190: 75 6d 6e 21 3d 28 2d 31 29 20 29 3b 20 2f 2a 20  umn!=(-1) ); /* 
61a0: 42 65 63 61 75 73 65 20 49 50 4b 20 6e 65 76 65  Because IPK neve
61b0: 72 20 68 61 73 20 41 46 46 5f 54 45 58 54 20 2a  r has AFF_TEXT *
61c0: 2f 0a 0a 20 20 70 52 69 67 68 74 20 3d 20 70 4c  /..  pRight = pL
61d0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
61e0: 0a 20 20 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e  .  op = pRight->
61f0: 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  op;.  if( op==TK
6200: 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20  _REGISTER ){.   
6210: 20 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e 6f 70   op = pRight->op
6220: 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d  2;.  }.  if( op=
6230: 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a  =TK_VARIABLE ){.
6240: 20 20 20 20 56 64 62 65 20 2a 70 52 65 70 72 65      Vdbe *pRepre
6250: 70 61 72 65 20 3d 20 70 50 61 72 73 65 2d 3e 70  pare = pParse->p
6260: 52 65 70 72 65 70 61 72 65 3b 0a 20 20 20 20 69  Reprepare;.    i
6270: 6e 74 20 69 43 6f 6c 20 3d 20 70 52 69 67 68 74  nt iCol = pRight
6280: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70  ->iColumn;.    p
6290: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Val = sqlite3Vdb
62a0: 65 47 65 74 56 61 6c 75 65 28 70 52 65 70 72 65  eGetValue(pRepre
62b0: 70 61 72 65 2c 20 69 43 6f 6c 2c 20 53 51 4c 49  pare, iCol, SQLI
62c0: 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a 20 20  TE_AFF_NONE);.  
62d0: 20 20 69 66 28 20 70 56 61 6c 20 26 26 20 73 71    if( pVal && sq
62e0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
62f0: 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54 45 5f 54  (pVal)==SQLITE_T
6300: 45 58 54 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d  EXT ){.      z =
6310: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
6320: 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c  _value_text(pVal
6330: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
6340: 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61  ite3VdbeSetVarma
6350: 73 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  sk(pParse->pVdbe
6360: 2c 20 69 43 6f 6c 29 3b 20 2f 2a 20 49 4d 50 3a  , iCol); /* IMP:
6370: 20 52 2d 32 33 32 35 37 2d 30 32 37 37 38 20 2a   R-23257-02778 *
6380: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  /.    assert( pR
6390: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52  ight->op==TK_VAR
63a0: 49 41 42 4c 45 20 7c 7c 20 70 52 69 67 68 74 2d  IABLE || pRight-
63b0: 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op==TK_REGISTER
63c0: 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
63d0: 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b  op==TK_STRING ){
63e0: 0a 20 20 20 20 7a 20 3d 20 70 52 69 67 68 74 2d  .    z = pRight-
63f0: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20  >u.zToken;.  }. 
6400: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 63 6e   if( z ){.    cn
6410: 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  t = 0;.    while
6420: 28 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20  ( (c=z[cnt])!=0 
6430: 26 26 20 63 21 3d 77 63 5b 30 5d 20 26 26 20 63  && c!=wc[0] && c
6440: 21 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d 77 63  !=wc[1] && c!=wc
6450: 5b 32 5d 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  [2] ){.      cnt
6460: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
6470: 28 20 63 6e 74 21 3d 30 20 26 26 20 32 35 35 21  ( cnt!=0 && 255!
6480: 3d 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b  =(u8)z[cnt-1] ){
6490: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 50 72  .      Expr *pPr
64a0: 65 66 69 78 3b 0a 20 20 20 20 20 20 2a 70 69 73  efix;.      *pis
64b0: 43 6f 6d 70 6c 65 74 65 20 3d 20 63 3d 3d 77 63  Complete = c==wc
64c0: 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d  [0] && z[cnt+1]=
64d0: 3d 30 3b 0a 20 20 20 20 20 20 70 50 72 65 66 69  =0;.      pPrefi
64e0: 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  x = sqlite3Expr(
64f0: 64 62 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20 7a  db, TK_STRING, z
6500: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  );.      if( pPr
6510: 65 66 69 78 20 29 20 70 50 72 65 66 69 78 2d 3e  efix ) pPrefix->
6520: 75 2e 7a 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20  u.zToken[cnt] = 
6530: 30 3b 0a 20 20 20 20 20 20 2a 70 70 50 72 65 66  0;.      *ppPref
6540: 69 78 20 3d 20 70 50 72 65 66 69 78 3b 0a 20 20  ix = pPrefix;.  
6550: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56      if( op==TK_V
6560: 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 20  ARIABLE ){.     
6570: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61     Vdbe *v = pPa
6580: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20  rse->pVdbe;.    
6590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
65a0: 65 74 56 61 72 6d 61 73 6b 28 76 2c 20 70 52 69  etVarmask(v, pRi
65b0: 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 20 2f  ght->iColumn); /
65c0: 2a 20 49 4d 50 3a 20 52 2d 32 33 32 35 37 2d 30  * IMP: R-23257-0
65d0: 32 37 37 38 20 2a 2f 0a 20 20 20 20 20 20 20 20  2778 */.        
65e0: 69 66 28 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65  if( *pisComplete
65f0: 20 26 26 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54   && pRight->u.zT
6600: 6f 6b 65 6e 5b 31 5d 20 29 7b 0a 20 20 20 20 20  oken[1] ){.     
6610: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72       /* If the r
6620: 68 73 20 6f 66 20 74 68 65 20 4c 49 4b 45 20 65  hs of the LIKE e
6630: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76  xpression is a v
6640: 61 72 69 61 62 6c 65 2c 20 61 6e 64 20 74 68 65  ariable, and the
6650: 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20 20 20   current.       
6660: 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74     ** value of t
6670: 68 65 20 76 61 72 69 61 62 6c 65 20 6d 65 61 6e  he variable mean
6680: 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  s there is no ne
6690: 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  ed to invoke the
66a0: 20 4c 49 4b 45 0a 20 20 20 20 20 20 20 20 20 20   LIKE.          
66b0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  ** function, the
66c0: 6e 20 6e 6f 20 4f 50 5f 56 61 72 69 61 62 6c 65  n no OP_Variable
66d0: 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74   will be added t
66e0: 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20  o the program.. 
66f0: 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73           ** This
6700: 20 63 61 75 73 65 73 20 70 72 6f 62 6c 65 6d 73   causes problems
6710: 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33   for the sqlite3
6720: 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
6730: 6e 61 6d 65 28 29 0a 20 20 20 20 20 20 20 20 20  name().         
6740: 20 2a 2a 20 41 50 49 2e 20 54 6f 20 77 6f 72 6b   ** API. To work
6750: 61 72 6f 75 6e 64 20 74 68 65 6d 2c 20 61 64 64  around them, add
6760: 20 61 20 64 75 6d 6d 79 20 4f 50 5f 56 61 72 69   a dummy OP_Vari
6770: 61 62 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20  able here..     
6780: 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20 20       */ .       
6790: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
67a0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
67b0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  arse);.         
67c0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
67d0: 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
67e0: 52 69 67 68 74 2c 20 72 31 29 3b 0a 20 20 20 20  Right, r1);.    
67f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6800: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 73 71 6c  eChangeP3(v, sql
6810: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
6820: 64 64 72 28 76 29 2d 31 2c 20 30 29 3b 0a 20 20  ddr(v)-1, 0);.  
6830: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
6840: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
6850: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
6860: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
6870: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20   }else{.      z 
6880: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
6890: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
68a0: 65 65 28 70 56 61 6c 29 3b 0a 20 20 72 65 74 75  ee(pVal);.  retu
68b0: 72 6e 20 28 7a 21 3d 30 29 3b 0a 7d 0a 23 65 6e  rn (z!=0);.}.#en
68c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
68d0: 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41  IT_LIKE_OPTIMIZA
68e0: 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65  TION */...#ifnde
68f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
6900: 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
6910: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
6920: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
6930: 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ssion is of the 
6940: 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  form.**.**      
6950: 20 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20     column MATCH 
6960: 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74  expr.**.** If it
6970: 20 69 73 20 74 68 65 6e 20 72 65 74 75 72 6e 20   is then return 
6980: 54 52 55 45 2e 20 20 49 66 20 6e 6f 74 2c 20 72  TRUE.  If not, r
6990: 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a  eturn FALSE..*/.
69a0: 73 74 61 74 69 63 20 69 6e 74 20 69 73 4d 61 74  static int isMat
69b0: 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20 45 78  chOfColumn(.  Ex
69c0: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 2f  pr *pExpr      /
69d0: 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70 72  * Test this expr
69e0: 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45  ession */.){.  E
69f0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a  xprList *pList;.
6a00: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
6a10: 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b  !=TK_FUNCTION ){
6a20: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
6a30: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
6a40: 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75  StrICmp(pExpr->u
6a50: 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 74 63 68 22 29  .zToken,"match")
6a60: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
6a70: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  n 0;.  }.  pList
6a80: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
6a90: 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  t;.  if( pList->
6aa0: 6e 45 78 70 72 21 3d 32 20 29 7b 0a 20 20 20 20  nExpr!=2 ){.    
6ab0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
6ac0: 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  if( pList->a[1].
6ad0: 70 45 78 70 72 2d 3e 6f 70 20 21 3d 20 54 4b 5f  pExpr->op != TK_
6ae0: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65  COLUMN ){.    re
6af0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
6b00: 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
6b10: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
6b20: 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
6b30: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 42  ./*.** If the pB
6b40: 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  ase expression o
6b50: 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65  riginated in the
6b60: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
6b70: 75 73 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e  use of.** a join
6b80: 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
6b90: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
6ba0: 6d 61 72 6b 69 6e 67 73 20 6f 76 65 72 20 74 6f  markings over to
6bb0: 20 64 65 72 69 76 65 64 2e 0a 2a 2f 0a 73 74 61   derived..*/.sta
6bc0: 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 66 65  tic void transfe
6bd0: 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 45 78  rJoinMarkings(Ex
6be0: 70 72 20 2a 70 44 65 72 69 76 65 64 2c 20 45 78  pr *pDerived, Ex
6bf0: 70 72 20 2a 70 42 61 73 65 29 7b 0a 20 20 70 44  pr *pBase){.  pD
6c00: 65 72 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d  erived->flags |=
6c10: 20 70 42 61 73 65 2d 3e 66 6c 61 67 73 20 26 20   pBase->flags & 
6c20: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 70  EP_FromJoin;.  p
6c30: 44 65 72 69 76 65 64 2d 3e 69 52 69 67 68 74 4a  Derived->iRightJ
6c40: 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42 61 73 65  oinTable = pBase
6c50: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
6c60: 65 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  e;.}..#if !defin
6c70: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  ed(SQLITE_OMIT_O
6c80: 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20  R_OPTIMIZATION) 
6c90: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
6ca0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
6cb0: 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  )./*.** Analyze 
6cc0: 61 20 74 65 72 6d 20 74 68 61 74 20 63 6f 6e 73  a term that cons
6cd0: 69 73 74 73 20 6f 66 20 74 77 6f 20 6f 72 20 6d  ists of two or m
6ce0: 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64  ore OR-connected
6cf0: 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e 20 20 53  .** subterms.  S
6d00: 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  o in:.**.**     
6d10: 2e 2e 2e 20 57 48 45 52 45 20 20 28 61 3d 35 29  ... WHERE  (a=5)
6d20: 20 41 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d 39   AND (b=7 OR c=9
6d30: 20 4f 52 20 64 3d 31 33 29 20 41 4e 44 20 28 64   OR d=13) AND (d
6d40: 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  =13).**         
6d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d60: 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e   ^^^^^^^^^^^^^^^
6d70: 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ^^^^^.**.** This
6d80: 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65   routine analyze
6d90: 73 20 74 65 72 6d 73 20 73 75 63 68 20 61 73 20  s terms such as 
6da0: 74 68 65 20 6d 69 64 64 6c 65 20 74 65 72 6d 20  the middle term 
6db0: 69 6e 20 74 68 65 20 61 62 6f 76 65 20 65 78 61  in the above exa
6dc0: 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72 65  mple..** A Where
6dd0: 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 20 69 73  OrTerm object is
6de0: 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 61 74   computed and at
6df0: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74 65  tached to the te
6e00: 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61 6c  rm under.** anal
6e10: 79 73 69 73 2c 20 72 65 67 61 72 64 6c 65 73 73  ysis, regardless
6e20: 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65 20   of the outcome 
6e30: 6f 66 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e  of the analysis.
6e40: 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20    Hence:.**.**  
6e50: 20 20 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46     WhereTerm.wtF
6e60: 6c 61 67 73 20 20 20 7c 3d 20 20 54 45 52 4d 5f  lags   |=  TERM_
6e70: 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57 68  ORINFO.**     Wh
6e80: 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66  ereTerm.u.pOrInf
6e90: 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d 69 63 61  o  =  a dynamica
6ea0: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68  lly allocated Wh
6eb0: 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74  ereOrTerm object
6ec0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20  .**.** The term 
6ed0: 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 6d  being analyzed m
6ee0: 75 73 74 20 68 61 76 65 20 74 77 6f 20 6f 72 20  ust have two or 
6ef0: 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e 65  more of OR-conne
6f00: 63 74 65 64 20 73 75 62 74 65 72 6d 73 2e 0a 2a  cted subterms..*
6f10: 2a 20 41 20 73 69 6e 67 6c 65 20 73 75 62 74 65  * A single subte
6f20: 72 6d 20 6d 69 67 68 74 20 62 65 20 61 20 73 65  rm might be a se
6f30: 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63 74  t of AND-connect
6f40: 65 64 20 73 75 62 2d 73 75 62 74 65 72 6d 73 2e  ed sub-subterms.
6f50: 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66 20  .** Examples of 
6f60: 74 65 72 6d 73 20 75 6e 64 65 72 20 61 6e 61 6c  terms under anal
6f70: 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ysis:.**.**     
6f80: 28 41 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e  (A)     t1.x=t2.
6f90: 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20 4f  y OR t1.x=t2.z O
6fa0: 52 20 74 31 2e 79 3d 31 35 20 4f 52 20 74 31 2e  R t1.y=15 OR t1.
6fb0: 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20 20  z=t3.a+5.**     
6fc0: 28 42 29 20 20 20 20 20 78 3d 65 78 70 72 31 20  (B)     x=expr1 
6fd0: 4f 52 20 65 78 70 72 32 3d 78 20 4f 52 20 78 3d  OR expr2=x OR x=
6fe0: 65 78 70 72 33 0a 2a 2a 20 20 20 20 20 28 43 29  expr3.**     (C)
6ff0: 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f       t1.x=t2.y O
7000: 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e 44  R (t1.x=t2.z AND
7010: 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20 20   t1.y=15).**    
7020: 20 28 44 29 20 20 20 20 20 78 3d 65 78 70 72 31   (D)     x=expr1
7030: 20 4f 52 20 28 79 3e 31 31 20 41 4e 44 20 79 3c   OR (y>11 AND y<
7040: 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27 2a  22 AND z LIKE '*
7050: 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20 20  hello*').**     
7060: 28 45 29 20 20 20 20 20 28 70 2e 61 3d 31 20 41  (E)     (p.a=1 A
7070: 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e 63  ND q.b=2 AND r.c
7080: 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34 20 41 4e  =3) OR (p.x=4 AN
7090: 44 20 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a 3d  D q.y=5 AND r.z=
70a0: 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 31 3a  6).**.** CASE 1:
70b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75  .**.** If all su
70c0: 62 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68  bterms are of th
70d0: 65 20 66 6f 72 6d 20 54 2e 43 3d 65 78 70 72 20  e form T.C=expr 
70e0: 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20  for some single 
70f0: 63 6f 6c 75 6d 6e 20 6f 66 20 43 0a 2a 2a 20 61  column of C.** a
7100: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 20   single table T 
7110: 28 61 73 20 73 68 6f 77 6e 20 69 6e 20 65 78 61  (as shown in exa
7120: 6d 70 6c 65 20 42 20 61 62 6f 76 65 29 20 74 68  mple B above) th
7130: 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  en create a new 
7140: 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20  virtual.** term 
7150: 74 68 61 74 20 69 73 20 61 6e 20 65 71 75 69 76  that is an equiv
7160: 61 6c 65 6e 74 20 49 4e 20 65 78 70 72 65 73 73  alent IN express
7170: 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ion.  In other w
7180: 6f 72 64 73 2c 20 69 66 20 74 68 65 20 74 65 72  ords, if the ter
7190: 6d 0a 2a 2a 20 62 65 69 6e 67 20 61 6e 61 6c 79  m.** being analy
71a0: 7a 65 64 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  zed is:.**.**   
71b0: 20 20 20 78 20 3d 20 65 78 70 72 31 20 20 4f 52     x = expr1  OR
71c0: 20 20 65 78 70 72 32 20 3d 20 78 20 20 4f 52 20    expr2 = x  OR 
71d0: 20 78 20 3d 20 65 78 70 72 33 0a 2a 2a 0a 2a 2a   x = expr3.**.**
71e0: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e   then create a n
71f0: 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20  ew virtual term 
7200: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
7210: 20 20 20 20 20 20 78 20 49 4e 20 28 65 78 70 72        x IN (expr
7220: 31 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a  1,expr2,expr3).*
7230: 2a 0a 2a 2a 20 43 41 53 45 20 32 3a 0a 2a 2a 0a  *.** CASE 2:.**.
7240: 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72  ** If all subter
7250: 6d 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65  ms are indexable
7260: 20 62 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62   by a single tab
7270: 6c 65 20 54 2c 20 74 68 65 6e 20 73 65 74 0a 2a  le T, then set.*
7280: 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65  *.**     WhereTe
7290: 72 6d 2e 65 4f 70 65 72 61 74 6f 72 20 20 20 20  rm.eOperator    
72a0: 20 20 20 20 20 20 20 20 20 20 3d 20 20 57 4f 5f            =  WO_
72b0: 4f 52 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54  OR.**     WhereT
72c0: 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69  erm.u.pOrInfo->i
72d0: 6e 64 65 78 61 62 6c 65 20 20 7c 3d 20 20 74 68  ndexable  |=  th
72e0: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
72f0: 66 6f 72 20 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a  for table T.**.*
7300: 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73 20 22  * A subterm is "
7310: 69 6e 64 65 78 61 62 6c 65 22 20 69 66 20 69 74  indexable" if it
7320: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a   is of the form.
7330: 2a 2a 20 22 54 2e 43 20 3c 6f 70 3e 20 3c 65 78  ** "T.C <op> <ex
7340: 70 72 3e 22 20 77 68 65 72 65 20 43 20 69 73 20  pr>" where C is 
7350: 61 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61  any column of ta
7360: 62 6c 65 20 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f  ble T and .** <o
7370: 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 22 3d 22  p> is one of "="
7380: 2c 20 22 3c 22 2c 20 22 3c 3d 22 2c 20 22 3e 22  , "<", "<=", ">"
7390: 2c 20 22 3e 3d 22 2c 20 22 49 53 20 4e 55 4c 4c  , ">=", "IS NULL
73a0: 22 2c 20 6f 72 20 22 49 4e 22 2e 0a 2a 2a 20 41  ", or "IN"..** A
73b0: 20 73 75 62 74 65 72 6d 20 69 73 20 61 6c 73 6f   subterm is also
73c0: 20 69 6e 64 65 78 61 62 6c 65 20 69 66 20 69 74   indexable if it
73d0: 20 69 73 20 61 6e 20 41 4e 44 20 6f 66 20 74 77   is an AND of tw
73e0: 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 73 75 62  o or more.** sub
73f0: 73 75 62 74 65 72 6d 73 20 61 74 20 6c 65 61 73  subterms at leas
7400: 74 20 6f 6e 65 20 6f 66 20 77 68 69 63 68 20 69  t one of which i
7410: 73 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 49 6e  s indexable.  In
7420: 64 65 78 61 62 6c 65 20 41 4e 44 20 0a 2a 2a 20  dexable AND .** 
7430: 73 75 62 74 65 72 6d 73 20 68 61 76 65 20 74 68  subterms have th
7440: 65 69 72 20 65 4f 70 65 72 61 74 6f 72 20 73 65  eir eOperator se
7450: 74 20 74 6f 20 57 4f 5f 41 4e 44 20 61 6e 64 20  t to WO_AND and 
7460: 74 68 65 79 20 68 61 76 65 0a 2a 2a 20 75 2e 70  they have.** u.p
7470: 41 6e 64 49 6e 66 6f 20 73 65 74 20 74 6f 20 61  AndInfo set to a
7480: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
7490: 6f 63 61 74 65 64 20 57 68 65 72 65 41 6e 64 54  ocated WhereAndT
74a0: 65 72 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  erm object..**.*
74b0: 2a 20 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 70  * From another p
74c0: 6f 69 6e 74 20 6f 66 20 76 69 65 77 2c 20 22 69  oint of view, "i
74d0: 6e 64 65 78 61 62 6c 65 22 20 6d 65 61 6e 73 20  ndexable" means 
74e0: 74 68 61 74 20 74 68 65 20 73 75 62 74 65 72 6d  that the subterm
74f0: 20 63 6f 75 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74   could.** potent
7500: 69 61 6c 6c 79 20 62 65 20 75 73 65 64 20 77 69  ially be used wi
7510: 74 68 20 61 6e 20 69 6e 64 65 78 20 69 66 20 61  th an index if a
7520: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e  n appropriate in
7530: 64 65 78 20 65 78 69 73 74 73 2e 0a 2a 2a 20 54  dex exists..** T
7540: 68 69 73 20 61 6e 61 6c 79 73 69 73 20 64 6f 65  his analysis doe
7550: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 20 77  s not consider w
7560: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
7570: 65 20 69 6e 64 65 78 20 65 78 69 73 74 73 3b 20  e index exists; 
7580: 74 68 61 74 0a 2a 2a 20 69 73 20 73 6f 6d 65 74  that.** is somet
7590: 68 69 6e 67 20 74 68 65 20 62 65 73 74 49 6e 64  hing the bestInd
75a0: 65 78 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  ex() routine wil
75b0: 6c 20 64 65 74 65 72 6d 69 6e 65 2e 20 20 54 68  l determine.  Th
75c0: 69 73 20 61 6e 61 6c 79 73 69 73 0a 2a 2a 20 6f  is analysis.** o
75d0: 6e 6c 79 20 6c 6f 6f 6b 73 20 61 74 20 77 68 65  nly looks at whe
75e0: 74 68 65 72 20 73 75 62 74 65 72 6d 73 20 61 70  ther subterms ap
75f0: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
7600: 64 65 78 69 6e 67 20 65 78 69 73 74 2e 0a 2a 2a  dexing exist..**
7610: 0a 2a 2a 20 41 6c 6c 20 65 78 61 6d 70 6c 65 73  .** All examples
7620: 20 41 20 74 68 72 6f 75 67 68 20 45 20 61 62 6f   A through E abo
7630: 76 65 20 61 6c 6c 20 73 61 74 69 73 66 79 20 63  ve all satisfy c
7640: 61 73 65 20 32 2e 20 20 42 75 74 20 69 66 20 61  ase 2.  But if a
7650: 20 74 65 72 6d 0a 2a 2a 20 61 6c 73 6f 20 73 74   term.** also st
7660: 61 74 69 73 66 69 65 73 20 63 61 73 65 20 31 20  atisfies case 1 
7670: 28 73 75 63 68 20 61 73 20 42 29 20 77 65 20 6b  (such as B) we k
7680: 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 70 74  now that the opt
7690: 69 6d 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a 20 61  imizer will.** a
76a0: 6c 77 61 79 73 20 70 72 65 66 65 72 20 63 61 73  lways prefer cas
76b0: 65 20 31 2c 20 73 6f 20 69 6e 20 74 68 61 74 20  e 1, so in that 
76c0: 63 61 73 65 20 77 65 20 70 72 65 74 65 6e 64 20  case we pretend 
76d0: 74 68 61 74 20 63 61 73 65 20 32 20 69 73 20 6e  that case 2 is n
76e0: 6f 74 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 2e  ot.** satisfied.
76f0: 0a 2a 2a 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20  .**.** It might 
7700: 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
7710: 20 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c 65 73   multiple tables
7720: 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2e 20   are indexable. 
7730: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a   For example,.**
7740: 20 28 45 29 20 61 62 6f 76 65 20 69 73 20 69 6e   (E) above is in
7750: 64 65 78 61 62 6c 65 20 6f 6e 20 74 61 62 6c 65  dexable on table
7760: 73 20 50 2c 20 51 2c 20 61 6e 64 20 52 2e 0a 2a  s P, Q, and R..*
7770: 2a 0a 2a 2a 20 54 65 72 6d 73 20 74 68 61 74 20  *.** Terms that 
7780: 73 61 74 69 73 66 79 20 63 61 73 65 20 32 20 61  satisfy case 2 a
7790: 72 65 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f  re candidates fo
77a0: 72 20 6c 6f 6f 6b 75 70 20 62 79 20 75 73 69 6e  r lookup by usin
77b0: 67 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 69 6e  g.** separate in
77c0: 64 69 63 65 73 20 74 6f 20 66 69 6e 64 20 72 6f  dices to find ro
77d0: 77 69 64 73 20 66 6f 72 20 65 61 63 68 20 73 75  wids for each su
77e0: 62 74 65 72 6d 20 61 6e 64 20 63 6f 6d 70 6f 73  bterm and compos
77f0: 69 6e 67 0a 2a 2a 20 74 68 65 20 75 6e 69 6f 6e  ing.** the union
7800: 20 6f 66 20 61 6c 6c 20 72 6f 77 69 64 73 20 75   of all rowids u
7810: 73 69 6e 67 20 61 20 52 6f 77 53 65 74 20 6f 62  sing a RowSet ob
7820: 6a 65 63 74 2e 20 20 54 68 69 73 20 69 73 20 73  ject.  This is s
7830: 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20 22 62 69  imilar.** to "bi
7840: 74 6d 61 70 20 69 6e 64 69 63 65 73 22 20 69 6e  tmap indices" in
7850: 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
7860: 65 6e 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f  engines..**.** O
7870: 54 48 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a 2a 20  THERWISE:.**.** 
7880: 49 66 20 6e 65 69 74 68 65 72 20 63 61 73 65 20  If neither case 
7890: 31 20 6e 6f 72 20 63 61 73 65 20 32 20 61 70 70  1 nor case 2 app
78a0: 6c 79 2c 20 74 68 65 6e 20 6c 65 61 76 65 20 74  ly, then leave t
78b0: 68 65 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74  he eOperator set
78c0: 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 20 20 54 68   to.** zero.  Th
78d0: 69 73 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 75  is term is not u
78e0: 73 65 66 75 6c 20 66 6f 72 20 73 65 61 72 63 68  seful for search
78f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7900: 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65   exprAnalyzeOrTe
7910: 72 6d 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  rm(.  SrcList *p
7920: 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Src,            
7930: 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* the FROM clau
7940: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  se */.  WhereCla
7950: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
7960: 20 20 2f 2a 20 74 68 65 20 63 6f 6d 70 6c 65 74    /* the complet
7970: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
7980: 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20  /.  int idxTerm 
7990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
79a0: 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 4f 52   Index of the OR
79b0: 2d 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c  -term to be anal
79c0: 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72  yzed */.){.  Par
79d0: 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43  se *pParse = pWC
79e0: 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 20  ->pParse;       
79f0: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
7a00: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69  ontext */.  sqli
7a10: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
7a20: 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20  ->db;           
7a30: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
7a40: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
7a50: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
7a60: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
7a70: 72 6d 5d 3b 20 20 20 20 2f 2a 20 54 68 65 20 74  rm];    /* The t
7a80: 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  erm to be analyz
7a90: 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  ed */.  Expr *pE
7aa0: 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
7ab0: 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
7ac0: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
7ad0: 6e 20 6f 66 20 74 68 65 20 74 65 72 6d 20 2a 2f  n of the term */
7ae0: 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  .  WhereMaskSet 
7af0: 2a 70 4d 61 73 6b 53 65 74 20 3d 20 70 57 43 2d  *pMaskSet = pWC-
7b00: 3e 70 4d 61 73 6b 53 65 74 3b 20 2f 2a 20 54 61  >pMaskSet; /* Ta
7b10: 62 6c 65 20 75 73 65 20 6d 61 73 6b 73 20 2a 2f  ble use masks */
7b20: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
7b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
7b50: 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
7b60: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f   WhereClause *pO
7b70: 72 57 63 3b 20 20 20 20 20 20 20 2f 2a 20 42 72  rWc;       /* Br
7b80: 65 61 6b 75 70 20 6f 66 20 70 54 65 72 6d 20 69  eakup of pTerm i
7b90: 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a  nto subterms */.
7ba0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72    WhereTerm *pOr
7bb0: 54 65 72 6d 3b 20 20 20 20 20 20 20 2f 2a 20 41  Term;       /* A
7bc0: 20 53 75 62 2d 74 65 72 6d 20 77 69 74 68 69 6e   Sub-term within
7bd0: 20 74 68 65 20 70 4f 72 57 63 20 2a 2f 0a 20 20   the pOrWc */.  
7be0: 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72  WhereOrInfo *pOr
7bf0: 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 41 64 64  Info;     /* Add
7c00: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
7c10: 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77  ion associated w
7c20: 69 74 68 20 70 54 65 72 6d 20 2a 2f 0a 20 20 42  ith pTerm */.  B
7c30: 69 74 6d 61 73 6b 20 63 68 6e 67 54 6f 49 4e 3b  itmask chngToIN;
7c40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
7c50: 65 73 20 74 68 61 74 20 6d 69 67 68 74 20 73 61  es that might sa
7c60: 74 69 73 66 79 20 63 61 73 65 20 31 20 2a 2f 0a  tisfy case 1 */.
7c70: 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65 78 61    Bitmask indexa
7c80: 62 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ble;        /* T
7c90: 61 62 6c 65 73 20 74 68 61 74 20 61 72 65 20 69  ables that are i
7ca0: 6e 64 65 78 61 62 6c 65 2c 20 73 61 74 69 73 66  ndexable, satisf
7cb0: 79 69 6e 67 20 63 61 73 65 20 32 20 2a 2f 0a 0a  ying case 2 */..
7cc0: 20 20 2f 2a 0a 20 20 2a 2a 20 42 72 65 61 6b 20    /*.  ** Break 
7cd0: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69 6e  the OR clause in
7ce0: 74 6f 20 69 74 73 20 73 65 70 61 72 61 74 65 20  to its separate 
7cf0: 73 75 62 74 65 72 6d 73 2e 20 20 54 68 65 20 73  subterms.  The s
7d00: 75 62 74 65 72 6d 73 20 61 72 65 0a 20 20 2a 2a  ubterms are.  **
7d10: 20 73 74 6f 72 65 64 20 69 6e 20 61 20 57 68 65   stored in a Whe
7d20: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
7d30: 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 77 69  re containing wi
7d40: 74 68 69 6e 20 74 68 65 20 57 68 65 72 65 4f 72  thin the WhereOr
7d50: 49 6e 66 6f 0a 20 20 2a 2a 20 6f 62 6a 65 63 74  Info.  ** object
7d60: 20 74 68 61 74 20 69 73 20 61 74 74 61 63 68 65   that is attache
7d70: 64 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  d to the origina
7d80: 6c 20 4f 52 20 63 6c 61 75 73 65 20 74 65 72 6d  l OR clause term
7d90: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
7da0: 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
7db0: 20 26 20 28 54 45 52 4d 5f 44 59 4e 41 4d 49 43   & (TERM_DYNAMIC
7dc0: 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52  |TERM_ORINFO|TER
7dd0: 4d 5f 41 4e 44 49 4e 46 4f 29 29 3d 3d 30 20 29  M_ANDINFO))==0 )
7de0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
7df0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a  r->op==TK_OR );.
7e00: 20 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e    pTerm->u.pOrIn
7e10: 66 6f 20 3d 20 70 4f 72 49 6e 66 6f 20 3d 20 73  fo = pOrInfo = s
7e20: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
7e30: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
7e40: 4f 72 49 6e 66 6f 29 29 3b 0a 20 20 69 66 28 20  OrInfo));.  if( 
7e50: 70 4f 72 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74  pOrInfo==0 ) ret
7e60: 75 72 6e 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74  urn;.  pTerm->wt
7e70: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52  Flags |= TERM_OR
7e80: 49 4e 46 4f 3b 0a 20 20 70 4f 72 57 63 20 3d 20  INFO;.  pOrWc = 
7e90: 26 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20  &pOrInfo->wc;.  
7ea0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
7eb0: 70 4f 72 57 63 2c 20 70 57 43 2d 3e 70 50 61 72  pOrWc, pWC->pPar
7ec0: 73 65 2c 20 70 4d 61 73 6b 53 65 74 29 3b 0a 20  se, pMaskSet);. 
7ed0: 20 77 68 65 72 65 53 70 6c 69 74 28 70 4f 72 57   whereSplit(pOrW
7ee0: 63 2c 20 70 45 78 70 72 2c 20 54 4b 5f 4f 52 29  c, pExpr, TK_OR)
7ef0: 3b 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41  ;.  exprAnalyzeA
7f00: 6c 6c 28 70 53 72 63 2c 20 70 4f 72 57 63 29 3b  ll(pSrc, pOrWc);
7f10: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
7f20: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
7f30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 57  ;.  assert( pOrW
7f40: 63 2d 3e 6e 54 65 72 6d 3e 3d 32 20 29 3b 0a 0a  c->nTerm>=2 );..
7f50: 20 20 2f 2a 0a 20 20 2a 2a 20 43 6f 6d 70 75 74    /*.  ** Comput
7f60: 65 20 74 68 65 20 73 65 74 20 6f 66 20 74 61 62  e the set of tab
7f70: 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74 20 73  les that might s
7f80: 61 74 69 73 66 79 20 63 61 73 65 73 20 31 20 6f  atisfy cases 1 o
7f90: 72 20 32 2e 0a 20 20 2a 2f 0a 20 20 69 6e 64 65  r 2..  */.  inde
7fa0: 78 61 62 6c 65 20 3d 20 7e 28 42 69 74 6d 61 73  xable = ~(Bitmas
7fb0: 6b 29 30 3b 0a 20 20 63 68 6e 67 54 6f 49 4e 20  k)0;.  chngToIN 
7fc0: 3d 20 7e 28 70 57 43 2d 3e 76 6d 61 73 6b 29 3b  = ~(pWC->vmask);
7fd0: 0a 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e  .  for(i=pOrWc->
7fe0: 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d  nTerm-1, pOrTerm
7ff0: 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 20  =pOrWc->a; i>=0 
8000: 26 26 20 69 6e 64 65 78 61 62 6c 65 3b 20 69 2d  && indexable; i-
8010: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
8020: 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d     if( (pOrTerm-
8030: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
8040: 53 49 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a 20 20  SINGLE)==0 ){.  
8050: 20 20 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f      WhereAndInfo
8060: 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20   *pAndInfo;.    
8070: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
8080: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 30 20  m->eOperator==0 
8090: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
80a0: 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61   (pOrTerm->wtFla
80b0: 67 73 20 26 20 28 54 45 52 4d 5f 41 4e 44 49 4e  gs & (TERM_ANDIN
80c0: 46 4f 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 29  FO|TERM_ORINFO))
80d0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 68 6e  ==0 );.      chn
80e0: 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20  gToIN = 0;.     
80f0: 20 70 41 6e 64 49 6e 66 6f 20 3d 20 73 71 6c 69   pAndInfo = sqli
8100: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
8110: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 41 6e 64 49  b, sizeof(*pAndI
8120: 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 69 66 28  nfo));.      if(
8130: 20 70 41 6e 64 49 6e 66 6f 20 29 7b 0a 20 20 20   pAndInfo ){.   
8140: 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65       WhereClause
8150: 20 2a 70 41 6e 64 57 43 3b 0a 20 20 20 20 20 20   *pAndWC;.      
8160: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 41 6e    WhereTerm *pAn
8170: 64 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69  dTerm;.        i
8180: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 42 69  nt j;.        Bi
8190: 74 6d 61 73 6b 20 62 20 3d 20 30 3b 0a 20 20 20  tmask b = 0;.   
81a0: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 75 2e       pOrTerm->u.
81b0: 70 41 6e 64 49 6e 66 6f 20 3d 20 70 41 6e 64 49  pAndInfo = pAndI
81c0: 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  nfo;.        pOr
81d0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
81e0: 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20   TERM_ANDINFO;. 
81f0: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
8200: 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41  eOperator = WO_A
8210: 4e 44 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64  ND;.        pAnd
8220: 57 43 20 3d 20 26 70 41 6e 64 49 6e 66 6f 2d 3e  WC = &pAndInfo->
8230: 77 63 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  wc;.        wher
8240: 65 43 6c 61 75 73 65 49 6e 69 74 28 70 41 6e 64  eClauseInit(pAnd
8250: 57 43 2c 20 70 57 43 2d 3e 70 50 61 72 73 65 2c  WC, pWC->pParse,
8260: 20 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 20 20   pMaskSet);.    
8270: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70      whereSplit(p
8280: 41 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e  AndWC, pOrTerm->
8290: 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a  pExpr, TK_AND);.
82a0: 20 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c          exprAnal
82b0: 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e  yzeAll(pSrc, pAn
82c0: 64 57 43 29 3b 0a 20 20 20 20 20 20 20 20 74 65  dWC);.        te
82d0: 73 74 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c  stcase( db->mall
82e0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
82f0: 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c      if( !db->mal
8300: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
8310: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20         for(j=0, 
8320: 70 41 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d  pAndTerm=pAndWC-
8330: 3e 61 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54  >a; j<pAndWC->nT
8340: 65 72 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65  erm; j++, pAndTe
8350: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  rm++){.         
8360: 20 20 20 61 73 73 65 72 74 28 20 70 41 6e 64 54     assert( pAndT
8370: 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20  erm->pExpr );.  
8380: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 6c            if( al
8390: 6c 6f 77 65 64 4f 70 28 70 41 6e 64 54 65 72 6d  lowedOp(pAndTerm
83a0: 2d 3e 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a  ->pExpr->op) ){.
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 20                b 
83c0: 7c 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b  |= getMask(pMask
83d0: 53 65 74 2c 20 70 41 6e 64 54 65 72 6d 2d 3e 6c  Set, pAndTerm->l
83e0: 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  eftCursor);.    
83f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8400: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
8410: 20 20 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c          indexabl
8420: 65 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a  e &= b;.      }.
8430: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
8440: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
8450: 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 7b 0a   TERM_COPIED ){.
8460: 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 74 68        /* Skip th
8470: 69 73 20 74 65 72 6d 20 66 6f 72 20 6e 6f 77 2e  is term for now.
8480: 20 20 57 65 20 72 65 76 69 73 69 74 20 69 74 20    We revisit it 
8490: 77 68 65 6e 20 77 65 20 70 72 6f 63 65 73 73 20  when we process 
84a0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72  the.      ** cor
84b0: 72 65 73 70 6f 6e 64 69 6e 67 20 54 45 52 4d 5f  responding TERM_
84c0: 56 49 52 54 55 41 4c 20 74 65 72 6d 20 2a 2f 0a  VIRTUAL term */.
84d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
84e0: 20 42 69 74 6d 61 73 6b 20 62 3b 0a 20 20 20 20   Bitmask b;.    
84f0: 20 20 62 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d    b = getMask(pM
8500: 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d  askSet, pOrTerm-
8510: 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20  >leftCursor);.  
8520: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
8530: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
8540: 56 49 52 54 55 41 4c 20 29 7b 0a 20 20 20 20 20  VIRTUAL ){.     
8550: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
8560: 74 68 65 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61  ther = &pOrWc->a
8570: 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e  [pOrTerm->iParen
8580: 74 5d 3b 0a 20 20 20 20 20 20 20 20 62 20 7c 3d  t];.        b |=
8590: 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
85a0: 74 2c 20 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43  t, pOther->leftC
85b0: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  ursor);.      }.
85c0: 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20        indexable 
85d0: 26 3d 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20  &= b;.      if( 
85e0: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
85f0: 6f 72 21 3d 57 4f 5f 45 51 20 29 7b 0a 20 20 20  or!=WO_EQ ){.   
8600: 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20       chngToIN = 
8610: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
8620: 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e          chngToIN
8630: 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20   &= b;.      }. 
8640: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20     }.  }..  /*. 
8650: 20 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 73   ** Record the s
8660: 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61  et of tables tha
8670: 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32  t satisfy case 2
8680: 2e 20 20 54 68 65 20 73 65 74 20 6d 69 67 68 74  .  The set might
8690: 20 62 65 0a 20 20 2a 2a 20 65 6d 70 74 79 2e 0a   be.  ** empty..
86a0: 20 20 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e    */.  pOrInfo->
86b0: 69 6e 64 65 78 61 62 6c 65 20 3d 20 69 6e 64 65  indexable = inde
86c0: 78 61 62 6c 65 3b 0a 20 20 70 54 65 72 6d 2d 3e  xable;.  pTerm->
86d0: 65 4f 70 65 72 61 74 6f 72 20 3d 20 69 6e 64 65  eOperator = inde
86e0: 78 61 62 6c 65 3d 3d 30 20 3f 20 30 20 3a 20 57  xable==0 ? 0 : W
86f0: 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  O_OR;..  /*.  **
8700: 20 63 68 6e 67 54 6f 49 4e 20 68 6f 6c 64 73 20   chngToIN holds 
8710: 61 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20  a set of tables 
8720: 74 68 61 74 20 2a 6d 69 67 68 74 2a 20 73 61 74  that *might* sat
8730: 69 73 66 79 20 63 61 73 65 20 31 2e 20 20 42 75  isfy case 1.  Bu
8740: 74 0a 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74  t.  ** we have t
8750: 6f 20 64 6f 20 73 6f 6d 65 20 61 64 64 69 74 69  o do some additi
8760: 6f 6e 61 6c 20 63 68 65 63 6b 69 6e 67 20 74 6f  onal checking to
8770: 20 73 65 65 20 69 66 20 63 61 73 65 20 31 20 72   see if case 1 r
8780: 65 61 6c 6c 79 0a 20 20 2a 2a 20 69 73 20 73 61  eally.  ** is sa
8790: 74 69 73 66 69 65 64 2e 0a 20 20 2a 2a 0a 20 20  tisfied..  **.  
87a0: 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 77 69 6c 6c  ** chngToIN will
87b0: 20 68 6f 6c 64 20 65 69 74 68 65 72 20 30 2c 20   hold either 0, 
87c0: 31 2c 20 6f 72 20 32 20 62 69 74 73 2e 20 20 54  1, or 2 bits.  T
87d0: 68 65 20 30 2d 62 69 74 20 63 61 73 65 20 6d 65  he 0-bit case me
87e0: 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  ans.  ** that th
87f0: 65 72 65 20 69 73 20 6e 6f 20 70 6f 73 73 69 62  ere is no possib
8800: 69 6c 69 74 79 20 6f 66 20 74 72 61 6e 73 66 6f  ility of transfo
8810: 72 6d 69 6e 67 20 74 68 65 20 4f 52 20 63 6c 61  rming the OR cla
8820: 75 73 65 20 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a  use into an.  **
8830: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 62 65 63   IN operator bec
8840: 61 75 73 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ause one or more
8850: 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52   terms in the OR
8860: 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 0a   clause contain.
8870: 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f    ** something o
8880: 74 68 65 72 20 74 68 61 6e 20 3d 3d 20 6f 6e 20  ther than == on 
8890: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  a column in the 
88a0: 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54  single table.  T
88b0: 68 65 20 31 2d 62 69 74 0a 20 20 2a 2a 20 63 61  he 1-bit.  ** ca
88c0: 73 65 20 6d 65 61 6e 73 20 74 68 61 74 20 65 76  se means that ev
88d0: 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ery term of the 
88e0: 4f 52 20 63 6c 61 75 73 65 20 69 73 20 6f 66 20  OR clause is of 
88f0: 74 68 65 20 66 6f 72 6d 0a 20 20 2a 2a 20 22 74  the form.  ** "t
8900: 61 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72  able.column=expr
8910: 22 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c  " for some singl
8920: 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6f 6e  e table.  The on
8930: 65 20 62 69 74 20 74 68 61 74 20 69 73 20 73 65  e bit that is se
8940: 74 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 6f 72 72  t.  ** will corr
8950: 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 63 6f  espond to the co
8960: 6d 6d 6f 6e 20 74 61 62 6c 65 2e 20 20 57 65 20  mmon table.  We 
8970: 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68  still need to ch
8980: 65 63 6b 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a  eck to make.  **
8990: 20 73 75 72 65 20 74 68 65 20 73 61 6d 65 20 63   sure the same c
89a0: 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 6f 6e  olumn is used on
89b0: 20 61 6c 6c 20 74 65 72 6d 73 2e 20 20 54 68 65   all terms.  The
89c0: 20 32 2d 62 69 74 20 63 61 73 65 20 69 73 20 77   2-bit case is w
89d0: 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c  hen.  ** the all
89e0: 20 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68   terms are of th
89f0: 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 31 2e 63  e form "table1.c
8a00: 6f 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c  olumn=table2.col
8a10: 75 6d 6e 22 2e 20 20 49 74 0a 20 20 2a 2a 20 6d  umn".  It.  ** m
8a20: 69 67 68 74 20 62 65 20 70 6f 73 73 69 62 6c 65  ight be possible
8a30: 20 74 6f 20 66 6f 72 6d 20 61 6e 20 49 4e 20 6f   to form an IN o
8a40: 70 65 72 61 74 6f 72 20 77 69 74 68 20 65 69 74  perator with eit
8a50: 68 65 72 20 74 61 62 6c 65 31 2e 63 6f 6c 75 6d  her table1.colum
8a60: 6e 0a 20 20 2a 2a 20 6f 72 20 74 61 62 6c 65 32  n.  ** or table2
8a70: 2e 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 4c  .column as the L
8a80: 48 53 20 69 66 20 65 69 74 68 65 72 20 69 73 20  HS if either is 
8a90: 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20  common to every 
8aa0: 74 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 65  term of.  ** the
8ab0: 20 4f 52 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a   OR clause..  **
8ac0: 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
8ad0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72  terms of the for
8ae0: 6d 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31  m "table.column1
8af0: 3d 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20  =table.column2" 
8b00: 28 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74  (the.  ** same t
8b10: 61 62 6c 65 20 6f 6e 20 62 6f 74 68 20 73 69 7a  able on both siz
8b20: 65 73 20 6f 66 20 74 68 65 20 3d 3d 29 20 63 61  es of the ==) ca
8b30: 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65  nnot be optimize
8b40: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68  d..  */.  if( ch
8b50: 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 69 6e  ngToIN ){.    in
8b60: 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d  t okToChngToIN =
8b70: 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20   0;     /* True 
8b80: 69 66 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f  if the conversio
8b90: 6e 20 74 6f 20 49 4e 20 69 73 20 76 61 6c 69 64  n to IN is valid
8ba0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c   */.    int iCol
8bb0: 75 6d 6e 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  umn = -1;       
8bc0: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64 65    /* Column inde
8bd0: 78 20 6f 6e 20 6c 68 73 20 6f 66 20 49 4e 20 6f  x on lhs of IN o
8be0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 69  perator */.    i
8bf0: 6e 74 20 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b  nt iCursor = -1;
8c00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
8c10: 65 20 63 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20  e cursor common 
8c20: 74 6f 20 61 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a  to all terms */.
8c30: 20 20 20 20 69 6e 74 20 6a 20 3d 20 30 3b 20 20      int j = 0;  
8c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8c50: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
8c60: 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20  ..    /* Search 
8c70: 66 6f 72 20 61 20 74 61 62 6c 65 20 61 6e 64 20  for a table and 
8c80: 63 6f 6c 75 6d 6e 20 74 68 61 74 20 61 70 70 65  column that appe
8c90: 61 72 73 20 6f 6e 20 6f 6e 65 20 73 69 64 65 20  ars on one side 
8ca0: 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74  or the.    ** ot
8cb0: 68 65 72 20 6f 66 20 74 68 65 20 3d 3d 20 6f 70  her of the == op
8cc0: 65 72 61 74 6f 72 20 69 6e 20 65 76 65 72 79 20  erator in every 
8cd0: 73 75 62 74 65 72 6d 2e 20 20 54 68 61 74 20 74  subterm.  That t
8ce0: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a  able and column.
8cf0: 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72      ** will be r
8d00: 65 63 6f 72 64 65 64 20 69 6e 20 69 43 75 72 73  ecorded in iCurs
8d10: 6f 72 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20  or and iColumn. 
8d20: 20 54 68 65 72 65 20 6d 69 67 68 74 20 6e 6f 74   There might not
8d30: 20 62 65 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73   be any.    ** s
8d40: 75 63 68 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  uch table and co
8d50: 6c 75 6d 6e 2e 20 20 53 65 74 20 6f 6b 54 6f 43  lumn.  Set okToC
8d60: 68 6e 67 54 6f 49 4e 20 69 66 20 61 6e 20 61 70  hngToIN if an ap
8d70: 70 72 6f 70 72 69 61 74 65 20 74 61 62 6c 65 0a  propriate table.
8d80: 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d      ** and colum
8d90: 6e 20 69 73 20 66 6f 75 6e 64 20 62 75 74 20 6c  n is found but l
8da0: 65 61 76 65 20 6f 6b 54 6f 43 68 6e 67 54 6f 49  eave okToChngToI
8db0: 4e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 20 66  N false if not f
8dc0: 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ound..    */.   
8dd0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20 26 26   for(j=0; j<2 &&
8de0: 20 21 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20   !okToChngToIN; 
8df0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4f 72 54  j++){.      pOrT
8e00: 65 72 6d 20 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a  erm = pOrWc->a;.
8e10: 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57        for(i=pOrW
8e20: 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30  c->nTerm-1; i>=0
8e30: 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b  ; i--, pOrTerm++
8e40: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
8e50: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  t( pOrTerm->eOpe
8e60: 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a  rator==WO_EQ );.
8e70: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
8e80: 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52  >wtFlags &= ~TER
8e90: 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  M_OR_OK;.       
8ea0: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
8eb0: 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f  ftCursor==iCurso
8ec0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  r ){.          /
8ed0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 32 2d  * This is the 2-
8ee0: 62 69 74 20 63 61 73 65 20 61 6e 64 20 77 65 20  bit case and we 
8ef0: 61 72 65 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e  are on the secon
8f00: 64 20 69 74 65 72 61 74 69 6f 6e 20 61 6e 64 0a  d iteration and.
8f10: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72            ** cur
8f20: 72 65 6e 74 20 74 65 72 6d 20 69 73 20 66 72 6f  rent term is fro
8f30: 6d 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  m the first iter
8f40: 61 74 69 6f 6e 2e 20 20 53 6f 20 73 6b 69 70 20  ation.  So skip 
8f50: 74 68 69 73 20 74 65 72 6d 2e 20 2a 2f 0a 20 20  this term. */.  
8f60: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8f70: 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  j==1 );.        
8f80: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
8f90: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
8fa0: 28 20 28 63 68 6e 67 54 6f 49 4e 20 26 20 67 65  ( (chngToIN & ge
8fb0: 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
8fc0: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
8fd0: 73 6f 72 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  sor))==0 ){.    
8fe0: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 74 65        /* This te
8ff0: 72 6d 20 6d 75 73 74 20 62 65 20 6f 66 20 74 68  rm must be of th
9000: 65 20 66 6f 72 6d 20 74 31 2e 61 3d 3d 74 32 2e  e form t1.a==t2.
9010: 62 20 77 68 65 72 65 20 74 32 20 69 73 20 69 6e  b where t2 is in
9020: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
9030: 2a 20 63 68 6e 67 54 6f 49 4e 20 73 65 74 20 62  * chngToIN set b
9040: 75 74 20 74 31 20 69 73 20 6e 6f 74 2e 20 20 54  ut t1 is not.  T
9050: 68 69 73 20 74 65 72 6d 20 77 69 6c 6c 20 62 65  his term will be
9060: 20 65 69 74 68 65 72 20 70 72 65 63 65 65 64 65   either preceede
9070: 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f  d.          ** o
9080: 72 20 66 6f 6c 6c 77 65 64 20 62 79 20 61 6e 20  r follwed by an 
9090: 69 6e 76 65 72 74 65 64 20 63 6f 70 79 20 28 74  inverted copy (t
90a0: 32 2e 62 3d 3d 74 31 2e 61 29 2e 20 20 53 6b 69  2.b==t1.a).  Ski
90b0: 70 20 74 68 69 73 20 74 65 72 6d 20 0a 20 20 20  p this term .   
90c0: 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 75 73         ** and us
90d0: 65 20 69 74 73 20 69 6e 76 65 72 73 69 6f 6e 2e  e its inversion.
90e0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
90f0: 73 74 63 61 73 65 28 20 70 4f 72 54 65 72 6d 2d  stcase( pOrTerm-
9100: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
9110: 43 4f 50 49 45 44 20 29 3b 0a 20 20 20 20 20 20  COPIED );.      
9120: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4f      testcase( pO
9130: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
9140: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
9150: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
9160: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c  t( pOrTerm->wtFl
9170: 61 67 73 20 26 20 28 54 45 52 4d 5f 43 4f 50 49  ags & (TERM_COPI
9180: 45 44 7c 54 45 52 4d 5f 56 49 52 54 55 41 4c 29  ED|TERM_VIRTUAL)
9190: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   );.          co
91a0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
91b0: 7d 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d  }.        iColum
91c0: 6e 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c  n = pOrTerm->u.l
91d0: 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
91e0: 20 20 20 69 43 75 72 73 6f 72 20 3d 20 70 4f 72     iCursor = pOr
91f0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
9200: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
9210: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
9220: 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( i<0 ){.      
9230: 20 20 2f 2a 20 4e 6f 20 63 61 6e 64 69 64 61 74    /* No candidat
9240: 65 20 74 61 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77  e table+column w
9250: 61 73 20 66 6f 75 6e 64 2e 20 20 54 68 69 73 20  as found.  This 
9260: 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 0a 20  can only occur. 
9270: 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65         ** on the
9280: 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f   second iteratio
9290: 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  n */.        ass
92a0: 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20  ert( j==1 );.   
92b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 63 68       assert( (ch
92c0: 6e 67 54 6f 49 4e 26 28 63 68 6e 67 54 6f 49 4e  ngToIN&(chngToIN
92d0: 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  -1))==0 );.     
92e0: 20 20 20 61 73 73 65 72 74 28 20 63 68 6e 67 54     assert( chngT
92f0: 6f 49 4e 3d 3d 67 65 74 4d 61 73 6b 28 70 4d 61  oIN==getMask(pMa
9300: 73 6b 53 65 74 2c 20 69 43 75 72 73 6f 72 29 20  skSet, iCursor) 
9310: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
9320: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9330: 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 31 20 29  testcase( j==1 )
9340: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 68  ;..      /* We h
9350: 61 76 65 20 66 6f 75 6e 64 20 61 20 63 61 6e 64  ave found a cand
9360: 69 64 61 74 65 20 74 61 62 6c 65 20 61 6e 64 20  idate table and 
9370: 63 6f 6c 75 6d 6e 2e 20 20 43 68 65 63 6b 20 74  column.  Check t
9380: 6f 20 73 65 65 20 69 66 20 74 68 61 74 0a 20 20  o see if that.  
9390: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64      ** table and
93a0: 20 63 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f   column is commo
93b0: 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20  n to every term 
93c0: 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  in the OR clause
93d0: 20 2a 2f 0a 20 20 20 20 20 20 6f 6b 54 6f 43 68   */.      okToCh
93e0: 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20  ngToIN = 1;.    
93f0: 20 20 66 6f 72 28 3b 20 69 3e 3d 30 20 26 26 20    for(; i>=0 && 
9400: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 69 2d  okToChngToIN; i-
9410: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
9420: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
9430: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
9440: 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20  r==WO_EQ );.    
9450: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
9460: 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75  >leftCursor!=iCu
9470: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rsor ){.        
9480: 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61    pOrTerm->wtFla
9490: 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f  gs &= ~TERM_OR_O
94a0: 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  K;.        }else
94b0: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e   if( pOrTerm->u.
94c0: 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c  leftColumn!=iCol
94d0: 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
94e0: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20   okToChngToIN = 
94f0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
9500: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
9510: 61 66 66 4c 65 66 74 2c 20 61 66 66 52 69 67 68  affLeft, affRigh
9520: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;.          /* 
9530: 49 66 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  If the right-han
9540: 64 20 73 69 64 65 20 69 73 20 61 6c 73 6f 20 61  d side is also a
9550: 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68   column, then th
9560: 65 20 61 66 66 69 6e 69 74 69 65 73 0a 20 20 20  e affinities.   
9570: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 6f 74         ** of bot
9580: 68 20 72 69 67 68 74 20 61 6e 64 20 6c 65 66 74  h right and left
9590: 20 73 69 64 65 73 20 6d 75 73 74 20 62 65 20 73   sides must be s
95a0: 75 63 68 20 74 68 61 74 20 6e 6f 20 74 79 70 65  uch that no type
95b0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
95c0: 6e 76 65 72 73 69 6f 6e 73 20 61 72 65 20 72 65  nversions are re
95d0: 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 72 69  quired on the ri
95e0: 67 68 74 2e 20 20 28 54 69 63 6b 65 74 20 23 32  ght.  (Ticket #2
95f0: 32 34 39 29 0a 20 20 20 20 20 20 20 20 20 20 2a  249).          *
9600: 2f 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 52  /.          affR
9610: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
9620: 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65  prAffinity(pOrTe
9630: 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
9640: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66  t);.          af
9650: 66 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  fLeft = sqlite3E
9660: 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54  xprAffinity(pOrT
9670: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66  erm->pExpr->pLef
9680: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t);.          if
9690: 28 20 61 66 66 52 69 67 68 74 21 3d 30 20 26 26  ( affRight!=0 &&
96a0: 20 61 66 66 52 69 67 68 74 21 3d 61 66 66 4c 65   affRight!=affLe
96b0: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ft ){.          
96c0: 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d    okToChngToIN =
96d0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   0;.          }e
96e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
96f0: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
9700: 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b  s |= TERM_OR_OK;
9710: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
9720: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
9730: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
9740: 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f  this point, okTo
9750: 43 68 6e 67 54 6f 49 4e 20 69 73 20 74 72 75 65  ChngToIN is true
9760: 20 69 66 20 6f 72 69 67 69 6e 61 6c 20 70 54 65   if original pTe
9770: 72 6d 20 73 61 74 69 73 66 69 65 73 0a 20 20 20  rm satisfies.   
9780: 20 2a 2a 20 63 61 73 65 20 31 2e 20 20 49 6e 20   ** case 1.  In 
9790: 74 68 61 74 20 63 61 73 65 2c 20 63 6f 6e 73 74  that case, const
97a0: 72 75 63 74 20 61 20 6e 65 77 20 76 69 72 74 75  ruct a new virtu
97b0: 61 6c 20 74 65 72 6d 20 74 68 61 74 20 69 73 20  al term that is 
97c0: 0a 20 20 20 20 2a 2a 20 70 54 65 72 6d 20 63 6f  .    ** pTerm co
97d0: 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20  nverted into an 
97e0: 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20  IN operator..   
97f0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 3a 20 52   **.    ** EV: R
9800: 2d 30 30 32 31 31 2d 31 35 31 30 30 0a 20 20 20  -00211-15100.   
9810: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6b 54 6f   */.    if( okTo
9820: 43 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20  ChngToIN ){.    
9830: 20 20 45 78 70 72 20 2a 70 44 75 70 3b 20 20 20    Expr *pDup;   
9840: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 72           /* A tr
9850: 61 6e 73 69 65 6e 74 20 64 75 70 6c 69 63 61 74  ansient duplicat
9860: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  e expression */.
9870: 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
9880: 70 4c 69 73 74 20 3d 20 30 3b 20 20 20 2f 2a 20  pList = 0;   /* 
9890: 54 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  The RHS of the I
98a0: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
98b0: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
98c0: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  = 0;       /* Th
98d0: 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
98e0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
98f0: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20    Expr *pNew;   
9900: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
9910: 63 6f 6d 70 6c 65 74 65 20 49 4e 20 6f 70 65 72  complete IN oper
9920: 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 66  ator */..      f
9930: 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72  or(i=pOrWc->nTer
9940: 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72  m-1, pOrTerm=pOr
9950: 57 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Wc->a; i>=0; i--
9960: 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20  , pOrTerm++){.  
9970: 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65        if( (pOrTe
9980: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
9990: 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63  RM_OR_OK)==0 ) c
99a0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
99b0: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
99c0: 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
99d0: 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  EQ );.        as
99e0: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c  sert( pOrTerm->l
99f0: 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73  eftCursor==iCurs
9a00: 6f 72 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  or );.        as
9a10: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75  sert( pOrTerm->u
9a20: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f  .leftColumn==iCo
9a30: 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  lumn );.        
9a40: 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78  pDup = sqlite3Ex
9a50: 70 72 44 75 70 28 64 62 2c 20 70 4f 72 54 65 72  prDup(db, pOrTer
9a60: 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
9a70: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  , 0);.        pL
9a80: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
9a90: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 57 43 2d  rListAppend(pWC-
9aa0: 3e 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  >pParse, pList, 
9ab0: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 70  pDup);.        p
9ac0: 4c 65 66 74 20 3d 20 70 4f 72 54 65 72 6d 2d 3e  Left = pOrTerm->
9ad0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
9ae0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
9af0: 72 74 28 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a  rt( pLeft!=0 );.
9b00: 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c        pDup = sql
9b10: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
9b20: 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20  pLeft, 0);.     
9b30: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50   pNew = sqlite3P
9b40: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
9b50: 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20 30 29 3b  IN, pDup, 0, 0);
9b60: 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20  .      if( pNew 
9b70: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
9b80: 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 74  dxNew;.        t
9b90: 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69  ransferJoinMarki
9ba0: 6e 67 73 28 70 4e 65 77 2c 20 70 45 78 70 72 29  ngs(pNew, pExpr)
9bb0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
9bc0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
9bd0: 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73 53  ty(pNew, EP_xIsS
9be0: 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
9bf0: 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20    pNew->x.pList 
9c00: 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  = pList;.       
9c10: 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
9c20: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
9c30: 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56 49 52 54   pNew, TERM_VIRT
9c40: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
9c50: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
9c60: 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29  ase( idxNew==0 )
9c70: 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 41 6e  ;.        exprAn
9c80: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
9c90: 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20   idxNew);.      
9ca0: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
9cb0: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
9cc0: 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65      pWC->a[idxNe
9cd0: 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  w].iParent = idx
9ce0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54  Term;.        pT
9cf0: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
9d00: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9d10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
9d20: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
9d30: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  pList);.      }.
9d40: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70        pTerm->eOp
9d50: 65 72 61 74 6f 72 20 3d 20 30 3b 20 20 2f 2a 20  erator = 0;  /* 
9d60: 63 61 73 65 20 31 20 74 72 75 6d 70 73 20 63 61  case 1 trumps ca
9d70: 73 65 20 32 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  se 2 */.    }.  
9d80: 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53  }.}.#endif /* !S
9d90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
9da0: 54 49 4d 49 5a 41 54 49 4f 4e 20 26 26 20 21 53  TIMIZATION && !S
9db0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
9dc0: 45 52 59 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ERY */.../*.** T
9dd0: 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73  he input to this
9de0: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 57   routine is an W
9df0: 68 65 72 65 54 65 72 6d 20 73 74 72 75 63 74 75  hereTerm structu
9e00: 72 65 20 77 69 74 68 20 6f 6e 6c 79 20 74 68 65  re with only the
9e10: 0a 2a 2a 20 22 70 45 78 70 72 22 20 66 69 65 6c  .** "pExpr" fiel
9e20: 64 20 66 69 6c 6c 65 64 20 69 6e 2e 20 20 54 68  d filled in.  Th
9e30: 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f  e job of this ro
9e40: 75 74 69 6e 65 20 69 73 20 74 6f 20 61 6e 61 6c  utine is to anal
9e50: 79 7a 65 20 74 68 65 0a 2a 2a 20 73 75 62 65 78  yze the.** subex
9e60: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 6f 70  pression and pop
9e70: 75 6c 61 74 65 20 61 6c 6c 20 74 68 65 20 6f 74  ulate all the ot
9e80: 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 74 68  her fields of th
9e90: 65 20 57 68 65 72 65 54 65 72 6d 0a 2a 2a 20 73  e WhereTerm.** s
9ea0: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
9eb0: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
9ec0: 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  n is of the form
9ed0: 20 22 3c 65 78 70 72 3e 20 3c 6f 70 3e 20 58 22   "<expr> <op> X"
9ee0: 20 69 74 20 67 65 74 73 20 63 6f 6d 6d 75 74 65   it gets commute
9ef0: 64 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 6e  d.** to the stan
9f00: 64 61 72 64 20 66 6f 72 6d 20 6f 66 20 22 58 20  dard form of "X 
9f10: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 0a 2a 2a  <op> <expr>"..**
9f20: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
9f30: 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ssion is of the 
9f40: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20  form "X <op> Y" 
9f50: 77 68 65 72 65 20 62 6f 74 68 20 58 20 61 6e 64  where both X and
9f60: 20 59 20 61 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e   Y are.** column
9f70: 73 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67  s, then the orig
9f80: 69 6e 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 20  inal expression 
9f90: 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  is unchanged and
9fa0: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a   a new virtual.*
9fb0: 2a 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f  * term of the fo
9fc0: 72 6d 20 22 59 20 3c 6f 70 3e 20 58 22 20 69 73  rm "Y <op> X" is
9fd0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 57 48   added to the WH
9fe0: 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64 0a 2a  ERE clause and.*
9ff0: 2a 20 61 6e 61 6c 79 7a 65 64 20 73 65 70 61 72  * analyzed separ
a000: 61 74 65 6c 79 2e 20 20 54 68 65 20 6f 72 69 67  ately.  The orig
a010: 69 6e 61 6c 20 74 65 72 6d 20 69 73 20 6d 61 72  inal term is mar
a020: 6b 65 64 20 77 69 74 68 20 54 45 52 4d 5f 43 4f  ked with TERM_CO
a030: 50 49 45 44 0a 2a 2a 20 61 6e 64 20 74 68 65 20  PIED.** and the 
a040: 6e 65 77 20 74 65 72 6d 20 69 73 20 6d 61 72 6b  new term is mark
a050: 65 64 20 77 69 74 68 20 54 45 52 4d 5f 44 59 4e  ed with TERM_DYN
a060: 41 4d 49 43 20 28 62 65 63 61 75 73 65 20 69 74  AMIC (because it
a070: 27 73 20 70 45 78 70 72 0a 2a 2a 20 6e 65 65 64  's pExpr.** need
a080: 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 77 69  s to be freed wi
a090: 74 68 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  th the WhereClau
a0a0: 73 65 29 20 61 6e 64 20 54 45 52 4d 5f 56 49 52  se) and TERM_VIR
a0b0: 54 55 41 4c 20 28 62 65 63 61 75 73 65 20 69 74  TUAL (because it
a0c0: 0a 2a 2a 20 69 73 20 61 20 63 6f 6d 6d 75 74 65  .** is a commute
a0d0: 64 20 63 6f 70 79 20 6f 66 20 61 20 70 72 69 6f  d copy of a prio
a0e0: 72 20 74 65 72 6d 2e 29 20 20 54 68 65 20 6f 72  r term.)  The or
a0f0: 69 67 69 6e 61 6c 20 74 65 72 6d 20 68 61 73 20  iginal term has 
a100: 6e 43 68 69 6c 64 3d 31 0a 2a 2a 20 61 6e 64 20  nChild=1.** and 
a110: 74 68 65 20 63 6f 70 79 20 68 61 73 20 69 64 78  the copy has idx
a120: 50 61 72 65 6e 74 20 73 65 74 20 74 6f 20 74 68  Parent set to th
a130: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6f  e index of the o
a140: 72 69 67 69 6e 61 6c 20 74 65 72 6d 2e 0a 2a 2f  riginal term..*/
a150: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
a160: 72 41 6e 61 6c 79 7a 65 28 0a 20 20 53 72 63 4c  rAnalyze(.  SrcL
a170: 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20  ist *pSrc,      
a180: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
a190: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  M clause */.  Wh
a1a0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
a1b0: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57          /* the W
a1c0: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
a1d0: 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20   int idxTerm    
a1e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
a1f0: 64 65 78 20 6f 66 20 74 68 65 20 74 65 72 6d 20  dex of the term 
a200: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
a210: 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d  /.){.  WhereTerm
a220: 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
a230: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
a240: 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  erm to be analyz
a250: 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73  ed */.  WhereMas
a260: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20  kSet *pMaskSet; 
a270: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
a280: 6f 66 20 74 61 62 6c 65 20 69 6e 64 65 78 20 6d  of table index m
a290: 61 73 6b 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a  asks */.  Expr *
a2a0: 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  pExpr;          
a2b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
a2c0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  e expression to 
a2d0: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20  be analyzed */. 
a2e0: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 4c   Bitmask prereqL
a2f0: 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  eft;            
a300: 20 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74    /* Prerequesit
a310: 65 73 20 6f 66 20 74 68 65 20 70 45 78 70 72 2d  es of the pExpr-
a320: 3e 70 4c 65 66 74 20 2a 2f 0a 20 20 42 69 74 6d  >pLeft */.  Bitm
a330: 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20 20  ask prereqAll;  
a340: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a350: 50 72 65 72 65 71 75 65 73 69 74 65 73 20 6f 66  Prerequesites of
a360: 20 70 45 78 70 72 20 2a 2f 0a 20 20 42 69 74 6d   pExpr */.  Bitm
a370: 61 73 6b 20 65 78 74 72 61 52 69 67 68 74 20 3d  ask extraRight =
a380: 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
a390: 45 78 74 72 61 20 64 65 70 65 6e 64 65 6e 63 69  Extra dependenci
a3a0: 65 73 20 6f 6e 20 4c 45 46 54 20 4a 4f 49 4e 20  es on LEFT JOIN 
a3b0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 53 74 72 31  */.  Expr *pStr1
a3c0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
a3d0: 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20        /* RHS of 
a3e0: 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74  LIKE/GLOB operat
a3f0: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  or */.  int isCo
a400: 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20 20 20 20  mplete = 0;     
a410: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20           /* RHS 
a420: 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 65 6e 64  of LIKE/GLOB end
a430: 73 20 77 69 74 68 20 77 69 6c 64 63 61 72 64 20  s with wildcard 
a440: 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65 20  */.  int noCase 
a450: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
a460: 20 20 20 20 20 20 2f 2a 20 4c 49 4b 45 2f 47 4c        /* LIKE/GL
a470: 4f 42 20 64 69 73 74 69 6e 67 75 69 73 68 65 73  OB distinguishes
a480: 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f   case */.  int o
a490: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
a4a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a4b0: 6f 70 2d 6c 65 76 65 6c 20 6f 70 65 72 61 74 6f  op-level operato
a4c0: 72 2e 20 20 70 45 78 70 72 2d 3e 6f 70 20 2a 2f  r.  pExpr->op */
a4d0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
a4e0: 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 3b 20   = pWC->pParse; 
a4f0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
a500: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69  ontext */.  sqli
a510: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
a520: 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 2f 2a 20  ->db;        /* 
a530: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
a540: 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62  ion */..  if( db
a550: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
a560: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
a570: 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43  }.  pTerm = &pWC
a580: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
a590: 70 4d 61 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e  pMaskSet = pWC->
a5a0: 70 4d 61 73 6b 53 65 74 3b 0a 20 20 70 45 78 70  pMaskSet;.  pExp
a5b0: 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
a5c0: 3b 0a 20 20 70 72 65 72 65 71 4c 65 66 74 20 3d  ;.  prereqLeft =
a5d0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
a5e0: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
a5f0: 3e 70 4c 65 66 74 29 3b 0a 20 20 6f 70 20 3d 20  >pLeft);.  op = 
a600: 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28  pExpr->op;.  if(
a610: 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20   op==TK_IN ){.  
a620: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
a630: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
a640: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
a650: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
a660: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
a670: 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65      pTerm->prere
a680: 71 52 69 67 68 74 20 3d 20 65 78 70 72 53 65 6c  qRight = exprSel
a690: 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  ectTableUsage(pM
a6a0: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78  askSet, pExpr->x
a6b0: 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d  .pSelect);.    }
a6c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 65 72  else{.      pTer
a6d0: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
a6e0: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
a6f0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
a700: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  xpr->x.pList);. 
a710: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
a720: 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
a730: 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65  {.    pTerm->pre
a740: 72 65 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20  reqRight = 0;.  
a750: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d  }else{.    pTerm
a760: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
a770: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
a780: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
a790: 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70  pRight);.  }.  p
a7a0: 72 65 72 65 71 41 6c 6c 20 3d 20 65 78 70 72 54  rereqAll = exprT
a7b0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
a7c0: 65 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66  et, pExpr);.  if
a7d0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
a7e0: 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
a7f0: 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 42 69 74  Join) ){.    Bit
a800: 6d 61 73 6b 20 78 20 3d 20 67 65 74 4d 61 73 6b  mask x = getMask
a810: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
a820: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
a830: 65 29 3b 0a 20 20 20 20 70 72 65 72 65 71 41 6c  e);.    prereqAl
a840: 6c 20 7c 3d 20 78 3b 0a 20 20 20 20 65 78 74 72  l |= x;.    extr
a850: 61 52 69 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f  aRight = x-1;  /
a860: 2a 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d  * ON clause term
a870: 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65  s may not be use
a880: 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 0a  d with an index.
a890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8a0: 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 6c 65 66         ** on lef
a8b0: 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46  t table of a LEF
a8c0: 54 20 4a 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20  T JOIN.  Ticket 
a8d0: 23 33 30 31 35 20 2a 2f 0a 20 20 7d 0a 20 20 70  #3015 */.  }.  p
a8e0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
a8f0: 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70  = prereqAll;.  p
a900: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
a910: 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e   = -1;.  pTerm->
a920: 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20  iParent = -1;.  
a930: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
a940: 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f   = 0;.  if( allo
a950: 77 65 64 4f 70 28 6f 70 29 20 26 26 20 28 70 54  wedOp(op) && (pT
a960: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
a970: 20 26 20 70 72 65 72 65 71 4c 65 66 74 29 3d 3d   & prereqLeft)==
a980: 30 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  0 ){.    Expr *p
a990: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
a9a0: 65 66 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  eft;.    Expr *p
a9b0: 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70  Right = pExpr->p
a9c0: 52 69 67 68 74 3b 0a 20 20 20 20 69 66 28 20 70  Right;.    if( p
a9d0: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Left->op==TK_COL
a9e0: 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70 54 65  UMN ){.      pTe
a9f0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  rm->leftCursor =
aa00: 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a   pLeft->iTable;.
aa10: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 75 2e 6c        pTerm->u.l
aa20: 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66  eftColumn = pLef
aa30: 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
aa40: 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74    pTerm->eOperat
aa50: 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73  or = operatorMas
aa60: 6b 28 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  k(op);.    }.   
aa70: 20 69 66 28 20 70 52 69 67 68 74 20 26 26 20 70   if( pRight && p
aa80: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  Right->op==TK_CO
aa90: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 57 68  LUMN ){.      Wh
aaa0: 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 3b 0a 20  ereTerm *pNew;. 
aab0: 20 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b       Expr *pDup;
aac0: 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
aad0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3e 3d 30 20  ->leftCursor>=0 
aae0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
aaf0: 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70  dxNew;.        p
ab00: 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Dup = sqlite3Exp
ab10: 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20  rDup(db, pExpr, 
ab20: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
ab30: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
ab40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
ab50: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
ab60: 64 62 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20  db, pDup);.     
ab70: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
ab80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
ab90: 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61  dxNew = whereCla
aba0: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
abb0: 44 75 70 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  Dup, TERM_VIRTUA
abc0: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
abd0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 64 78  .        if( idx
abe0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  New==0 ) return;
abf0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
ac00: 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b  &pWC->a[idxNew];
ac10: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69  .        pNew->i
ac20: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
ac30: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20  ;.        pTerm 
ac40: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
ac50: 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  m];.        pTer
ac60: 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20  m->nChild = 1;. 
ac70: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74         pTerm->wt
ac80: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
ac90: 50 49 45 44 3b 0a 20 20 20 20 20 20 7d 65 6c 73  PIED;.      }els
aca0: 65 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  e{.        pDup 
acb0: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
acc0: 20 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20   pNew = pTerm;. 
acd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70       }.      exp
ace0: 72 43 6f 6d 6d 75 74 65 28 70 50 61 72 73 65 2c  rCommute(pParse,
acf0: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 70 4c   pDup);.      pL
ad00: 65 66 74 20 3d 20 70 44 75 70 2d 3e 70 4c 65 66  eft = pDup->pLef
ad10: 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c  t;.      pNew->l
ad20: 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66  eftCursor = pLef
ad30: 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  t->iTable;.     
ad40: 20 70 4e 65 77 2d 3e 75 2e 6c 65 66 74 43 6f 6c   pNew->u.leftCol
ad50: 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f  umn = pLeft->iCo
ad60: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 74 65 73 74  lumn;.      test
ad70: 63 61 73 65 28 20 28 70 72 65 72 65 71 4c 65 66  case( (prereqLef
ad80: 74 20 7c 20 65 78 74 72 61 52 69 67 68 74 29 20  t | extraRight) 
ad90: 21 3d 20 70 72 65 72 65 71 4c 65 66 74 20 29 3b  != prereqLeft );
ada0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  .      pNew->pre
adb0: 72 65 71 52 69 67 68 74 20 3d 20 70 72 65 72 65  reqRight = prere
adc0: 71 4c 65 66 74 20 7c 20 65 78 74 72 61 52 69 67  qLeft | extraRig
add0: 68 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ht;.      pNew->
ade0: 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72  prereqAll = prer
adf0: 65 71 41 6c 6c 3b 0a 20 20 20 20 20 20 70 4e 65  eqAll;.      pNe
ae00: 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f  w->eOperator = o
ae10: 70 65 72 61 74 6f 72 4d 61 73 6b 28 70 44 75 70  peratorMask(pDup
ae20: 2d 3e 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ->op);.    }.  }
ae30: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
ae40: 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50  _OMIT_BETWEEN_OP
ae50: 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20  TIMIZATION.  /* 
ae60: 49 66 20 61 20 74 65 72 6d 20 69 73 20 74 68 65  If a term is the
ae70: 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f   BETWEEN operato
ae80: 72 2c 20 63 72 65 61 74 65 20 74 77 6f 20 6e 65  r, create two ne
ae90: 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 0a  w virtual terms.
aea0: 20 20 2a 2a 20 74 68 61 74 20 64 65 66 69 6e 65    ** that define
aeb0: 20 74 68 65 20 72 61 6e 67 65 20 74 68 61 74 20   the range that 
aec0: 74 68 65 20 42 45 54 57 45 45 4e 20 69 6d 70 6c  the BETWEEN impl
aed0: 65 6d 65 6e 74 73 2e 20 20 46 6f 72 20 65 78 61  ements.  For exa
aee0: 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mple:.  **.  ** 
aef0: 20 20 20 20 20 61 20 42 45 54 57 45 45 4e 20 62       a BETWEEN b
af00: 20 41 4e 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a   AND c.  **.  **
af10: 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   is converted in
af20: 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
af30: 20 20 20 28 61 20 42 45 54 57 45 45 4e 20 62 20     (a BETWEEN b 
af40: 41 4e 44 20 63 29 20 41 4e 44 20 28 61 3e 3d 62  AND c) AND (a>=b
af50: 29 20 41 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a  ) AND (a<=c).  *
af60: 2a 0a 20 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e  *.  ** The two n
af70: 65 77 20 74 65 72 6d 73 20 61 72 65 20 61 64 64  ew terms are add
af80: 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  ed onto the end 
af90: 6f 66 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  of the WhereClau
afa0: 73 65 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20  se object..  ** 
afb0: 54 68 65 20 6e 65 77 20 74 65 72 6d 73 20 61 72  The new terms ar
afc0: 65 20 22 64 79 6e 61 6d 69 63 22 20 61 6e 64 20  e "dynamic" and 
afd0: 61 72 65 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  are children of 
afe0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 42 45 54  the original BET
aff0: 57 45 45 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20  WEEN.  ** term. 
b000: 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   That means that
b010: 20 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20   if the BETWEEN 
b020: 74 65 72 6d 20 69 73 20 63 6f 64 65 64 2c 20 74  term is coded, t
b030: 68 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65 0a  he children are.
b040: 20 20 2a 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f    ** skipped.  O
b050: 72 2c 20 69 66 20 74 68 65 20 63 68 69 6c 64 72  r, if the childr
b060: 65 6e 20 61 72 65 20 73 61 74 69 73 66 69 65 64  en are satisfied
b070: 20 62 79 20 61 6e 20 69 6e 64 65 78 2c 20 74 68   by an index, th
b080: 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  e original.  ** 
b090: 42 45 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20  BETWEEN term is 
b0a0: 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20  skipped..  */.  
b0b0: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
b0c0: 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26  op==TK_BETWEEN &
b0d0: 26 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e  & pWC->op==TK_AN
b0e0: 44 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  D ){.    ExprLis
b0f0: 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
b100: 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69  ->x.pList;.    i
b110: 6e 74 20 69 3b 0a 20 20 20 20 73 74 61 74 69 63  nt i;.    static
b120: 20 63 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20   const u8 ops[] 
b130: 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d  = {TK_GE, TK_LE}
b140: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
b150: 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  ist!=0 );.    as
b160: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
b170: 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72  pr==2 );.    for
b180: 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b  (i=0; i<2; i++){
b190: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
b1a0: 77 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74  wExpr;.      int
b1b0: 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 70   idxNew;.      p
b1c0: 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
b1d0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 6f  3PExpr(pParse, o
b1e0: 70 73 5b 69 5d 2c 20 0a 20 20 20 20 20 20 20 20  ps[i], .        
b1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b200: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
b210: 44 75 70 28 64 62 2c 20 70 45 78 70 72 2d 3e 70  Dup(db, pExpr->p
b220: 4c 65 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20  Left, 0),.      
b230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b240: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
b250: 70 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d  prDup(db, pList-
b260: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29 2c  >a[i].pExpr, 0),
b270: 20 30 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65   0);.      idxNe
b280: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
b290: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45  nsert(pWC, pNewE
b2a0: 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  xpr, TERM_VIRTUA
b2b0: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
b2c0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
b2d0: 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20   idxNew==0 );.  
b2e0: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
b2f0: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65  pSrc, pWC, idxNe
b300: 77 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  w);.      pTerm 
b310: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
b320: 6d 5d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61  m];.      pWC->a
b330: 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74  [idxNew].iParent
b340: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
b350: 7d 0a 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68  }.    pTerm->nCh
b360: 69 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e  ild = 2;.  }.#en
b370: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
b380: 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d  IT_BETWEEN_OPTIM
b390: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20  IZATION */..#if 
b3a0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
b3b0: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
b3c0: 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65  TION) && !define
b3d0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
b3e0: 42 51 55 45 52 59 29 0a 20 20 2f 2a 20 41 6e 61  BQUERY).  /* Ana
b3f0: 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74  lyze a term that
b400: 20 69 73 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20   is composed of 
b410: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74  two or more subt
b420: 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  erms connected b
b430: 79 0a 20 20 2a 2a 20 61 6e 20 4f 52 20 6f 70 65  y.  ** an OR ope
b440: 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c  rator..  */.  el
b450: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  se if( pExpr->op
b460: 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 61  ==TK_OR ){.    a
b470: 73 73 65 72 74 28 20 70 57 43 2d 3e 6f 70 3d 3d  ssert( pWC->op==
b480: 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 65 78  TK_AND );.    ex
b490: 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28  prAnalyzeOrTerm(
b4a0: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 54 65  pSrc, pWC, idxTe
b4b0: 72 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  rm);.    pTerm =
b4c0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
b4d0: 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  ];.  }.#endif /*
b4e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f   SQLITE_OMIT_OR_
b4f0: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
b500: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b510: 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49  OMIT_LIKE_OPTIMI
b520: 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20  ZATION.  /* Add 
b530: 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 72  constraints to r
b540: 65 64 75 63 65 20 74 68 65 20 73 65 61 72 63 68  educe the search
b550: 20 73 70 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45   space on a LIKE
b560: 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70   or GLOB.  ** op
b570: 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a  erator..  **.  *
b580: 2a 20 41 20 6c 69 6b 65 20 70 61 74 74 65 72 6e  * A like pattern
b590: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20   of the form "x 
b5a0: 4c 49 4b 45 20 27 61 62 63 25 27 22 20 69 73 20  LIKE 'abc%'" is 
b5b0: 63 68 61 6e 67 65 64 20 69 6e 74 6f 20 63 6f 6e  changed into con
b5c0: 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 0a 20 20  straints.  **.  
b5d0: 2a 2a 20 20 20 20 20 20 20 20 20 20 78 3e 3d 27  **          x>='
b5e0: 61 62 63 27 20 41 4e 44 20 78 3c 27 61 62 64 27  abc' AND x<'abd'
b5f0: 20 41 4e 44 20 78 20 4c 49 4b 45 20 27 61 62 63   AND x LIKE 'abc
b600: 25 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  %'.  **.  ** The
b610: 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20   last character 
b620: 6f 66 20 74 68 65 20 70 72 65 66 69 78 20 22 61  of the prefix "a
b630: 62 63 22 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  bc" is increment
b640: 65 64 20 74 6f 20 66 6f 72 6d 20 74 68 65 0a 20  ed to form the. 
b650: 20 2a 2a 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20   ** termination 
b660: 63 6f 6e 64 69 74 69 6f 6e 20 22 61 62 64 22 2e  condition "abd".
b670: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d  .  */.  if( pWC-
b680: 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 0a 20 20 20  >op==TK_AND .   
b690: 26 26 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28  && isLikeOrGlob(
b6a0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
b6b0: 70 53 74 72 31 2c 20 26 69 73 43 6f 6d 70 6c 65  pStr1, &isComple
b6c0: 74 65 2c 20 26 6e 6f 43 61 73 65 29 0a 20 20 29  te, &noCase).  )
b6d0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66  {.    Expr *pLef
b6e0: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20  t;       /* LHS 
b6f0: 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65  of LIKE/GLOB ope
b700: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70  rator */.    Exp
b710: 72 20 2a 70 53 74 72 32 3b 20 20 20 20 20 20 20  r *pStr2;       
b720: 2f 2a 20 43 6f 70 79 20 6f 66 20 70 53 74 72 31  /* Copy of pStr1
b730: 20 2d 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47   - RHS of LIKE/G
b740: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  LOB operator */.
b750: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
b760: 70 72 31 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  pr1;.    Expr *p
b770: 4e 65 77 45 78 70 72 32 3b 0a 20 20 20 20 69 6e  NewExpr2;.    in
b780: 74 20 69 64 78 4e 65 77 31 3b 0a 20 20 20 20 69  t idxNew1;.    i
b790: 6e 74 20 69 64 78 4e 65 77 32 3b 0a 20 20 20 20  nt idxNew2;.    
b7a0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
b7b0: 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20     /* Collating 
b7c0: 73 65 71 75 65 6e 63 65 20 74 6f 20 75 73 65 20  sequence to use 
b7d0: 2a 2f 0a 0a 20 20 20 20 70 4c 65 66 74 20 3d 20  */..    pLeft = 
b7e0: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
b7f0: 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[1].pExpr;.    
b800: 70 53 74 72 32 20 3d 20 73 71 6c 69 74 65 33 45  pStr2 = sqlite3E
b810: 78 70 72 44 75 70 28 64 62 2c 20 70 53 74 72 31  xprDup(db, pStr1
b820: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21 64  , 0);.    if( !d
b830: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
b840: 29 7b 0a 20 20 20 20 20 20 75 38 20 63 2c 20 2a  ){.      u8 c, *
b850: 70 43 3b 20 20 20 20 20 20 20 2f 2a 20 4c 61 73  pC;       /* Las
b860: 74 20 63 68 61 72 61 63 74 65 72 20 62 65 66 6f  t character befo
b870: 72 65 20 74 68 65 20 66 69 72 73 74 20 77 69 6c  re the first wil
b880: 64 63 61 72 64 20 2a 2f 0a 20 20 20 20 20 20 70  dcard */.      p
b890: 43 20 3d 20 28 75 38 2a 29 26 70 53 74 72 32 2d  C = (u8*)&pStr2-
b8a0: 3e 75 2e 7a 54 6f 6b 65 6e 5b 73 71 6c 69 74 65  >u.zToken[sqlite
b8b0: 33 53 74 72 6c 65 6e 33 30 28 70 53 74 72 32 2d  3Strlen30(pStr2-
b8c0: 3e 75 2e 7a 54 6f 6b 65 6e 29 2d 31 5d 3b 0a 20  >u.zToken)-1];. 
b8d0: 20 20 20 20 20 63 20 3d 20 2a 70 43 3b 0a 20 20       c = *pC;.  
b8e0: 20 20 20 20 69 66 28 20 6e 6f 43 61 73 65 20 29      if( noCase )
b8f0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
b900: 20 70 6f 69 6e 74 20 69 73 20 74 6f 20 69 6e 63   point is to inc
b910: 72 65 6d 65 6e 74 20 74 68 65 20 6c 61 73 74 20  rement the last 
b920: 63 68 61 72 61 63 74 65 72 20 62 65 66 6f 72 65  character before
b930: 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20   the first.     
b940: 20 20 20 2a 2a 20 77 69 6c 64 63 61 72 64 2e 20     ** wildcard. 
b950: 20 42 75 74 20 69 66 20 77 65 20 69 6e 63 72 65   But if we incre
b960: 6d 65 6e 74 20 27 40 27 2c 20 74 68 61 74 20 77  ment '@', that w
b970: 69 6c 6c 20 70 75 73 68 20 69 74 20 69 6e 74 6f  ill push it into
b980: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
b990: 61 6c 70 68 61 62 65 74 69 63 20 72 61 6e 67 65  alphabetic range
b9a0: 20 77 68 65 72 65 20 63 61 73 65 20 63 6f 6e 76   where case conv
b9b0: 65 72 73 69 6f 6e 73 20 77 69 6c 6c 20 6d 65 73  ersions will mes
b9c0: 73 20 75 70 20 74 68 65 20 0a 20 20 20 20 20 20  s up the .      
b9d0: 20 20 2a 2a 20 69 6e 65 71 75 61 6c 69 74 79 2e    ** inequality.
b9e0: 20 20 54 6f 20 61 76 6f 69 64 20 74 68 69 73 2c    To avoid this,
b9f0: 20 6d 61 6b 65 20 73 75 72 65 20 74 6f 20 61 6c   make sure to al
ba00: 73 6f 20 72 75 6e 20 74 68 65 20 66 75 6c 6c 0a  so run the full.
ba10: 20 20 20 20 20 20 20 20 2a 2a 20 4c 49 4b 45 20          ** LIKE 
ba20: 6f 6e 20 61 6c 6c 20 63 61 6e 64 69 64 61 74 65  on all candidate
ba30: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 62 79 20   expressions by 
ba40: 63 6c 65 61 72 69 6e 67 20 74 68 65 20 69 73 43  clearing the isC
ba50: 6f 6d 70 6c 65 74 65 20 66 6c 61 67 0a 20 20 20  omplete flag.   
ba60: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
ba70: 69 66 28 20 63 3d 3d 27 41 27 2d 31 20 29 20 69  if( c=='A'-1 ) i
ba80: 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20  sComplete = 0;  
ba90: 20 2f 2a 20 45 56 3a 20 52 2d 36 34 33 33 39 2d   /* EV: R-64339-
baa0: 30 38 32 30 37 20 2a 2f 0a 0a 0a 20 20 20 20 20  08207 */...     
bab0: 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55 70     c = sqlite3Up
bac0: 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20  perToLower[c];. 
bad0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 43       }.      *pC
bae0: 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d 0a   = c + 1;.    }.
baf0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
bb00: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
bb10: 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  b, SQLITE_UTF8, 
bb20: 6e 6f 43 61 73 65 20 3f 20 22 4e 4f 43 41 53 45  noCase ? "NOCASE
bb30: 22 20 3a 20 22 42 49 4e 41 52 59 22 2c 30 29 3b  " : "BINARY",0);
bb40: 0a 20 20 20 20 70 4e 65 77 45 78 70 72 31 20 3d  .    pNewExpr1 =
bb50: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
bb60: 61 72 73 65 2c 20 54 4b 5f 47 45 2c 20 0a 20 20  arse, TK_GE, .  
bb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb80: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 65     sqlite3ExprSe
bb90: 74 43 6f 6c 6c 28 73 71 6c 69 74 65 33 45 78 70  tColl(sqlite3Exp
bba0: 72 44 75 70 28 64 62 2c 70 4c 65 66 74 2c 30 29  rDup(db,pLeft,0)
bbb0: 2c 20 70 43 6f 6c 6c 29 2c 0a 20 20 20 20 20 20  , pColl),.      
bbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
bbd0: 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 69 64  Str1, 0);.    id
bbe0: 78 4e 65 77 31 20 3d 20 77 68 65 72 65 43 6c 61  xNew1 = whereCla
bbf0: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
bc00: 4e 65 77 45 78 70 72 31 2c 20 54 45 52 4d 5f 56  NewExpr1, TERM_V
bc10: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
bc20: 4d 49 43 29 3b 0a 20 20 20 20 74 65 73 74 63 61  MIC);.    testca
bc30: 73 65 28 20 69 64 78 4e 65 77 31 3d 3d 30 20 29  se( idxNew1==0 )
bc40: 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  ;.    exprAnalyz
bc50: 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78  e(pSrc, pWC, idx
bc60: 4e 65 77 31 29 3b 0a 20 20 20 20 70 4e 65 77 45  New1);.    pNewE
bc70: 78 70 72 32 20 3d 20 73 71 6c 69 74 65 33 50 45  xpr2 = sqlite3PE
bc80: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c  xpr(pParse, TK_L
bc90: 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  T,.             
bca0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
bcb0: 78 70 72 53 65 74 43 6f 6c 6c 28 73 71 6c 69 74  xprSetColl(sqlit
bcc0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 70 4c 65  e3ExprDup(db,pLe
bcd0: 66 74 2c 30 29 2c 20 70 43 6f 6c 6c 29 2c 0a 20  ft,0), pColl),. 
bce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcf0: 20 20 20 20 70 53 74 72 32 2c 20 30 29 3b 0a 20      pStr2, 0);. 
bd00: 20 20 20 69 64 78 4e 65 77 32 20 3d 20 77 68 65     idxNew2 = whe
bd10: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
bd20: 57 43 2c 20 70 4e 65 77 45 78 70 72 32 2c 20 54  WC, pNewExpr2, T
bd30: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
bd40: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74  _DYNAMIC);.    t
bd50: 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 32  estcase( idxNew2
bd60: 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41  ==0 );.    exprA
bd70: 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43  nalyze(pSrc, pWC
bd80: 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20 20 20 20  , idxNew2);.    
bd90: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
bda0: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66  idxTerm];.    if
bdb0: 28 20 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a  ( isComplete ){.
bdc0: 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78        pWC->a[idx
bdd0: 4e 65 77 31 5d 2e 69 50 61 72 65 6e 74 20 3d 20  New1].iParent = 
bde0: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  idxTerm;.      p
bdf0: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 32 5d 2e 69  WC->a[idxNew2].i
be00: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
be10: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e  ;.      pTerm->n
be20: 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20 7d  Child = 2;.    }
be30: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
be40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f  QLITE_OMIT_LIKE_
be50: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
be60: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
be70: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
be80: 45 0a 20 20 2f 2a 20 41 64 64 20 61 20 57 4f 5f  E.  /* Add a WO_
be90: 4d 41 54 43 48 20 61 75 78 69 6c 69 61 72 79 20  MATCH auxiliary 
bea0: 74 65 72 6d 20 74 6f 20 74 68 65 20 63 6f 6e 73  term to the cons
beb0: 74 72 61 69 6e 74 20 73 65 74 20 69 66 20 74 68  traint set if th
bec0: 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 65  e.  ** current e
bed0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20  xpression is of 
bee0: 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d  the form:  colum
bef0: 6e 20 4d 41 54 43 48 20 65 78 70 72 2e 0a 20 20  n MATCH expr..  
bf00: 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  ** This informat
bf10: 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 74  ion is used by t
bf20: 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65  he xBestIndex me
bf30: 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a 20 76 69  thods of.  ** vi
bf40: 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 20 20 54  rtual tables.  T
bf50: 68 65 20 6e 61 74 69 76 65 20 71 75 65 72 79 20  he native query 
bf60: 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65 73 20 6e  optimizer does n
bf70: 6f 74 20 61 74 74 65 6d 70 74 0a 20 20 2a 2a 20  ot attempt.  ** 
bf80: 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 77  to do anything w
bf90: 69 74 68 20 4d 41 54 43 48 20 66 75 6e 63 74 69  ith MATCH functi
bfa0: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
bfb0: 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28  isMatchOfColumn(
bfc0: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 69 6e  pExpr) ){.    in
bfd0: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 45 78  t idxNew;.    Ex
bfe0: 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65  pr *pRight, *pLe
bff0: 66 74 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72  ft;.    WhereTer
c000: 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 20 20 20  m *pNewTerm;.   
c010: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 43   Bitmask prereqC
c020: 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71 45 78 70  olumn, prereqExp
c030: 72 3b 0a 0a 20 20 20 20 70 52 69 67 68 74 20 3d  r;..    pRight =
c040: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
c050: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
c060: 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e   pLeft = pExpr->
c070: 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  x.pList->a[1].pE
c080: 78 70 72 3b 0a 20 20 20 20 70 72 65 72 65 71 45  xpr;.    prereqE
c090: 78 70 72 20 3d 20 65 78 70 72 54 61 62 6c 65 55  xpr = exprTableU
c0a0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
c0b0: 52 69 67 68 74 29 3b 0a 20 20 20 20 70 72 65 72  Right);.    prer
c0c0: 65 71 43 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 54  eqColumn = exprT
c0d0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
c0e0: 65 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20  et, pLeft);.    
c0f0: 69 66 28 20 28 70 72 65 72 65 71 45 78 70 72 20  if( (prereqExpr 
c100: 26 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 29 3d  & prereqColumn)=
c110: 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  =0 ){.      Expr
c120: 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20   *pNewExpr;.    
c130: 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c    pNewExpr = sql
c140: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
c150: 2c 20 54 4b 5f 4d 41 54 43 48 2c 20 0a 20 20 20  , TK_MATCH, .   
c160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c170: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 73 71             0, sq
c180: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
c190: 20 70 52 69 67 68 74 2c 20 30 29 2c 20 30 29 3b   pRight, 0), 0);
c1a0: 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20  .      idxNew = 
c1b0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
c1c0: 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c  t(pWC, pNewExpr,
c1d0: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
c1e0: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
c1f0: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78     testcase( idx
c200: 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  New==0 );.      
c210: 70 4e 65 77 54 65 72 6d 20 3d 20 26 70 57 43 2d  pNewTerm = &pWC-
c220: 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20  >a[idxNew];.    
c230: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72    pNewTerm->prer
c240: 65 71 52 69 67 68 74 20 3d 20 70 72 65 72 65 71  eqRight = prereq
c250: 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77  Expr;.      pNew
c260: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
c270: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
c280: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
c290: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d  ->u.leftColumn =
c2a0: 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b   pLeft->iColumn;
c2b0: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
c2c0: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f  >eOperator = WO_
c2d0: 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 70 4e 65  MATCH;.      pNe
c2e0: 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d  wTerm->iParent =
c2f0: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20   idxTerm;.      
c300: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
c310: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  idxTerm];.      
c320: 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20  pTerm->nChild = 
c330: 31 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  1;.      pTerm->
c340: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
c350: 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e  COPIED;.      pN
c360: 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  ewTerm->prereqAl
c370: 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  l = pTerm->prere
c380: 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  qAll;.    }.  }.
c390: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
c3a0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
c3b0: 4c 45 20 2a 2f 0a 0a 20 20 2f 2a 20 50 72 65 76  LE */..  /* Prev
c3c0: 65 6e 74 20 4f 4e 20 63 6c 61 75 73 65 20 74 65  ent ON clause te
c3d0: 72 6d 73 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  rms of a LEFT JO
c3e0: 49 4e 20 66 72 6f 6d 20 62 65 69 6e 67 20 75 73  IN from being us
c3f0: 65 64 20 74 6f 20 64 72 69 76 65 0a 20 20 2a 2a  ed to drive.  **
c400: 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 74 61   an index for ta
c410: 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74  bles to the left
c420: 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20   of the join..  
c430: 2a 2f 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72  */.  pTerm->prer
c440: 65 71 52 69 67 68 74 20 7c 3d 20 65 78 74 72 61  eqRight |= extra
c450: 52 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Right;.}../*.** 
c460: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61  Return TRUE if a
c470: 6e 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ny of the expres
c480: 73 69 6f 6e 73 20 69 6e 20 70 4c 69 73 74 2d 3e  sions in pList->
c490: 61 5b 69 46 69 72 73 74 2e 2e 2e 5d 20 63 6f 6e  a[iFirst...] con
c4a0: 74 61 69 6e 0a 2a 2a 20 61 20 72 65 66 65 72 65  tain.** a refere
c4b0: 6e 63 65 20 74 6f 20 61 6e 79 20 74 61 62 6c 65  nce to any table
c4c0: 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20   other than the 
c4d0: 69 42 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a  iBase table..*/.
c4e0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 66 65 72  static int refer
c4f0: 65 6e 63 65 73 4f 74 68 65 72 54 61 62 6c 65 73  encesOtherTables
c500: 28 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  (.  ExprList *pL
c510: 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ist,          /*
c520: 20 53 65 61 72 63 68 20 65 78 70 72 65 73 73 69   Search expressi
c530: 6f 6e 73 20 69 6e 20 74 68 73 20 6c 69 73 74 20  ons in ths list 
c540: 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
c550: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 20 20 2f  t *pMaskSet,   /
c560: 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74  * Mapping from t
c570: 61 62 6c 65 73 20 74 6f 20 62 69 74 6d 61 70 73  ables to bitmaps
c580: 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74   */.  int iFirst
c590: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c5a0: 2f 2a 20 42 65 20 73 65 61 72 63 68 69 6e 67 20  /* Be searching 
c5b0: 77 69 74 68 20 74 68 65 20 69 46 69 72 73 74 2d  with the iFirst-
c5c0: 74 68 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  th expression */
c5d0: 0a 20 20 69 6e 74 20 69 42 61 73 65 20 20 20 20  .  int iBase    
c5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c5f0: 49 67 6e 6f 72 65 20 72 65 66 65 72 65 6e 63 65  Ignore reference
c600: 73 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  s to this table 
c610: 2a 2f 0a 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20  */.){.  Bitmask 
c620: 61 6c 6c 6f 77 65 64 20 3d 20 7e 67 65 74 4d 61  allowed = ~getMa
c630: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 69 42 61  sk(pMaskSet, iBa
c640: 73 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 46  se);.  while( iF
c650: 69 72 73 74 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  irst<pList->nExp
c660: 72 20 29 7b 0a 20 20 20 20 69 66 28 20 28 65 78  r ){.    if( (ex
c670: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
c680: 73 6b 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b  skSet, pList->a[
c690: 69 46 69 72 73 74 2b 2b 5d 2e 70 45 78 70 72 29  iFirst++].pExpr)
c6a0: 26 61 6c 6c 6f 77 65 64 29 21 3d 30 20 29 7b 0a  &allowed)!=0 ){.
c6b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
c6c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
c6d0: 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn 0;.}.../*.** 
c6e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 65 63  This routine dec
c6f0: 69 64 65 73 20 69 66 20 70 49 64 78 20 63 61 6e  ides if pIdx can
c700: 20 62 65 20 75 73 65 64 20 74 6f 20 73 61 74 69   be used to sati
c710: 73 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59  sfy the ORDER BY
c720: 0a 2a 2a 20 63 6c 61 75 73 65 2e 20 20 49 66 20  .** clause.  If 
c730: 69 74 20 63 61 6e 2c 20 69 74 20 72 65 74 75 72  it can, it retur
c740: 6e 73 20 31 2e 20 20 49 66 20 70 49 64 78 20 63  ns 1.  If pIdx c
c750: 61 6e 6e 6f 74 20 73 61 74 69 73 66 79 20 74 68  annot satisfy th
c760: 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c  e.** ORDER BY cl
c770: 61 75 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69  ause, this routi
c780: 6e 65 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a  ne returns 0..**
c790: 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20  .** pOrderBy is 
c7a0: 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
c7b0: 73 65 20 66 72 6f 6d 20 61 20 53 45 4c 45 43 54  se from a SELECT
c7c0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 70 54 61   statement.  pTa
c7d0: 62 20 69 73 20 74 68 65 0a 2a 2a 20 6c 65 66 74  b is the.** left
c7e0: 2d 6d 6f 73 74 20 74 61 62 6c 65 20 69 6e 20 74  -most table in t
c7f0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
c800: 66 20 74 68 61 74 20 73 61 6d 65 20 53 45 4c 45  f that same SELE
c810: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64  CT statement and
c820: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 68 61  .** the table ha
c830: 73 20 61 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  s a cursor numbe
c840: 72 20 6f 66 20 22 62 61 73 65 22 2e 20 20 70 49  r of "base".  pI
c850: 64 78 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f  dx is an index o
c860: 6e 20 70 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 6e 45  n pTab..**.** nE
c870: 71 43 6f 6c 20 69 73 20 74 68 65 20 6e 75 6d 62  qCol is the numb
c880: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66  er of columns of
c890: 20 70 49 64 78 20 74 68 61 74 20 61 72 65 20 75   pIdx that are u
c8a0: 73 65 64 20 61 73 20 65 71 75 61 6c 69 74 79 0a  sed as equality.
c8b0: 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20  ** constraints. 
c8c0: 20 41 6e 79 20 6f 66 20 74 68 65 73 65 20 63 6f   Any of these co
c8d0: 6c 75 6d 6e 73 20 6d 61 79 20 62 65 20 6d 69 73  lumns may be mis
c8e0: 73 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 4f 52  sing from the OR
c8f0: 44 45 52 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65  DER BY.** clause
c900: 20 61 6e 64 20 74 68 65 20 6d 61 74 63 68 20 63   and the match c
c910: 61 6e 20 73 74 69 6c 6c 20 62 65 20 61 20 73 75  an still be a su
c920: 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  ccess..**.** All
c930: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
c940: 44 45 52 20 42 59 20 74 68 61 74 20 6d 61 74 63  DER BY that matc
c950: 68 20 61 67 61 69 6e 73 74 20 74 68 65 20 69 6e  h against the in
c960: 64 65 78 20 6d 75 73 74 20 62 65 20 65 69 74 68  dex must be eith
c970: 65 72 0a 2a 2a 20 41 53 43 20 6f 72 20 44 45 53  er.** ASC or DES
c980: 43 2e 20 20 28 54 65 72 6d 73 20 6f 66 20 74 68  C.  (Terms of th
c990: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
c9a0: 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
c9b0: 66 20 61 20 55 4e 49 51 55 45 0a 2a 2a 20 69 6e  f a UNIQUE.** in
c9c0: 64 65 78 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20  dex do not need 
c9d0: 74 6f 20 73 61 74 69 73 66 79 20 74 68 69 73 20  to satisfy this 
c9e0: 63 6f 6e 73 74 72 61 69 6e 74 2e 29 20 20 54 68  constraint.)  Th
c9f0: 65 20 2a 70 62 52 65 76 20 76 61 6c 75 65 20 69  e *pbRev value i
ca00: 73 0a 2a 2a 20 73 65 74 20 74 6f 20 31 20 69 66  s.** set to 1 if
ca10: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
ca20: 61 75 73 65 20 69 73 20 61 6c 6c 20 44 45 53 43  ause is all DESC
ca30: 20 61 6e 64 20 69 74 20 69 73 20 73 65 74 20 74   and it is set t
ca40: 6f 20 30 20 69 66 0a 2a 2a 20 74 68 65 20 4f 52  o 0 if.** the OR
ca50: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 73  DER BY clause is
ca60: 20 61 6c 6c 20 41 53 43 2e 0a 2a 2f 0a 73 74 61   all ASC..*/.sta
ca70: 74 69 63 20 69 6e 74 20 69 73 53 6f 72 74 69 6e  tic int isSortin
ca80: 67 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  gIndex(.  Parse 
ca90: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
caa0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
cab0: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d  text */.  WhereM
cac0: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
cad0: 2c 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f  , /* Mapping fro
cae0: 6d 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 6e  m table cursor n
caf0: 75 6d 62 65 72 73 20 74 6f 20 62 69 74 6d 61 70  umbers to bitmap
cb00: 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  s */.  Index *pI
cb10: 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  dx,            /
cb20: 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65 20 61  * The index we a
cb30: 72 65 20 74 65 73 74 69 6e 67 20 2a 2f 0a 20 20  re testing */.  
cb40: 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20 20  int base,       
cb50: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
cb60: 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
cb70: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 73 6f 72   table to be sor
cb80: 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ted */.  ExprLis
cb90: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
cba0: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
cbb0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
cbc0: 20 6e 45 71 43 6f 6c 2c 20 20 20 20 20 20 20 20   nEqCol,        
cbd0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
cbe0: 66 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  f index columns 
cbf0: 77 69 74 68 20 3d 3d 20 63 6f 6e 73 74 72 61 69  with == constrai
cc00: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62  nts */.  int *pb
cc10: 52 65 76 20 20 20 20 20 20 20 20 20 20 20 20 20  Rev             
cc20: 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 69 66 20   /* Set to 1 if 
cc30: 4f 52 44 45 52 20 42 59 20 69 73 20 44 45 53 43  ORDER BY is DESC
cc40: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
cc50: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
cc60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
cc70: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
cc80: 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 30  nt sortOrder = 0
cc90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
cca0: 2a 20 58 4f 52 20 6f 66 20 69 6e 64 65 78 20 61  * XOR of index a
ccb0: 6e 64 20 4f 52 44 45 52 20 42 59 20 73 6f 72 74  nd ORDER BY sort
ccc0: 20 64 69 72 65 63 74 69 6f 6e 20 2a 2f 0a 20 20   direction */.  
ccd0: 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20  int nTerm;      
cce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccf0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44  /* Number of ORD
cd00: 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20  ER BY terms */. 
cd10: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
cd20: 5f 69 74 65 6d 20 2a 70 54 65 72 6d 3b 20 20 20  _item *pTerm;   
cd30: 20 2f 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68   /* A term of th
cd40: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
cd50: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
cd60: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
cd70: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ..  assert( pOrd
cd80: 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 6e 54 65  erBy!=0 );.  nTe
cd90: 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  rm = pOrderBy->n
cda0: 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20  Expr;.  assert( 
cdb0: 6e 54 65 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f 2a  nTerm>0 );..  /*
cdc0: 20 41 72 67 75 6d 65 6e 74 20 70 49 64 78 20 6d   Argument pIdx m
cdd0: 75 73 74 20 65 69 74 68 65 72 20 70 6f 69 6e 74  ust either point
cde0: 20 74 6f 20 61 20 27 72 65 61 6c 27 20 6e 61 6d   to a 'real' nam
cdf0: 65 64 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  ed index structu
ce00: 72 65 2c 20 0a 20 20 2a 2a 20 6f 72 20 61 6e 20  re, .  ** or an 
ce10: 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  index structure 
ce20: 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65  allocated on the
ce30: 20 73 74 61 63 6b 20 62 79 20 62 65 73 74 42 74   stack by bestBt
ce40: 72 65 65 49 6e 64 65 78 28 29 20 74 6f 0a 20 20  reeIndex() to.  
ce50: 2a 2a 20 72 65 70 72 65 73 65 6e 74 20 74 68 65  ** represent the
ce60: 20 72 6f 77 69 64 20 69 6e 64 65 78 20 74 68 61   rowid index tha
ce70: 74 20 69 73 20 70 61 72 74 20 6f 66 20 65 76 65  t is part of eve
ce80: 72 79 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ry table.  */.  
ce90: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 7a 4e  assert( pIdx->zN
cea0: 61 6d 65 20 7c 7c 20 28 70 49 64 78 2d 3e 6e 43  ame || (pIdx->nC
ceb0: 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20 70 49 64 78  olumn==1 && pIdx
cec0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 2d  ->aiColumn[0]==-
ced0: 31 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 74 63  1) );..  /* Matc
cee0: 68 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f  h terms of the O
cef0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
cf00: 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 6f  gainst columns o
cf10: 66 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78  f.  ** the index
cf20: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65  ..  **.  ** Note
cf30: 20 74 68 61 74 20 69 6e 64 69 63 65 73 20 68 61   that indices ha
cf40: 76 65 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  ve pIdx->nColumn
cf50: 20 72 65 67 75 6c 61 72 20 63 6f 6c 75 6d 6e 73   regular columns
cf60: 20 70 6c 75 73 0a 20 20 2a 2a 20 6f 6e 65 20 61   plus.  ** one a
cf70: 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
cf80: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
cf90: 72 6f 77 69 64 2e 20 20 54 68 65 20 72 6f 77 69  rowid.  The rowi
cfa0: 64 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 66  d column.  ** of
cfb0: 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 61 6c   the index is al
cfc0: 73 6f 20 61 6c 6c 6f 77 65 64 20 74 6f 20 6d 61  so allowed to ma
cfd0: 74 63 68 20 61 67 61 69 6e 73 74 20 74 68 65 20  tch against the 
cfe0: 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20 63 6c  ORDER BY.  ** cl
cff0: 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ause..  */.  for
d000: 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 4f  (i=j=0, pTerm=pO
d010: 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 54 65  rderBy->a; j<nTe
d020: 72 6d 20 26 26 20 69 3c 3d 70 49 64 78 2d 3e 6e  rm && i<=pIdx->n
d030: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
d040: 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20    Expr *pExpr;  
d050: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
d060: 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 4f 52  ession of the OR
d070: 44 45 52 20 42 59 20 70 54 65 72 6d 20 2a 2f 0a  DER BY pTerm */.
d080: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
d090: 6c 6c 3b 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ll;    /* The co
d0a0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
d0b0: 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 20   of pExpr */.   
d0c0: 20 69 6e 74 20 74 65 72 6d 53 6f 72 74 4f 72 64   int termSortOrd
d0d0: 65 72 3b 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65  er; /* Sort orde
d0e0: 72 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d 20  r for this term 
d0f0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75  */.    int iColu
d100: 6d 6e 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  mn;       /* The
d110: 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20   i-th column of 
d120: 74 68 65 20 69 6e 64 65 78 2e 20 20 2d 31 20 66  the index.  -1 f
d130: 6f 72 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20  or rowid */.    
d140: 69 6e 74 20 69 53 6f 72 74 4f 72 64 65 72 3b 20  int iSortOrder; 
d150: 20 20 20 2f 2a 20 31 20 66 6f 72 20 44 45 53 43     /* 1 for DESC
d160: 2c 20 30 20 66 6f 72 20 41 53 43 20 6f 6e 20 74  , 0 for ASC on t
d170: 68 65 20 69 2d 74 68 20 69 6e 64 65 78 20 74 65  he i-th index te
d180: 72 6d 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  rm */.    const 
d190: 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 2f 2a 20  char *zColl; /* 
d1a0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 6c  Name of the coll
d1b0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
d1c0: 6f 72 20 69 2d 74 68 20 69 6e 64 65 78 20 74 65  or i-th index te
d1d0: 72 6d 20 2a 2f 0a 0a 20 20 20 20 70 45 78 70 72  rm */..    pExpr
d1e0: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
d1f0: 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
d200: 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op!=TK_COLUMN ||
d210: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d   pExpr->iTable!=
d220: 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  base ){.      /*
d230: 20 43 61 6e 20 6e 6f 74 20 75 73 65 20 61 6e 20   Can not use an 
d240: 69 6e 64 65 78 20 73 6f 72 74 20 6f 6e 20 61 6e  index sort on an
d250: 79 74 68 69 6e 67 20 74 68 61 74 20 69 73 20 6e  ything that is n
d260: 6f 74 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ot a column in t
d270: 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 65 66 74  he.      ** left
d280: 2d 6d 6f 73 74 20 74 61 62 6c 65 20 6f 66 20 74  -most table of t
d290: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
d2a0: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
d2b0: 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 6c 20 3d     }.    pColl =
d2c0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
d2d0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
d2e0: 72 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f  r);.    if( !pCo
d2f0: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c  ll ){.      pCol
d300: 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
d310: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  l;.    }.    if(
d320: 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 26 26 20   pIdx->zName && 
d330: 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  i<pIdx->nColumn 
d340: 29 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e  ){.      iColumn
d350: 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
d360: 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  n[i];.      if( 
d370: 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 70  iColumn==pIdx->p
d380: 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 7b 0a  Table->iPKey ){.
d390: 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20          iColumn 
d3a0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = -1;.      }.  
d3b0: 20 20 20 20 69 53 6f 72 74 4f 72 64 65 72 20 3d      iSortOrder =
d3c0: 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
d3d0: 72 5b 69 5d 3b 0a 20 20 20 20 20 20 7a 43 6f 6c  r[i];.      zCol
d3e0: 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  l = pIdx->azColl
d3f0: 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  [i];.    }else{.
d400: 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
d410: 2d 31 3b 0a 20 20 20 20 20 20 69 53 6f 72 74 4f  -1;.      iSortO
d420: 72 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rder = 0;.      
d430: 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 2d 3e 7a  zColl = pColl->z
d440: 4e 61 6d 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Name;.    }.    
d450: 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
d460: 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 7c 7c 20 73  mn!=iColumn || s
d470: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
d480: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  oll->zName, zCol
d490: 6c 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  l) ){.      /* T
d4a0: 65 72 6d 20 6a 20 6f 66 20 74 68 65 20 4f 52 44  erm j of the ORD
d4b0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 64 6f 65  ER BY clause doe
d4c0: 73 20 6e 6f 74 20 6d 61 74 63 68 20 63 6f 6c 75  s not match colu
d4d0: 6d 6e 20 69 20 6f 66 20 74 68 65 20 69 6e 64 65  mn i of the inde
d4e0: 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69  x */.      if( i
d4f0: 3c 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20  <nEqCol ){.     
d500: 20 20 20 2f 2a 20 49 66 20 61 6e 20 69 6e 64 65     /* If an inde
d510: 78 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 73  x column that is
d520: 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20   constrained by 
d530: 3d 3d 20 66 61 69 6c 73 20 74 6f 20 6d 61 74 63  == fails to matc
d540: 68 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  h an.        ** 
d550: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 2c 20 74  ORDER BY term, t
d560: 68 61 74 20 69 73 20 4f 4b 2e 20 20 4a 75 73 74  hat is OK.  Just
d570: 20 69 67 6e 6f 72 65 20 74 68 61 74 20 63 6f 6c   ignore that col
d580: 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
d590: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
d5a0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
d5b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 3d      }else if( i=
d5c0: 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  =pIdx->nColumn )
d5d0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  {.        /* Ind
d5e0: 65 78 20 63 6f 6c 75 6d 6e 20 69 20 69 73 20 74  ex column i is t
d5f0: 68 65 20 72 6f 77 69 64 2e 20 20 41 6c 6c 20 6f  he rowid.  All o
d600: 74 68 65 72 20 74 65 72 6d 73 20 6d 61 74 63 68  ther terms match
d610: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  . */.        bre
d620: 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ak;.      }else{
d630: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61  .        /* If a
d640: 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 66  n index column f
d650: 61 69 6c 73 20 74 6f 20 6d 61 74 63 68 20 61 6e  ails to match an
d660: 64 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 72 61  d is not constra
d670: 69 6e 65 64 20 62 79 20 3d 3d 0a 20 20 20 20 20  ined by ==.     
d680: 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 69     ** then the i
d690: 6e 64 65 78 20 63 61 6e 6e 6f 74 20 73 61 74 69  ndex cannot sati
d6a0: 73 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59  sfy the ORDER BY
d6b0: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 20   constraint..   
d6c0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
d6d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
d6e0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
d6f0: 72 74 28 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  rt( pIdx->aSortO
d700: 72 64 65 72 21 3d 30 20 7c 7c 20 69 43 6f 6c 75  rder!=0 || iColu
d710: 6d 6e 3d 3d 2d 31 20 29 3b 0a 20 20 20 20 61 73  mn==-1 );.    as
d720: 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 73 6f 72  sert( pTerm->sor
d730: 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 70 54 65  tOrder==0 || pTe
d740: 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 31  rm->sortOrder==1
d750: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
d760: 69 53 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c  iSortOrder==0 ||
d770: 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29   iSortOrder==1 )
d780: 3b 0a 20 20 20 20 74 65 72 6d 53 6f 72 74 4f 72  ;.    termSortOr
d790: 64 65 72 20 3d 20 69 53 6f 72 74 4f 72 64 65 72  der = iSortOrder
d7a0: 20 5e 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72   ^ pTerm->sortOr
d7b0: 64 65 72 3b 0a 20 20 20 20 69 66 28 20 69 3e 6e  der;.    if( i>n
d7c0: 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69  EqCol ){.      i
d7d0: 66 28 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72  f( termSortOrder
d7e0: 21 3d 73 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20  !=sortOrder ){. 
d7f0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 65         /* Indice
d800: 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73  s can only be us
d810: 65 64 20 69 66 20 61 6c 6c 20 4f 52 44 45 52 20  ed if all ORDER 
d820: 42 59 20 74 65 72 6d 73 20 70 61 73 74 20 74 68  BY terms past th
d830: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 71 75  e.        ** equ
d840: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
d850: 73 20 61 72 65 20 61 6c 6c 20 65 69 74 68 65 72  s are all either
d860: 20 44 45 53 43 20 6f 72 20 41 53 43 2e 20 2a 2f   DESC or ASC. */
d870: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
d880: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
d890: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 6f 72 74  else{.      sort
d8a0: 4f 72 64 65 72 20 3d 20 74 65 72 6d 53 6f 72 74  Order = termSort
d8b0: 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Order;.    }.   
d8c0: 20 6a 2b 2b 3b 0a 20 20 20 20 70 54 65 72 6d 2b   j++;.    pTerm+
d8d0: 2b 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 75  +;.    if( iColu
d8e0: 6d 6e 3c 30 20 26 26 20 21 72 65 66 65 72 65 6e  mn<0 && !referen
d8f0: 63 65 73 4f 74 68 65 72 54 61 62 6c 65 73 28 70  cesOtherTables(p
d900: 4f 72 64 65 72 42 79 2c 20 70 4d 61 73 6b 53 65  OrderBy, pMaskSe
d910: 74 2c 20 6a 2c 20 62 61 73 65 29 20 29 7b 0a 20  t, j, base) ){. 
d920: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69       /* If the i
d930: 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20 69 73  ndexed column is
d940: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
d950: 20 61 6e 64 20 65 76 65 72 79 74 68 69 6e 67 20   and everything 
d960: 6d 61 74 63 68 65 73 0a 20 20 20 20 20 20 2a 2a  matches.      **
d970: 20 73 6f 20 66 61 72 20 61 6e 64 20 6e 6f 6e 65   so far and none
d980: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
d990: 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 72 69   terms to the ri
d9a0: 67 68 74 20 72 65 66 65 72 65 6e 63 65 20 6f 74  ght reference ot
d9b0: 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 61 62  her.      ** tab
d9c0: 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2c  les in the join,
d9d0: 20 74 68 65 6e 20 77 65 20 61 72 65 20 61 73 73   then we are ass
d9e0: 75 72 65 64 20 74 68 61 74 20 74 68 65 20 69 6e  ured that the in
d9f0: 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20  dex can be used 
da00: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 6f 72  .      ** to sor
da10: 74 20 62 65 63 61 75 73 65 20 74 68 65 20 70 72  t because the pr
da20: 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75 6e 69  imary key is uni
da30: 71 75 65 20 61 6e 64 20 73 6f 20 6e 6f 6e 65 20  que and so none 
da40: 6f 66 20 74 68 65 20 6f 74 68 65 72 0a 20 20 20  of the other.   
da50: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 77 69     ** columns wi
da60: 6c 6c 20 6d 61 6b 65 20 61 6e 79 20 64 69 66 66  ll make any diff
da70: 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2f 0a  erence.      */.
da80: 20 20 20 20 20 20 6a 20 3d 20 6e 54 65 72 6d 3b        j = nTerm;
da90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70  .    }.  }..  *p
daa0: 62 52 65 76 20 3d 20 73 6f 72 74 4f 72 64 65 72  bRev = sortOrder
dab0: 21 3d 30 3b 0a 20 20 69 66 28 20 6a 3e 3d 6e 54  !=0;.  if( j>=nT
dac0: 65 72 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c  erm ){.    /* Al
dad0: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f  l terms of the O
dae0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
daf0: 72 65 20 63 6f 76 65 72 65 64 20 62 79 20 74 68  re covered by th
db00: 69 73 20 69 6e 64 65 78 20 73 6f 0a 20 20 20 20  is index so.    
db10: 2a 2a 20 74 68 69 73 20 69 6e 64 65 78 20 63 61  ** this index ca
db20: 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 73 6f  n be used for so
db30: 72 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 65  rting. */.    re
db40: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
db50: 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  ( pIdx->onError!
db60: 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20 69 3d 3d 70  =OE_None && i==p
db70: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20  Idx->nColumn.   
db80: 20 20 20 26 26 20 21 72 65 66 65 72 65 6e 63 65     && !reference
db90: 73 4f 74 68 65 72 54 61 62 6c 65 73 28 70 4f 72  sOtherTables(pOr
dba0: 64 65 72 42 79 2c 20 70 4d 61 73 6b 53 65 74 2c  derBy, pMaskSet,
dbb0: 20 6a 2c 20 62 61 73 65 29 20 29 7b 0a 20 20 20   j, base) ){.   
dbc0: 20 2f 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66   /* All terms of
dbd0: 20 74 68 69 73 20 69 6e 64 65 78 20 6d 61 74 63   this index matc
dbe0: 68 20 73 6f 6d 65 20 70 72 65 66 69 78 20 6f 66  h some prefix of
dbf0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
dc00: 61 75 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20  ause.    ** and 
dc10: 74 68 65 20 69 6e 64 65 78 20 69 73 20 55 4e 49  the index is UNI
dc20: 51 55 45 20 61 6e 64 20 6e 6f 20 74 65 72 6d 73  QUE and no terms
dc30: 20 6f 6e 20 74 68 65 20 74 61 69 6c 20 6f 66 20   on the tail of 
dc40: 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20  the ORDER BY.   
dc50: 20 2a 2a 20 63 6c 61 75 73 65 20 72 65 66 65 72   ** clause refer
dc60: 65 6e 63 65 20 6f 74 68 65 72 20 74 61 62 6c 65  ence other table
dc70: 73 20 69 6e 20 61 20 6a 6f 69 6e 2e 20 20 49 66  s in a join.  If
dc80: 20 74 68 69 73 20 69 73 20 61 6c 6c 20 74 72 75   this is all tru
dc90: 65 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  e then.    ** th
dca0: 65 20 6f 72 64 65 72 20 62 79 20 63 6c 61 75 73  e order by claus
dcb0: 65 20 69 73 20 73 75 70 65 72 66 6c 75 6f 75 73  e is superfluous
dcc0: 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
dcd0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
dce0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70  0;.}../*.** Prep
dcf0: 61 72 65 20 61 20 63 72 75 64 65 20 65 73 74 69  are a crude esti
dd00: 6d 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 67 61  mate of the loga
dd10: 72 69 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70  rithm of the inp
dd20: 75 74 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65  ut value..** The
dd30: 20 72 65 73 75 6c 74 73 20 6e 65 65 64 20 6e 6f   results need no
dd40: 74 20 62 65 20 65 78 61 63 74 2e 20 20 54 68 69  t be exact.  Thi
dd50: 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66  s is only used f
dd60: 6f 72 20 65 73 74 69 6d 61 74 69 6e 67 0a 2a 2a  or estimating.**
dd70: 20 74 68 65 20 74 6f 74 61 6c 20 63 6f 73 74 20   the total cost 
dd80: 6f 66 20 70 65 72 66 6f 72 6d 69 6e 67 20 6f 70  of performing op
dd90: 65 72 61 74 69 6f 6e 73 20 77 69 74 68 20 4f 28  erations with O(
dda0: 6c 6f 67 4e 29 20 6f 72 20 4f 28 4e 6c 6f 67 4e  logN) or O(NlogN
ddb0: 29 0a 2a 2a 20 63 6f 6d 70 6c 65 78 69 74 79 2e  ).** complexity.
ddc0: 20 20 42 65 63 61 75 73 65 20 4e 20 69 73 20 6a    Because N is j
ddd0: 75 73 74 20 61 20 67 75 65 73 73 2c 20 69 74 20  ust a guess, it 
dde0: 69 73 20 6e 6f 20 67 72 65 61 74 20 74 72 61 67  is no great trag
ddf0: 65 64 79 20 69 66 0a 2a 2a 20 6c 6f 67 4e 20 69  edy if.** logN i
de00: 73 20 61 20 6c 69 74 74 6c 65 20 6f 66 66 2e 0a  s a little off..
de10: 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65  */.static double
de20: 20 65 73 74 4c 6f 67 28 64 6f 75 62 6c 65 20 4e   estLog(double N
de30: 29 7b 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 67 4e  ){.  double logN
de40: 20 3d 20 31 3b 0a 20 20 64 6f 75 62 6c 65 20 78   = 1;.  double x
de50: 20 3d 20 31 30 3b 0a 20 20 77 68 69 6c 65 28 20   = 10;.  while( 
de60: 4e 3e 78 20 29 7b 0a 20 20 20 20 6c 6f 67 4e 20  N>x ){.    logN 
de70: 2b 3d 20 31 3b 0a 20 20 20 20 78 20 2a 3d 20 31  += 1;.    x *= 1
de80: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
de90: 6c 6f 67 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  logN;.}../*.** T
dea0: 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20  wo routines for 
deb0: 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e  printing the con
dec0: 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69 74  tent of an sqlit
ded0: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a  e3_index_info.**
dee0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 55 73 65   structure.  Use
def0: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
df00: 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  d debugging only
df10: 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a  .  If neither.**
df20: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72 20   SQLITE_TEST or 
df30: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72 65  SQLITE_DEBUG are
df40: 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74   defined, then t
df50: 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a  hese routines.**
df60: 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a   are no-ops..*/.
df70: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
df80: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
df90: 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65  TABLE) && define
dfa0: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
dfb0: 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43  static void TRAC
dfc0: 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 73 71 6c  E_IDX_INPUTS(sql
dfd0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
dfe0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
dff0: 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72  if( !sqlite3Wher
e000: 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b  eTrace ) return;
e010: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
e020: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
e030: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
e040: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 63 6f  ebugPrintf("  co
e050: 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f  nstraint[%d]: co
e060: 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25 64 20 6f  l=%d termid=%d o
e070: 70 3d 25 64 20 75 73 61 62 6c 65 64 3d 25 64 5c  p=%d usabled=%d\
e080: 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20  n",.       i,.  
e090: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
e0a0: 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a  int[i].iColumn,.
e0b0: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
e0c0: 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66  raint[i].iTermOf
e0d0: 66 73 65 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e  fset,.       p->
e0e0: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f  aConstraint[i].o
e0f0: 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  p,.       p->aCo
e100: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62  nstraint[i].usab
e110: 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  le);.  }.  for(i
e120: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42  =0; i<p->nOrderB
e130: 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  y; i++){.    sql
e140: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
e150: 22 20 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20  "  orderby[%d]: 
e160: 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e  col=%d desc=%d\n
e170: 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20  ",.       i,.   
e180: 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b      p->aOrderBy[
e190: 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  i].iColumn,.    
e1a0: 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69     p->aOrderBy[i
e1b0: 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73  ].desc);.  }.}.s
e1c0: 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45  tatic void TRACE
e1d0: 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 73 71 6c  _IDX_OUTPUTS(sql
e1e0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
e1f0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
e200: 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72  if( !sqlite3Wher
e210: 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b  eTrace ) return;
e220: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
e230: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
e240: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
e250: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 75 73  ebugPrintf("  us
e260: 61 67 65 5b 25 64 5d 3a 20 61 72 67 76 49 64 78  age[%d]: argvIdx
e270: 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a  =%d omit=%d\n",.
e280: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
e290: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
e2a0: 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
e2b0: 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  x,.       p->aCo
e2c0: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d  nstraintUsage[i]
e2d0: 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71  .omit);.  }.  sq
e2e0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
e2f0: 28 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22  ("  idxNum=%d\n"
e300: 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20  , p->idxNum);.  
e310: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
e320: 74 66 28 22 20 20 69 64 78 53 74 72 3d 25 73 5c  tf("  idxStr=%s\
e330: 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a  n", p->idxStr);.
e340: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
e350: 69 6e 74 66 28 22 20 20 6f 72 64 65 72 42 79 43  intf("  orderByC
e360: 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70  onsumed=%d\n", p
e370: 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
e380: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  d);.  sqlite3Deb
e390: 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74 69  ugPrintf("  esti
e3a0: 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c  matedCost=%g\n",
e3b0: 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73   p->estimatedCos
e3c0: 74 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66  t);.}.#else.#def
e3d0: 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e  ine TRACE_IDX_IN
e3e0: 50 55 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20  PUTS(A).#define 
e3f0: 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
e400: 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  S(A).#endif../* 
e410: 0a 2a 2a 20 52 65 71 75 69 72 65 64 20 62 65 63  .** Required bec
e420: 61 75 73 65 20 62 65 73 74 49 6e 64 65 78 28 29  ause bestIndex()
e430: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 62 65   is called by be
e440: 73 74 4f 72 43 6c 61 75 73 65 49 6e 64 65 78 28  stOrClauseIndex(
e450: 29 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ) .*/.static voi
e460: 64 20 62 65 73 74 49 6e 64 65 78 28 0a 20 20 20  d bestIndex(.   
e470: 20 50 61 72 73 65 2a 2c 20 57 68 65 72 65 43 6c   Parse*, WhereCl
e480: 61 75 73 65 2a 2c 20 73 74 72 75 63 74 20 53 72  ause*, struct Sr
e490: 63 4c 69 73 74 5f 69 74 65 6d 2a 2c 0a 20 20 20  cList_item*,.   
e4a0: 20 42 69 74 6d 61 73 6b 2c 20 42 69 74 6d 61 73   Bitmask, Bitmas
e4b0: 6b 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 57 68  k, ExprList*, Wh
e4c0: 65 72 65 43 6f 73 74 2a 29 3b 0a 0a 2f 2a 0a 2a  ereCost*);../*.*
e4d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
e4e0: 74 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20  ttempts to find 
e4f0: 61 6e 20 73 63 61 6e 6e 69 6e 67 20 73 74 72 61  an scanning stra
e500: 74 65 67 79 20 74 68 61 74 20 63 61 6e 20 62 65  tegy that can be
e510: 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 6f 70 74   used .** to opt
e520: 69 6d 69 7a 65 20 61 6e 20 27 4f 52 27 20 65 78  imize an 'OR' ex
e530: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73  pression that is
e540: 20 70 61 72 74 20 6f 66 20 61 20 57 48 45 52 45   part of a WHERE
e550: 20 63 6c 61 75 73 65 2e 20 0a 2a 2a 0a 2a 2a 20   clause. .**.** 
e560: 54 68 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69  The table associ
e570: 61 74 65 64 20 77 69 74 68 20 46 52 4f 4d 20 63  ated with FROM c
e580: 6c 61 75 73 65 20 74 65 72 6d 20 70 53 72 63 20  lause term pSrc 
e590: 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61 0a  may be either a.
e5a0: 2a 2a 20 72 65 67 75 6c 61 72 20 42 2d 54 72 65  ** regular B-Tre
e5b0: 65 20 74 61 62 6c 65 20 6f 72 20 61 20 76 69 72  e table or a vir
e5c0: 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  tual table..*/.s
e5d0: 74 61 74 69 63 20 76 6f 69 64 20 62 65 73 74 4f  tatic void bestO
e5e0: 72 43 6c 61 75 73 65 49 6e 64 65 78 28 0a 20 20  rClauseIndex(.  
e5f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
e600: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e610: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
e620: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
e630: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
e640: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
e650: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
e660: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
e670: 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20   *pSrc,  /* The 
e680: 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
e690: 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
e6a0: 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
e6b0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ,           /* M
e6c0: 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 6e  ask of cursors n
e6d0: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ot available for
e6e0: 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42   indexing */.  B
e6f0: 69 74 6d 61 73 6b 20 6e 6f 74 56 61 6c 69 64 2c  itmask notValid,
e700: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
e710: 72 73 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c 61  rsors not availa
e720: 62 6c 65 20 66 6f 72 20 61 6e 79 20 70 75 72 70  ble for any purp
e730: 6f 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ose */.  ExprLis
e740: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
e750: 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45       /* The ORDE
e760: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
e770: 20 57 68 65 72 65 43 6f 73 74 20 2a 70 43 6f 73   WhereCost *pCos
e780: 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
e790: 4c 6f 77 65 73 74 20 63 6f 73 74 20 71 75 65 72  Lowest cost quer
e7a0: 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 23 69 66  y plan */.){.#if
e7b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e7c0: 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
e7d0: 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43 75  .  const int iCu
e7e0: 72 20 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f  r = pSrc->iCurso
e7f0: 72 3b 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73  r;   /* The curs
e800: 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  or of the table 
e810: 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 20 2a  to be accessed *
e820: 2f 0a 20 20 63 6f 6e 73 74 20 42 69 74 6d 61 73  /.  const Bitmas
e830: 6b 20 6d 61 73 6b 53 72 63 20 3d 20 67 65 74 4d  k maskSrc = getM
e840: 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65  ask(pWC->pMaskSe
e850: 74 2c 20 69 43 75 72 29 3b 20 20 2f 2a 20 42 69  t, iCur);  /* Bi
e860: 74 6d 61 73 6b 20 66 6f 72 20 70 53 72 63 20 2a  tmask for pSrc *
e870: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20  /.  WhereTerm * 
e880: 63 6f 6e 73 74 20 70 57 43 45 6e 64 20 3d 20 26  const pWCEnd = &
e890: 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
e8a0: 6d 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e  m];        /* En
e8b0: 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f  d of pWC->a[] */
e8c0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
e8d0: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
e8e0: 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
e8f0: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
e900: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20  RE clause */..  
e910: 2f 2a 20 4e 6f 20 4f 52 2d 63 6c 61 75 73 65 20  /* No OR-clause 
e920: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61 6c 6c  optimization all
e930: 6f 77 65 64 20 69 66 20 74 68 65 20 49 4e 44 45  owed if the INDE
e940: 58 45 44 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e  XED BY or NOT IN
e950: 44 45 58 45 44 20 63 6c 61 75 73 65 73 0a 20 20  DEXED clauses.  
e960: 2a 2a 20 61 72 65 20 75 73 65 64 20 2a 2f 0a 20  ** are used */. 
e970: 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e   if( pSrc->notIn
e980: 64 65 78 65 64 20 7c 7c 20 70 53 72 63 2d 3e 70  dexed || pSrc->p
e990: 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20 20  Index!=0 ){.    
e9a0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  return;.  }..  /
e9b0: 2a 20 53 65 61 72 63 68 20 74 68 65 20 57 48 45  * Search the WHE
e9c0: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
e9d0: 66 6f 72 20 61 20 75 73 61 62 6c 65 20 57 4f 5f  for a usable WO_
e9e0: 4f 52 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 66 6f  OR term. */.  fo
e9f0: 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  r(pTerm=pWC->a; 
ea00: 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54  pTerm<pWCEnd; pT
ea10: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
ea20: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
ea30: 3d 3d 57 4f 5f 4f 52 20 0a 20 20 20 20 20 26 26  ==WO_OR .     &&
ea40: 20 28 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   ((pTerm->prereq
ea50: 41 6c 6c 20 26 20 7e 6d 61 73 6b 53 72 63 29 20  All & ~maskSrc) 
ea60: 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 0a 20  & notReady)==0. 
ea70: 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 75      && (pTerm->u
ea80: 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61  .pOrInfo->indexa
ea90: 62 6c 65 20 26 20 6d 61 73 6b 53 72 63 29 21 3d  ble & maskSrc)!=
eaa0: 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0 .    ){.      
eab0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f  WhereClause * co
eac0: 6e 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65  nst pOrWC = &pTe
ead0: 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77  rm->u.pOrInfo->w
eae0: 63 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  c;.      WhereTe
eaf0: 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43  rm * const pOrWC
eb00: 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b  End = &pOrWC->a[
eb10: 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20  pOrWC->nTerm];. 
eb20: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
eb30: 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 69  pOrTerm;.      i
eb40: 6e 74 20 66 6c 61 67 73 20 3d 20 57 48 45 52 45  nt flags = WHERE
eb50: 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20  _MULTI_OR;.     
eb60: 20 64 6f 75 62 6c 65 20 72 54 6f 74 61 6c 20 3d   double rTotal =
eb70: 20 30 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65   0;.      double
eb80: 20 6e 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 20   nRow = 0;.     
eb90: 20 42 69 74 6d 61 73 6b 20 75 73 65 64 20 3d 20   Bitmask used = 
eba0: 30 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 4f  0;..      for(pO
ebb0: 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20  rTerm=pOrWC->a; 
ebc0: 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64  pOrTerm<pOrWCEnd
ebd0: 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20  ; pOrTerm++){.  
ebe0: 20 20 20 20 20 20 57 68 65 72 65 43 6f 73 74 20        WhereCost 
ebf0: 73 54 65 72 6d 43 6f 73 74 3b 0a 20 20 20 20 20  sTermCost;.     
ec00: 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22     WHERETRACE(("
ec10: 2e 2e 2e 20 4d 75 6c 74 69 2d 69 6e 64 65 78 20  ... Multi-index 
ec20: 4f 52 20 74 65 73 74 69 6e 67 20 66 6f 72 20 74  OR testing for t
ec30: 65 72 6d 20 25 64 20 6f 66 20 25 64 2e 2e 2e 2e  erm %d of %d....
ec40: 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
ec50: 28 70 4f 72 54 65 72 6d 20 2d 20 70 4f 72 57 43  (pOrTerm - pOrWC
ec60: 2d 3e 61 29 2c 20 28 70 54 65 72 6d 20 2d 20 70  ->a), (pTerm - p
ec70: 57 43 2d 3e 61 29 0a 20 20 20 20 20 20 20 20 29  WC->a).        )
ec80: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
ec90: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
eca0: 72 3d 3d 57 4f 5f 41 4e 44 20 29 7b 0a 20 20 20  r==WO_AND ){.   
ecb0: 20 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75         WhereClau
ecc0: 73 65 20 2a 70 41 6e 64 57 43 20 3d 20 26 70 4f  se *pAndWC = &pO
ecd0: 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66  rTerm->u.pAndInf
ece0: 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 20  o->wc;.         
ecf0: 20 62 65 73 74 49 6e 64 65 78 28 70 50 61 72 73   bestIndex(pPars
ed00: 65 2c 20 70 41 6e 64 57 43 2c 20 70 53 72 63 2c  e, pAndWC, pSrc,
ed10: 20 6e 6f 74 52 65 61 64 79 2c 20 6e 6f 74 56 61   notReady, notVa
ed20: 6c 69 64 2c 20 30 2c 20 26 73 54 65 72 6d 43 6f  lid, 0, &sTermCo
ed30: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  st);.        }el
ed40: 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e  se if( pOrTerm->
ed50: 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
ed60: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68   ){.          Wh
ed70: 65 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57 43  ereClause tempWC
ed80: 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
ed90: 57 43 2e 70 50 61 72 73 65 20 3d 20 70 57 43 2d  WC.pParse = pWC-
eda0: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20  >pParse;.       
edb0: 20 20 20 74 65 6d 70 57 43 2e 70 4d 61 73 6b 53     tempWC.pMaskS
edc0: 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53  et = pWC->pMaskS
edd0: 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  et;.          te
ede0: 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44  mpWC.op = TK_AND
edf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
ee00: 57 43 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a  WC.a = pOrTerm;.
ee10: 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
ee20: 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  .nTerm = 1;.    
ee30: 20 20 20 20 20 20 62 65 73 74 49 6e 64 65 78 28        bestIndex(
ee40: 70 50 61 72 73 65 2c 20 26 74 65 6d 70 57 43 2c  pParse, &tempWC,
ee50: 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c   pSrc, notReady,
ee60: 20 6e 6f 74 56 61 6c 69 64 2c 20 30 2c 20 26 73   notValid, 0, &s
ee70: 54 65 72 6d 43 6f 73 74 29 3b 0a 20 20 20 20 20  TermCost);.     
ee80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ee90: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
eea0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
eeb0: 72 54 6f 74 61 6c 20 2b 3d 20 73 54 65 72 6d 43  rTotal += sTermC
eec0: 6f 73 74 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20  ost.rCost;.     
eed0: 20 20 20 6e 52 6f 77 20 2b 3d 20 73 54 65 72 6d     nRow += sTerm
eee0: 43 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77 3b 0a  Cost.plan.nRow;.
eef0: 20 20 20 20 20 20 20 20 75 73 65 64 20 7c 3d 20          used |= 
ef00: 73 54 65 72 6d 43 6f 73 74 2e 75 73 65 64 3b 0a  sTermCost.used;.
ef10: 20 20 20 20 20 20 20 20 69 66 28 20 72 54 6f 74          if( rTot
ef20: 61 6c 3e 3d 70 43 6f 73 74 2d 3e 72 43 6f 73 74  al>=pCost->rCost
ef30: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
ef40: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  }..      /* If t
ef50: 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
ef60: 20 42 59 20 63 6c 61 75 73 65 2c 20 69 6e 63 72   BY clause, incr
ef70: 65 61 73 65 20 74 68 65 20 73 63 61 6e 20 63 6f  ease the scan co
ef80: 73 74 20 74 6f 20 61 63 63 6f 75 6e 74 20 0a 20  st to account . 
ef90: 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20       ** for the 
efa0: 63 6f 73 74 20 6f 66 20 74 68 65 20 73 6f 72 74  cost of the sort
efb0: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
efc0: 4f 72 64 65 72 42 79 21 3d 30 20 29 7b 0a 20 20  OrderBy!=0 ){.  
efd0: 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
efe0: 28 28 22 2e 2e 2e 20 73 6f 72 74 69 6e 67 20 69  (("... sorting i
eff0: 6e 63 72 65 61 73 65 73 20 4f 52 20 63 6f 73 74  ncreases OR cost
f000: 20 25 2e 39 67 20 74 6f 20 25 2e 39 67 5c 6e 22   %.9g to %.9g\n"
f010: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f020: 20 20 20 20 20 20 72 54 6f 74 61 6c 2c 20 72 54        rTotal, rT
f030: 6f 74 61 6c 2b 6e 52 6f 77 2a 65 73 74 4c 6f 67  otal+nRow*estLog
f040: 28 6e 52 6f 77 29 29 29 3b 0a 20 20 20 20 20 20  (nRow)));.      
f050: 20 20 72 54 6f 74 61 6c 20 2b 3d 20 6e 52 6f 77    rTotal += nRow
f060: 2a 65 73 74 4c 6f 67 28 6e 52 6f 77 29 3b 0a 20  *estLog(nRow);. 
f070: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
f080: 20 49 66 20 74 68 65 20 63 6f 73 74 20 6f 66 20   If the cost of 
f090: 73 63 61 6e 6e 69 6e 67 20 75 73 69 6e 67 20 74  scanning using t
f0a0: 68 69 73 20 4f 52 20 74 65 72 6d 20 66 6f 72 20  his OR term for 
f0b0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 0a  optimization is.
f0c0: 20 20 20 20 20 20 2a 2a 20 6c 65 73 73 20 74 68        ** less th
f0d0: 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  an the current c
f0e0: 6f 73 74 20 73 74 6f 72 65 64 20 69 6e 20 70 43  ost stored in pC
f0f0: 6f 73 74 2c 20 72 65 70 6c 61 63 65 20 74 68 65  ost, replace the
f100: 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20 20 20   contents.      
f110: 2a 2a 20 6f 66 20 70 43 6f 73 74 2e 20 2a 2f 0a  ** of pCost. */.
f120: 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
f130: 28 28 22 2e 2e 2e 20 6d 75 6c 74 69 2d 69 6e 64  (("... multi-ind
f140: 65 78 20 4f 52 20 63 6f 73 74 3d 25 2e 39 67 20  ex OR cost=%.9g 
f150: 6e 72 6f 77 3d 25 2e 39 67 5c 6e 22 2c 20 72 54  nrow=%.9g\n", rT
f160: 6f 74 61 6c 2c 20 6e 52 6f 77 29 29 3b 0a 20 20  otal, nRow));.  
f170: 20 20 20 20 69 66 28 20 72 54 6f 74 61 6c 3c 70      if( rTotal<p
f180: 43 6f 73 74 2d 3e 72 43 6f 73 74 20 29 7b 0a 20  Cost->rCost ){. 
f190: 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 72 43         pCost->rC
f1a0: 6f 73 74 20 3d 20 72 54 6f 74 61 6c 3b 0a 20 20  ost = rTotal;.  
f1b0: 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 75 73 65        pCost->use
f1c0: 64 20 3d 20 75 73 65 64 3b 0a 20 20 20 20 20 20  d = used;.      
f1d0: 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 52    pCost->plan.nR
f1e0: 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 20  ow = nRow;.     
f1f0: 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77     pCost->plan.w
f200: 73 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  sFlags = flags;.
f210: 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70          pCost->p
f220: 6c 61 6e 2e 75 2e 70 54 65 72 6d 20 3d 20 70 54  lan.u.pTerm = pT
f230: 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  erm;.      }.   
f240: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
f250: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f   SQLITE_OMIT_OR_
f260: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
f270: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
f280: 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
f290: 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74  _INDEX./*.** Ret
f2a0: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
f2b0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
f2c0: 6d 20 70 54 65 72 6d 20 69 73 20 6f 66 20 61 20  m pTerm is of a 
f2d0: 66 6f 72 6d 20 77 68 65 72 65 20 69 74 0a 2a 2a  form where it.**
f2e0: 20 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20 77   could be used w
f2f0: 69 74 68 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ith an index to 
f300: 61 63 63 65 73 73 20 70 53 72 63 2c 20 61 73 73  access pSrc, ass
f310: 75 6d 69 6e 67 20 61 6e 20 61 70 70 72 6f 70 72  uming an appropr
f320: 69 61 74 65 0a 2a 2a 20 69 6e 64 65 78 20 65 78  iate.** index ex
f330: 69 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  isted..*/.static
f340: 20 69 6e 74 20 74 65 72 6d 43 61 6e 44 72 69 76   int termCanDriv
f350: 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65 54  eIndex(.  WhereT
f360: 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 20 20  erm *pTerm,     
f370: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52           /* WHER
f380: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  E clause term to
f390: 20 63 68 65 63 6b 20 2a 2f 0a 20 20 73 74 72 75   check */.  stru
f3a0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
f3b0: 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 61  *pSrc,     /* Ta
f3c0: 62 6c 65 20 77 65 20 61 72 65 20 74 72 79 69 6e  ble we are tryin
f3d0: 67 20 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20  g to access */. 
f3e0: 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
f3f0: 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y               
f400: 2f 2a 20 54 61 62 6c 65 73 20 69 6e 20 6f 75 74  /* Tables in out
f410: 65 72 20 6c 6f 6f 70 73 20 6f 66 20 74 68 65 20  er loops of the 
f420: 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  join */.){.  cha
f430: 72 20 61 66 66 3b 0a 20 20 69 66 28 20 70 54 65  r aff;.  if( pTe
f440: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d  rm->leftCursor!=
f450: 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
f460: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
f470: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
f480: 21 3d 57 4f 5f 45 51 20 29 20 72 65 74 75 72 6e  !=WO_EQ ) return
f490: 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d   0;.  if( (pTerm
f4a0: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
f4b0: 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20 72  notReady)!=0 ) r
f4c0: 65 74 75 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d  eturn 0;.  aff =
f4d0: 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f   pSrc->pTab->aCo
f4e0: 6c 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  l[pTerm->u.leftC
f4f0: 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b  olumn].affinity;
f500: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49  .  if( !sqlite3I
f510: 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70  ndexAffinityOk(p
f520: 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66  Term->pExpr, aff
f530: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
f540: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
f550: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
f560: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
f570: 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 49 66  C_INDEX./*.** If
f580: 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20   the query plan 
f590: 66 6f 72 20 70 53 72 63 20 73 70 65 63 69 66 69  for pSrc specifi
f5a0: 65 64 20 69 6e 20 70 43 6f 73 74 20 69 73 20 61  ed in pCost is a
f5b0: 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   full table scan
f5c0: 0a 2a 2a 20 61 6e 64 20 69 6e 64 65 78 69 6e 67  .** and indexing
f5d0: 20 69 73 20 61 6c 6c 6f 77 73 20 28 69 66 20 74   is allows (if t
f5e0: 68 65 72 65 20 69 73 20 6e 6f 20 4e 4f 54 20 49  here is no NOT I
f5f0: 4e 44 45 58 45 44 20 63 6c 61 75 73 65 29 20 61  NDEXED clause) a
f600: 6e 64 20 69 74 0a 2a 2a 20 70 6f 73 73 69 62 6c  nd it.** possibl
f610: 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61  e to construct a
f620: 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78   transient index
f630: 20 74 68 61 74 20 77 6f 75 6c 64 20 70 65 72 66   that would perf
f640: 6f 72 6d 20 62 65 74 74 65 72 0a 2a 2a 20 74 68  orm better.** th
f650: 61 6e 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20  an a full table 
f660: 73 63 61 6e 20 65 76 65 6e 20 77 68 65 6e 20 74  scan even when t
f670: 68 65 20 63 6f 73 74 20 6f 66 20 63 6f 6e 73 74  he cost of const
f680: 72 75 63 74 69 6e 67 20 74 68 65 20 69 6e 64 65  ructing the inde
f690: 78 0a 2a 2a 20 69 73 20 74 61 6b 65 6e 20 69 6e  x.** is taken in
f6a0: 74 6f 20 61 63 63 6f 75 6e 74 2c 20 74 68 65 6e  to account, then
f6b0: 20 61 6c 74 65 72 20 74 68 65 20 71 75 65 72 79   alter the query
f6c0: 20 70 6c 61 6e 20 74 6f 20 75 73 65 20 74 68 65   plan to use the
f6d0: 0a 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e  .** transient in
f6e0: 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
f6f0: 6f 69 64 20 62 65 73 74 41 75 74 6f 6d 61 74 69  oid bestAutomati
f700: 63 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  cIndex(.  Parse 
f710: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
f720: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
f730: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
f740: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
f750: 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  WC,           /*
f760: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
f770: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
f780: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
f790: 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63  ,  /* The FROM c
f7a0: 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65  lause term to se
f7b0: 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73  arch */.  Bitmas
f7c0: 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20  k notReady,     
f7d0: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
f7e0: 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   cursors that ar
f7f0: 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  e not available 
f800: 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 2a  */.  WhereCost *
f810: 70 43 6f 73 74 20 20 20 20 20 20 20 20 20 20 20  pCost           
f820: 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74 20   /* Lowest cost 
f830: 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b  query plan */.){
f840: 0a 20 20 64 6f 75 62 6c 65 20 6e 54 61 62 6c 65  .  double nTable
f850: 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Row;           /
f860: 2a 20 52 6f 77 73 20 69 6e 20 74 68 65 20 69 6e  * Rows in the in
f870: 70 75 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 64  put table */.  d
f880: 6f 75 62 6c 65 20 6c 6f 67 4e 3b 20 20 20 20 20  ouble logN;     
f890: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f             /* lo
f8a0: 67 28 6e 54 61 62 6c 65 52 6f 77 29 20 2a 2f 0a  g(nTableRow) */.
f8b0: 20 20 64 6f 75 62 6c 65 20 63 6f 73 74 54 65 6d    double costTem
f8c0: 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 2f 2a  pIdx;         /*
f8d0: 20 70 65 72 2d 71 75 65 72 79 20 63 6f 73 74 20   per-query cost 
f8e0: 6f 66 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74  of the transient
f8f0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72   index */.  Wher
f900: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
f910: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
f920: 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20  gle term of the 
f930: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
f940: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43    WhereTerm *pWC
f950: 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  End;          /*
f960: 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d   End of pWC->a[]
f970: 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
f980: 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ble;            
f990: 20 20 2f 2a 20 54 61 62 6c 65 20 74 68 74 20 6d    /* Table tht m
f9a0: 69 67 68 74 20 62 65 20 69 6e 64 65 78 65 64 20  ight be indexed 
f9b0: 2a 2f 0a 0a 20 20 69 66 28 20 28 70 50 61 72 73  */..  if( (pPars
f9c0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
f9d0: 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 29  QLITE_AutoIndex)
f9e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 75  ==0 ){.    /* Au
f9f0: 74 6f 6d 61 74 69 63 20 69 6e 64 69 63 65 73 20  tomatic indices 
fa00: 61 72 65 20 64 69 73 61 62 6c 65 64 20 61 74 20  are disabled at 
fa10: 72 75 6e 2d 74 69 6d 65 20 2a 2f 0a 20 20 20 20  run-time */.    
fa20: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
fa30: 28 20 28 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77  ( (pCost->plan.w
fa40: 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e  sFlags & WHERE_N
fa50: 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 21 3d 30 20  OT_FULLSCAN)!=0 
fa60: 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 6c 72  ){.    /* We alr
fa70: 65 61 64 79 20 68 61 76 65 20 73 6f 6d 65 20 6b  eady have some k
fa80: 69 6e 64 20 6f 66 20 69 6e 64 65 78 20 69 6e 20  ind of index in 
fa90: 75 73 65 20 66 6f 72 20 74 68 69 73 20 71 75 65  use for this que
faa0: 72 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ry. */.    retur
fab0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72  n;.  }.  if( pSr
fac0: 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 29 7b  c->notIndexed ){
fad0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 4e 4f 54 20  .    /* The NOT 
fae0: 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 61  INDEXED clause a
faf0: 70 70 65 61 72 73 20 69 6e 20 74 68 65 20 53 51  ppears in the SQ
fb00: 4c 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  L. */.    return
fb10: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
fb20: 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
fb30: 6f 6f 70 20 3e 3d 20 28 64 6f 75 62 6c 65 29 31  oop >= (double)1
fb40: 20 29 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20 70   );.  pTable = p
fb50: 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 6e 54 61  Src->pTab;.  nTa
fb60: 62 6c 65 52 6f 77 20 3d 20 70 54 61 62 6c 65 2d  bleRow = pTable-
fb70: 3e 6e 52 6f 77 45 73 74 3b 0a 20 20 6c 6f 67 4e  >nRowEst;.  logN
fb80: 20 3d 20 65 73 74 4c 6f 67 28 6e 54 61 62 6c 65   = estLog(nTable
fb90: 52 6f 77 29 3b 0a 20 20 63 6f 73 74 54 65 6d 70  Row);.  costTemp
fba0: 49 64 78 20 3d 20 32 2a 6c 6f 67 4e 2a 28 6e 54  Idx = 2*logN*(nT
fbb0: 61 62 6c 65 52 6f 77 2f 70 50 61 72 73 65 2d 3e  ableRow/pParse->
fbc0: 6e 51 75 65 72 79 4c 6f 6f 70 20 2b 20 31 29 3b  nQueryLoop + 1);
fbd0: 0a 20 20 69 66 28 20 63 6f 73 74 54 65 6d 70 49  .  if( costTempI
fbe0: 64 78 3e 3d 70 43 6f 73 74 2d 3e 72 43 6f 73 74  dx>=pCost->rCost
fbf0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63   ){.    /* The c
fc00: 6f 73 74 20 6f 66 20 63 72 65 61 74 69 6e 67 20  ost of creating 
fc10: 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61  the transient ta
fc20: 62 6c 65 20 77 6f 75 6c 64 20 62 65 20 67 72 65  ble would be gre
fc30: 61 74 65 72 20 74 68 61 6e 0a 20 20 20 20 2a 2a  ater than.    **
fc40: 20 64 6f 69 6e 67 20 74 68 65 20 66 75 6c 6c 20   doing the full 
fc50: 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20  table scan */.  
fc60: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
fc70: 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
fc80: 6e 79 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70  ny equality comp
fc90: 61 72 69 73 6f 6e 20 74 65 72 6d 20 2a 2f 0a 20  arison term */. 
fca0: 20 70 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e   pWCEnd = &pWC->
fcb0: 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20  a[pWC->nTerm];. 
fcc0: 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
fcd0: 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b  a; pTerm<pWCEnd;
fce0: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
fcf0: 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  f( termCanDriveI
fd00: 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63  ndex(pTerm, pSrc
fd10: 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20  , notReady) ){. 
fd20: 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
fd30: 28 22 61 75 74 6f 2d 69 6e 64 65 78 20 72 65 64  ("auto-index red
fd40: 75 63 65 73 20 63 6f 73 74 20 66 72 6f 6d 20 25  uces cost from %
fd50: 2e 32 66 20 74 6f 20 25 2e 32 66 5c 6e 22 2c 0a  .2f to %.2f\n",.
fd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd70: 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74      pCost->rCost
fd80: 2c 20 63 6f 73 74 54 65 6d 70 49 64 78 29 29 3b  , costTempIdx));
fd90: 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 72 43  .      pCost->rC
fda0: 6f 73 74 20 3d 20 63 6f 73 74 54 65 6d 70 49 64  ost = costTempId
fdb0: 78 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  x;.      pCost->
fdc0: 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 6c 6f 67 4e  plan.nRow = logN
fdd0: 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 43 6f 73   + 1;.      pCos
fde0: 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  t->plan.wsFlags 
fdf0: 3d 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44  = WHERE_TEMP_IND
fe00: 45 58 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d  EX;.      pCost-
fe10: 3e 75 73 65 64 20 3d 20 70 54 65 72 6d 2d 3e 70  >used = pTerm->p
fe20: 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20  rereqRight;.    
fe30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
fe40: 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
fe50: 69 6e 65 20 62 65 73 74 41 75 74 6f 6d 61 74 69  ine bestAutomati
fe60: 63 49 6e 64 65 78 28 41 2c 42 2c 43 2c 44 2c 45  cIndex(A,B,C,D,E
fe70: 29 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 23  )  /* no-op */.#
fe80: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
fe90: 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
fea0: 4e 44 45 58 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65  NDEX */...#ifnde
feb0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
fec0: 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a  TOMATIC_INDEX./*
fed0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
fee0: 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74  e to construct t
fef0: 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  he Index object 
ff00: 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  for an automatic
ff10: 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 6f   index.** and to
ff20: 20 73 65 74 20 75 70 20 74 68 65 20 57 68 65 72   set up the Wher
ff30: 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20 70 4c  eLevel object pL
ff40: 65 76 65 6c 20 73 6f 20 74 68 61 74 20 74 68 65  evel so that the
ff50: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a   code generator.
ff60: 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f 66 20  ** makes use of 
ff70: 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
ff80: 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
ff90: 6f 69 64 20 63 6f 6e 73 74 72 75 63 74 41 75 74  oid constructAut
ffa0: 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20 50  omaticIndex(.  P
ffb0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
ffc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
ffd0: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
ffe0: 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
fff0: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
10000 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
10010 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
10020 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
10030 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46  *pSrc,  /* The F
10040 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
10050 74 6f 20 67 65 74 20 74 68 65 20 6e 65 78 74 20  to get the next 
10060 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61  index */.  Bitma
10070 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
10080 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
10090 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61  f cursors that a
100a0 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  re not available
100b0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
100c0 20 2a 70 4c 65 76 65 6c 20 20 20 20 20 20 20 20   *pLevel        
100d0 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 69    /* Write new i
100e0 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ndex here */.){.
100f0 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 20 20    int nColumn;  
10100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10110 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
10120 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72  ns in the constr
10130 75 63 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20  ucted index */. 
10140 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
10150 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
10160 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66  A single term of
10170 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
10180 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
10190 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20 20   *pWCEnd;       
101a0 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43     /* End of pWC
101b0 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  ->a[] */.  int n
101c0 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
101d0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
101e0 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65 64 20  f memory needed 
101f0 66 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e  for pIdx */.  In
10200 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
10210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a            /* Obj
10220 65 63 74 20 64 65 73 63 72 69 62 69 6e 67 20 74  ect describing t
10230 68 65 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64  he transient ind
10240 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ex */.  Vdbe *v;
10250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10260 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20      /* Prepared 
10270 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  statement under 
10280 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
10290 20 20 69 6e 74 20 72 65 67 49 73 49 6e 69 74 3b    int regIsInit;
102a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
102b0 20 52 65 67 69 73 74 65 72 20 73 65 74 20 62 79   Register set by
102c0 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
102d0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 49 6e 69  */.  int addrIni
102e0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
102f0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
10300 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
10310 6e 20 62 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f  n bypass jump */
10320 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  .  Table *pTable
10330 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
10340 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * The table bein
10350 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 4b  g indexed */.  K
10360 65 79 49 6e 66 6f 20 2a 70 4b 65 79 69 6e 66 6f  eyInfo *pKeyinfo
10370 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65  ;          /* Ke
10380 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  y information fo
10390 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 20 20  r the index */  
103a0 20 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b   .  int addrTop;
103b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103c0 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e  /* Top of the in
103d0 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f  dex fill loop */
103e0 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64  .  int regRecord
103f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
10400 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
10410 6e 67 20 61 6e 20 69 6e 64 65 78 20 72 65 63 6f  ng an index reco
10420 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  rd */.  int n;  
10430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10440 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f      /* Column co
10450 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  unter */.  int i
10460 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10470 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
10480 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
10490 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20 20 20 20  mxBitCol;       
104a0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
104b0 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72  um column in pSr
104c0 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20  c->colUsed */.  
104d0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
104e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
104f0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
10500 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  e to on a column
10510 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 64   */.  Bitmask id
10520 78 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20  xCols;          
10530 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 63    /* Bitmap of c
10540 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66 6f 72 20  olumns used for 
10550 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69  indexing */.  Bi
10560 74 6d 61 73 6b 20 65 78 74 72 61 43 6f 6c 73 3b  tmask extraCols;
10570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
10580 6d 61 70 20 6f 66 20 61 64 64 69 74 69 6f 6e 61  map of additiona
10590 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20  l columns */..  
105a0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
105b0 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 74 68   to skip over th
105c0 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 69  e creation and i
105d0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66  nitialization of
105e0 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 69   the.  ** transi
105f0 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e 64  ent index on 2nd
10600 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20   and subsequent 
10610 69 74 65 72 61 74 69 6f 6e 73 20 6f 66 20 74 68  iterations of th
10620 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d  e loop. */.  v =
10630 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
10640 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
10650 3b 0a 20 20 72 65 67 49 73 49 6e 69 74 20 3d 20  ;.  regIsInit = 
10660 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
10670 20 20 61 64 64 72 49 6e 69 74 20 3d 20 73 71 6c    addrInit = sql
10680 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
10690 2c 20 4f 50 5f 49 66 2c 20 72 65 67 49 73 49 6e  , OP_If, regIsIn
106a0 69 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  it);.  sqlite3Vd
106b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
106c0 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 49 73  nteger, 1, regIs
106d0 49 6e 69 74 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75  Init);..  /* Cou
106e0 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
106f0 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69   columns that wi
10700 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  ll be added to t
10710 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 61 6e  he index.  ** an
10720 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63 68 20  d used to match 
10730 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
10740 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6e 43  straints */.  nC
10750 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 70 54 61  olumn = 0;.  pTa
10760 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  ble = pSrc->pTab
10770 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26 70 57  ;.  pWCEnd = &pW
10780 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d  C->a[pWC->nTerm]
10790 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b  ;.  idxCols = 0;
107a0 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
107b0 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
107c0 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
107d0 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76   if( termCanDriv
107e0 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53  eIndex(pTerm, pS
107f0 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b  rc, notReady) ){
10800 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
10810 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
10820 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74  olumn;.      Bit
10830 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f  mask cMask = iCo
10840 6c 3e 3d 42 4d 53 20 3f 20 28 28 42 69 74 6d 61  l>=BMS ? ((Bitma
10850 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 20 3a  sk)1)<<(BMS-1) :
10860 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69   ((Bitmask)1)<<i
10870 43 6f 6c 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Col;.      testc
10880 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29  ase( iCol==BMS )
10890 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
108a0 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ( iCol==BMS-1 );
108b0 0a 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43  .      if( (idxC
108c0 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20  ols & cMask)==0 
108d0 29 7b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75  ){.        nColu
108e0 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 64  mn++;.        id
108f0 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a  xCols |= cMask;.
10900 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10910 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c  }.  assert( nCol
10920 75 6d 6e 3e 30 20 29 3b 0a 20 20 70 4c 65 76 65  umn>0 );.  pLeve
10930 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20 6e 43  l->plan.nEq = nC
10940 6f 6c 75 6d 6e 3b 0a 0a 20 20 2f 2a 20 43 6f 75  olumn;..  /* Cou
10950 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
10960 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75   additional colu
10970 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 63 72  mns needed to cr
10980 65 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f 76 65  eate a.  ** cove
10990 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 41 20 22  ring index.  A "
109a0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 22 20  covering index" 
109b0 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74  is an index that
109c0 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 20 20   contains all.  
109d0 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  ** columns that 
109e0 61 72 65 20 6e 65 65 64 65 64 20 62 79 20 74 68  are needed by th
109f0 65 20 71 75 65 72 79 2e 20 20 57 69 74 68 20 61  e query.  With a
10a00 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c   covering index,
10a10 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e   the.  ** origin
10a20 61 6c 20 74 61 62 6c 65 20 6e 65 76 65 72 20 6e  al table never n
10a30 65 65 64 73 20 74 6f 20 62 65 20 61 63 63 65 73  eeds to be acces
10a40 73 65 64 2e 20 20 41 75 74 6f 6d 61 74 69 63 20  sed.  Automatic 
10a50 69 6e 64 69 63 65 73 20 6d 75 73 74 0a 20 20 2a  indices must.  *
10a60 2a 20 62 65 20 61 20 63 6f 76 65 72 69 6e 67 20  * be a covering 
10a70 69 6e 64 65 78 20 62 65 63 61 75 73 65 20 74 68  index because th
10a80 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74  e index will not
10a90 20 62 65 20 75 70 64 61 74 65 64 20 69 66 20 74   be updated if t
10aa0 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c  he.  ** original
10ab0 20 74 61 62 6c 65 20 63 68 61 6e 67 65 73 20 61   table changes a
10ac0 6e 64 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  nd the index and
10ad0 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 6f   table cannot bo
10ae0 74 68 20 62 65 20 75 73 65 64 0a 20 20 2a 2a 20  th be used.  ** 
10af0 69 66 20 74 68 65 79 20 67 6f 20 6f 75 74 20 6f  if they go out o
10b00 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65  f sync..  */.  e
10b10 78 74 72 61 43 6f 6c 73 20 3d 20 70 53 72 63 2d  xtraCols = pSrc-
10b20 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e 69 64 78  >colUsed & (~idx
10b30 43 6f 6c 73 20 7c 20 28 28 28 42 69 74 6d 61 73  Cols | (((Bitmas
10b40 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29 29 3b  k)1)<<(BMS-1)));
10b50 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d 20 28 70  .  mxBitCol = (p
10b60 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e 3d 20 42  Table->nCol >= B
10b70 4d 53 2d 31 29 20 3f 20 42 4d 53 2d 31 20 3a 20  MS-1) ? BMS-1 : 
10b80 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a 20 20  pTable->nCol;.  
10b90 74 65 73 74 63 61 73 65 28 20 70 54 61 62 6c 65  testcase( pTable
10ba0 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ->nCol==BMS-1 );
10bb0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61  .  testcase( pTa
10bc0 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32  ble->nCol==BMS-2
10bd0 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
10be0 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b  <mxBitCol; i++){
10bf0 0a 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f  .    if( extraCo
10c00 6c 73 20 26 20 28 28 28 42 69 74 6d 61 73 6b 29  ls & (((Bitmask)
10c10 31 29 3c 3c 69 29 20 29 20 6e 43 6f 6c 75 6d 6e  1)<<i) ) nColumn
10c20 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  ++;.  }.  if( pS
10c30 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 28  rc->colUsed & ((
10c40 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d  (Bitmask)1)<<(BM
10c50 53 2d 31 29 29 20 29 7b 0a 20 20 20 20 6e 43 6f  S-1)) ){.    nCo
10c60 6c 75 6d 6e 20 2b 3d 20 70 54 61 62 6c 65 2d 3e  lumn += pTable->
10c70 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b 0a  nCol - BMS + 1;.
10c80 20 20 7d 0a 20 20 70 4c 65 76 65 6c 2d 3e 70 6c    }.  pLevel->pl
10c90 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  an.wsFlags |= WH
10ca0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20  ERE_COLUMN_EQ | 
10cb0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c  WHERE_IDX_ONLY |
10cc0 20 57 4f 5f 45 51 3b 0a 0a 20 20 2f 2a 20 43 6f   WO_EQ;..  /* Co
10cd0 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e 64 65  nstruct the Inde
10ce0 78 20 6f 62 6a 65 63 74 20 74 6f 20 64 65 73 63  x object to desc
10cf0 72 69 62 65 20 74 68 69 73 20 69 6e 64 65 78 20  ribe this index 
10d00 2a 2f 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  */.  nByte = siz
10d10 65 6f 66 28 49 6e 64 65 78 29 3b 0a 20 20 6e 42  eof(Index);.  nB
10d20 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a 73  yte += nColumn*s
10d30 69 7a 65 6f 66 28 69 6e 74 29 3b 20 20 20 20 20  izeof(int);     
10d40 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d  /* Index.aiColum
10d50 6e 20 2a 2f 0a 20 20 6e 42 79 74 65 20 2b 3d 20  n */.  nByte += 
10d60 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66 28 63  nColumn*sizeof(c
10d70 68 61 72 2a 29 3b 20 20 20 2f 2a 20 49 6e 64 65  har*);   /* Inde
10d80 78 2e 61 7a 43 6f 6c 6c 20 2a 2f 0a 20 20 6e 42  x.azColl */.  nB
10d90 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 3b 20  yte += nColumn; 
10da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10db0 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72  /* Index.aSortOr
10dc0 64 65 72 20 2a 2f 0a 20 20 70 49 64 78 20 3d 20  der */.  pIdx = 
10dd0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
10de0 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ero(pParse->db, 
10df0 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 70 49  nByte);.  if( pI
10e00 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  dx==0 ) return;.
10e10 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75    pLevel->plan.u
10e20 2e 70 49 64 78 20 3d 20 70 49 64 78 3b 0a 20 20  .pIdx = pIdx;.  
10e30 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28  pIdx->azColl = (
10e40 63 68 61 72 2a 2a 29 26 70 49 64 78 5b 31 5d 3b  char**)&pIdx[1];
10e50 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  .  pIdx->aiColum
10e60 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 64 78 2d  n = (int*)&pIdx-
10e70 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c 75 6d 6e 5d  >azColl[nColumn]
10e80 3b 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  ;.  pIdx->aSortO
10e90 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 49 64  rder = (u8*)&pId
10ea0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c  x->aiColumn[nCol
10eb0 75 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e  umn];.  pIdx->zN
10ec0 61 6d 65 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65  ame = "auto-inde
10ed0 78 22 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c  x";.  pIdx->nCol
10ee0 75 6d 6e 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20  umn = nColumn;. 
10ef0 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20   pIdx->pTable = 
10f00 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b  pTable;.  n = 0;
10f10 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a  .  idxCols = 0;.
10f20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
10f30 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64  >a; pTerm<pWCEnd
10f40 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
10f50 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65  if( termCanDrive
10f60 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72  Index(pTerm, pSr
10f70 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a  c, notReady) ){.
10f80 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
10f90 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
10fa0 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d  lumn;.      Bitm
10fb0 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c  ask cMask = iCol
10fc0 3e 3d 42 4d 53 20 3f 20 28 28 42 69 74 6d 61 73  >=BMS ? ((Bitmas
10fd0 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 20 3a 20  k)1)<<(BMS-1) : 
10fe0 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69 43  ((Bitmask)1)<<iC
10ff0 6f 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69  ol;.      if( (i
11000 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d  dxCols & cMask)=
11010 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  =0 ){.        Ex
11020 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e  pr *pX = pTerm->
11030 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
11040 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b  dxCols |= cMask;
11050 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
11060 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65  iColumn[n] = pTe
11070 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
11080 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  ;.        pColl 
11090 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
110a0 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
110b0 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c  arse, pX->pLeft,
110c0 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20   pX->pRight);.  
110d0 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
110e0 6c 6c 5b 6e 5d 20 3d 20 70 43 6f 6c 6c 2d 3e 7a  ll[n] = pColl->z
110f0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 6e 2b  Name;.        n+
11100 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
11110 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
11120 75 33 32 29 6e 3d 3d 70 4c 65 76 65 6c 2d 3e 70  u32)n==pLevel->p
11130 6c 61 6e 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a  lan.nEq );..  /*
11140 20 41 64 64 20 61 64 64 69 74 69 6f 6e 61 6c 20   Add additional 
11150 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74  columns needed t
11160 6f 20 6d 61 6b 65 20 74 68 65 20 61 75 74 6f 6d  o make the autom
11170 61 74 69 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a  atic index into.
11180 20 20 2a 2a 20 61 20 63 6f 76 65 72 69 6e 67 20    ** a covering 
11190 69 6e 64 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69  index */.  for(i
111a0 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20  =0; i<mxBitCol; 
111b0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78  i++){.    if( ex
111c0 74 72 61 43 6f 6c 73 20 26 20 28 28 28 42 69 74  traCols & (((Bit
111d0 6d 61 73 6b 29 31 29 3c 3c 69 29 20 29 7b 0a 20  mask)1)<<i) ){. 
111e0 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c       pIdx->aiCol
111f0 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20  umn[n] = i;.    
11200 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e    pIdx->azColl[n
11210 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20  ] = "BINARY";.  
11220 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20      n++;.    }. 
11230 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63   }.  if( pSrc->c
11240 6f 6c 55 73 65 64 20 26 20 28 28 28 42 69 74 6d  olUsed & (((Bitm
11250 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29  ask)1)<<(BMS-1))
11260 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d   ){.    for(i=BM
11270 53 2d 31 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e  S-1; i<pTable->n
11280 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
11290 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
112a0 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49  n] = i;.      pI
112b0 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
112c0 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20  "BINARY";.      
112d0 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n++;.    }.  }. 
112e0 20 61 73 73 65 72 74 28 20 6e 3d 3d 6e 43 6f 6c   assert( n==nCol
112f0 75 6d 6e 20 29 3b 0a 0a 20 20 2f 2a 20 43 72 65  umn );..  /* Cre
11300 61 74 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ate the automati
11310 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70 4b 65  c index */.  pKe
11320 79 69 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 49  yinfo = sqlite3I
11330 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72  ndexKeyinfo(pPar
11340 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 61 73 73  se, pIdx);.  ass
11350 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ert( pLevel->iId
11360 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 73 71 6c  xCur>=0 );.  sql
11370 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
11380 2c 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64  , OP_OpenAutoind
11390 65 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  ex, pLevel->iIdx
113a0 43 75 72 2c 20 6e 43 6f 6c 75 6d 6e 2b 31 2c 20  Cur, nColumn+1, 
113b0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
113c0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
113d0 65 79 69 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyinfo, P4_KEYIN
113e0 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 56  FO_HANDOFF);.  V
113f0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
11400 66 6f 72 20 25 73 22 2c 20 70 54 61 62 6c 65 2d  for %s", pTable-
11410 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20  >zName));..  /* 
11420 46 69 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61 74  Fill the automat
11430 69 63 20 69 6e 64 65 78 20 77 69 74 68 20 63 6f  ic index with co
11440 6e 74 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 54  ntent */.  addrT
11450 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
11460 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77  AddOp1(v, OP_Rew
11470 69 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  ind, pLevel->iTa
11480 62 43 75 72 29 3b 0a 20 20 72 65 67 52 65 63 6f  bCur);.  regReco
11490 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
114a0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
114b0 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74    sqlite3Generat
114c0 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65  eIndexKey(pParse
114d0 2c 20 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e  , pIdx, pLevel->
114e0 69 54 61 62 43 75 72 2c 20 72 65 67 52 65 63 6f  iTabCur, regReco
114f0 72 64 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65  rd, 1);.  sqlite
11500 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11510 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4c 65  P_IdxInsert, pLe
11520 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72 65  vel->iIdxCur, re
11530 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69  gRecord);.  sqli
11540 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
11550 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
11560 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69  KRESULT);.  sqli
11570 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11580 20 4f 50 5f 4e 65 78 74 2c 20 70 4c 65 76 65 6c   OP_Next, pLevel
11590 2d 3e 69 54 61 62 43 75 72 2c 20 61 64 64 72 54  ->iTabCur, addrT
115a0 6f 70 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  op+1);.  sqlite3
115b0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
115c0 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
115d0 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20  S_AUTOINDEX);.  
115e0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
115f0 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b  ere(v, addrTop);
11600 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
11610 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
11620 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 0a   regRecord);.  .
11630 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77    /* Jump here w
11640 68 65 6e 20 73 6b 69 70 70 69 6e 67 20 74 68 65  hen skipping the
11650 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
11660 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
11670 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
11680 49 6e 69 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  Init);.}.#endif 
11690 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  /* SQLITE_OMIT_A
116a0 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a  UTOMATIC_INDEX *
116b0 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
116c0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
116d0 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  BLE./*.** Alloca
116e0 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20  te and populate 
116f0 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  an sqlite3_index
11700 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  _info structure.
11710 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72   It is the .** r
11720 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
11730 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
11740 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73  ventually releas
11750 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 0a  e the structure.
11760 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20 74 68  ** by passing th
11770 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
11780 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
11790 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f 66  ion to sqlite3_f
117a0 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ree()..*/.static
117b0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
117c0 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64  nfo *allocateInd
117d0 65 78 49 6e 66 6f 28 0a 20 20 50 61 72 73 65 20  exInfo(.  Parse 
117e0 2a 70 50 61 72 73 65 2c 20 0a 20 20 57 68 65 72  *pParse, .  Wher
117f0 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20 20  eClause *pWC,.  
11800 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
11810 74 65 6d 20 2a 70 53 72 63 2c 0a 20 20 45 78 70  tem *pSrc,.  Exp
11820 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 0a  rList *pOrderBy.
11830 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
11840 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74   int nTerm;.  st
11850 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
11860 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70  ex_constraint *p
11870 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63  IdxCons;.  struc
11880 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
11890 6f 72 64 65 72 62 79 20 2a 70 49 64 78 4f 72 64  orderby *pIdxOrd
118a0 65 72 42 79 3b 0a 20 20 73 74 72 75 63 74 20 73  erBy;.  struct s
118b0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
118c0 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70  straint_usage *p
118d0 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65  Usage;.  WhereTe
118e0 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74  rm *pTerm;.  int
118f0 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 73 71 6c   nOrderBy;.  sql
11900 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
11910 2a 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 57 48  *pIdxInfo;..  WH
11920 45 52 45 54 52 41 43 45 28 28 22 52 65 63 6f 6d  ERETRACE(("Recom
11930 70 75 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 66  puting index inf
11940 6f 20 66 6f 72 20 25 73 2e 2e 2e 5c 6e 22 2c 20  o for %s...\n", 
11950 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  pSrc->pTab->zNam
11960 65 29 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74  e));..  /* Count
11970 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
11980 6f 73 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c  ossible WHERE cl
11990 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ause constraints
119a0 20 72 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20   referring.  ** 
119b0 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20  to this virtual 
119c0 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69  table */.  for(i
119d0 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d  =nTerm=0, pTerm=
119e0 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e  pWC->a; i<pWC->n
119f0 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d  Term; i++, pTerm
11a00 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  ++){.    if( pTe
11a10 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21  rm->leftCursor !
11a20 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  = pSrc->iCursor 
11a30 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
11a40 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
11a50 65 4f 70 65 72 61 74 6f 72 26 28 70 54 65 72 6d  eOperator&(pTerm
11a60 2d 3e 65 4f 70 65 72 61 74 6f 72 2d 31 29 29 3d  ->eOperator-1))=
11a70 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =0 );.    testca
11a80 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
11a90 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20  ator==WO_IN );. 
11aa0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
11ab0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
11ac0 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
11ad0 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
11ae0 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f  ator & (WO_IN|WO
11af0 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69  _ISNULL) ) conti
11b00 6e 75 65 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b  nue;.    nTerm++
11b10 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
11b20 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
11b30 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79  se contains only
11b40 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
11b50 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69  current .  ** vi
11b60 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 65 6e  rtual table then
11b70 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
11b80 66 6f 72 20 74 68 65 20 61 4f 72 64 65 72 42 79  for the aOrderBy
11b90 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68   part of.  ** th
11ba0 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
11bb0 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a  info structure..
11bc0 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20    */.  nOrderBy 
11bd0 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  = 0;.  if( pOrde
11be0 72 42 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  rBy ){.    for(i
11bf0 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
11c00 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
11c10 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
11c20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
11c30 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  pExpr;.      if(
11c40 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
11c50 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e  OLUMN || pExpr->
11c60 69 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43  iTable!=pSrc->iC
11c70 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20  ursor ) break;. 
11c80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d     }.    if( i==
11c90 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
11ca0 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65 72 42  ){.      nOrderB
11cb0 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  y = pOrderBy->nE
11cc0 78 70 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  xpr;.    }.  }..
11cd0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    /* Allocate th
11ce0 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
11cf0 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20  info structure. 
11d00 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d   */.  pIdxInfo =
11d10 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
11d20 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c  Zero(pParse->db,
11d30 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66   sizeof(*pIdxInf
11d40 6f 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o).             
11d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
11d60 28 73 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e  (sizeof(*pIdxCon
11d70 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73  s) + sizeof(*pUs
11d80 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20  age))*nTerm.    
11d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11da0 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28         + sizeof(
11db0 2a 70 49 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f  *pIdxOrderBy)*nO
11dc0 72 64 65 72 42 79 20 29 3b 0a 20 20 69 66 28 20  rderBy );.  if( 
11dd0 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  pIdxInfo==0 ){. 
11de0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
11df0 73 67 28 70 50 61 72 73 65 2c 20 22 6f 75 74 20  sg(pParse, "out 
11e00 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20  of memory");.   
11e10 20 2f 2a 20 28 64 6f 75 62 6c 65 29 30 20 49 6e   /* (double)0 In
11e20 20 63 61 73 65 20 6f 66 20 53 51 4c 49 54 45 5f   case of SQLITE_
11e30 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
11e40 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20 72 65  INT... */.    re
11e50 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
11e60 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
11e70 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
11e80 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
11e90 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f  nfo structure co
11ea0 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79  ntains.  ** many
11eb0 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 72 65   fields that are
11ec0 20 64 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74   declared "const
11ed0 22 20 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65  " to prevent xBe
11ee0 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a  stIndex from.  *
11ef0 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e  * changing them.
11f00 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20    We have to do 
11f10 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69  some funky casti
11f20 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20  ng in order to. 
11f30 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   ** initialize t
11f40 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a  hose fields..  *
11f50 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28  /.  pIdxCons = (
11f60 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
11f70 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
11f80 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20  )&pIdxInfo[1];. 
11f90 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28   pIdxOrderBy = (
11fa0 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
11fb0 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70  ndex_orderby*)&p
11fc0 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a  IdxCons[nTerm];.
11fd0 20 20 70 55 73 61 67 65 20 3d 20 28 73 74 72 75    pUsage = (stru
11fe0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
11ff0 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
12000 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b  e*)&pIdxOrderBy[
12010 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69  nOrderBy];.  *(i
12020 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt*)&pIdxInfo->n
12030 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54 65  Constraint = nTe
12040 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49  rm;.  *(int*)&pI
12050 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
12060 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a   = nOrderBy;.  *
12070 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
12080 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
12090 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
120a0 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78  onstraint = pIdx
120b0 43 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63 74  Cons;.  *(struct
120c0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f   sqlite3_index_o
120d0 72 64 65 72 62 79 2a 2a 29 26 70 49 64 78 49 6e  rderby**)&pIdxIn
120e0 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20 70  fo->aOrderBy = p
120f0 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28  IdxOrderBy;.  *(
12100 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
12110 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
12120 75 73 61 67 65 2a 2a 29 26 70 49 64 78 49 6e 66  usage**)&pIdxInf
12130 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
12140 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20  age =.          
12150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12180 20 20 20 20 20 20 20 20 20 70 55 73 61 67 65 3b           pUsage;
12190 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70  ..  for(i=j=0, p
121a0 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70  Term=pWC->a; i<p
121b0 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20  WC->nTerm; i++, 
121c0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
121d0 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
121e0 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75  sor != pSrc->iCu
121f0 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  rsor ) continue;
12200 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54  .    assert( (pT
12210 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28  erm->eOperator&(
12220 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
12230 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 74  -1))==0 );.    t
12240 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
12250 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e  eOperator==WO_IN
12260 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
12270 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
12280 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  or==WO_ISNULL );
12290 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
122a0 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
122b0 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20  IN|WO_ISNULL) ) 
122c0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 49  continue;.    pI
122d0 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d  dxCons[j].iColum
122e0 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  n = pTerm->u.lef
122f0 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64  tColumn;.    pId
12300 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66  xCons[j].iTermOf
12310 66 73 65 74 20 3d 20 69 3b 0a 20 20 20 20 70 49  fset = i;.    pI
12320 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 28  dxCons[j].op = (
12330 75 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  u8)pTerm->eOpera
12340 74 6f 72 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  tor;.    /* The 
12350 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e  direct assignmen
12360 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  t in the previou
12370 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62  s line is possib
12380 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a  le only because.
12390 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61      ** the WO_ a
123a0 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  nd SQLITE_INDEX_
123b0 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65  CONSTRAINT_ code
123c0 73 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e  s are identical.
123d0 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c    The.    ** fol
123e0 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 76  lowing asserts v
123f0 65 72 69 66 79 20 74 68 69 73 20 66 61 63 74 2e  erify this fact.
12400 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
12410 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_EQ==SQLITE_IN
12420 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45  DEX_CONSTRAINT_E
12430 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Q );.    assert(
12440 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49   WO_LT==SQLITE_I
12450 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
12460 4c 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  LT );.    assert
12470 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f  ( WO_LE==SQLITE_
12480 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
12490 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _LE );.    asser
124a0 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45  t( WO_GT==SQLITE
124b0 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
124c0 54 5f 47 54 20 29 3b 0a 20 20 20 20 61 73 73 65  T_GT );.    asse
124d0 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54  rt( WO_GE==SQLIT
124e0 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
124f0 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 61 73 73  NT_GE );.    ass
12500 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53  ert( WO_MATCH==S
12510 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
12520 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a  TRAINT_MATCH );.
12530 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
12540 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
12550 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c  WO_EQ|WO_LT|WO_L
12560 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f  E|WO_GT|WO_GE|WO
12570 5f 4d 41 54 43 48 29 20 29 3b 0a 20 20 20 20 6a  _MATCH) );.    j
12580 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  ++;.  }.  for(i=
12590 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  0; i<nOrderBy; i
125a0 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
125b0 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d  Expr = pOrderBy-
125c0 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
125d0 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e   pIdxOrderBy[i].
125e0 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d  iColumn = pExpr-
125f0 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49  >iColumn;.    pI
12600 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73  dxOrderBy[i].des
12610 63 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  c = pOrderBy->a[
12620 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
12630 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78  }..  return pIdx
12640 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Info;.}../*.** T
12650 68 65 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20  he table object 
12660 72 65 66 65 72 65 6e 63 65 20 70 61 73 73 65 64  reference passed
12670 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
12680 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
12690 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74  function.** must
126a0 20 72 65 70 72 65 73 65 6e 74 20 61 20 76 69 72   represent a vir
126b0 74 75 61 6c 20 74 61 62 6c 65 2e 20 54 68 69 73  tual table. This
126c0 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65   function invoke
126d0 73 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78  s the xBestIndex
126e0 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20  ().** method of 
126f0 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
12700 65 20 77 69 74 68 20 74 68 65 20 73 71 6c 69 74  e with the sqlit
12710 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 70 6f  e3_index_info po
12720 69 6e 74 65 72 20 70 61 73 73 65 64 0a 2a 2a 20  inter passed.** 
12730 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e  as the argument.
12740 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
12750 6f 72 20 6f 63 63 75 72 73 2c 20 70 50 61 72 73  or occurs, pPars
12760 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  e is populated w
12770 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ith an error mes
12780 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f  sage and a.** no
12790 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20  n-zero value is 
127a0 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
127b0 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e  ise, 0 is return
127c0 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75  ed and the outpu
127d0 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65  t.** part of the
127e0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
127f0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
12800 20 6c 65 66 74 20 70 6f 70 75 6c 61 74 65 64 2e   left populated.
12810 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f  .**.** Whether o
12820 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69  r not an error i
12830 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69  s returned, it i
12840 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
12850 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63  lity of the.** c
12860 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
12870 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53  lly free p->idxS
12880 74 72 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46  tr if p->needToF
12890 72 65 65 49 64 78 53 74 72 20 69 6e 64 69 63 61  reeIdxStr indica
128a0 74 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73  tes.** that this
128b0 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f   is required..*/
128c0 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74 61 62  .static int vtab
128d0 42 65 73 74 49 6e 64 65 78 28 50 61 72 73 65 20  BestIndex(Parse 
128e0 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
128f0 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e  pTab, sqlite3_in
12900 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20  dex_info *p){.  
12910 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
12920 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74  tab = sqlite3Get
12930 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64  VTable(pParse->d
12940 62 2c 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b  b, pTab)->pVtab;
12950 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
12960 72 63 3b 0a 0a 20 20 57 48 45 52 45 54 52 41 43  rc;..  WHERETRAC
12970 45 28 28 22 78 42 65 73 74 49 6e 64 65 78 20 66  E(("xBestIndex f
12980 6f 72 20 25 73 5c 6e 22 2c 20 70 54 61 62 2d 3e  or %s\n", pTab->
12990 7a 4e 61 6d 65 29 29 3b 0a 20 20 54 52 41 43 45  zName));.  TRACE
129a0 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a  _IDX_INPUTS(p);.
129b0 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d    rc = pVtab->pM
129c0 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65  odule->xBestInde
129d0 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20 20 54  x(pVtab, p);.  T
129e0 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53  RACE_IDX_OUTPUTS
129f0 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d  (p);..  if( rc!=
12a00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12a10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
12a20 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 70  NOMEM ){.      p
12a30 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
12a40 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
12a50 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74 61   }else if( !pVta
12a60 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  b->zErrMsg ){.  
12a70 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
12a80 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22  Msg(pParse, "%s"
12a90 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
12aa0 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rc));.    }else{
12ab0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
12ac0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
12ad0 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72  %s", pVtab->zErr
12ae0 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Msg);.    }.  }.
12af0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
12b00 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
12b10 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67    pVtab->zErrMsg
12b20 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30   = 0;..  for(i=0
12b30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  ; i<p->nConstrai
12b40 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  nt; i++){.    if
12b50 28 20 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  ( !p->aConstrain
12b60 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70  t[i].usable && p
12b70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
12b80 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e  ge[i].argvIndex>
12b90 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
12ba0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
12bb0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 74  e, .          "t
12bc0 61 62 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e  able %s: xBestIn
12bd0 64 65 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20  dex returned an 
12be0 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70  invalid plan", p
12bf0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
12c00 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
12c10 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d   pParse->nErr;.}
12c20 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  .../*.** Compute
12c30 20 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20   the best index 
12c40 66 6f 72 20 61 20 76 69 72 74 75 61 6c 20 74 61  for a virtual ta
12c50 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62  ble..**.** The b
12c60 65 73 74 20 69 6e 64 65 78 20 69 73 20 63 6f 6d  est index is com
12c70 70 75 74 65 64 20 62 79 20 74 68 65 20 78 42 65  puted by the xBe
12c80 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 20 6f  stIndex method o
12c90 66 20 74 68 65 20 76 69 72 74 75 61 6c 0a 2a 2a  f the virtual.**
12ca0 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 2e 20 20   table module.  
12cb0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
12cc0 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 77 72  really just a wr
12cd0 61 70 70 65 72 20 74 68 61 74 20 73 65 74 73 20  apper that sets 
12ce0 75 70 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  up.** the sqlite
12cf0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
12d00 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20 75  ucture that is u
12d10 73 65 64 20 74 6f 20 63 6f 6d 6d 75 6e 69 63 61  sed to communica
12d20 74 65 20 77 69 74 68 0a 2a 2a 20 78 42 65 73 74  te with.** xBest
12d30 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  Index..**.** In 
12d40 61 20 6a 6f 69 6e 2c 20 74 68 69 73 20 72 6f 75  a join, this rou
12d50 74 69 6e 65 20 6d 69 67 68 74 20 62 65 20 63 61  tine might be ca
12d60 6c 6c 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69  lled multiple ti
12d70 6d 65 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73  mes for the.** s
12d80 61 6d 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ame virtual tabl
12d90 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  e.  The sqlite3_
12da0 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
12db0 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 0a  ture is created.
12dc0 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ** and initializ
12dd0 65 64 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20  ed on the first 
12de0 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20 72  invocation and r
12df0 65 75 73 65 64 20 6f 6e 20 61 6c 6c 20 73 75 62  eused on all sub
12e00 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 76 6f 63  sequent.** invoc
12e10 61 74 69 6f 6e 73 2e 20 20 54 68 65 20 73 71 6c  ations.  The sql
12e20 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
12e30 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 73  structure is als
12e40 6f 20 75 73 65 64 20 77 68 65 6e 0a 2a 2a 20 63  o used when.** c
12e50 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ode is generated
12e60 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 76   to access the v
12e70 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54  irtual table.  T
12e80 68 65 20 77 68 65 72 65 49 6e 66 6f 44 65 6c 65  he whereInfoDele
12e90 74 65 28 29 20 0a 2a 2a 20 72 6f 75 74 69 6e 65  te() .** routine
12ea0 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20 66   takes care of f
12eb0 72 65 65 69 6e 67 20 74 68 65 20 73 71 6c 69 74  reeing the sqlit
12ec0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
12ed0 72 75 63 74 75 72 65 20 61 66 74 65 72 0a 2a 2a  ructure after.**
12ee0 20 65 76 65 72 79 62 6f 64 79 20 68 61 73 20 66   everybody has f
12ef0 69 6e 69 73 68 65 64 20 77 69 74 68 20 69 74 2e  inished with it.
12f00 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12f10 62 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78  bestVirtualIndex
12f20 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
12f30 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
12f40 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
12f50 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
12f60 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
12f70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12f80 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
12f90 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
12fa0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
12fb0 72 63 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  rc,      /* The 
12fc0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
12fd0 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
12fe0 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
12ff0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13000 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f  /* Mask of curso
13010 72 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  rs not available
13020 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20   for index */.  
13030 42 69 74 6d 61 73 6b 20 6e 6f 74 56 61 6c 69 64  Bitmask notValid
13040 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13050 2f 2a 20 43 75 72 73 6f 72 73 20 6e 6f 74 20 76  /* Cursors not v
13060 61 6c 69 64 20 66 6f 72 20 61 6e 79 20 70 75 72  alid for any pur
13070 70 6f 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  pose */.  ExprLi
13080 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
13090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
130a0 20 6f 72 64 65 72 20 62 79 20 63 6c 61 75 73 65   order by clause
130b0 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20   */.  WhereCost 
130c0 2a 70 43 6f 73 74 2c 20 20 20 20 20 20 20 20 20  *pCost,         
130d0 20 20 20 20 20 20 2f 2a 20 4c 6f 77 65 73 74 20        /* Lowest 
130e0 63 6f 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20  cost query plan 
130f0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  */.  sqlite3_ind
13100 65 78 5f 69 6e 66 6f 20 2a 2a 70 70 49 64 78 49  ex_info **ppIdxI
13110 6e 66 6f 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e  nfo  /* Index in
13120 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73 65 64  formation passed
13130 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78 20 2a   to xBestIndex *
13140 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
13150 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b  ab = pSrc->pTab;
13160 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  .  sqlite3_index
13170 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b  _info *pIdxInfo;
13180 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
13190 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
131a0 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20  nt *pIdxCons;.  
131b0 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
131c0 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
131d0 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20  usage *pUsage;. 
131e0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
131f0 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  m;.  int i, j;. 
13200 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20   int nOrderBy;. 
13210 20 64 6f 75 62 6c 65 20 72 43 6f 73 74 3b 0a 0a   double rCost;..
13220 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77    /* Make sure w
13230 73 46 6c 61 67 73 20 69 73 20 69 6e 69 74 69 61  sFlags is initia
13240 6c 69 7a 65 64 20 74 6f 20 73 6f 6d 65 20 73 61  lized to some sa
13250 6e 65 20 76 61 6c 75 65 2e 20 4f 74 68 65 72 77  ne value. Otherw
13260 69 73 65 2c 20 69 66 20 74 68 65 20 0a 20 20 2a  ise, if the .  *
13270 2a 20 6d 61 6c 6c 6f 63 20 69 6e 20 61 6c 6c 6f  * malloc in allo
13280 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 29 20  cateIndexInfo() 
13290 66 61 69 6c 73 20 61 6e 64 20 74 68 69 73 20 66  fails and this f
132a0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
132b0 6c 65 61 76 69 6e 67 0a 20 20 2a 2a 20 77 73 46  leaving.  ** wsF
132c0 6c 61 67 73 20 69 6e 20 61 6e 20 75 6e 69 6e 69  lags in an unini
132d0 74 69 61 6c 69 7a 65 64 20 73 74 61 74 65 2c 20  tialized state, 
132e0 74 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 20 62  the caller may b
132f0 65 68 61 76 65 20 75 6e 70 72 65 64 69 63 74 61  ehave unpredicta
13300 62 6c 79 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73  bly..  */.  mems
13310 65 74 28 70 43 6f 73 74 2c 20 30 2c 20 73 69 7a  et(pCost, 0, siz
13320 65 6f 66 28 2a 70 43 6f 73 74 29 29 3b 0a 20 20  eof(*pCost));.  
13330 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c  pCost->plan.wsFl
13340 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54  ags = WHERE_VIRT
13350 55 41 4c 54 41 42 4c 45 3b 0a 0a 20 20 2f 2a 20  UALTABLE;..  /* 
13360 49 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  If the sqlite3_i
13370 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
13380 75 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ure has not been
13390 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20 2a 2a   previously.  **
133a0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69   allocated and i
133b0 6e 69 74 69 61 6c 69 7a 65 64 2c 20 74 68 65 6e  nitialized, then
133c0 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e   allocate and in
133d0 69 74 69 61 6c 69 7a 65 20 69 74 20 6e 6f 77 2e  itialize it now.
133e0 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f  .  */.  pIdxInfo
133f0 20 3d 20 2a 70 70 49 64 78 49 6e 66 6f 3b 0a 20   = *ppIdxInfo;. 
13400 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30   if( pIdxInfo==0
13410 20 29 7b 0a 20 20 20 20 2a 70 70 49 64 78 49 6e   ){.    *ppIdxIn
13420 66 6f 20 3d 20 70 49 64 78 49 6e 66 6f 20 3d 20  fo = pIdxInfo = 
13430 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66  allocateIndexInf
13440 6f 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70  o(pParse, pWC, p
13450 53 72 63 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  Src, pOrderBy);.
13460 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78 49 6e    }.  if( pIdxIn
13470 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  fo==0 ){.    ret
13480 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  urn;.  }..  /* A
13490 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  t this point, th
134a0 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
134b0 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  info structure t
134c0 68 61 74 20 70 49 64 78 49 6e 66 6f 20 70 6f 69  hat pIdxInfo poi
134d0 6e 74 73 0a 20 20 2a 2a 20 74 6f 20 77 69 6c 6c  nts.  ** to will
134e0 20 68 61 76 65 20 62 65 65 6e 20 69 6e 69 74 69   have been initi
134f0 61 6c 69 7a 65 64 2c 20 65 69 74 68 65 72 20 64  alized, either d
13500 75 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  uring the curren
13510 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 72 0a  t invocation or.
13520 20 20 2a 2a 20 64 75 72 69 6e 67 20 73 6f 6d 65    ** during some
13530 20 70 72 69 6f 72 20 69 6e 76 6f 63 61 74 69 6f   prior invocatio
13540 6e 2e 20 20 4e 6f 77 20 77 65 20 6a 75 73 74 20  n.  Now we just 
13550 68 61 76 65 20 74 6f 20 63 75 73 74 6f 6d 69 7a  have to customiz
13560 65 20 74 68 65 0a 20 20 2a 2a 20 64 65 74 61 69  e the.  ** detai
13570 6c 73 20 6f 66 20 70 49 64 78 49 6e 66 6f 20 66  ls of pIdxInfo f
13580 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  or the current i
13590 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20 70 61  nvocation and pa
135a0 73 73 20 69 74 20 74 6f 0a 20 20 2a 2a 20 78 42  ss it to.  ** xB
135b0 65 73 74 49 6e 64 65 78 2e 0a 20 20 2a 2f 0a 0a  estIndex..  */..
135c0 20 20 2f 2a 20 54 68 65 20 6d 6f 64 75 6c 65 20    /* The module 
135d0 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 64 65 66  name must be def
135e0 69 6e 65 64 2e 20 41 6c 73 6f 2c 20 62 79 20 74  ined. Also, by t
135f0 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20  his point there 
13600 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 61 20 70  must.  ** be a p
13610 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
13620 69 74 65 33 5f 76 74 61 62 20 73 74 72 75 63 74  ite3_vtab struct
13630 75 72 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20  ure. Otherwise. 
13640 20 2a 2a 20 73 71 6c 69 74 65 33 56 69 65 77 47   ** sqlite3ViewG
13650 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20  etColumnNames() 
13660 77 6f 75 6c 64 20 68 61 76 65 20 70 69 63 6b 65  would have picke
13670 64 20 75 70 20 74 68 65 20 65 72 72 6f 72 2e 20  d up the error. 
13680 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
13690 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72  pTab->azModuleAr
136a0 67 20 26 26 20 70 54 61 62 2d 3e 61 7a 4d 6f 64  g && pTab->azMod
136b0 75 6c 65 41 72 67 5b 30 5d 20 29 3b 0a 20 20 61  uleArg[0] );.  a
136c0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 47 65  ssert( sqlite3Ge
136d0 74 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  tVTable(pParse->
136e0 64 62 2c 20 70 54 61 62 29 20 29 3b 0a 0a 20 20  db, pTab) );..  
136f0 2f 2a 20 53 65 74 20 74 68 65 20 61 43 6f 6e 73  /* Set the aCons
13700 74 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c 65 20  traint[].usable 
13710 66 69 65 6c 64 73 20 61 6e 64 20 69 6e 69 74 69  fields and initi
13720 61 6c 69 7a 65 20 61 6c 6c 20 0a 20 20 2a 2a 20  alize all .  ** 
13730 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  output variables
13740 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20   to zero..  **. 
13750 20 2a 2a 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b   ** aConstraint[
13760 5d 2e 75 73 61 62 6c 65 20 69 73 20 74 72 75 65  ].usable is true
13770 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73   for constraints
13780 20 77 68 65 72 65 20 74 68 65 20 72 69 67 68 74   where the right
13790 2d 68 61 6e 64 0a 20 20 2a 2a 20 73 69 64 65 20  -hand.  ** side 
137a0 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 72 65  contains only re
137b0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62 6c  ferences to tabl
137c0 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  es to the left o
137d0 66 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  f the current.  
137e0 2a 2a 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74  ** table.  In ot
137f0 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68  her words, if th
13800 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  e constraint is 
13810 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a  of the form:.  *
13820 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  *.  **          
13830 20 63 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 0a 20   column = expr. 
13840 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 77 65 20   **.  ** and we 
13850 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 61  are evaluating a
13860 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68 65 20   join, then the 
13870 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 63 6f  constraint on co
13880 6c 75 6d 6e 20 69 73 20 0a 20 20 2a 2a 20 6f 6e  lumn is .  ** on
13890 6c 79 20 76 61 6c 69 64 20 69 66 20 61 6c 6c 20  ly valid if all 
138a0 74 61 62 6c 65 73 20 72 65 66 65 72 65 6e 63 65  tables reference
138b0 64 20 69 6e 20 65 78 70 72 20 6f 63 63 75 72 20  d in expr occur 
138c0 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20 2a 2a  to the left.  **
138d0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f   of the table co
138e0 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2e  ntaining column.
138f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 61  .  **.  ** The a
13900 43 6f 6e 73 74 72 61 69 6e 74 73 5b 5d 20 61 72  Constraints[] ar
13910 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74  ray contains ent
13920 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6e  ries for all con
13930 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 6f 6e  straints.  ** on
13940 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
13950 6c 65 2e 20 20 54 68 61 74 20 77 61 79 20 77 65  le.  That way we
13960 20 6f 6e 6c 79 20 68 61 76 65 20 74 6f 20 63 6f   only have to co
13970 6d 70 75 74 65 20 69 74 20 6f 6e 63 65 0a 20 20  mpute it once.  
13980 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20 77  ** even though w
13990 65 20 6d 69 67 68 74 20 74 72 79 20 74 6f 20 70  e might try to p
139a0 69 63 6b 20 74 68 65 20 62 65 73 74 20 69 6e 64  ick the best ind
139b0 65 78 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  ex multiple time
139c0 73 2e 0a 20 20 2a 2a 20 46 6f 72 20 65 61 63 68  s..  ** For each
139d0 20 61 74 74 65 6d 70 74 20 61 74 20 70 69 63 6b   attempt at pick
139e0 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20 74 68  ing an index, th
139f0 65 20 6f 72 64 65 72 20 6f 66 20 74 61 62 6c 65  e order of table
13a00 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 6a 6f  s in the.  ** jo
13a10 69 6e 20 6d 69 67 68 74 20 62 65 20 64 69 66 66  in might be diff
13a20 65 72 65 6e 74 20 73 6f 20 77 65 20 68 61 76 65  erent so we have
13a30 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68   to recompute th
13a40 65 20 75 73 61 62 6c 65 20 66 6c 61 67 0a 20 20  e usable flag.  
13a50 2a 2a 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20  ** each time..  
13a60 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  */.  pIdxCons = 
13a70 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
13a80 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
13a90 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
13aa0 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 70 55  Constraint;.  pU
13ab0 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d  sage = pIdxInfo-
13ac0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
13ad0 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  e;.  for(i=0; i<
13ae0 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
13af0 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78  raint; i++, pIdx
13b00 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 6a 20 3d  Cons++){.    j =
13b10 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d   pIdxCons->iTerm
13b20 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 54 65 72  Offset;.    pTer
13b30 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a  m = &pWC->a[j];.
13b40 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73      pIdxCons->us
13b50 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e 70  able = (pTerm->p
13b60 72 65 72 65 71 52 69 67 68 74 26 6e 6f 74 52 65  rereqRight&notRe
13b70 61 64 79 29 20 3f 20 30 20 3a 20 31 3b 0a 20 20  ady) ? 0 : 1;.  
13b80 7d 0a 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67  }.  memset(pUsag
13b90 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73  e, 0, sizeof(pUs
13ba0 61 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f  age[0])*pIdxInfo
13bb0 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a  ->nConstraint);.
13bc0 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e    if( pIdxInfo->
13bd0 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
13be0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
13bf0 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69  free(pIdxInfo->i
13c00 64 78 53 74 72 29 3b 0a 20 20 7d 0a 20 20 70 49  dxStr);.  }.  pI
13c10 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d  dxInfo->idxStr =
13c20 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   0;.  pIdxInfo->
13c30 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 70 49  idxNum = 0;.  pI
13c40 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
13c50 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  eeIdxStr = 0;.  
13c60 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
13c70 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20  yConsumed = 0;. 
13c80 20 2f 2a 20 28 28 64 6f 75 62 6c 65 29 32 29 20   /* ((double)2) 
13c90 49 6e 20 63 61 73 65 20 6f 66 20 53 51 4c 49 54  In case of SQLIT
13ca0 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
13cb0 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 70 49  POINT... */.  pI
13cc0 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
13cd0 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42  dCost = SQLITE_B
13ce0 49 47 5f 44 42 4c 20 2f 20 28 28 64 6f 75 62 6c  IG_DBL / ((doubl
13cf0 65 29 32 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79  e)2);.  nOrderBy
13d00 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72   = pIdxInfo->nOr
13d10 64 65 72 42 79 3b 0a 20 20 69 66 28 20 21 70 4f  derBy;.  if( !pO
13d20 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 70 49  rderBy ){.    pI
13d30 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
13d40 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28   = 0;.  }..  if(
13d50 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 70   vtabBestIndex(p
13d60 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 49 64  Parse, pTab, pId
13d70 78 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 72 65  xInfo) ){.    re
13d80 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 70 49 64  turn;.  }..  pId
13d90 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74  xCons = *(struct
13da0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
13db0 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
13dc0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
13dd0 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  nt;.  for(i=0; i
13de0 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  <pIdxInfo->nCons
13df0 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  traint; i++){.  
13e00 20 20 69 66 28 20 70 55 73 61 67 65 5b 69 5d 2e    if( pUsage[i].
13e10 61 72 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20  argvIndex>0 ){. 
13e20 20 20 20 20 20 70 43 6f 73 74 2d 3e 75 73 65 64       pCost->used
13e30 20 7c 3d 20 70 57 43 2d 3e 61 5b 70 49 64 78 43   |= pWC->a[pIdxC
13e40 6f 6e 73 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73  ons[i].iTermOffs
13e50 65 74 5d 2e 70 72 65 72 65 71 52 69 67 68 74 3b  et].prereqRight;
13e60 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
13e70 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
13e80 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
13e90 20 61 6e 64 20 74 68 65 20 73 65 6c 65 63 74 65   and the selecte
13ea0 64 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  d virtual table 
13eb0 69 6e 64 65 78 0a 20 20 2a 2a 20 64 6f 65 73 20  index.  ** does 
13ec0 6e 6f 74 20 73 61 74 69 73 66 79 20 69 74 2c 20  not satisfy it, 
13ed0 69 6e 63 72 65 61 73 65 20 74 68 65 20 63 6f 73  increase the cos
13ee0 74 20 6f 66 20 74 68 65 20 73 63 61 6e 20 61 63  t of the scan ac
13ef0 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68 69 73 0a  cordingly. This.
13f00 20 20 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65    ** matches the
13f10 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
13f20 6e 6f 6e 2d 76 69 72 74 75 61 6c 20 74 61 62 6c  non-virtual tabl
13f30 65 73 20 69 6e 20 62 65 73 74 42 74 72 65 65 49  es in bestBtreeI
13f40 6e 64 65 78 28 29 2e 0a 20 20 2a 2f 0a 20 20 72  ndex()..  */.  r
13f50 43 6f 73 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d  Cost = pIdxInfo-
13f60 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3b 0a  >estimatedCost;.
13f70 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 26    if( pOrderBy &
13f80 26 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65  & pIdxInfo->orde
13f90 72 42 79 43 6f 6e 73 75 6d 65 64 3d 3d 30 20 29  rByConsumed==0 )
13fa0 7b 0a 20 20 20 20 72 43 6f 73 74 20 2b 3d 20 65  {.    rCost += e
13fb0 73 74 4c 6f 67 28 72 43 6f 73 74 29 2a 72 43 6f  stLog(rCost)*rCo
13fc0 73 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  st;.  }..  /* Th
13fd0 65 20 63 6f 73 74 20 69 73 20 6e 6f 74 20 61 6c  e cost is not al
13fe0 6c 6f 77 65 64 20 74 6f 20 62 65 20 6c 61 72 67  lowed to be larg
13ff0 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42  er than SQLITE_B
14000 49 47 5f 44 42 4c 20 28 74 68 65 0a 20 20 2a 2a  IG_DBL (the.  **
14010 20 69 6e 69 74 61 6c 20 76 61 6c 75 65 20 6f 66   inital value of
14020 20 6c 6f 77 65 73 74 43 6f 73 74 20 69 6e 20 74   lowestCost in t
14030 68 69 73 20 6c 6f 6f 70 2e 20 49 66 20 69 74 20  his loop. If it 
14040 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a  is, then the.  *
14050 2a 20 28 63 6f 73 74 3c 6c 6f 77 65 73 74 43 6f  * (cost<lowestCo
14060 73 74 29 20 74 65 73 74 20 62 65 6c 6f 77 20 77  st) test below w
14070 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 74 72 75  ill never be tru
14080 65 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 55 73  e..  ** .  ** Us
14090 65 20 22 28 64 6f 75 62 6c 65 29 32 22 20 69 6e  e "(double)2" in
140a0 73 74 65 61 64 20 6f 66 20 22 32 2e 30 22 20 69  stead of "2.0" i
140b0 6e 20 63 61 73 65 20 4f 4d 49 54 5f 46 4c 4f 41  n case OMIT_FLOA
140c0 54 49 4e 47 5f 50 4f 49 4e 54 20 0a 20 20 2a 2a  TING_POINT .  **
140d0 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 20 20 2a   is defined..  *
140e0 2f 0a 20 20 69 66 28 20 28 53 51 4c 49 54 45 5f  /.  if( (SQLITE_
140f0 42 49 47 5f 44 42 4c 2f 28 28 64 6f 75 62 6c 65  BIG_DBL/((double
14100 29 32 29 29 3c 72 43 6f 73 74 20 29 7b 0a 20 20  )2))<rCost ){.  
14110 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d    pCost->rCost =
14120 20 28 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c   (SQLITE_BIG_DBL
14130 2f 28 28 64 6f 75 62 6c 65 29 32 29 29 3b 0a 20  /((double)2));. 
14140 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 73   }else{.    pCos
14150 74 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73 74  t->rCost = rCost
14160 3b 0a 20 20 7d 0a 20 20 70 43 6f 73 74 2d 3e 70  ;.  }.  pCost->p
14170 6c 61 6e 2e 75 2e 70 56 74 61 62 49 64 78 20 3d  lan.u.pVtabIdx =
14180 20 70 49 64 78 49 6e 66 6f 3b 0a 20 20 69 66 28   pIdxInfo;.  if(
14190 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72   pIdxInfo->order
141a0 42 79 43 6f 6e 73 75 6d 65 64 20 29 7b 0a 20 20  ByConsumed ){.  
141b0 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73    pCost->plan.ws
141c0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f  Flags |= WHERE_O
141d0 52 44 45 52 42 59 3b 0a 20 20 7d 0a 20 20 70 43  RDERBY;.  }.  pC
141e0 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20  ost->plan.nEq = 
141f0 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e  0;.  pIdxInfo->n
14200 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72  OrderBy = nOrder
14210 42 79 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f  By;..  /* Try to
14220 20 66 69 6e 64 20 61 20 6d 6f 72 65 20 65 66 66   find a more eff
14230 69 63 69 65 6e 74 20 61 63 63 65 73 73 20 70 61  icient access pa
14240 74 74 65 72 6e 20 62 79 20 75 73 69 6e 67 20 6d  ttern by using m
14250 75 6c 74 69 70 6c 65 20 69 6e 64 65 78 65 73 0a  ultiple indexes.
14260 20 20 2a 2a 20 74 6f 20 6f 70 74 69 6d 69 7a 65    ** to optimize
14270 20 61 6e 20 4f 52 20 65 78 70 72 65 73 73 69 6f   an OR expressio
14280 6e 20 77 69 74 68 69 6e 20 74 68 65 20 57 48 45  n within the WHE
14290 52 45 20 63 6c 61 75 73 65 2e 20 0a 20 20 2a 2f  RE clause. .  */
142a0 0a 20 20 62 65 73 74 4f 72 43 6c 61 75 73 65 49  .  bestOrClauseI
142b0 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 57 43  ndex(pParse, pWC
142c0 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79  , pSrc, notReady
142d0 2c 20 6e 6f 74 56 61 6c 69 64 2c 20 70 4f 72 64  , notValid, pOrd
142e0 65 72 42 79 2c 20 70 43 6f 73 74 29 3b 0a 7d 0a  erBy, pCost);.}.
142f0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
14300 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
14310 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 72 67  LE */../*.** Arg
14320 75 6d 65 6e 74 20 70 49 64 78 20 69 73 20 61 20  ument pIdx is a 
14330 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
14340 64 65 78 20 73 74 72 75 63 74 75 72 65 20 74 68  dex structure th
14350 61 74 20 68 61 73 20 61 6e 20 61 72 72 61 79 20  at has an array 
14360 6f 66 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4e 44  of.** SQLITE_IND
14370 45 58 5f 53 41 4d 50 4c 45 53 20 65 76 65 6e 6c  EX_SAMPLES evenl
14380 79 20 73 70 61 63 65 64 20 73 61 6d 70 6c 65 73  y spaced samples
14390 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 69 6e   of the first in
143a0 64 65 78 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  dexed column.** 
143b0 73 74 6f 72 65 64 20 69 6e 20 49 6e 64 65 78 2e  stored in Index.
143c0 61 53 61 6d 70 6c 65 2e 20 54 68 65 20 64 6f 6d  aSample. The dom
143d0 61 69 6e 20 6f 66 20 76 61 6c 75 65 73 20 73 74  ain of values st
143e0 6f 72 65 64 20 69 6e 20 73 61 69 64 20 63 6f 6c  ored in said col
143f0 75 6d 6e 0a 2a 2a 20 6d 61 79 20 62 65 20 74 68  umn.** may be th
14400 6f 75 67 68 74 20 6f 66 20 61 73 20 64 69 76 69  ought of as divi
14410 64 65 64 20 69 6e 74 6f 20 28 53 51 4c 49 54 45  ded into (SQLITE
14420 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 2b 31  _INDEX_SAMPLES+1
14430 29 20 72 65 67 69 6f 6e 73 2e 0a 2a 2a 20 52 65  ) regions..** Re
14440 67 69 6f 6e 20 30 20 63 6f 6e 74 61 69 6e 73 20  gion 0 contains 
14450 61 6c 6c 20 76 61 6c 75 65 73 20 73 6d 61 6c 6c  all values small
14460 65 72 20 74 68 61 6e 20 74 68 65 20 66 69 72 73  er than the firs
14470 74 20 73 61 6d 70 6c 65 20 76 61 6c 75 65 2e 20  t sample value. 
14480 52 65 67 69 6f 6e 0a 2a 2a 20 31 20 63 6f 6e 74  Region.** 1 cont
14490 61 69 6e 73 20 76 61 6c 75 65 73 20 6c 61 72 67  ains values larg
144a0 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
144b0 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66   to the value of
144c0 20 74 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c   the first sampl
144d0 65 2c 0a 2a 2a 20 62 75 74 20 73 6d 61 6c 6c 65  e,.** but smalle
144e0 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75 65  r than the value
144f0 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 2e 20   of the second. 
14500 41 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 0a 2a 2a  And so on..**.**
14510 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
14520 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65  this function de
14530 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 6f  termines which o
14540 66 20 74 68 65 20 72 65 67 69 6f 6e 73 20 76 61  f the regions va
14550 6c 75 65 20 0a 2a 2a 20 70 56 61 6c 20 6c 69 65  lue .** pVal lie
14560 73 20 69 6e 2c 20 73 65 74 73 20 2a 70 69 52 65  s in, sets *piRe
14570 67 69 6f 6e 20 74 6f 20 74 68 65 20 72 65 67 69  gion to the regi
14580 6f 6e 20 69 6e 64 65 78 20 28 61 20 76 61 6c 75  on index (a valu
14590 65 20 62 65 74 77 65 65 6e 20 30 0a 2a 2a 20 61  e between 0.** a
145a0 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  nd SQLITE_INDEX_
145b0 53 41 4d 50 4c 45 53 2b 31 2c 20 69 6e 63 6c 75  SAMPLES+1, inclu
145c0 73 69 76 65 29 20 61 6e 64 20 72 65 74 75 72 6e  sive) and return
145d0 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  s SQLITE_OK..** 
145e0 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 6f 63  Or, if an OOM oc
145f0 63 75 72 73 20 77 68 69 6c 65 20 63 6f 6e 76 65  curs while conve
14600 72 74 69 6e 67 20 74 65 78 74 20 76 61 6c 75 65  rting text value
14610 73 20 62 65 74 77 65 65 6e 20 65 6e 63 6f 64 69  s between encodi
14620 6e 67 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  ngs,.** SQLITE_N
14630 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
14640 20 61 6e 64 20 2a 70 69 52 65 67 69 6f 6e 20 69   and *piRegion i
14650 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  s undefined..*/.
14660 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
14670 41 42 4c 45 5f 53 54 41 54 32 0a 73 74 61 74 69  ABLE_STAT2.stati
14680 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65  c int whereRange
14690 52 65 67 69 6f 6e 28 0a 20 20 50 61 72 73 65 20  Region(.  Parse 
146a0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
146b0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
146c0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
146d0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
146e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
146f0 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64   Index to consid
14700 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a  er domain of */.
14710 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
14720 2a 70 56 61 6c 2c 20 20 20 20 20 20 20 20 2f 2a  *pVal,        /*
14730 20 56 61 6c 75 65 20 74 6f 20 63 6f 6e 73 69 64   Value to consid
14740 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 52  er */.  int *piR
14750 65 67 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20  egion           
14760 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 67 69      /* OUT: Regi
14770 6f 6e 20 6f 66 20 64 6f 6d 61 69 6e 20 69 6e 20  on of domain in 
14780 77 68 69 63 68 20 76 61 6c 75 65 20 6c 69 65 73  which value lies
14790 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 41 4c 57   */.){.  if( ALW
147a0 41 59 53 28 70 56 61 6c 29 20 29 7b 0a 20 20 20  AYS(pVal) ){.   
147b0 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53   IndexSample *aS
147c0 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53  ample = pIdx->aS
147d0 61 6d 70 6c 65 3b 0a 20 20 20 20 69 6e 74 20 69  ample;.    int i
147e0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 65 54   = 0;.    int eT
147f0 79 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ype = sqlite3_va
14800 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3b 0a  lue_type(pVal);.
14810 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
14820 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 7c  SQLITE_INTEGER |
14830 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
14840 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 64  FLOAT ){.      d
14850 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65  ouble r = sqlite
14860 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 70  3_value_double(p
14870 56 61 6c 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  Val);.      for(
14880 69 3d 30 3b 20 69 3c 53 51 4c 49 54 45 5f 49 4e  i=0; i<SQLITE_IN
14890 44 45 58 5f 53 41 4d 50 4c 45 53 3b 20 69 2b 2b  DEX_SAMPLES; i++
148a0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
148b0 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d  Sample[i].eType=
148c0 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 63  =SQLITE_NULL ) c
148d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
148e0 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e   if( aSample[i].
148f0 65 54 79 70 65 3e 3d 53 51 4c 49 54 45 5f 54 45  eType>=SQLITE_TE
14900 58 54 20 7c 7c 20 61 53 61 6d 70 6c 65 5b 69 5d  XT || aSample[i]
14910 2e 75 2e 72 3e 72 20 29 20 62 72 65 61 6b 3b 0a  .u.r>r ) break;.
14920 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
14930 65 7b 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e{ .      sqlite
14940 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
14950 64 62 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  db;.      CollSe
14960 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  q *pColl;.      
14970 63 6f 6e 73 74 20 75 38 20 2a 7a 3b 0a 20 20 20  const u8 *z;.   
14980 20 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 20 20 20     int n;..     
14990 20 2f 2a 20 70 56 61 6c 20 63 6f 6d 65 73 20 66   /* pVal comes f
149a0 72 6f 6d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  rom sqlite3Value
149b0 46 72 6f 6d 45 78 70 72 28 29 20 73 6f 20 74 68  FromExpr() so th
149c0 65 20 74 79 70 65 20 63 61 6e 6e 6f 74 20 62 65  e type cannot be
149d0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 61   NULL */.      a
149e0 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51  ssert( eType==SQ
149f0 4c 49 54 45 5f 54 45 58 54 20 7c 7c 20 65 54 79  LITE_TEXT || eTy
14a00 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20  pe==SQLITE_BLOB 
14a10 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 65 54  );..      if( eT
14a20 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42  ype==SQLITE_BLOB
14a30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20   ){.        z = 
14a40 28 63 6f 6e 73 74 20 75 38 20 2a 29 73 71 6c 69  (const u8 *)sqli
14a50 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70  te3_value_blob(p
14a60 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 70 43  Val);.        pC
14a70 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
14a80 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73  oll;.        ass
14a90 65 72 74 28 20 70 43 6f 6c 6c 2d 3e 65 6e 63 3d  ert( pColl->enc=
14aa0 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29 3b 0a  =SQLITE_UTF8 );.
14ab0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14ac0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
14ad0 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 64  ite3GetCollSeq(d
14ae0 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  b, SQLITE_UTF8, 
14af0 30 2c 20 2a 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  0, *pIdx->azColl
14b00 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
14b10 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Coll==0 ){.     
14b20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
14b30 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
14b40 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20   such collation 
14b50 73 65 71 75 65 6e 63 65 3a 20 25 73 22 2c 0a 20  sequence: %s",. 
14b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b70 20 20 20 20 20 20 20 20 20 2a 70 49 64 78 2d 3e           *pIdx->
14b80 61 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20  azColl);.       
14b90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14ba0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
14bb0 7d 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 28 63  }.        z = (c
14bc0 6f 6e 73 74 20 75 38 20 2a 29 73 71 6c 69 74 65  onst u8 *)sqlite
14bd0 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c  3ValueText(pVal,
14be0 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20   pColl->enc);.  
14bf0 20 20 20 20 20 20 69 66 28 20 21 7a 20 29 7b 0a        if( !z ){.
14c00 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
14c10 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
14c20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14c30 20 61 73 73 65 72 74 28 20 7a 20 26 26 20 70 43   assert( z && pC
14c40 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43  oll && pColl->xC
14c50 6d 70 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mp );.      }.  
14c60 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 56      n = sqlite3V
14c70 61 6c 75 65 42 79 74 65 73 28 70 56 61 6c 2c 20  alueBytes(pVal, 
14c80 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 0a 20 20  pColl->enc);..  
14c90 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53      for(i=0; i<S
14ca0 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50  QLITE_INDEX_SAMP
14cb0 4c 45 53 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  LES; i++){.     
14cc0 20 20 20 69 6e 74 20 72 3b 0a 20 20 20 20 20 20     int r;.      
14cd0 20 20 69 6e 74 20 65 53 61 6d 70 6c 65 74 79 70    int eSampletyp
14ce0 65 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65  e = aSample[i].e
14cf0 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Type;.        if
14d00 28 20 65 53 61 6d 70 6c 65 74 79 70 65 3d 3d 53  ( eSampletype==S
14d10 51 4c 49 54 45 5f 4e 55 4c 4c 20 7c 7c 20 65 53  QLITE_NULL || eS
14d20 61 6d 70 6c 65 74 79 70 65 3c 65 54 79 70 65 20  ampletype<eType 
14d30 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
14d40 20 20 20 20 69 66 28 20 28 65 53 61 6d 70 6c 65      if( (eSample
14d50 74 79 70 65 21 3d 65 54 79 70 65 29 20 29 20 62  type!=eType) ) b
14d60 72 65 61 6b 3b 0a 23 69 66 6e 64 65 66 20 53 51  reak;.#ifndef SQ
14d70 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
14d80 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
14d90 6c 2d 3e 65 6e 63 21 3d 53 51 4c 49 54 45 5f 55  l->enc!=SQLITE_U
14da0 54 46 38 20 29 7b 0a 20 20 20 20 20 20 20 20 20  TF8 ){.         
14db0 20 69 6e 74 20 6e 53 61 6d 70 6c 65 3b 0a 20 20   int nSample;.  
14dc0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53          char *zS
14dd0 61 6d 70 6c 65 20 3d 20 73 71 6c 69 74 65 33 55  ample = sqlite3U
14de0 74 66 38 74 6f 31 36 28 0a 20 20 20 20 20 20 20  tf8to16(.       
14df0 20 20 20 20 20 20 20 64 62 2c 20 70 43 6f 6c 6c         db, pColl
14e00 2d 3e 65 6e 63 2c 20 61 53 61 6d 70 6c 65 5b 69  ->enc, aSample[i
14e10 5d 2e 75 2e 7a 2c 20 61 53 61 6d 70 6c 65 5b 69  ].u.z, aSample[i
14e20 5d 2e 6e 42 79 74 65 2c 20 26 6e 53 61 6d 70 6c  ].nByte, &nSampl
14e30 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  e.          );. 
14e40 20 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 53           if( !zS
14e50 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  ample ){.       
14e60 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
14e70 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
14e80 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
14e90 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
14ea0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
14eb0 20 20 20 20 20 20 20 20 72 20 3d 20 70 43 6f 6c          r = pCol
14ec0 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70  l->xCmp(pColl->p
14ed0 55 73 65 72 2c 20 6e 53 61 6d 70 6c 65 2c 20 7a  User, nSample, z
14ee0 53 61 6d 70 6c 65 2c 20 6e 2c 20 7a 29 3b 0a 20  Sample, n, z);. 
14ef0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14f00 44 62 46 72 65 65 28 64 62 2c 20 7a 53 61 6d 70  DbFree(db, zSamp
14f10 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  le);.        }el
14f20 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
14f30 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72 20    {.          r 
14f40 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43  = pColl->xCmp(pC
14f50 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 61 53 61 6d  oll->pUser, aSam
14f60 70 6c 65 5b 69 5d 2e 6e 42 79 74 65 2c 20 61 53  ple[i].nByte, aS
14f70 61 6d 70 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 6e 2c  ample[i].u.z, n,
14f80 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   z);.        }. 
14f90 20 20 20 20 20 20 20 69 66 28 20 72 3e 30 20 29         if( r>0 )
14fa0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
14fb0 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
14fc0 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 53 51  t( i>=0 && i<=SQ
14fd0 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c  LITE_INDEX_SAMPL
14fe0 45 53 20 29 3b 0a 20 20 20 20 2a 70 69 52 65 67  ES );.    *piReg
14ff0 69 6f 6e 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 72  ion = i;.  }.  r
15000 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15010 0a 7d 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20 23  .}.#endif   /* #
15020 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
15030 42 4c 45 5f 53 54 41 54 32 20 2a 2f 0a 0a 2f 2a  BLE_STAT2 */../*
15040 0a 2a 2a 20 49 66 20 65 78 70 72 65 73 73 69 6f  .** If expressio
15050 6e 20 70 45 78 70 72 20 72 65 70 72 65 73 65 6e  n pExpr represen
15060 74 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c  ts a literal val
15070 75 65 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 70  ue, set *pp to p
15080 6f 69 6e 74 20 74 6f 0a 2a 2a 20 61 6e 20 73 71  oint to.** an sq
15090 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75  lite3_value stru
150a0 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67  cture containing
150b0 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2c   the same value,
150c0 20 77 69 74 68 20 61 66 66 69 6e 69 74 79 0a 2a   with affinity.*
150d0 2a 20 61 66 66 20 61 70 70 6c 69 65 64 20 74 6f  * aff applied to
150e0 20 69 74 2c 20 62 65 66 6f 72 65 20 72 65 74 75   it, before retu
150f0 72 6e 69 6e 67 2e 20 49 74 20 69 73 20 74 68 65  rning. It is the
15100 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
15110 6f 66 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65  of the .** calle
15120 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
15130 72 65 6c 65 61 73 65 20 74 68 69 73 20 73 74 72  release this str
15140 75 63 74 75 72 65 20 62 79 20 70 61 73 73 69 6e  ucture by passin
15150 67 20 69 74 20 74 6f 20 0a 2a 2a 20 73 71 6c 69  g it to .** sqli
15160 74 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a  te3ValueFree()..
15170 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
15180 72 65 6e 74 20 70 61 72 73 65 20 69 73 20 61 20  rent parse is a 
15190 72 65 63 6f 6d 70 69 6c 65 20 28 73 71 6c 69 74  recompile (sqlit
151a0 65 33 52 65 70 72 65 70 61 72 65 28 29 29 20 61  e3Reprepare()) a
151b0 6e 64 20 70 45 78 70 72 0a 2a 2a 20 69 73 20 61  nd pExpr.** is a
151c0 6e 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20 74  n SQL variable t
151d0 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 68 61  hat currently ha
151e0 73 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c  s a non-NULL val
151f0 75 65 20 62 6f 75 6e 64 20 74 6f 20 69 74 2c 0a  ue bound to it,.
15200 2a 2a 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c  ** create an sql
15210 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63  ite3_value struc
15220 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ture containing 
15230 74 68 69 73 20 76 61 6c 75 65 2c 20 61 67 61 69  this value, agai
15240 6e 20 77 69 74 68 0a 2a 2a 20 61 66 66 69 6e 69  n with.** affini
15250 74 79 20 61 66 66 20 61 70 70 6c 69 65 64 20 74  ty aff applied t
15260 6f 20 69 74 2c 20 69 6e 73 74 65 61 64 2e 0a 2a  o it, instead..*
15270 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20  *.** If neither 
15280 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 70 70  of the above app
15290 6c 79 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 4e  ly, set *pp to N
152a0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ULL..**.** If an
152b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
152c0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
152d0 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ode. Otherwise, 
152e0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 23 69  SQLITE_OK..*/.#i
152f0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
15300 4c 45 5f 53 54 41 54 32 0a 73 74 61 74 69 63 20  LE_STAT2.static 
15310 69 6e 74 20 76 61 6c 75 65 46 72 6f 6d 45 78 70  int valueFromExp
15320 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
15330 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78  se, .  Expr *pEx
15340 70 72 2c 20 0a 20 20 75 38 20 61 66 66 2c 20 0a  pr, .  u8 aff, .
15350 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
15360 2a 2a 70 70 0a 29 7b 0a 20 20 2f 2a 20 54 68 65  **pp.){.  /* The
15370 20 65 76 61 6c 43 6f 6e 73 74 45 78 70 72 28 29   evalConstExpr()
15380 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 68   function will h
15390 61 76 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 76  ave already conv
153a0 65 72 74 65 64 20 61 6e 79 20 54 4b 5f 56 41 52  erted any TK_VAR
153b0 49 41 42 4c 45 0a 20 20 2a 2a 20 65 78 70 72 65  IABLE.  ** expre
153c0 73 73 69 6f 6e 20 69 6e 76 6f 6c 76 65 64 20 69  ssion involved i
153d0 6e 20 61 6e 20 63 6f 6d 70 61 72 69 73 6f 6e 20  n an comparison 
153e0 69 6e 74 6f 20 61 20 54 4b 5f 52 45 47 49 53 54  into a TK_REGIST
153f0 45 52 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ER. */.  assert(
15400 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 56   pExpr->op!=TK_V
15410 41 52 49 41 42 4c 45 20 29 3b 0a 20 20 69 66 28  ARIABLE );.  if(
15420 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52   pExpr->op==TK_R
15430 45 47 49 53 54 45 52 20 26 26 20 70 45 78 70 72  EGISTER && pExpr
15440 2d 3e 6f 70 32 3d 3d 54 4b 5f 56 41 52 49 41 42  ->op2==TK_VARIAB
15450 4c 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 56  LE ){.    int iV
15460 61 72 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ar = pExpr->iCol
15470 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  umn;.    sqlite3
15480 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 70  VdbeSetVarmask(p
15490 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 56  Parse->pVdbe, iV
154a0 61 72 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 32  ar); /* IMP: R-2
154b0 33 32 35 37 2d 30 32 37 37 38 20 2a 2f 0a 20 20  3257-02778 */.  
154c0 20 20 2a 70 70 20 3d 20 73 71 6c 69 74 65 33 56    *pp = sqlite3V
154d0 64 62 65 47 65 74 56 61 6c 75 65 28 70 50 61 72  dbeGetValue(pPar
154e0 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65 2c 20  se->pReprepare, 
154f0 69 56 61 72 2c 20 61 66 66 29 3b 0a 20 20 20 20  iVar, aff);.    
15500 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15510 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
15520 71 6c 69 74 65 33 56 61 6c 75 65 46 72 6f 6d 45  qlite3ValueFromE
15530 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  xpr(pParse->db, 
15540 70 45 78 70 72 2c 20 53 51 4c 49 54 45 5f 55 54  pExpr, SQLITE_UT
15550 46 38 2c 20 61 66 66 2c 20 70 70 29 3b 0a 7d 0a  F8, aff, pp);.}.
15560 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
15570 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
15580 73 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20  sed to estimate 
15590 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
155a0 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
155b0 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 73 63  visited.** by sc
155c0 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  anning an index 
155d0 66 6f 72 20 61 20 72 61 6e 67 65 20 6f 66 20 76  for a range of v
155e0 61 6c 75 65 73 2e 20 54 68 65 20 72 61 6e 67 65  alues. The range
155f0 20 6d 61 79 20 68 61 76 65 20 61 6e 20 75 70 70   may have an upp
15600 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c  er.** bound, a l
15610 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62  ower bound, or b
15620 6f 74 68 2e 20 54 68 65 20 57 48 45 52 45 20 63  oth. The WHERE c
15630 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 74  lause terms that
15640 20 73 65 74 20 74 68 65 20 75 70 70 65 72 0a 2a   set the upper.*
15650 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e  * and lower boun
15660 64 73 20 61 72 65 20 72 65 70 72 65 73 65 6e 74  ds are represent
15670 65 64 20 62 79 20 70 4c 6f 77 65 72 20 61 6e 64  ed by pLower and
15680 20 70 55 70 70 65 72 20 72 65 73 70 65 63 74 69   pUpper respecti
15690 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61  vely. For.** exa
156a0 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 74  mple, assuming t
156b0 68 61 74 20 69 6e 64 65 78 20 70 20 69 73 20 6f  hat index p is o
156c0 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20  n t1(a):.**.**  
156d0 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45   ... FROM t1 WHE
156e0 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c  RE a > ? AND a <
156f0 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20   ? ....**       
15700 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 5f 5f               |__
15710 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a  ___|   |_____|.*
15720 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
15730 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
15740 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
15750 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65             pLowe
15760 72 20 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a  r    pUpper.**.*
15770 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74  * If either of t
15780 68 65 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65  he upper or lowe
15790 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70  r bound is not p
157a0 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c  resent, then NUL
157b0 4c 20 69 73 20 70 61 73 73 65 64 20 69 6e 0a 2a  L is passed in.*
157c0 2a 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 63  * place of the c
157d0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65  orresponding Whe
157e0 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  reTerm..**.** Th
157f0 65 20 6e 45 71 20 70 61 72 61 6d 65 74 65 72 20  e nEq parameter 
15800 69 73 20 70 61 73 73 65 64 20 74 68 65 20 69 6e  is passed the in
15810 64 65 78 20 6f 66 20 74 68 65 20 69 6e 64 65 78  dex of the index
15820 20 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20   column subject 
15830 74 6f 20 74 68 65 0a 2a 2a 20 72 61 6e 67 65 20  to the.** range 
15840 63 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20  constraint. Or, 
15850 65 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68  equivalently, th
15860 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 71 75 61  e number of equa
15870 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
15880 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 20 62 79  .** optimized by
15890 20 74 68 65 20 70 72 6f 70 6f 73 65 64 20 69 6e   the proposed in
158a0 64 65 78 20 73 63 61 6e 2e 20 46 6f 72 20 65 78  dex scan. For ex
158b0 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20  ample, assuming 
158c0 69 6e 64 65 78 20 70 20 69 73 0a 2a 2a 20 6f 6e  index p is.** on
158d0 20 74 31 28 61 2c 20 62 29 2c 20 61 6e 64 20 74   t1(a, b), and t
158e0 68 65 20 53 51 4c 20 71 75 65 72 79 20 69 73 3a  he SQL query is:
158f0 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f  .**.**   ... FRO
15900 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d 20 3f  M t1 WHERE a = ?
15910 20 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20 62   AND b > ? AND b
15920 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74   < ? ....**.** t
15930 68 65 6e 20 6e 45 71 20 73 68 6f 75 6c 64 20 62  hen nEq should b
15940 65 20 70 61 73 73 65 64 20 74 68 65 20 76 61 6c  e passed the val
15950 75 65 20 31 20 28 61 73 20 74 68 65 20 72 61 6e  ue 1 (as the ran
15960 67 65 20 72 65 73 74 72 69 63 74 65 64 20 63 6f  ge restricted co
15970 6c 75 6d 6e 2c 0a 2a 2a 20 62 2c 20 69 73 20 74  lumn,.** b, is t
15980 68 65 20 73 65 63 6f 6e 64 20 6c 65 66 74 2d 6d  he second left-m
15990 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ost column of th
159a0 65 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66  e index). Or, if
159b0 20 74 68 65 20 71 75 65 72 79 20 69 73 3a 0a 2a   the query is:.*
159c0 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20  *.**   ... FROM 
159d0 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41  t1 WHERE a > ? A
159e0 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a  ND a < ? ....**.
159f0 2a 2a 20 74 68 65 6e 20 6e 45 71 20 73 68 6f 75  ** then nEq shou
15a00 6c 64 20 62 65 20 70 61 73 73 65 64 20 30 2e 0a  ld be passed 0..
15a10 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
15a20 65 64 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69  ed value is an i
15a30 6e 74 65 67 65 72 20 62 65 74 77 65 65 6e 20 31  nteger between 1
15a40 20 61 6e 64 20 31 30 30 2c 20 69 6e 63 6c 75 73   and 100, inclus
15a50 69 76 65 2e 20 41 20 72 65 74 75 72 6e 0a 2a 2a  ive. A return.**
15a60 20 76 61 6c 75 65 20 6f 66 20 31 20 69 6e 64 69   value of 1 indi
15a70 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 70  cates that the p
15a80 72 6f 70 6f 73 65 64 20 72 61 6e 67 65 20 73 63  roposed range sc
15a90 61 6e 20 69 73 20 65 78 70 65 63 74 65 64 20 74  an is expected t
15aa0 6f 20 76 69 73 69 74 0a 2a 2a 20 61 70 70 72 6f  o visit.** appro
15ab0 78 69 6d 61 74 65 6c 79 20 31 2f 31 30 30 74 68  ximately 1/100th
15ac0 20 28 31 25 29 20 6f 66 20 74 68 65 20 72 6f 77   (1%) of the row
15ad0 73 20 73 65 6c 65 63 74 65 64 20 62 79 20 74 68  s selected by th
15ae0 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79 0a 2a  e nEq equality.*
15af0 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 69  * constraints (i
15b00 66 20 61 6e 79 29 2e 20 41 20 72 65 74 75 72 6e  f any). A return
15b10 20 76 61 6c 75 65 20 6f 66 20 31 30 30 20 69 6e   value of 100 in
15b20 64 69 63 61 74 65 73 20 74 68 61 74 20 69 74 20  dicates that it 
15b30 69 73 20 65 78 70 65 63 74 65 64 0a 2a 2a 20 74  is expected.** t
15b40 68 61 74 20 74 68 65 20 72 61 6e 67 65 20 73 63  hat the range sc
15b50 61 6e 20 77 69 6c 6c 20 76 69 73 69 74 20 65 76  an will visit ev
15b60 65 72 79 20 72 6f 77 20 28 31 30 30 25 29 20 73  ery row (100%) s
15b70 65 6c 65 63 74 65 64 20 62 79 20 74 68 65 20 65  elected by the e
15b80 71 75 61 6c 69 74 79 0a 2a 2a 20 63 6f 6e 73 74  quality.** const
15b90 72 61 69 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e  raints..**.** In
15ba0 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20   the absence of 
15bb0 73 71 6c 69 74 65 5f 73 74 61 74 32 20 41 4e 41  sqlite_stat2 ANA
15bc0 4c 59 5a 45 20 64 61 74 61 2c 20 65 61 63 68 20  LYZE data, each 
15bd0 72 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74 79  range inequality
15be0 0a 2a 2a 20 72 65 64 75 63 65 73 20 74 68 65 20  .** reduces the 
15bf0 73 65 61 72 63 68 20 73 70 61 63 65 20 62 79 20  search space by 
15c00 32 2f 33 72 64 73 2e 20 20 48 65 6e 63 65 20 61  2/3rds.  Hence a
15c10 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69   single constrai
15c20 6e 74 20 28 78 3e 3f 29 0a 2a 2a 20 72 65 73 75  nt (x>?).** resu
15c30 6c 74 73 20 69 6e 20 61 20 72 65 74 75 72 6e 20  lts in a return 
15c40 6f 66 20 33 33 20 61 6e 64 20 61 20 72 61 6e 67  of 33 and a rang
15c50 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 78 3e  e constraint (x>
15c60 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65 73 75 6c  ? AND x<?) resul
15c70 74 73 0a 2a 2a 20 69 6e 20 61 20 72 65 74 75 72  ts.** in a retur
15c80 6e 20 6f 66 20 31 31 2e 0a 2a 2f 0a 73 74 61 74  n of 11..*/.stat
15c90 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67  ic int whereRang
15ca0 65 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  eScanEst(.  Pars
15cb0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
15cc0 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
15cd0 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
15ce0 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78  ntext */.  Index
15cf0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
15d00 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 63 6f 6e  /* The index con
15d10 74 61 69 6e 69 6e 67 20 74 68 65 20 72 61 6e 67  taining the rang
15d20 65 2d 63 6f 6d 70 61 72 65 64 20 63 6f 6c 75 6d  e-compared colum
15d30 6e 3b 20 22 78 22 20 2a 2f 0a 20 20 69 6e 74 20  n; "x" */.  int 
15d40 6e 45 71 2c 20 20 20 20 20 20 20 20 20 20 20 20  nEq,            
15d50 20 2f 2a 20 69 6e 64 65 78 20 69 6e 74 6f 20 70   /* index into p
15d60 2d 3e 61 43 6f 6c 5b 5d 20 6f 66 20 74 68 65 20  ->aCol[] of the 
15d70 72 61 6e 67 65 2d 63 6f 6d 70 61 72 65 64 20 63  range-compared c
15d80 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65  olumn */.  Where
15d90 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20  Term *pLower,   
15da0 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f  /* Lower bound o
15db0 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a  n the range. ex:
15dc0 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62   "x>123" Might b
15dd0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72  e NULL */.  Wher
15de0 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20  eTerm *pUpper,  
15df0 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20   /* Upper bound 
15e00 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78  on the range. ex
15e10 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20  : "x<455" Might 
15e20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
15e30 20 2a 70 69 45 73 74 20 20 20 20 20 20 20 20 20   *piEst         
15e40 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e    /* OUT: Return
15e50 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 69   value */.){.  i
15e60 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
15e70 4b 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  K;..#ifdef SQLIT
15e80 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a 0a  E_ENABLE_STAT2..
15e90 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 26 26 20    if( nEq==0 && 
15ea0 70 2d 3e 61 53 61 6d 70 6c 65 20 29 7b 0a 20 20  p->aSample ){.  
15eb0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
15ec0 2a 70 4c 6f 77 65 72 56 61 6c 20 3d 20 30 3b 0a  *pLowerVal = 0;.
15ed0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
15ee0 65 20 2a 70 55 70 70 65 72 56 61 6c 20 3d 20 30  e *pUpperVal = 0
15ef0 3b 0a 20 20 20 20 69 6e 74 20 69 45 73 74 3b 0a  ;.    int iEst;.
15f00 20 20 20 20 69 6e 74 20 69 4c 6f 77 65 72 20 3d      int iLower =
15f10 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 55 70 70   0;.    int iUpp
15f20 65 72 20 3d 20 53 51 4c 49 54 45 5f 49 4e 44 45  er = SQLITE_INDE
15f30 58 5f 53 41 4d 50 4c 45 53 3b 0a 20 20 20 20 75  X_SAMPLES;.    u
15f40 38 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c  8 aff = p->pTabl
15f50 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c  e->aCol[p->aiCol
15f60 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e 69 74 79  umn[0]].affinity
15f70 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c 6f 77 65  ;..    if( pLowe
15f80 72 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  r ){.      Expr 
15f90 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d  *pExpr = pLower-
15fa0 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
15fb0 20 20 20 20 20 20 72 63 20 3d 20 76 61 6c 75 65        rc = value
15fc0 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c  FromExpr(pParse,
15fd0 20 70 45 78 70 72 2c 20 61 66 66 2c 20 26 70 4c   pExpr, aff, &pL
15fe0 6f 77 65 72 56 61 6c 29 3b 0a 20 20 20 20 7d 0a  owerVal);.    }.
15ff0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
16000 54 45 5f 4f 4b 20 26 26 20 70 55 70 70 65 72 20  TE_OK && pUpper 
16010 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
16020 45 78 70 72 20 3d 20 70 55 70 70 65 72 2d 3e 70  Expr = pUpper->p
16030 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
16040 20 20 20 20 72 63 20 3d 20 76 61 6c 75 65 46 72      rc = valueFr
16050 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20 70  omExpr(pParse, p
16060 45 78 70 72 2c 20 61 66 66 2c 20 26 70 55 70 70  Expr, aff, &pUpp
16070 65 72 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20  erVal);.    }.. 
16080 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16090 45 5f 4f 4b 20 7c 7c 20 28 70 4c 6f 77 65 72 56  E_OK || (pLowerV
160a0 61 6c 3d 3d 30 20 26 26 20 70 55 70 70 65 72 56  al==0 && pUpperV
160b0 61 6c 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  al==0) ){.      
160c0 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
160d0 28 70 4c 6f 77 65 72 56 61 6c 29 3b 0a 20 20 20  (pLowerVal);.   
160e0 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46     sqlite3ValueF
160f0 72 65 65 28 70 55 70 70 65 72 56 61 6c 29 3b 0a  ree(pUpperVal);.
16100 20 20 20 20 20 20 67 6f 74 6f 20 72 61 6e 67 65        goto range
16110 5f 65 73 74 5f 66 61 6c 6c 62 61 63 6b 3b 0a 20  _est_fallback;. 
16120 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f     }else if( pLo
16130 77 65 72 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  werVal==0 ){.   
16140 20 20 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e     rc = whereRan
16150 67 65 52 65 67 69 6f 6e 28 70 50 61 72 73 65 2c  geRegion(pParse,
16160 20 70 2c 20 70 55 70 70 65 72 56 61 6c 2c 20 26   p, pUpperVal, &
16170 69 55 70 70 65 72 29 3b 0a 20 20 20 20 20 20 69  iUpper);.      i
16180 66 28 20 70 4c 6f 77 65 72 20 29 20 69 4c 6f 77  f( pLower ) iLow
16190 65 72 20 3d 20 69 55 70 70 65 72 2f 32 3b 0a 20  er = iUpper/2;. 
161a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 55 70     }else if( pUp
161b0 70 65 72 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  perVal==0 ){.   
161c0 20 20 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e     rc = whereRan
161d0 67 65 52 65 67 69 6f 6e 28 70 50 61 72 73 65 2c  geRegion(pParse,
161e0 20 70 2c 20 70 4c 6f 77 65 72 56 61 6c 2c 20 26   p, pLowerVal, &
161f0 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 69  iLower);.      i
16200 66 28 20 70 55 70 70 65 72 20 29 20 69 55 70 70  f( pUpper ) iUpp
16210 65 72 20 3d 20 28 69 4c 6f 77 65 72 20 2b 20 53  er = (iLower + S
16220 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50  QLITE_INDEX_SAMP
16230 4c 45 53 20 2b 20 31 29 2f 32 3b 0a 20 20 20 20  LES + 1)/2;.    
16240 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
16250 3d 20 77 68 65 72 65 52 61 6e 67 65 52 65 67 69  = whereRangeRegi
16260 6f 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70 55  on(pParse, p, pU
16270 70 70 65 72 56 61 6c 2c 20 26 69 55 70 70 65 72  pperVal, &iUpper
16280 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
16290 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
162a0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
162b0 52 61 6e 67 65 52 65 67 69 6f 6e 28 70 50 61 72  RangeRegion(pPar
162c0 73 65 2c 20 70 2c 20 70 4c 6f 77 65 72 56 61 6c  se, p, pLowerVal
162d0 2c 20 26 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20  , &iLower);.    
162e0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
162f0 45 73 74 20 3d 20 69 55 70 70 65 72 20 2d 20 69  Est = iUpper - i
16300 4c 6f 77 65 72 3b 0a 20 20 20 20 74 65 73 74 63  Lower;.    testc
16310 61 73 65 28 20 69 45 73 74 3d 3d 53 51 4c 49 54  ase( iEst==SQLIT
16320 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 20  E_INDEX_SAMPLES 
16330 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
16340 45 73 74 3c 3d 53 51 4c 49 54 45 5f 49 4e 44 45  Est<=SQLITE_INDE
16350 58 5f 53 41 4d 50 4c 45 53 20 29 3b 0a 20 20 20  X_SAMPLES );.   
16360 20 69 66 28 20 69 45 73 74 3c 31 20 29 7b 0a 20   if( iEst<1 ){. 
16370 20 20 20 20 20 69 45 73 74 20 3d 20 31 3b 0a 20       iEst = 1;. 
16380 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65     }..    sqlite
16390 33 56 61 6c 75 65 46 72 65 65 28 70 4c 6f 77 65  3ValueFree(pLowe
163a0 72 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  rVal);.    sqlit
163b0 65 33 56 61 6c 75 65 46 72 65 65 28 70 55 70 70  e3ValueFree(pUpp
163c0 65 72 56 61 6c 29 3b 0a 20 20 20 20 2a 70 69 45  erVal);.    *piE
163d0 73 74 20 3d 20 28 69 45 73 74 20 2a 20 31 30 30  st = (iEst * 100
163e0 29 2f 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53  )/SQLITE_INDEX_S
163f0 41 4d 50 4c 45 53 3b 0a 20 20 20 20 72 65 74 75  AMPLES;.    retu
16400 72 6e 20 72 63 3b 0a 20 20 7d 0a 72 61 6e 67 65  rn rc;.  }.range
16410 5f 65 73 74 5f 66 61 6c 6c 62 61 63 6b 3a 0a 23  _est_fallback:.#
16420 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
16430 52 41 4d 45 54 45 52 28 70 50 61 72 73 65 29 3b  RAMETER(pParse);
16440 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
16450 54 45 52 28 70 29 3b 0a 20 20 55 4e 55 53 45 44  TER(p);.  UNUSED
16460 5f 50 41 52 41 4d 45 54 45 52 28 6e 45 71 29 3b  _PARAMETER(nEq);
16470 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
16480 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70  ( pLower || pUpp
16490 65 72 20 29 3b 0a 20 20 69 66 28 20 70 4c 6f 77  er );.  if( pLow
164a0 65 72 20 26 26 20 70 55 70 70 65 72 20 29 7b 0a  er && pUpper ){.
164b0 20 20 20 20 2a 70 69 45 73 74 20 3d 20 31 31 3b      *piEst = 11;
164c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
164d0 69 45 73 74 20 3d 20 33 33 3b 0a 20 20 7d 0a 20  iEst = 33;.  }. 
164e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
164f0 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 71  /*.** Find the q
16500 75 65 72 79 20 70 6c 61 6e 20 66 6f 72 20 61 63  uery plan for ac
16510 63 65 73 73 69 6e 67 20 61 20 70 61 72 74 69 63  cessing a partic
16520 75 6c 61 72 20 74 61 62 6c 65 2e 20 20 57 72 69  ular table.  Wri
16530 74 65 20 74 68 65 0a 2a 2a 20 62 65 73 74 20 71  te the.** best q
16540 75 65 72 79 20 70 6c 61 6e 20 61 6e 64 20 69 74  uery plan and it
16550 73 20 63 6f 73 74 20 69 6e 74 6f 20 74 68 65 20  s cost into the 
16560 57 68 65 72 65 43 6f 73 74 20 6f 62 6a 65 63 74  WhereCost object
16570 20 73 75 70 70 6c 69 65 64 20 61 73 20 74 68 65   supplied as the
16580 0a 2a 2a 20 6c 61 73 74 20 70 61 72 61 6d 65 74  .** last paramet
16590 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 6f  er..**.** The lo
165a0 77 65 73 74 20 63 6f 73 74 20 70 6c 61 6e 20 77  west cost plan w
165b0 69 6e 73 2e 20 20 54 68 65 20 63 6f 73 74 20 69  ins.  The cost i
165c0 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  s an estimate of
165d0 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 0a 2a   the amount of.*
165e0 2a 20 43 50 55 20 61 6e 64 20 64 69 73 6b 20 49  * CPU and disk I
165f0 2f 4f 20 6e 65 65 64 20 74 6f 20 70 72 6f 63 65  /O need to proce
16600 73 73 20 74 68 65 20 72 65 71 75 65 73 74 20 75  ss the request u
16610 73 69 6e 67 20 74 68 65 20 73 65 6c 65 63 74 65  sing the selecte
16620 64 20 70 6c 61 6e 2e 0a 2a 2a 20 46 61 63 74 6f  d plan..** Facto
16630 72 73 20 74 68 61 74 20 69 6e 66 6c 75 65 6e 63  rs that influenc
16640 65 20 63 6f 73 74 20 69 6e 63 6c 75 64 65 3a 0a  e cost include:.
16650 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  **.**    *  The 
16660 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  estimated number
16670 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69   of rows that wi
16680 6c 6c 20 62 65 20 72 65 74 72 69 65 76 65 64 2e  ll be retrieved.
16690 20 20 28 54 68 65 0a 2a 2a 20 20 20 20 20 20 20    (The.**       
166a0 66 65 77 65 72 20 74 68 65 20 62 65 74 74 65 72  fewer the better
166b0 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57  .).**.**    *  W
166c0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 73 6f  hether or not so
166d0 72 74 69 6e 67 20 6d 75 73 74 20 6f 63 63 75 72  rting must occur
166e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68  ..**.**    *  Wh
166f0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
16700 72 65 20 6d 75 73 74 20 62 65 20 73 65 70 61 72  re must be separ
16710 61 74 65 20 6c 6f 6f 6b 75 70 73 20 69 6e 20 74  ate lookups in t
16720 68 65 0a 2a 2a 20 20 20 20 20 20 20 69 6e 64 65  he.**       inde
16730 78 20 61 6e 64 20 69 6e 20 74 68 65 20 6d 61 69  x and in the mai
16740 6e 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  n table..**.** I
16750 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49  f there was an I
16760 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
16770 20 28 70 53 72 63 2d 3e 70 49 6e 64 65 78 29 20   (pSrc->pIndex) 
16780 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
16790 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20  table in.** the 
167a0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  SQL statement, t
167b0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
167c0 6e 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 73  n only considers
167d0 20 70 6c 61 6e 73 20 75 73 69 6e 67 20 74 68 65   plans using the
167e0 20 0a 2a 2a 20 6e 61 6d 65 64 20 69 6e 64 65 78   .** named index
167f0 2e 20 49 66 20 6e 6f 20 73 75 63 68 20 70 6c 61  . If no such pla
16800 6e 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e  n is found, then
16810 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 63 6f   the returned co
16820 73 74 20 69 73 0a 2a 2a 20 53 51 4c 49 54 45 5f  st is.** SQLITE_
16830 42 49 47 5f 44 42 4c 2e 20 49 66 20 61 20 70 6c  BIG_DBL. If a pl
16840 61 6e 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74  an is found that
16850 20 75 73 65 73 20 74 68 65 20 6e 61 6d 65 64 20   uses the named 
16860 69 6e 64 65 78 2c 20 0a 2a 2a 20 74 68 65 6e 20  index, .** then 
16870 74 68 65 20 63 6f 73 74 20 69 73 20 63 61 6c 63  the cost is calc
16880 75 6c 61 74 65 64 20 69 6e 20 74 68 65 20 75 73  ulated in the us
16890 75 61 6c 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49  ual way..**.** I
168a0 66 20 61 20 4e 4f 54 20 49 4e 44 45 58 45 44 20  f a NOT INDEXED 
168b0 63 6c 61 75 73 65 20 28 70 53 72 63 2d 3e 6e 6f  clause (pSrc->no
168c0 74 49 6e 64 65 78 65 64 21 3d 30 29 20 77 61 73  tIndexed!=0) was
168d0 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
168e0 20 74 61 62 6c 65 20 0a 2a 2a 20 69 6e 20 74 68   table .** in th
168f0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
16900 6e 74 2c 20 74 68 65 6e 20 6e 6f 20 69 6e 64 65  nt, then no inde
16910 78 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  xes are consider
16920 65 64 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 65  ed. However, the
16930 20 0a 2a 2a 20 73 65 6c 65 63 74 65 64 20 70 6c   .** selected pl
16940 61 6e 20 6d 61 79 20 73 74 69 6c 6c 20 74 61 6b  an may still tak
16950 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74  e advantage of t
16960 68 65 20 74 61 62 6c 65 73 20 62 75 69 6c 74 2d  he tables built-
16970 69 6e 20 72 6f 77 69 64 0a 2a 2a 20 69 6e 64 65  in rowid.** inde
16980 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
16990 64 20 62 65 73 74 42 74 72 65 65 49 6e 64 65 78  d bestBtreeIndex
169a0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
169b0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
169c0 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
169d0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
169e0 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
169f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
16a00 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
16a10 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
16a20 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20  item *pSrc,  /* 
16a30 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
16a40 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a  term to search *
16a50 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
16a60 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20  eady,           
16a70 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f  /* Mask of curso
16a80 72 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  rs not available
16a90 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f   for indexing */
16aa0 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 56 61  .  Bitmask notVa
16ab0 6c 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  lid,           /
16ac0 2a 20 43 75 72 73 6f 72 73 20 6e 6f 74 20 61 76  * Cursors not av
16ad0 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6e 79 20  ailable for any 
16ae0 70 75 72 70 6f 73 65 20 2a 2f 0a 20 20 45 78 70  purpose */.  Exp
16af0 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
16b00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16b10 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
16b20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 2a  */.  WhereCost *
16b30 70 43 6f 73 74 20 20 20 20 20 20 20 20 20 20 20  pCost           
16b40 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74 20   /* Lowest cost 
16b50 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b  query plan */.){
16b60 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 53  .  int iCur = pS
16b70 72 63 2d 3e 69 43 75 72 73 6f 72 3b 20 20 20 2f  rc->iCursor;   /
16b80 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20  * The cursor of 
16b90 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
16ba0 61 63 63 65 73 73 65 64 20 2a 2f 0a 20 20 49 6e  accessed */.  In
16bb0 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20  dex *pProbe;    
16bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
16bd0 69 6e 64 65 78 20 77 65 20 61 72 65 20 65 76 61  index we are eva
16be0 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64  luating */.  Ind
16bf0 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
16c00 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79           /* Copy
16c10 20 6f 66 20 70 50 72 6f 62 65 2c 20 6f 72 20 7a   of pProbe, or z
16c20 65 72 6f 20 66 6f 72 20 49 50 4b 20 69 6e 64 65  ero for IPK inde
16c30 78 20 2a 2f 0a 20 20 69 6e 74 20 65 71 54 65 72  x */.  int eqTer
16c40 6d 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  mMask;          
16c50 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6d 61     /* Current ma
16c60 73 6b 20 6f 66 20 76 61 6c 69 64 20 65 71 75 61  sk of valid equa
16c70 6c 69 74 79 20 6f 70 65 72 61 74 6f 72 73 20 2a  lity operators *
16c80 2f 0a 20 20 69 6e 74 20 69 64 78 45 71 54 65 72  /.  int idxEqTer
16c90 6d 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  mMask;          
16ca0 2f 2a 20 49 6e 64 65 78 20 6d 61 73 6b 20 6f 66  /* Index mask of
16cb0 20 76 61 6c 69 64 20 65 71 75 61 6c 69 74 79 20   valid equality 
16cc0 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 49  operators */.  I
16cd0 6e 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20  ndex sPk;       
16ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
16cf0 66 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63  fake index objec
16d00 74 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72  t for the primar
16d10 79 20 6b 65 79 20 2a 2f 0a 20 20 75 6e 73 69 67  y key */.  unsig
16d20 6e 65 64 20 69 6e 74 20 61 69 52 6f 77 45 73 74  ned int aiRowEst
16d30 50 6b 5b 32 5d 3b 20 2f 2a 20 54 68 65 20 61 69  Pk[2]; /* The ai
16d40 52 6f 77 45 73 74 5b 5d 20 76 61 6c 75 65 20 66  RowEst[] value f
16d50 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78  or the sPk index
16d60 20 2a 2f 0a 20 20 69 6e 74 20 61 69 43 6f 6c 75   */.  int aiColu
16d70 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20  mnPk = -1;      
16d80 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e    /* The aColumn
16d90 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  [] value for the
16da0 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20   sPk index */.  
16db0 69 6e 74 20 77 73 46 6c 61 67 4d 61 73 6b 3b 20  int wsFlagMask; 
16dc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
16dd0 6c 6c 6f 77 65 64 20 66 6c 61 67 73 20 69 6e 20  llowed flags in 
16de0 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c  pCost->plan.wsFl
16df0 61 67 20 2a 2f 0a 0a 20 20 2f 2a 20 49 6e 69 74  ag */..  /* Init
16e00 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 73 74 20  ialize the cost 
16e10 74 6f 20 61 20 77 6f 72 73 74 2d 63 61 73 65 20  to a worst-case 
16e20 76 61 6c 75 65 20 2a 2f 0a 20 20 6d 65 6d 73 65  value */.  memse
16e30 74 28 70 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65  t(pCost, 0, size
16e40 6f 66 28 2a 70 43 6f 73 74 29 29 3b 0a 20 20 70  of(*pCost));.  p
16e50 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20 53 51  Cost->rCost = SQ
16e60 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 0a 20  LITE_BIG_DBL;.. 
16e70 20 2f 2a 20 49 66 20 74 68 65 20 70 53 72 63 20   /* If the pSrc 
16e80 74 61 62 6c 65 20 69 73 20 74 68 65 20 72 69 67  table is the rig
16e90 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45  ht table of a LE
16ea0 46 54 20 4a 4f 49 4e 20 74 68 65 6e 20 77 65 20  FT JOIN then we 
16eb0 6d 61 79 20 6e 6f 74 0a 20 20 2a 2a 20 75 73 65  may not.  ** use
16ec0 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 73 61 74   an index to sat
16ed0 69 73 66 79 20 49 53 20 4e 55 4c 4c 20 63 6f 6e  isfy IS NULL con
16ee0 73 74 72 61 69 6e 74 73 20 6f 6e 20 74 68 61 74  straints on that
16ef0 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73   table.  This is
16f00 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 63 6f  .  ** because co
16f10 6c 75 6d 6e 73 20 6d 69 67 68 74 20 65 6e 64 20  lumns might end 
16f20 75 70 20 62 65 69 6e 67 20 4e 55 4c 4c 20 69 66  up being NULL if
16f30 20 74 68 65 20 74 61 62 6c 65 20 64 6f 65 73 20   the table does 
16f40 6e 6f 74 20 6d 61 74 63 68 20 2d 0a 20 20 2a 2a  not match -.  **
16f50 20 61 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20   a circumstance 
16f60 77 68 69 63 68 20 74 68 65 20 69 6e 64 65 78 20  which the index 
16f70 63 61 6e 6e 6f 74 20 68 65 6c 70 20 75 73 20 64  cannot help us d
16f80 69 73 63 6f 76 65 72 2e 20 20 54 69 63 6b 65 74  iscover.  Ticket
16f90 20 23 32 31 37 37 2e 0a 20 20 2a 2f 0a 20 20 69   #2177..  */.  i
16fa0 66 28 20 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70  f( pSrc->jointyp
16fb0 65 20 26 20 4a 54 5f 4c 45 46 54 20 29 7b 0a 20  e & JT_LEFT ){. 
16fc0 20 20 20 69 64 78 45 71 54 65 72 6d 4d 61 73 6b     idxEqTermMask
16fd0 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a   = WO_EQ|WO_IN;.
16fe0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64 78    }else{.    idx
16ff0 45 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f  EqTermMask = WO_
17000 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55  EQ|WO_IN|WO_ISNU
17010 4c 4c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  LL;.  }..  if( p
17020 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20  Src->pIndex ){. 
17030 20 20 20 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44     /* An INDEXED
17040 20 42 59 20 63 6c 61 75 73 65 20 73 70 65 63 69   BY clause speci
17050 66 69 65 73 20 61 20 70 61 72 74 69 63 75 6c 61  fies a particula
17060 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 2a  r index to use *
17070 2f 0a 20 20 20 20 70 49 64 78 20 3d 20 70 50 72  /.    pIdx = pPr
17080 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64  obe = pSrc->pInd
17090 65 78 3b 0a 20 20 20 20 77 73 46 6c 61 67 4d 61  ex;.    wsFlagMa
170a0 73 6b 20 3d 20 7e 28 57 48 45 52 45 5f 52 4f 57  sk = ~(WHERE_ROW
170b0 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49  ID_EQ|WHERE_ROWI
170c0 44 5f 52 41 4e 47 45 29 3b 0a 20 20 20 20 65 71  D_RANGE);.    eq
170d0 54 65 72 6d 4d 61 73 6b 20 3d 20 69 64 78 45 71  TermMask = idxEq
170e0 54 65 72 6d 4d 61 73 6b 3b 0a 20 20 7d 65 6c 73  TermMask;.  }els
170f0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  e{.    /* There 
17100 69 73 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59  is no INDEXED BY
17110 20 63 6c 61 75 73 65 2e 20 20 43 72 65 61 74 65   clause.  Create
17120 20 61 20 66 61 6b 65 20 49 6e 64 65 78 20 6f 62   a fake Index ob
17130 6a 65 63 74 20 74 6f 0a 20 20 20 20 2a 2a 20 72  ject to.    ** r
17140 65 70 72 65 73 65 6e 74 20 74 68 65 20 70 72 69  epresent the pri
17150 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 20 20  mary key */.    
17160 49 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20  Index *pFirst;  
17170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17180 20 41 6e 79 20 6f 74 68 65 72 20 69 6e 64 65 78   Any other index
17190 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   on the table */
171a0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50 6b  .    memset(&sPk
171b0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64 65  , 0, sizeof(Inde
171c0 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 43 6f  x));.    sPk.nCo
171d0 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 73 50  lumn = 1;.    sP
171e0 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d 20 26 61 69  k.aiColumn = &ai
171f0 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20 73 50  ColumnPk;.    sP
17200 6b 2e 61 69 52 6f 77 45 73 74 20 3d 20 61 69 52  k.aiRowEst = aiR
17210 6f 77 45 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b  owEstPk;.    sPk
17220 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65  .onError = OE_Re
17230 70 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70  place;.    sPk.p
17240 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54  Table = pSrc->pT
17250 61 62 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74  ab;.    aiRowEst
17260 50 6b 5b 30 5d 20 3d 20 70 53 72 63 2d 3e 70 54  Pk[0] = pSrc->pT
17270 61 62 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20 20  ab->nRowEst;.   
17280 20 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20 3d   aiRowEstPk[1] =
17290 20 31 3b 0a 20 20 20 20 70 46 69 72 73 74 20 3d   1;.    pFirst =
172a0 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e   pSrc->pTab->pIn
172b0 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 53 72  dex;.    if( pSr
172c0 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30  c->notIndexed==0
172d0 20 29 7b 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e   ){.      sPk.pN
172e0 65 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20  ext = pFirst;.  
172f0 20 20 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d    }.    pProbe =
17300 20 26 73 50 6b 3b 0a 20 20 20 20 77 73 46 6c 61   &sPk;.    wsFla
17310 67 4d 61 73 6b 20 3d 20 7e 28 0a 20 20 20 20 20  gMask = ~(.     
17320 20 20 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f     WHERE_COLUMN_
17330 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  IN|WHERE_COLUMN_
17340 45 51 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  EQ|WHERE_COLUMN_
17350 4e 55 4c 4c 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  NULL|WHERE_COLUM
17360 4e 5f 52 41 4e 47 45 0a 20 20 20 20 29 3b 0a 20  N_RANGE.    );. 
17370 20 20 20 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20     eqTermMask = 
17380 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20 20  WO_EQ|WO_IN;.   
17390 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a   pIdx = 0;.  }..
173a0 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61    /* Loop over a
173b0 6c 6c 20 69 6e 64 69 63 65 73 20 6c 6f 6f 6b 69  ll indices looki
173c0 6e 67 20 66 6f 72 20 74 68 65 20 62 65 73 74 20  ng for the best 
173d0 6f 6e 65 20 74 6f 20 75 73 65 0a 20 20 2a 2f 0a  one to use.  */.
173e0 20 20 66 6f 72 28 3b 20 70 50 72 6f 62 65 3b 20    for(; pProbe; 
173f0 70 49 64 78 3d 70 50 72 6f 62 65 3d 70 50 72 6f  pIdx=pProbe=pPro
17400 62 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  be->pNext){.    
17410 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 69  const unsigned i
17420 6e 74 20 2a 20 63 6f 6e 73 74 20 61 69 52 6f 77  nt * const aiRow
17430 45 73 74 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  Est = pProbe->ai
17440 52 6f 77 45 73 74 3b 0a 20 20 20 20 64 6f 75 62  RowEst;.    doub
17450 6c 65 20 63 6f 73 74 3b 20 20 20 20 20 20 20 20  le cost;        
17460 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20          /* Cost 
17470 6f 66 20 75 73 69 6e 67 20 70 50 72 6f 62 65 20  of using pProbe 
17480 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 6e 52  */.    double nR
17490 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ow;             
174a0 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20     /* Estimated 
174b0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
174c0 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  n result set */.
174d0 20 20 20 20 69 6e 74 20 72 65 76 3b 20 20 20 20      int rev;    
174e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174f0 2f 2a 20 54 72 75 65 20 74 6f 20 73 63 61 6e 20  /* True to scan 
17500 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
17510 20 2a 2f 0a 20 20 20 20 69 6e 74 20 77 73 46 6c   */.    int wsFl
17520 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 42 69 74  ags = 0;.    Bit
17530 6d 61 73 6b 20 75 73 65 64 20 3d 20 30 3b 0a 0a  mask used = 0;..
17540 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
17550 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73 20 61  wing variables a
17560 72 65 20 70 6f 70 75 6c 61 74 65 64 20 62 61 73  re populated bas
17570 65 64 20 6f 6e 20 74 68 65 20 70 72 6f 70 65 72  ed on the proper
17580 74 69 65 73 20 6f 66 0a 20 20 20 20 2a 2a 20 73  ties of.    ** s
17590 63 61 6e 20 62 65 69 6e 67 20 65 76 61 6c 75 61  can being evalua
175a0 74 65 64 2e 20 54 68 65 79 20 61 72 65 20 74 68  ted. They are th
175b0 65 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  en used to deter
175c0 6d 69 6e 65 20 74 68 65 20 65 78 70 65 63 74 65  mine the expecte
175d0 64 0a 20 20 20 20 2a 2a 20 63 6f 73 74 20 61 6e  d.    ** cost an
175e0 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  d number of rows
175f0 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 2a   returned..    *
17600 2a 0a 20 20 20 20 2a 2a 20 20 6e 45 71 3a 20 0a  *.    **  nEq: .
17610 20 20 20 20 2a 2a 20 20 20 20 4e 75 6d 62 65 72      **    Number
17620 20 6f 66 20 65 71 75 61 6c 69 74 79 20 74 65 72   of equality ter
17630 6d 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 69  ms that can be i
17640 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67  mplemented using
17650 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
17660 2a 2a 0a 20 20 20 20 2a 2a 20 20 6e 49 6e 4d 75  **.    **  nInMu
17670 6c 3a 20 20 0a 20 20 20 20 2a 2a 20 20 20 20 54  l:  .    **    T
17680 68 65 20 22 69 6e 2d 6d 75 6c 74 69 70 6c 69 65  he "in-multiplie
17690 72 22 2e 20 54 68 69 73 20 69 73 20 61 6e 20 65  r". This is an e
176a0 73 74 69 6d 61 74 65 20 6f 66 20 68 6f 77 20 6d  stimate of how m
176b0 61 6e 79 20 73 65 65 6b 20 6f 70 65 72 61 74 69  any seek operati
176c0 6f 6e 73 20 0a 20 20 20 20 2a 2a 20 20 20 20 53  ons .    **    S
176d0 51 4c 69 74 65 20 6d 75 73 74 20 70 65 72 66 6f  QLite must perfo
176e0 72 6d 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 20  rm on the index 
176f0 69 6e 20 71 75 65 73 74 69 6f 6e 2e 20 46 6f 72  in question. For
17700 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
17710 20 0a 20 20 20 20 2a 2a 20 20 20 20 57 48 45 52   .    **    WHER
17720 45 20 63 6c 61 75 73 65 20 69 73 3a 0a 20 20 20  E clause is:.   
17730 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
17740 57 48 45 52 45 20 61 20 49 4e 20 28 31 2c 20 32  WHERE a IN (1, 2
17750 2c 20 33 29 20 41 4e 44 20 62 20 49 4e 20 28 34  , 3) AND b IN (4
17760 2c 20 35 2c 20 36 29 0a 20 20 20 20 2a 2a 0a 20  , 5, 6).    **. 
17770 20 20 20 2a 2a 20 20 20 20 53 51 4c 69 74 65 20     **    SQLite 
17780 6d 75 73 74 20 70 65 72 66 6f 72 6d 20 39 20 6c  must perform 9 l
17790 6f 6f 6b 75 70 73 20 6f 6e 20 61 6e 20 69 6e 64  ookups on an ind
177a0 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 73 6f  ex on (a, b), so
177b0 20 6e 49 6e 4d 75 6c 20 69 73 20 0a 20 20 20 20   nInMul is .    
177c0 2a 2a 20 20 20 20 73 65 74 20 74 6f 20 39 2e 20  **    set to 9. 
177d0 47 69 76 65 6e 20 74 68 65 20 73 61 6d 65 20 73  Given the same s
177e0 63 68 65 6d 61 20 61 6e 64 20 65 69 74 68 65 72  chema and either
177f0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
17800 67 20 57 48 45 52 45 20 0a 20 20 20 20 2a 2a 20  g WHERE .    ** 
17810 20 20 20 63 6c 61 75 73 65 73 3a 0a 20 20 20 20     clauses:.    
17820 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 57  **.    **      W
17830 48 45 52 45 20 61 20 3d 20 20 31 0a 20 20 20 20  HERE a =  1.    
17840 2a 2a 20 20 20 20 20 20 57 48 45 52 45 20 61 20  **      WHERE a 
17850 3e 3d 20 32 0a 20 20 20 20 2a 2a 0a 20 20 20 20  >= 2.    **.    
17860 2a 2a 20 20 20 20 6e 49 6e 4d 75 6c 20 69 73 20  **    nInMul is 
17870 73 65 74 20 74 6f 20 31 2e 0a 20 20 20 20 2a 2a  set to 1..    **
17880 0a 20 20 20 20 2a 2a 20 20 20 20 49 66 20 74 68  .    **    If th
17890 65 72 65 20 65 78 69 73 74 73 20 61 20 57 48 45  ere exists a WHE
178a0 52 45 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66  RE term of the f
178b0 6f 72 6d 20 22 78 20 49 4e 20 28 53 45 4c 45 43  orm "x IN (SELEC
178c0 54 20 2e 2e 2e 29 22 2c 20 74 68 65 6e 20 0a 20  T ...)", then . 
178d0 20 20 20 2a 2a 20 20 20 20 74 68 65 20 73 75 62     **    the sub
178e0 2d 73 65 6c 65 63 74 20 69 73 20 61 73 73 75 6d  -select is assum
178f0 65 64 20 74 6f 20 72 65 74 75 72 6e 20 32 35 20  ed to return 25 
17900 72 6f 77 73 20 66 6f 72 20 74 68 65 20 70 75 72  rows for the pur
17910 70 6f 73 65 73 20 6f 66 20 0a 20 20 20 20 2a 2a  poses of .    **
17920 20 20 20 20 64 65 74 65 72 6d 69 6e 69 6e 67 20      determining 
17930 6e 49 6e 4d 75 6c 2e 0a 20 20 20 20 2a 2a 0a 20  nInMul..    **. 
17940 20 20 20 2a 2a 20 20 62 49 6e 45 73 74 3a 20 20     **  bInEst:  
17950 0a 20 20 20 20 2a 2a 20 20 20 20 53 65 74 20 74  .    **    Set t
17960 6f 20 74 72 75 65 20 69 66 20 74 68 65 72 65 20  o true if there 
17970 77 61 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  was at least one
17980 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e   "x IN (SELECT .
17990 2e 2e 29 22 20 74 65 72 6d 20 75 73 65 64 20 0a  ..)" term used .
179a0 20 20 20 20 2a 2a 20 20 20 20 69 6e 20 64 65 74      **    in det
179b0 65 72 6d 69 6e 69 6e 67 20 74 68 65 20 76 61 6c  ermining the val
179c0 75 65 20 6f 66 20 6e 49 6e 4d 75 6c 2e 0a 20 20  ue of nInMul..  
179d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 65 73 74    **.    **  est
179e0 42 6f 75 6e 64 3a 0a 20 20 20 20 2a 2a 20 20 20  Bound:.    **   
179f0 20 41 6e 20 65 73 74 69 6d 61 74 65 20 6f 6e 20   An estimate on 
17a00 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68  the amount of th
17a10 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d 75 73  e table that mus
17a20 74 20 62 65 20 73 65 61 72 63 68 65 64 2e 20 20  t be searched.  
17a30 41 0a 20 20 20 20 2a 2a 20 20 20 20 76 61 6c 75  A.    **    valu
17a40 65 20 6f 66 20 31 30 30 20 6d 65 61 6e 73 20 74  e of 100 means t
17a50 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65 20  he entire table 
17a60 69 73 20 73 65 61 72 63 68 65 64 2e 20 20 52 61  is searched.  Ra
17a70 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  nge constraints.
17a80 20 20 20 20 2a 2a 20 20 20 20 6d 69 67 68 74 20      **    might 
17a90 72 65 64 75 63 65 20 74 68 69 73 20 74 6f 20 61  reduce this to a
17aa0 20 76 61 6c 75 65 20 6c 65 73 73 20 74 68 61 6e   value less than
17ab0 20 31 30 30 20 74 6f 20 69 6e 64 69 63 61 74 65   100 to indicate
17ac0 20 74 68 61 74 20 6f 6e 6c 79 0a 20 20 20 20 2a   that only.    *
17ad0 2a 20 20 20 20 61 20 66 72 61 63 74 69 6f 6e 20  *    a fraction 
17ae0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6e 65 65  of the table nee
17af0 64 73 20 73 65 61 72 63 68 69 6e 67 2e 20 20 49  ds searching.  I
17b00 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66  n the absence of
17b10 0a 20 20 20 20 2a 2a 20 20 20 20 73 71 6c 69 74  .    **    sqlit
17b20 65 5f 73 74 61 74 32 20 41 4e 41 4c 59 5a 45 20  e_stat2 ANALYZE 
17b30 64 61 74 61 2c 20 61 20 73 69 6e 67 6c 65 20 69  data, a single i
17b40 6e 65 71 75 61 6c 69 74 79 20 72 65 64 75 63 65  nequality reduce
17b50 73 20 74 68 65 20 73 65 61 72 63 68 0a 20 20 20  s the search.   
17b60 20 2a 2a 20 20 20 20 73 70 61 63 65 20 74 6f 20   **    space to 
17b70 31 2f 33 72 64 20 69 74 73 20 6f 72 69 67 69 6e  1/3rd its origin
17b80 61 6c 20 73 69 7a 65 2e 20 20 53 6f 20 61 6e 20  al size.  So an 
17b90 78 3e 3f 20 63 6f 6e 73 74 72 61 69 6e 74 20 72  x>? constraint r
17ba0 65 64 75 63 65 73 0a 20 20 20 20 2a 2a 20 20 20  educes.    **   
17bb0 20 65 73 74 42 6f 75 6e 64 20 74 6f 20 33 33 2e   estBound to 33.
17bc0 20 20 54 77 6f 20 63 6f 6e 73 74 72 61 69 6e 74    Two constraint
17bd0 73 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20  s (x>? AND x<?) 
17be0 72 65 64 75 63 65 20 65 73 74 42 6f 75 6e 64 20  reduce estBound 
17bf0 74 6f 20 31 31 2e 0a 20 20 20 20 2a 2a 0a 20 20  to 11..    **.  
17c00 20 20 2a 2a 20 20 62 53 6f 72 74 3a 20 20 20 0a    **  bSort:   .
17c10 20 20 20 20 2a 2a 20 20 20 20 42 6f 6f 6c 65 61      **    Boolea
17c20 6e 2e 20 54 72 75 65 20 69 66 20 74 68 65 72 65  n. True if there
17c30 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
17c40 63 6c 61 75 73 65 20 74 68 61 74 20 77 69 6c 6c  clause that will
17c50 20 72 65 71 75 69 72 65 20 61 6e 20 0a 20 20 20   require an .   
17c60 20 2a 2a 20 20 20 20 65 78 74 65 72 6e 61 6c 20   **    external 
17c70 73 6f 72 74 20 28 69 2e 65 2e 20 73 63 61 6e 6e  sort (i.e. scann
17c80 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 62 65  ing the index be
17c90 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20 77 69  ing evaluated wi
17ca0 6c 6c 20 6e 6f 74 20 0a 20 20 20 20 2a 2a 20 20  ll not .    **  
17cb0 20 20 63 6f 72 72 65 63 74 6c 79 20 6f 72 64 65    correctly orde
17cc0 72 20 72 65 63 6f 72 64 73 29 2e 0a 20 20 20 20  r records)..    
17cd0 2a 2a 0a 20 20 20 20 2a 2a 20 20 62 4c 6f 6f 6b  **.    **  bLook
17ce0 75 70 3a 20 0a 20 20 20 20 2a 2a 20 20 20 20 42  up: .    **    B
17cf0 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20  oolean. True if 
17d00 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78 20 65  for each index e
17d10 6e 74 72 79 20 76 69 73 69 74 65 64 20 61 20 6c  ntry visited a l
17d20 6f 6f 6b 75 70 20 6f 6e 20 74 68 65 20 0a 20 20  ookup on the .  
17d30 20 20 2a 2a 20 20 20 20 63 6f 72 72 65 73 70 6f    **    correspo
17d40 6e 64 69 6e 67 20 74 61 62 6c 65 20 62 2d 74 72  nding table b-tr
17d50 65 65 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ee is required. 
17d60 54 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 66  This is always f
17d70 61 6c 73 65 20 0a 20 20 20 20 2a 2a 20 20 20 20  alse .    **    
17d80 66 6f 72 20 74 68 65 20 72 6f 77 69 64 20 69 6e  for the rowid in
17d90 64 65 78 2e 20 46 6f 72 20 6f 74 68 65 72 20 69  dex. For other i
17da0 6e 64 65 78 65 73 2c 20 69 74 20 69 73 20 74 72  ndexes, it is tr
17db0 75 65 20 75 6e 6c 65 73 73 20 61 6c 6c 20 74 68  ue unless all th
17dc0 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 63 6f 6c  e .    **    col
17dd0 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c  umns of the tabl
17de0 65 20 75 73 65 64 20 62 79 20 74 68 65 20 53 45  e used by the SE
17df0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61  LECT statement a
17e00 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 0a 20  re present in . 
17e10 20 20 20 2a 2a 20 20 20 20 74 68 65 20 69 6e 64     **    the ind
17e20 65 78 20 28 73 75 63 68 20 61 6e 20 69 6e 64 65  ex (such an inde
17e30 78 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 64  x is sometimes d
17e40 65 73 63 72 69 62 65 64 20 61 73 20 61 20 63 6f  escribed as a co
17e50 76 65 72 69 6e 67 20 69 6e 64 65 78 29 2e 0a 20  vering index).. 
17e60 20 20 20 2a 2a 20 20 20 20 46 6f 72 20 65 78 61     **    For exa
17e70 6d 70 6c 65 2c 20 67 69 76 65 6e 20 74 68 65 20  mple, given the 
17e80 69 6e 64 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c  index on (a, b),
17e90 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 66 20 74   the second of t
17ea0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 20 20  he following .  
17eb0 20 20 2a 2a 20 20 20 20 74 77 6f 20 71 75 65 72    **    two quer
17ec0 69 65 73 20 72 65 71 75 69 72 65 73 20 74 61 62  ies requires tab
17ed0 6c 65 20 62 2d 74 72 65 65 20 6c 6f 6f 6b 75 70  le b-tree lookup
17ee0 73 2c 20 62 75 74 20 74 68 65 20 66 69 72 73 74  s, but the first
17ef0 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a   does not..    *
17f00 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
17f10 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62       SELECT a, b
17f20 20 20 20 20 46 52 4f 4d 20 74 62 6c 20 57 48 45      FROM tbl WHE
17f30 52 45 20 61 20 3d 20 31 3b 0a 20 20 20 20 2a 2a  RE a = 1;.    **
17f40 20 20 20 20 20 20 20 20 20 20 20 20 20 53 45 4c               SEL
17f50 45 43 54 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d  ECT a, b, c FROM
17f60 20 74 62 6c 20 57 48 45 52 45 20 61 20 3d 20 31   tbl WHERE a = 1
17f70 3b 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ;.    */.    int
17f80 20 6e 45 71 3b 0a 20 20 20 20 69 6e 74 20 62 49   nEq;.    int bI
17f90 6e 45 73 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  nEst = 0;.    in
17fa0 74 20 6e 49 6e 4d 75 6c 20 3d 20 31 3b 0a 20 20  t nInMul = 1;.  
17fb0 20 20 69 6e 74 20 65 73 74 42 6f 75 6e 64 20 3d    int estBound =
17fc0 20 31 30 30 3b 0a 20 20 20 20 69 6e 74 20 6e 42   100;.    int nB
17fd0 6f 75 6e 64 20 3d 20 30 3b 20 20 20 20 20 20 20  ound = 0;       
17fe0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
17ff0 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  of range constra
18000 69 6e 74 73 20 73 65 65 6e 20 2a 2f 0a 20 20 20  ints seen */.   
18010 20 69 6e 74 20 62 53 6f 72 74 20 3d 20 30 3b 0a   int bSort = 0;.
18020 20 20 20 20 69 6e 74 20 62 4c 6f 6f 6b 75 70 20      int bLookup 
18030 3d 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54 65  = 0;.    WhereTe
18040 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
18050 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
18060 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
18070 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20  RE clause */..  
18080 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74    /* Determine t
18090 68 65 20 76 61 6c 75 65 73 20 6f 66 20 6e 45 71  he values of nEq
180a0 20 61 6e 64 20 6e 49 6e 4d 75 6c 20 2a 2f 0a 20   and nInMul */. 
180b0 20 20 20 66 6f 72 28 6e 45 71 3d 30 3b 20 6e 45     for(nEq=0; nE
180c0 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d  q<pProbe->nColum
180d0 6e 3b 20 6e 45 71 2b 2b 29 7b 0a 20 20 20 20 20  n; nEq++){.     
180e0 20 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d   int j = pProbe-
180f0 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a  >aiColumn[nEq];.
18100 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69        pTerm = fi
18110 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
18120 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 65  , j, notReady, e
18130 71 54 65 72 6d 4d 61 73 6b 2c 20 70 49 64 78 29  qTermMask, pIdx)
18140 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
18150 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  m==0 ) break;.  
18160 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 28      wsFlags |= (
18170 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c  WHERE_COLUMN_EQ|
18180 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 29 3b  WHERE_ROWID_EQ);
18190 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
181a0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
181b0 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 45  _IN ){.        E
181c0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65  xpr *pExpr = pTe
181d0 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
181e0 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48     wsFlags |= WH
181f0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20  ERE_COLUMN_IN;. 
18200 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48         if( ExprH
18210 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
18220 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
18230 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 49 6e  ){.          nIn
18240 4d 75 6c 20 2a 3d 20 32 35 3b 0a 20 20 20 20 20  Mul *= 25;.     
18250 20 20 20 20 20 62 49 6e 45 73 74 20 3d 20 31 3b       bInEst = 1;
18260 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
18270 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d  f( ALWAYS(pExpr-
18280 3e 78 2e 70 4c 69 73 74 29 20 29 7b 0a 20 20 20  >x.pList) ){.   
18290 20 20 20 20 20 20 20 6e 49 6e 4d 75 6c 20 2a 3d         nInMul *=
182a0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
182b0 3e 6e 45 78 70 72 20 2b 20 31 3b 0a 20 20 20 20  >nExpr + 1;.    
182c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
182d0 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70  e if( pTerm->eOp
182e0 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55  erator & WO_ISNU
182f0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 77 73  LL ){.        ws
18300 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
18310 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20  OLUMN_NULL;.    
18320 20 20 7d 0a 20 20 20 20 20 20 75 73 65 64 20 7c    }.      used |
18330 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  = pTerm->prereqR
18340 69 67 68 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ight;.    }..   
18350 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68   /* Determine th
18360 65 20 76 61 6c 75 65 20 6f 66 20 65 73 74 42 6f  e value of estBo
18370 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  und. */.    if( 
18380 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  nEq<pProbe->nCol
18390 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  umn ){.      int
183a0 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43   j = pProbe->aiC
183b0 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 20 20  olumn[nEq];.    
183c0 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70    if( findTerm(p
183d0 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74  WC, iCur, j, not
183e0 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f  Ready, WO_LT|WO_
183f0 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20  LE|WO_GT|WO_GE, 
18400 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20  pIdx) ){.       
18410 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 6f 70   WhereTerm *pTop
18420 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
18430 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61   iCur, j, notRea
18440 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c  dy, WO_LT|WO_LE,
18450 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
18460 57 68 65 72 65 54 65 72 6d 20 2a 70 42 74 6d 20  WhereTerm *pBtm 
18470 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
18480 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64  iCur, j, notRead
18490 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20  y, WO_GT|WO_GE, 
184a0 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 77  pIdx);.        w
184b0 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74  hereRangeScanEst
184c0 28 70 50 61 72 73 65 2c 20 70 50 72 6f 62 65 2c  (pParse, pProbe,
184d0 20 6e 45 71 2c 20 70 42 74 6d 2c 20 70 54 6f 70   nEq, pBtm, pTop
184e0 2c 20 26 65 73 74 42 6f 75 6e 64 29 3b 0a 20 20  , &estBound);.  
184f0 20 20 20 20 20 20 69 66 28 20 70 54 6f 70 20 29        if( pTop )
18500 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 42 6f 75  {.          nBou
18510 6e 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nd = 1;.        
18520 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45    wsFlags |= WHE
18530 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20  RE_TOP_LIMIT;.  
18540 20 20 20 20 20 20 20 20 75 73 65 64 20 7c 3d 20          used |= 
18550 70 54 6f 70 2d 3e 70 72 65 72 65 71 52 69 67 68  pTop->prereqRigh
18560 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
18570 20 20 20 20 20 69 66 28 20 70 42 74 6d 20 29 7b       if( pBtm ){
18580 0a 20 20 20 20 20 20 20 20 20 20 6e 42 6f 75 6e  .          nBoun
18590 64 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 77  d++;.          w
185a0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
185b0 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  BTM_LIMIT;.     
185c0 20 20 20 20 20 75 73 65 64 20 7c 3d 20 70 42 74       used |= pBt
185d0 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  m->prereqRight;.
185e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
185f0 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 28 57 48    wsFlags |= (WH
18600 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
18610 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e  |WHERE_ROWID_RAN
18620 47 45 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  GE);.      }.   
18630 20 7d 65 6c 73 65 20 69 66 28 20 70 50 72 6f 62   }else if( pProb
18640 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  e->onError!=OE_N
18650 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 74 65 73  one ){.      tes
18660 74 63 61 73 65 28 20 77 73 46 6c 61 67 73 20 26  tcase( wsFlags &
18670 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
18680 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
18690 73 65 28 20 77 73 46 6c 61 67 73 20 26 20 57 48  se( wsFlags & WH
186a0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 20  ERE_COLUMN_NULL 
186b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 77 73  );.      if( (ws
186c0 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43  Flags & (WHERE_C
186d0 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43  OLUMN_IN|WHERE_C
186e0 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 29 3d 3d 30 20  OLUMN_NULL))==0 
186f0 29 7b 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61  ){.        wsFla
18700 67 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e 49 51  gs |= WHERE_UNIQ
18710 55 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  UE;.      }.    
18720 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
18730 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
18740 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65  Y clause and the
18750 20 69 6e 64 65 78 20 62 65 69 6e 67 20 63 6f 6e   index being con
18760 73 69 64 65 72 65 64 20 77 69 6c 6c 0a 20 20 20  sidered will.   
18770 20 2a 2a 20 6e 61 74 75 72 61 6c 6c 79 20 73 63   ** naturally sc
18780 61 6e 20 72 6f 77 73 20 69 6e 20 74 68 65 20 72  an rows in the r
18790 65 71 75 69 72 65 64 20 6f 72 64 65 72 2c 20 73  equired order, s
187a0 65 74 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  et the appropria
187b0 74 65 20 66 6c 61 67 73 0a 20 20 20 20 2a 2a 20  te flags.    ** 
187c0 69 6e 20 77 73 46 6c 61 67 73 2e 20 4f 74 68 65  in wsFlags. Othe
187d0 72 77 69 73 65 2c 20 69 66 20 74 68 65 72 65 20  rwise, if there 
187e0 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
187f0 6c 61 75 73 65 20 62 75 74 20 74 68 65 20 69 6e  lause but the in
18800 64 65 78 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  dex.    ** will 
18810 73 63 61 6e 20 72 6f 77 73 20 69 6e 20 61 20 64  scan rows in a d
18820 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 2c 20  ifferent order, 
18830 73 65 74 20 74 68 65 20 62 53 6f 72 74 20 76 61  set the bSort va
18840 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20  riable.  */.    
18850 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
18860 20 20 20 20 20 20 69 66 28 20 28 77 73 46 6c 61        if( (wsFla
18870 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55  gs & (WHERE_COLU
18880 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55  MN_IN|WHERE_COLU
18890 4d 4e 5f 4e 55 4c 4c 29 29 3d 3d 30 0a 20 20 20  MN_NULL))==0.   
188a0 20 20 20 20 20 26 26 20 69 73 53 6f 72 74 69 6e       && isSortin
188b0 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c 70 57  gIndex(pParse,pW
188c0 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 70 50 72 6f  C->pMaskSet,pPro
188d0 62 65 2c 69 43 75 72 2c 70 4f 72 64 65 72 42 79  be,iCur,pOrderBy
188e0 2c 6e 45 71 2c 26 72 65 76 29 0a 20 20 20 20 20  ,nEq,&rev).     
188f0 20 29 7b 0a 20 20 20 20 20 20 20 20 77 73 46 6c   ){.        wsFl
18900 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 4f 57  ags |= WHERE_ROW
18910 49 44 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 43  ID_RANGE|WHERE_C
18920 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52  OLUMN_RANGE|WHER
18930 45 5f 4f 52 44 45 52 42 59 3b 0a 20 20 20 20 20  E_ORDERBY;.     
18940 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 28 72     wsFlags |= (r
18950 65 76 20 3f 20 57 48 45 52 45 5f 52 45 56 45 52  ev ? WHERE_REVER
18960 53 45 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d  SE : 0);.      }
18970 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62 53  else{.        bS
18980 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ort = 1;.      }
18990 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
189a0 66 20 63 75 72 72 65 6e 74 6c 79 20 63 61 6c 63  f currently calc
189b0 75 6c 61 74 69 6e 67 20 74 68 65 20 63 6f 73 74  ulating the cost
189c0 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69 6e 64   of using an ind
189d0 65 78 20 28 6e 6f 74 20 74 68 65 20 49 50 4b 0a  ex (not the IPK.
189e0 20 20 20 20 2a 2a 20 69 6e 64 65 78 29 2c 20 64      ** index), d
189f0 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6c 6c 20  etermine if all 
18a00 72 65 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20  required column 
18a10 64 61 74 61 20 6d 61 79 20 62 65 20 6f 62 74 61  data may be obta
18a20 69 6e 65 64 20 77 69 74 68 6f 75 74 20 0a 20 20  ined without .  
18a30 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 6d    ** using the m
18a40 61 69 6e 20 74 61 62 6c 65 20 28 69 2e 65 2e 20  ain table (i.e. 
18a50 69 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  if the index is 
18a60 61 20 63 6f 76 65 72 69 6e 67 0a 20 20 20 20 2a  a covering.    *
18a70 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 69 73  * index for this
18a80 20 71 75 65 72 79 29 2e 20 49 66 20 69 74 20 69   query). If it i
18a90 73 2c 20 73 65 74 20 74 68 65 20 57 48 45 52 45  s, set the WHERE
18aa0 5f 49 44 58 5f 4f 4e 4c 59 20 66 6c 61 67 20 69  _IDX_ONLY flag i
18ab0 6e 0a 20 20 20 20 2a 2a 20 77 73 46 6c 61 67 73  n.    ** wsFlags
18ac0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74  . Otherwise, set
18ad0 20 74 68 65 20 62 4c 6f 6f 6b 75 70 20 76 61 72   the bLookup var
18ae0 69 61 62 6c 65 20 74 6f 20 74 72 75 65 2e 20 20  iable to true.  
18af0 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 64 78 20  */.    if( pIdx 
18b00 26 26 20 77 73 46 6c 61 67 73 20 29 7b 0a 20 20  && wsFlags ){.  
18b10 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20      Bitmask m = 
18b20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20  pSrc->colUsed;. 
18b30 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
18b40 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64    for(j=0; j<pId
18b50 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29  x->nColumn; j++)
18b60 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20  {.        int x 
18b70 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
18b80 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [j];.        if(
18b90 20 78 3c 42 4d 53 2d 31 20 29 7b 0a 20 20 20 20   x<BMS-1 ){.    
18ba0 20 20 20 20 20 20 6d 20 26 3d 20 7e 28 28 28 42        m &= ~(((B
18bb0 69 74 6d 61 73 6b 29 31 29 3c 3c 78 29 3b 0a 20  itmask)1)<<x);. 
18bc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
18bd0 0a 20 20 20 20 20 20 69 66 28 20 6d 3d 3d 30 20  .      if( m==0 
18be0 29 7b 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61  ){.        wsFla
18bf0 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f  gs |= WHERE_IDX_
18c00 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ONLY;.      }els
18c10 65 7b 0a 20 20 20 20 20 20 20 20 62 4c 6f 6f 6b  e{.        bLook
18c20 75 70 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  up = 1;.      }.
18c30 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
18c40 20 20 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68    ** Estimate th
18c50 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
18c60 20 6f 66 20 6f 75 74 70 75 74 2e 20 20 46 6f 72   of output.  For
18c70 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c   an IN operator,
18c80 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 6c  .    ** do not l
18c90 65 74 20 74 68 65 20 65 73 74 69 6d 61 74 65 20  et the estimate 
18ca0 65 78 63 65 65 64 20 68 61 6c 66 20 74 68 65 20  exceed half the 
18cb0 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
18cc0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 52  e..    */.    nR
18cd0 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29 28 61 69  ow = (double)(ai
18ce0 52 6f 77 45 73 74 5b 6e 45 71 5d 20 2a 20 6e 49  RowEst[nEq] * nI
18cf0 6e 4d 75 6c 29 3b 0a 20 20 20 20 69 66 28 20 62  nMul);.    if( b
18d00 49 6e 45 73 74 20 26 26 20 6e 52 6f 77 2a 32 3e  InEst && nRow*2>
18d10 61 69 52 6f 77 45 73 74 5b 30 5d 20 29 7b 0a 20  aiRowEst[0] ){. 
18d20 20 20 20 20 20 6e 52 6f 77 20 3d 20 61 69 52 6f       nRow = aiRo
18d30 77 45 73 74 5b 30 5d 2f 32 3b 0a 20 20 20 20 20  wEst[0]/2;.     
18d40 20 6e 49 6e 4d 75 6c 20 3d 20 28 69 6e 74 29 28   nInMul = (int)(
18d50 6e 52 6f 77 20 2f 20 61 69 52 6f 77 45 73 74 5b  nRow / aiRowEst[
18d60 6e 45 71 5d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  nEq]);.    }..  
18d70 20 20 2f 2a 20 41 73 73 75 6d 65 20 63 6f 6e 73    /* Assume cons
18d80 74 61 6e 74 20 63 6f 73 74 20 74 6f 20 61 63 63  tant cost to acc
18d90 65 73 73 20 61 20 72 6f 77 20 61 6e 64 20 6c 6f  ess a row and lo
18da0 67 61 72 69 74 68 6d 69 63 20 63 6f 73 74 20 74  garithmic cost t
18db0 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 61 20 62 69  o.    ** do a bi
18dc0 6e 61 72 79 20 73 65 61 72 63 68 2e 20 20 48 65  nary search.  He
18dd0 6e 63 65 2c 20 74 68 65 20 69 6e 69 74 69 61 6c  nce, the initial
18de0 20 63 6f 73 74 20 69 73 20 74 68 65 20 6e 75 6d   cost is the num
18df0 62 65 72 20 6f 66 20 6f 75 74 70 75 74 0a 20 20  ber of output.  
18e00 20 20 2a 2a 20 72 6f 77 73 20 70 6c 75 73 20 6c    ** rows plus l
18e10 6f 67 32 28 74 61 62 6c 65 2d 73 69 7a 65 29 20  og2(table-size) 
18e20 74 69 6d 65 73 20 74 68 65 20 6e 75 6d 62 65 72  times the number
18e30 20 6f 66 20 62 69 6e 61 72 79 20 73 65 61 72 63   of binary searc
18e40 68 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  hes..    */.    
18e50 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2b 20 6e 49  cost = nRow + nI
18e60 6e 4d 75 6c 2a 65 73 74 4c 6f 67 28 61 69 52 6f  nMul*estLog(aiRo
18e70 77 45 73 74 5b 30 5d 29 3b 0a 0a 20 20 20 20 2f  wEst[0]);..    /
18e80 2a 20 41 64 6a 75 73 74 20 74 68 65 20 6e 75 6d  * Adjust the num
18e90 62 65 72 20 6f 66 20 72 6f 77 73 20 61 6e 64 20  ber of rows and 
18ea0 74 68 65 20 63 6f 73 74 20 64 6f 77 6e 77 61 72  the cost downwar
18eb0 64 20 74 6f 20 72 65 66 6c 65 63 74 20 72 6f 77  d to reflect row
18ec0 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72  s.    ** that ar
18ed0 65 20 65 78 63 6c 75 64 65 64 20 62 79 20 72 61  e excluded by ra
18ee0 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  nge constraints.
18ef0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 52 6f 77  .    */.    nRow
18f00 20 3d 20 28 6e 52 6f 77 20 2a 20 28 64 6f 75 62   = (nRow * (doub
18f10 6c 65 29 65 73 74 42 6f 75 6e 64 29 20 2f 20 28  le)estBound) / (
18f20 64 6f 75 62 6c 65 29 31 30 30 3b 0a 20 20 20 20  double)100;.    
18f30 63 6f 73 74 20 3d 20 28 63 6f 73 74 20 2a 20 28  cost = (cost * (
18f40 64 6f 75 62 6c 65 29 65 73 74 42 6f 75 6e 64 29  double)estBound)
18f50 20 2f 20 28 64 6f 75 62 6c 65 29 31 30 30 3b 0a   / (double)100;.
18f60 0a 20 20 20 20 2f 2a 20 41 64 64 20 69 6e 20 74  .    /* Add in t
18f70 68 65 20 65 73 74 69 6d 61 74 65 64 20 63 6f 73  he estimated cos
18f80 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 74 68 65  t of sorting the
18f90 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2f 0a 20   result.    */. 
18fa0 20 20 20 69 66 28 20 62 53 6f 72 74 20 29 7b 0a     if( bSort ){.
18fb0 20 20 20 20 20 20 63 6f 73 74 20 2b 3d 20 63 6f        cost += co
18fc0 73 74 2a 65 73 74 4c 6f 67 28 63 6f 73 74 29 3b  st*estLog(cost);
18fd0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
18fe0 66 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  f all informatio
18ff0 6e 20 63 61 6e 20 62 65 20 74 61 6b 65 6e 20 64  n can be taken d
19000 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65  irectly from the
19010 20 69 6e 64 65 78 2c 20 77 65 20 61 76 6f 69 64   index, we avoid
19020 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 61  .    ** doing ta
19030 62 6c 65 20 6c 6f 6f 6b 75 70 73 2e 20 20 54 68  ble lookups.  Th
19040 69 73 20 72 65 64 75 63 65 73 20 74 68 65 20 63  is reduces the c
19050 6f 73 74 20 62 79 20 68 61 6c 66 2e 20 20 28 4e  ost by half.  (N
19060 6f 74 20 72 65 61 6c 6c 79 20 2d 0a 20 20 20 20  ot really -.    
19070 2a 2a 20 74 68 69 73 20 6e 65 65 64 73 20 74 6f  ** this needs to
19080 20 62 65 20 66 69 78 65 64 2e 29 0a 20 20 20 20   be fixed.).    
19090 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 64 78 20  */.    if( pIdx 
190a0 26 26 20 62 4c 6f 6f 6b 75 70 3d 3d 30 20 29 7b  && bLookup==0 ){
190b0 0a 20 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 28  .      cost /= (
190c0 64 6f 75 62 6c 65 29 32 3b 0a 20 20 20 20 7d 0a  double)2;.    }.
190d0 20 20 20 20 2f 2a 2a 2a 2a 20 43 6f 73 74 20 6f      /**** Cost o
190e0 66 20 75 73 69 6e 67 20 74 68 69 73 20 69 6e 64  f using this ind
190f0 65 78 20 68 61 73 20 6e 6f 77 20 62 65 65 6e 20  ex has now been 
19100 63 6f 6d 70 75 74 65 64 20 2a 2a 2a 2a 2f 0a 0a  computed ****/..
19110 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
19120 61 72 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63  are additional c
19130 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 74 68  onstraints on th
19140 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 63 61  is table that ca
19150 6e 6e 6f 74 0a 20 20 20 20 2a 2a 20 62 65 20 75  nnot.    ** be u
19160 73 65 64 20 77 69 74 68 20 74 68 65 20 63 75 72  sed with the cur
19170 72 65 6e 74 20 69 6e 64 65 78 2c 20 62 75 74 20  rent index, but 
19180 77 68 69 63 68 20 6d 69 67 68 74 20 6c 6f 77 65  which might lowe
19190 72 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20  r the number.   
191a0 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 20 72 6f   ** of output ro
191b0 77 73 2c 20 61 64 6a 75 73 74 20 74 68 65 20 6e  ws, adjust the n
191c0 52 6f 77 20 76 61 6c 75 65 20 61 63 63 6f 72 64  Row value accord
191d0 69 6e 67 6c 79 2e 20 20 54 68 69 73 20 6f 6e 6c  ingly.  This onl
191e0 79 20 0a 20 20 20 20 2a 2a 20 6d 61 74 74 65 72  y .    ** matter
191f0 73 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74  s if the current
19200 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 6c 65   index is the le
19210 61 73 74 20 63 6f 73 74 6c 79 2c 20 73 6f 20 64  ast costly, so d
19220 6f 20 6e 6f 74 20 62 6f 74 68 65 72 0a 20 20 20  o not bother.   
19230 20 2a 2a 20 77 69 74 68 20 74 68 69 73 20 73 74   ** with this st
19240 65 70 20 69 66 20 77 65 20 61 6c 72 65 61 64 79  ep if we already
19250 20 6b 6e 6f 77 20 74 68 69 73 20 69 6e 64 65 78   know this index
19260 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 68 6f   will not be cho
19270 73 65 6e 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f  sen..    ** Also
19280 2c 20 6e 65 76 65 72 20 72 65 64 75 63 65 20 74  , never reduce t
19290 68 65 20 6f 75 74 70 75 74 20 72 6f 77 20 63 6f  he output row co
192a0 75 6e 74 20 62 65 6c 6f 77 20 32 20 75 73 69 6e  unt below 2 usin
192b0 67 20 74 68 69 73 20 73 74 65 70 2e 0a 20 20 20  g this step..   
192c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 74 20 69 73   **.    ** It is
192d0 20 63 72 69 74 69 63 61 6c 20 74 68 61 74 20 74   critical that t
192e0 68 65 20 6e 6f 74 56 61 6c 69 64 20 6d 61 73 6b  he notValid mask
192f0 20 62 65 20 75 73 65 64 20 68 65 72 65 20 69 6e   be used here in
19300 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20  stead of.    ** 
19310 74 68 65 20 6e 6f 74 52 65 61 64 79 20 6d 61 73  the notReady mas
19320 6b 2e 20 20 57 68 65 6e 20 63 6f 6d 70 75 74 69  k.  When computi
19330 6e 67 20 61 6e 20 22 6f 70 74 69 6d 61 6c 22 20  ng an "optimal" 
19340 69 6e 64 65 78 2c 20 74 68 65 20 6e 6f 74 52 65  index, the notRe
19350 61 64 79 0a 20 20 20 20 2a 2a 20 6d 61 73 6b 20  ady.    ** mask 
19360 77 69 6c 6c 20 6f 6e 6c 79 20 68 61 76 65 20 6f  will only have o
19370 6e 65 20 62 69 74 20 73 65 74 20 2d 20 74 68 65  ne bit set - the
19380 20 62 69 74 20 66 6f 72 20 74 68 65 20 63 75 72   bit for the cur
19390 72 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20 20 20  rent table..    
193a0 2a 2a 20 54 68 65 20 6e 6f 74 56 61 6c 69 64 20  ** The notValid 
193b0 6d 61 73 6b 2c 20 6f 6e 20 74 68 65 20 6f 74 68  mask, on the oth
193c0 65 72 20 68 61 6e 64 2c 20 61 6c 77 61 79 73 20  er hand, always 
193d0 68 61 73 20 61 6c 6c 20 62 69 74 73 20 73 65 74  has all bits set
193e0 20 66 6f 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c   for.    ** tabl
193f0 65 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  es that are not 
19400 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 2e 20  in outer loops. 
19410 20 49 66 20 6e 6f 74 52 65 61 64 79 20 69 73 20   If notReady is 
19420 75 73 65 64 20 68 65 72 65 20 69 6e 73 74 65 61  used here instea
19430 64 0a 20 20 20 20 2a 2a 20 6f 66 20 6e 6f 74 56  d.    ** of notV
19440 61 6c 69 64 2c 20 74 68 65 6e 20 61 20 6f 70 74  alid, then a opt
19450 69 6d 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20  imal index that 
19460 64 65 70 65 6e 64 73 20 6f 6e 20 69 6e 6e 65 72  depends on inner
19470 20 6a 6f 69 6e 73 20 6c 6f 6f 70 73 0a 20 20 20   joins loops.   
19480 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 73 65 6c   ** might be sel
19490 65 63 74 65 64 20 65 76 65 6e 20 77 68 65 6e 20  ected even when 
194a0 74 68 65 72 65 20 65 78 69 73 74 73 20 61 6e 20  there exists an 
194b0 6f 70 74 69 6d 61 6c 20 69 6e 64 65 78 20 74 68  optimal index th
194c0 61 74 20 68 61 73 0a 20 20 20 20 2a 2a 20 6e 6f  at has.    ** no
194d0 20 73 75 63 68 20 64 65 70 65 6e 64 65 6e 63 79   such dependency
194e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
194f0 20 6e 52 6f 77 3e 32 20 26 26 20 63 6f 73 74 3c   nRow>2 && cost<
19500 3d 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 29 7b  =pCost->rCost ){
19510 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20  .      int k;   
19520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19530 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
19540 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ter */.      int
19550 20 6e 53 6b 69 70 45 71 20 3d 20 6e 45 71 3b 20   nSkipEq = nEq; 
19560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
19570 62 65 72 20 6f 66 20 3d 3d 20 63 6f 6e 73 74 72  ber of == constr
19580 61 69 6e 74 73 20 74 6f 20 73 6b 69 70 20 2a 2f  aints to skip */
19590 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 6b 69 70  .      int nSkip
195a0 52 61 6e 67 65 20 3d 20 6e 42 6f 75 6e 64 3b 20  Range = nBound; 
195b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
195c0 20 3c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74   < constraints t
195d0 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 20 20 20 20  o skip */.      
195e0 42 69 74 6d 61 73 6b 20 74 68 69 73 54 61 62 3b  Bitmask thisTab;
195f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19600 42 69 74 6d 61 70 20 66 6f 72 20 70 53 72 63 20  Bitmap for pSrc 
19610 2a 2f 0a 0a 20 20 20 20 20 20 74 68 69 73 54 61  */..      thisTa
19620 62 20 3d 20 67 65 74 4d 61 73 6b 28 70 57 43 2d  b = getMask(pWC-
19630 3e 70 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29  >pMaskSet, iCur)
19640 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65 72  ;.      for(pTer
19650 6d 3d 70 57 43 2d 3e 61 2c 20 6b 3d 70 57 43 2d  m=pWC->a, k=pWC-
19660 3e 6e 54 65 72 6d 3b 20 6e 52 6f 77 3e 32 20 26  >nTerm; nRow>2 &
19670 26 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b  & k; k--, pTerm+
19680 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
19690 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
196a0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 20   TERM_VIRTUAL ) 
196b0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
196c0 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
196d0 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 56 61 6c  ereqAll & notVal
196e0 69 64 29 21 3d 74 68 69 73 54 61 62 20 29 20 63  id)!=thisTab ) c
196f0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
19700 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
19710 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57  rator & (WO_EQ|W
19720 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20  O_IN|WO_ISNULL) 
19730 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
19740 20 6e 53 6b 69 70 45 71 20 29 7b 0a 20 20 20 20   nSkipEq ){.    
19750 20 20 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72          /* Ignor
19760 65 20 74 68 65 20 66 69 72 73 74 20 6e 45 71 20  e the first nEq 
19770 65 71 75 61 6c 69 74 79 20 6d 61 74 63 68 65 73  equality matches
19780 20 73 69 6e 63 65 20 74 68 65 20 69 6e 64 65 78   since the index
19790 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
197a0 68 61 73 20 61 6c 72 65 61 64 79 20 61 63 63 6f  has already acco
197b0 75 6e 74 65 64 20 66 6f 72 20 74 68 65 73 65 20  unted for these 
197c0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  */.            n
197d0 53 6b 69 70 45 71 2d 2d 3b 0a 20 20 20 20 20 20  SkipEq--;.      
197e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
197f0 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
19800 20 65 61 63 68 20 61 64 64 69 74 69 6f 6e 61 6c   each additional
19810 20 65 71 75 61 6c 69 74 79 20 6d 61 74 63 68 20   equality match 
19820 72 65 64 75 63 65 73 20 74 68 65 20 72 65 73 75  reduces the resu
19830 6c 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  lt.            *
19840 2a 20 73 65 74 20 73 69 7a 65 20 62 79 20 61 20  * set size by a 
19850 66 61 63 74 6f 72 20 6f 66 20 31 30 20 2a 2f 0a  factor of 10 */.
19860 20 20 20 20 20 20 20 20 20 20 20 20 6e 52 6f 77              nRow
19870 20 2f 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20   /= 10;.        
19880 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
19890 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70  e if( pTerm->eOp
198a0 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c  erator & (WO_LT|
198b0 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
198c0 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  E) ){.          
198d0 69 66 28 20 6e 53 6b 69 70 52 61 6e 67 65 20 29  if( nSkipRange )
198e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
198f0 20 49 67 6e 6f 72 65 20 74 68 65 20 66 69 72 73   Ignore the firs
19900 74 20 6e 42 6f 75 6e 64 20 72 61 6e 67 65 20 63  t nBound range c
19910 6f 6e 73 74 72 61 69 6e 74 73 20 73 69 6e 63 65  onstraints since
19920 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20   the index.     
19930 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 61 6c         ** has al
19940 72 65 61 64 79 20 61 63 63 6f 75 6e 74 65 64 20  ready accounted 
19950 66 6f 72 20 74 68 65 73 65 20 2a 2f 0a 20 20 20  for these */.   
19960 20 20 20 20 20 20 20 20 20 6e 53 6b 69 70 52 61           nSkipRa
19970 6e 67 65 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20  nge--;.         
19980 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
19990 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 20 65 61      /* Assume ea
199a0 63 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 72 61  ch additional ra
199b0 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 72  nge constraint r
199c0 65 64 75 63 65 73 20 74 68 65 20 72 65 73 75 6c  educes the resul
199d0 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  t.            **
199e0 20 73 65 74 20 73 69 7a 65 20 62 79 20 61 20 66   set size by a f
199f0 61 63 74 6f 72 20 6f 66 20 33 20 2a 2f 0a 20 20  actor of 3 */.  
19a00 20 20 20 20 20 20 20 20 20 20 6e 52 6f 77 20 2f            nRow /
19a10 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 3;.          }
19a20 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
19a30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 79            /* Any
19a40 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f   other expressio
19a50 6e 20 6c 6f 77 65 72 73 20 74 68 65 20 6f 75 74  n lowers the out
19a60 70 75 74 20 72 6f 77 20 63 6f 75 6e 74 20 62 79  put row count by
19a70 20 68 61 6c 66 20 2a 2f 0a 20 20 20 20 20 20 20   half */.       
19a80 20 20 20 6e 52 6f 77 20 2f 3d 20 32 3b 0a 20 20     nRow /= 2;.  
19a90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
19aa0 20 20 20 20 20 20 69 66 28 20 6e 52 6f 77 3c 32        if( nRow<2
19ab0 20 29 20 6e 52 6f 77 20 3d 20 32 3b 0a 20 20 20   ) nRow = 2;.   
19ac0 20 7d 0a 0a 0a 20 20 20 20 57 48 45 52 45 54 52   }...    WHERETR
19ad0 41 43 45 28 28 0a 20 20 20 20 20 20 22 25 73 28  ACE((.      "%s(
19ae0 25 73 29 3a 20 6e 45 71 3d 25 64 20 6e 49 6e 4d  %s): nEq=%d nInM
19af0 75 6c 3d 25 64 20 65 73 74 42 6f 75 6e 64 3d 25  ul=%d estBound=%
19b00 64 20 62 53 6f 72 74 3d 25 64 20 62 4c 6f 6f 6b  d bSort=%d bLook
19b10 75 70 3d 25 64 20 77 73 46 6c 61 67 73 3d 30 78  up=%d wsFlags=0x
19b20 25 78 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 20  %x\n".      "   
19b30 20 20 20 20 20 20 6e 6f 74 52 65 61 64 79 3d 30        notReady=0
19b40 78 25 6c 6c 78 20 6e 52 6f 77 3d 25 2e 32 66 20  x%llx nRow=%.2f 
19b50 63 6f 73 74 3d 25 2e 32 66 20 75 73 65 64 3d 30  cost=%.2f used=0
19b60 78 25 6c 6c 78 5c 6e 22 2c 0a 20 20 20 20 20 20  x%llx\n",.      
19b70 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  pSrc->pTab->zNam
19b80 65 2c 20 28 70 49 64 78 20 3f 20 70 49 64 78 2d  e, (pIdx ? pIdx-
19b90 3e 7a 4e 61 6d 65 20 3a 20 22 69 70 6b 22 29 2c  >zName : "ipk"),
19ba0 20 0a 20 20 20 20 20 20 6e 45 71 2c 20 6e 49 6e   .      nEq, nIn
19bb0 4d 75 6c 2c 20 65 73 74 42 6f 75 6e 64 2c 20 62  Mul, estBound, b
19bc0 53 6f 72 74 2c 20 62 4c 6f 6f 6b 75 70 2c 20 77  Sort, bLookup, w
19bd0 73 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 6e 6f  sFlags,.      no
19be0 74 52 65 61 64 79 2c 20 6e 52 6f 77 2c 20 63 6f  tReady, nRow, co
19bf0 73 74 2c 20 75 73 65 64 0a 20 20 20 20 29 29 3b  st, used.    ));
19c00 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
19c10 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 62 65   index is the be
19c20 73 74 20 77 65 20 68 61 76 65 20 73 65 65 6e 20  st we have seen 
19c30 73 6f 20 66 61 72 2c 20 74 68 65 6e 20 72 65 63  so far, then rec
19c40 6f 72 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ord this.    ** 
19c50 69 6e 64 65 78 20 61 6e 64 20 69 74 73 20 63 6f  index and its co
19c60 73 74 20 69 6e 20 74 68 65 20 70 43 6f 73 74 20  st in the pCost 
19c70 73 74 72 75 63 74 75 72 65 2e 0a 20 20 20 20 2a  structure..    *
19c80 2f 0a 20 20 20 20 69 66 28 20 28 21 70 49 64 78  /.    if( (!pIdx
19c90 20 7c 7c 20 77 73 46 6c 61 67 73 29 0a 20 20 20   || wsFlags).   
19ca0 20 20 26 26 20 28 63 6f 73 74 3c 70 43 6f 73 74    && (cost<pCost
19cb0 2d 3e 72 43 6f 73 74 20 7c 7c 20 28 63 6f 73 74  ->rCost || (cost
19cc0 3c 3d 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 26  <=pCost->rCost &
19cd0 26 20 6e 52 6f 77 3c 70 43 6f 73 74 2d 3e 70 6c  & nRow<pCost->pl
19ce0 61 6e 2e 6e 52 6f 77 29 29 0a 20 20 20 20 29 7b  an.nRow)).    ){
19cf0 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 72 43  .      pCost->rC
19d00 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20  ost = cost;.    
19d10 20 20 70 43 6f 73 74 2d 3e 75 73 65 64 20 3d 20    pCost->used = 
19d20 75 73 65 64 3b 0a 20 20 20 20 20 20 70 43 6f 73  used;.      pCos
19d30 74 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 6e  t->plan.nRow = n
19d40 52 6f 77 3b 0a 20 20 20 20 20 20 70 43 6f 73 74  Row;.      pCost
19d50 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d  ->plan.wsFlags =
19d60 20 28 77 73 46 6c 61 67 73 26 77 73 46 6c 61 67   (wsFlags&wsFlag
19d70 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 70 43 6f  Mask);.      pCo
19d80 73 74 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20 6e  st->plan.nEq = n
19d90 45 71 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d  Eq;.      pCost-
19da0 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 20 3d 20 70  >plan.u.pIdx = p
19db0 49 64 78 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  Idx;.    }..    
19dc0 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  /* If there was 
19dd0 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  an INDEXED BY cl
19de0 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  ause, then only 
19df0 74 68 61 74 20 6f 6e 65 20 69 6e 64 65 78 20 69  that one index i
19e00 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65  s.    ** conside
19e10 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  red. */.    if( 
19e20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 20 62  pSrc->pIndex ) b
19e30 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  reak;..    /* Re
19e40 73 65 74 20 6d 61 73 6b 73 20 66 6f 72 20 74 68  set masks for th
19e50 65 20 6e 65 78 74 20 69 6e 64 65 78 20 69 6e 20  e next index in 
19e60 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  the loop */.    
19e70 77 73 46 6c 61 67 4d 61 73 6b 20 3d 20 7e 28 57  wsFlagMask = ~(W
19e80 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48  HERE_ROWID_EQ|WH
19e90 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29  ERE_ROWID_RANGE)
19ea0 3b 0a 20 20 20 20 65 71 54 65 72 6d 4d 61 73 6b  ;.    eqTermMask
19eb0 20 3d 20 69 64 78 45 71 54 65 72 6d 4d 61 73 6b   = idxEqTermMask
19ec0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
19ed0 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52  here is no ORDER
19ee0 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74   BY clause and t
19ef0 68 65 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73  he SQLITE_Revers
19f00 65 4f 72 64 65 72 20 66 6c 61 67 0a 20 20 2a 2a  eOrder flag.  **
19f10 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 72 65   is set, then re
19f20 76 65 72 73 65 20 74 68 65 20 6f 72 64 65 72 20  verse the order 
19f30 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 77  that the index w
19f40 69 6c 6c 20 62 65 20 73 63 61 6e 6e 65 64 0a 20  ill be scanned. 
19f50 20 2a 2a 20 69 6e 2e 20 54 68 69 73 20 69 73 20   ** in. This is 
19f60 75 73 65 64 20 66 6f 72 20 61 70 70 6c 69 63 61  used for applica
19f70 74 69 6f 6e 20 74 65 73 74 69 6e 67 2c 20 74 6f  tion testing, to
19f80 20 68 65 6c 70 20 66 69 6e 64 20 63 61 73 65 73   help find cases
19f90 0a 20 20 2a 2a 20 77 68 65 72 65 20 61 70 70 6c  .  ** where appl
19fa0 69 63 61 74 69 6f 6e 20 62 65 68 61 76 69 6f 75  ication behaviou
19fb0 72 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  r depends on the
19fc0 20 28 75 6e 64 65 66 69 6e 65 64 29 20 6f 72 64   (undefined) ord
19fd0 65 72 20 74 68 61 74 0a 20 20 2a 2a 20 53 51 4c  er that.  ** SQL
19fe0 69 74 65 20 6f 75 74 70 75 74 73 20 72 6f 77 73  ite outputs rows
19ff0 20 69 6e 20 69 6e 20 74 68 65 20 61 62 73 65 6e   in in the absen
1a000 63 65 20 6f 66 20 61 6e 20 4f 52 44 45 52 20 42  ce of an ORDER B
1a010 59 20 63 6c 61 75 73 65 2e 20 20 2a 2f 0a 20 20  Y clause.  */.  
1a020 69 66 28 20 21 70 4f 72 64 65 72 42 79 20 26 26  if( !pOrderBy &&
1a030 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
1a040 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 76 65  gs & SQLITE_Reve
1a050 72 73 65 4f 72 64 65 72 20 29 7b 0a 20 20 20 20  rseOrder ){.    
1a060 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c  pCost->plan.wsFl
1a070 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 56  ags |= WHERE_REV
1a080 45 52 53 45 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  ERSE;.  }..  ass
1a090 65 72 74 28 20 70 4f 72 64 65 72 42 79 20 7c 7c  ert( pOrderBy ||
1a0a0 20 28 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73   (pCost->plan.ws
1a0b0 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45  Flags&WHERE_ORDE
1a0c0 52 42 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  RBY)==0 );.  ass
1a0d0 65 72 74 28 20 70 43 6f 73 74 2d 3e 70 6c 61 6e  ert( pCost->plan
1a0e0 2e 75 2e 70 49 64 78 3d 3d 30 20 7c 7c 20 28 70  .u.pIdx==0 || (p
1a0f0 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  Cost->plan.wsFla
1a100 67 73 26 57 48 45 52 45 5f 52 4f 57 49 44 5f 45  gs&WHERE_ROWID_E
1a110 51 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Q)==0 );.  asser
1a120 74 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3d  t( pSrc->pIndex=
1a130 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 43  =0 .       || pC
1a140 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  ost->plan.u.pIdx
1a150 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  ==0 .       || p
1a160 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64  Cost->plan.u.pId
1a170 78 3d 3d 70 53 72 63 2d 3e 70 49 6e 64 65 78 20  x==pSrc->pIndex 
1a180 0a 20 20 29 3b 0a 0a 20 20 57 48 45 52 45 54 52  .  );..  WHERETR
1a190 41 43 45 28 28 22 62 65 73 74 20 69 6e 64 65 78  ACE(("best index
1a1a0 20 69 73 3a 20 25 73 5c 6e 22 2c 20 0a 20 20 20   is: %s\n", .   
1a1b0 20 28 28 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77   ((pCost->plan.w
1a1c0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e  sFlags & WHERE_N
1a1d0 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d 30 20  OT_FULLSCAN)==0 
1a1e0 3f 20 22 6e 6f 6e 65 22 20 3a 20 0a 20 20 20 20  ? "none" : .    
1a1f0 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e       pCost->plan
1a200 2e 75 2e 70 49 64 78 20 3f 20 70 43 6f 73 74 2d  .u.pIdx ? pCost-
1a210 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e  >plan.u.pIdx->zN
1a220 61 6d 65 20 3a 20 22 69 70 6b 22 29 0a 20 20 29  ame : "ipk").  )
1a230 29 3b 0a 20 20 0a 20 20 62 65 73 74 4f 72 43 6c  );.  .  bestOrCl
1a240 61 75 73 65 49 6e 64 65 78 28 70 50 61 72 73 65  auseIndex(pParse
1a250 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74  , pWC, pSrc, not
1a260 52 65 61 64 79 2c 20 6e 6f 74 56 61 6c 69 64 2c  Ready, notValid,
1a270 20 70 4f 72 64 65 72 42 79 2c 20 70 43 6f 73 74   pOrderBy, pCost
1a280 29 3b 0a 20 20 62 65 73 74 41 75 74 6f 6d 61 74  );.  bestAutomat
1a290 69 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  icIndex(pParse, 
1a2a0 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65  pWC, pSrc, notRe
1a2b0 61 64 79 2c 20 70 43 6f 73 74 29 3b 0a 20 20 70  ady, pCost);.  p
1a2c0 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  Cost->plan.wsFla
1a2d0 67 73 20 7c 3d 20 65 71 54 65 72 6d 4d 61 73 6b  gs |= eqTermMask
1a2e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
1a2f0 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20 66  the query plan f
1a300 6f 72 20 61 63 63 65 73 73 69 6e 67 20 74 61 62  or accessing tab
1a310 6c 65 20 70 53 72 63 2d 3e 70 54 61 62 2e 20 57  le pSrc->pTab. W
1a320 72 69 74 65 20 74 68 65 0a 2a 2a 20 62 65 73 74  rite the.** best
1a330 20 71 75 65 72 79 20 70 6c 61 6e 20 61 6e 64 20   query plan and 
1a340 69 74 73 20 63 6f 73 74 20 69 6e 74 6f 20 74 68  its cost into th
1a350 65 20 57 68 65 72 65 43 6f 73 74 20 6f 62 6a 65  e WhereCost obje
1a360 63 74 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20  ct supplied .** 
1a370 61 73 20 74 68 65 20 6c 61 73 74 20 70 61 72 61  as the last para
1a380 6d 65 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63  meter. This func
1a390 74 69 6f 6e 20 6d 61 79 20 63 61 6c 63 75 6c 61  tion may calcula
1a3a0 74 65 20 74 68 65 20 63 6f 73 74 20 6f 66 0a 2a  te the cost of.*
1a3b0 2a 20 62 6f 74 68 20 72 65 61 6c 20 61 6e 64 20  * both real and 
1a3c0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 73 63  virtual table sc
1a3d0 61 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ans..*/.static v
1a3e0 6f 69 64 20 62 65 73 74 49 6e 64 65 78 28 0a 20  oid bestIndex(. 
1a3f0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1a400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a410 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
1a420 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ext */.  WhereCl
1a430 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
1a440 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
1a450 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
1a460 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1a470 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65  m *pSrc,  /* The
1a480 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
1a490 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  m to search */. 
1a4a0 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
1a4b0 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
1a4c0 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20  Mask of cursors 
1a4d0 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  not available fo
1a4e0 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20  r indexing */.  
1a4f0 42 69 74 6d 61 73 6b 20 6e 6f 74 56 61 6c 69 64  Bitmask notValid
1a500 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ,           /* C
1a510 75 72 73 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c  ursors not avail
1a520 61 62 6c 65 20 66 6f 72 20 61 6e 79 20 70 75 72  able for any pur
1a530 70 6f 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  pose */.  ExprLi
1a540 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
1a550 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44        /* The ORD
1a560 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
1a570 20 20 57 68 65 72 65 43 6f 73 74 20 2a 70 43 6f    WhereCost *pCo
1a580 73 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st            /*
1a590 20 4c 6f 77 65 73 74 20 63 6f 73 74 20 71 75 65   Lowest cost que
1a5a0 72 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 23 69  ry plan */.){.#i
1a5b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1a5c0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
1a5d0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
1a5e0 53 72 63 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20  Src->pTab) ){.  
1a5f0 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
1a600 69 6e 66 6f 20 2a 70 20 3d 20 30 3b 0a 20 20 20  info *p = 0;.   
1a610 20 62 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65   bestVirtualInde
1a620 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70  x(pParse, pWC, p
1a630 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e  Src, notReady, n
1a640 6f 74 56 61 6c 69 64 2c 20 70 4f 72 64 65 72 42  otValid, pOrderB
1a650 79 2c 20 70 43 6f 73 74 2c 26 70 29 3b 0a 20 20  y, pCost,&p);.  
1a660 20 20 69 66 28 20 70 2d 3e 6e 65 65 64 54 6f 46    if( p->needToF
1a670 72 65 65 49 64 78 53 74 72 20 29 7b 0a 20 20 20  reeIdxStr ){.   
1a680 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1a690 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  p->idxStr);.    
1a6a0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
1a6b0 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
1a6c0 70 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  p);.  }else.#end
1a6d0 69 66 0a 20 20 7b 0a 20 20 20 20 62 65 73 74 42  if.  {.    bestB
1a6e0 74 72 65 65 49 6e 64 65 78 28 70 50 61 72 73 65  treeIndex(pParse
1a6f0 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74  , pWC, pSrc, not
1a700 52 65 61 64 79 2c 20 6e 6f 74 56 61 6c 69 64 2c  Ready, notValid,
1a710 20 70 4f 72 64 65 72 42 79 2c 20 70 43 6f 73 74   pOrderBy, pCost
1a720 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1a730 44 69 73 61 62 6c 65 20 61 20 74 65 72 6d 20 69  Disable a term i
1a740 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
1a750 73 65 2e 20 20 45 78 63 65 70 74 2c 20 64 6f 20  se.  Except, do 
1a760 6e 6f 74 20 64 69 73 61 62 6c 65 20 74 68 65 20  not disable the 
1a770 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f  term.** if it co
1a780 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55  ntrols a LEFT OU
1a790 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20  TER JOIN and it 
1a7a0 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74  did not originat
1a7b0 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f  e in the ON.** o
1a7c0 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  r USING clause o
1a7d0 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a  f that join..**.
1a7e0 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20  ** Consider the 
1a7f0 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69  term t2.z='ok' i
1a800 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
1a810 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  queries:.**.**  
1a820 20 28 31 29 20 20 53 45 4c 45 43 54 20 2a 20 46   (1)  SELECT * F
1a830 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM t1 LEFT JOIN
1a840 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78   t2 ON t1.a=t2.x
1a850 20 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27   WHERE t2.z='ok'
1a860 0a 2a 2a 20 20 20 28 32 29 20 20 53 45 4c 45 43  .**   (2)  SELEC
1a870 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54  T * FROM t1 LEFT
1a880 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61   JOIN t2 ON t1.a
1a890 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27  =t2.x AND t2.z='
1a8a0 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20 53 45  ok'.**   (3)  SE
1a8b0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20  LECT * FROM t1, 
1a8c0 74 32 20 57 48 45 52 45 20 74 31 2e 61 3d 74 32  t2 WHERE t1.a=t2
1a8d0 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27  .x AND t2.z='ok'
1a8e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d  .**.** The t2.z=
1a8f0 27 6f 6b 27 20 69 73 20 64 69 73 61 62 6c 65 64  'ok' is disabled
1a900 20 69 6e 20 74 68 65 20 69 6e 20 28 32 29 20 62   in the in (2) b
1a910 65 63 61 75 73 65 20 69 74 20 6f 72 69 67 69 6e  ecause it origin
1a920 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f  ates.** in the O
1a930 4e 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 74  N clause.  The t
1a940 65 72 6d 20 69 73 20 64 69 73 61 62 6c 65 64 20  erm is disabled 
1a950 69 6e 20 28 33 29 20 62 65 63 61 75 73 65 20 69  in (3) because i
1a960 74 20 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a  t is not part.**
1a970 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52   of a LEFT OUTER
1a980 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20   JOIN.  In (1), 
1a990 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20  the term is not 
1a9a0 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  disabled..**.** 
1a9b0 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
1a9c0 46 3a 20 52 2d 32 34 35 39 37 2d 35 38 36 35 35  F: R-24597-58655
1a9d0 20 4e 6f 20 74 65 73 74 73 20 61 72 65 20 64 6f   No tests are do
1a9e0 6e 65 20 66 6f 72 20 74 65 72 6d 73 20 74 68 61  ne for terms tha
1a9f0 74 20 61 72 65 0a 2a 2a 20 63 6f 6d 70 6c 65 74  t are.** complet
1aa00 65 6c 79 20 73 61 74 69 73 66 69 65 64 20 62 79  ely satisfied by
1aa10 20 69 6e 64 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20   indices..**.** 
1aa20 44 69 73 61 62 6c 69 6e 67 20 61 20 74 65 72 6d  Disabling a term
1aa30 20 63 61 75 73 65 73 20 74 68 61 74 20 74 65 72   causes that ter
1aa40 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74 65 73 74  m to not be test
1aa50 65 64 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20  ed in the inner 
1aa60 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a  loop.** of the j
1aa70 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67 20  oin.  Disabling 
1aa80 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
1aa90 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d 73 20  on.  When terms 
1aaa0 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a  are satisfied.**
1aab0 20 62 79 20 69 6e 64 69 63 65 73 2c 20 77 65 20   by indices, we 
1aac0 64 69 73 61 62 6c 65 20 74 68 65 6d 20 74 6f 20  disable them to 
1aad0 70 72 65 76 65 6e 74 20 72 65 64 75 6e 64 61 6e  prevent redundan
1aae0 74 20 74 65 73 74 73 20 69 6e 20 74 68 65 20 69  t tests in the i
1aaf0 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57  nner.** loop.  W
1ab00 65 20 77 6f 75 6c 64 20 67 65 74 20 74 68 65 20  e would get the 
1ab10 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 73 20  correct results 
1ab20 69 66 20 6e 6f 74 68 69 6e 67 20 77 65 72 65 20  if nothing were 
1ab30 65 76 65 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a  ever disabled,.*
1ab40 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68  * but joins migh
1ab50 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73  t run a little s
1ab60 6c 6f 77 65 72 2e 20 20 54 68 65 20 74 72 69 63  lower.  The tric
1ab70 6b 20 69 73 20 74 6f 20 64 69 73 61 62 6c 65 20  k is to disable 
1ab80 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65  as much.** as we
1ab90 20 63 61 6e 20 77 69 74 68 6f 75 74 20 64 69 73   can without dis
1aba0 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e  abling too much.
1abb0 20 20 49 66 20 77 65 20 64 69 73 61 62 6c 65 64    If we disabled
1abc0 20 69 6e 20 28 31 29 2c 20 77 65 27 64 20 67 65   in (1), we'd ge
1abd0 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20 61  t.** the wrong a
1abe0 6e 73 77 65 72 2e 20 20 53 65 65 20 74 69 63 6b  nswer.  See tick
1abf0 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74  et #813..*/.stat
1ac00 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65 54  ic void disableT
1ac10 65 72 6d 28 57 68 65 72 65 4c 65 76 65 6c 20 2a  erm(WhereLevel *
1ac20 70 4c 65 76 65 6c 2c 20 57 68 65 72 65 54 65 72  pLevel, WhereTer
1ac30 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66 28  m *pTerm){.  if(
1ac40 20 70 54 65 72 6d 0a 20 20 20 20 20 20 26 26 20   pTerm.      && 
1ac50 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
1ac60 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30  & TERM_CODED)==0
1ac70 0a 20 20 20 20 20 20 26 26 20 28 70 4c 65 76 65  .      && (pLeve
1ac80 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20  l->iLeftJoin==0 
1ac90 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  || ExprHasProper
1aca0 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
1acb0 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20   EP_FromJoin)). 
1acc0 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77   ){.    pTerm->w
1acd0 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
1ace0 4f 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54  ODED;.    if( pT
1acf0 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20  erm->iParent>=0 
1ad00 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
1ad10 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54  rm *pOther = &pT
1ad20 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72  erm->pWC->a[pTer
1ad30 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20  m->iParent];.   
1ad40 20 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72     if( (--pOther
1ad50 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a  ->nChild)==0 ){.
1ad60 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
1ad70 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68  erm(pLevel, pOth
1ad80 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
1ad90 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
1ada0 43 6f 64 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e  Code an OP_Affin
1adb0 69 74 79 20 6f 70 63 6f 64 65 20 74 6f 20 61 70  ity opcode to ap
1adc0 70 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61  ply the column a
1add0 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 7a  ffinity string z
1ade0 41 66 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20  Aff.** to the n 
1adf0 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
1ae00 6e 67 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a  ng at base. .**.
1ae10 2a 2a 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ** As an optimiz
1ae20 61 74 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46  ation, SQLITE_AF
1ae30 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 28  F_NONE entries (
1ae40 77 68 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73  which are no-ops
1ae50 29 20 61 74 20 74 68 65 0a 2a 2a 20 62 65 67 69  ) at the.** begi
1ae60 6e 6e 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66  nning and end of
1ae70 20 7a 41 66 66 20 61 72 65 20 69 67 6e 6f 72 65   zAff are ignore
1ae80 64 2e 20 20 49 66 20 61 6c 6c 20 65 6e 74 72 69  d.  If all entri
1ae90 65 73 20 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a  es in zAff are.*
1aea0 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
1aeb0 45 2c 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20  E, then no code 
1aec0 67 65 74 73 20 67 65 6e 65 72 61 74 65 64 2e 0a  gets generated..
1aed0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1aee0 6e 65 20 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e  ne makes its own
1aef0 20 63 6f 70 79 20 6f 66 20 7a 41 66 66 20 73 6f   copy of zAff so
1af00 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
1af10 20 69 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d   is free.** to m
1af20 6f 64 69 66 79 20 7a 41 66 66 20 61 66 74 65 72  odify zAff after
1af30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
1af40 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  turns..*/.static
1af50 20 76 6f 69 64 20 63 6f 64 65 41 70 70 6c 79 41   void codeApplyA
1af60 66 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70  ffinity(Parse *p
1af70 50 61 72 73 65 2c 20 69 6e 74 20 62 61 73 65 2c  Parse, int base,
1af80 20 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41   int n, char *zA
1af90 66 66 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ff){.  Vdbe *v =
1afa0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
1afb0 20 20 69 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b    if( zAff==0 ){
1afc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1afd0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
1afe0 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74  ailed );.    ret
1aff0 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
1b000 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  t( v!=0 );..  /*
1b010 20 41 64 6a 75 73 74 20 62 61 73 65 20 61 6e 64   Adjust base and
1b020 20 6e 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20   n to skip over 
1b030 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
1b040 65 6e 74 72 69 65 73 20 61 74 20 74 68 65 20 62  entries at the b
1b050 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e  eginning.  ** an
1b060 64 20 65 6e 64 20 6f 66 20 74 68 65 20 61 66 66  d end of the aff
1b070 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 20 20  inity string..  
1b080 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  */.  while( n>0 
1b090 26 26 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49  && zAff[0]==SQLI
1b0a0 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20  TE_AFF_NONE ){. 
1b0b0 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65     n--;.    base
1b0c0 2b 2b 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a  ++;.    zAff++;.
1b0d0 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31    }.  while( n>1
1b0e0 20 26 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53   && zAff[n-1]==S
1b0f0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29  QLITE_AFF_NONE )
1b100 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a  {.    n--;.  }..
1b110 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f 50    /* Code the OP
1b120 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65  _Affinity opcode
1b130 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   if there is any
1b140 74 68 69 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f  thing left to do
1b150 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29  . */.  if( n>0 )
1b160 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1b170 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66  eAddOp2(v, OP_Af
1b180 66 69 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e 29  finity, base, n)
1b190 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1b1a0 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
1b1b0 20 7a 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73   zAff, n);.    s
1b1c0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
1b1d0 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
1b1e0 61 72 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a  arse, base, n);.
1b1f0 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65    }.}.../*.** Ge
1b200 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1b210 61 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74  a single equalit
1b220 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  y term of the WH
1b230 45 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20  ERE clause.  An 
1b240 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d  equality.** term
1b250 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 58   can be either X
1b260 3d 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e  =expr or X IN (.
1b270 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20  ..).   pTerm is 
1b280 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a  the term to be .
1b290 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  ** coded..**.** 
1b2a0 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  The current valu
1b2b0 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72  e for the constr
1b2c0 61 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e 20  aint is left in 
1b2d0 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 0a 2a  register iReg..*
1b2e0 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74  *.** For a const
1b2f0 72 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72  raint of the for
1b300 6d 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78  m X=expr, the ex
1b310 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c  pression is eval
1b320 75 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a  uated and its.**
1b330 20 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20   result is left 
1b340 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46  on the stack.  F
1b350 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  or constraints o
1b360 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20  f the form X IN 
1b370 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f  (...).** this ro
1b380 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20  utine sets up a 
1b390 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69  loop that will i
1b3a0 74 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20  terate over all 
1b3b0 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a  values of X..*/.
1b3c0 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 45  static int codeE
1b3d0 71 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50  qualityTerm(.  P
1b3e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1b3f0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
1b400 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
1b410 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
1b420 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f     /* The term o
1b430 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
1b440 73 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  se to be coded *
1b450 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
1b460 70 4c 65 76 65 6c 2c 20 2f 2a 20 57 68 65 6e 20  pLevel, /* When 
1b470 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 46 52 4f  level of the FRO
1b480 4d 20 63 6c 61 75 73 65 20 77 65 20 61 72 65 20  M clause we are 
1b490 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20  working on */.  
1b4a0 69 6e 74 20 69 54 61 72 67 65 74 20 20 20 20 20  int iTarget     
1b4b0 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74      /* Attempt t
1b4c0 6f 20 6c 65 61 76 65 20 72 65 73 75 6c 74 73 20  o leave results 
1b4d0 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
1b4e0 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
1b4f0 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
1b500 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
1b510 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
1b520 6e 74 20 69 52 65 67 3b 20 20 20 20 20 20 20 20  nt iReg;        
1b530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
1b540 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 65  ister holding re
1b550 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 61 73 73 65  sults */..  asse
1b560 72 74 28 20 69 54 61 72 67 65 74 3e 30 20 29 3b  rt( iTarget>0 );
1b570 0a 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54  .  if( pX->op==T
1b580 4b 5f 45 51 20 29 7b 0a 20 20 20 20 69 52 65 67  K_EQ ){.    iReg
1b590 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1b5a0 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
1b5b0 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 69 54 61   pX->pRight, iTa
1b5c0 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69  rget);.  }else i
1b5d0 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  f( pX->op==TK_IS
1b5e0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 52 65 67  NULL ){.    iReg
1b5f0 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20   = iTarget;.    
1b600 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b610 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
1b620 20 69 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20   iReg);.#ifndef 
1b630 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1b640 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  UERY.  }else{.  
1b650 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 20 20 20    int eType;.   
1b660 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 20 20 73   int iTab;.    s
1b670 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49  truct InLoop *pI
1b680 6e 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  n;..    assert( 
1b690 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b  pX->op==TK_IN );
1b6a0 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72  .    iReg = iTar
1b6b0 67 65 74 3b 0a 20 20 20 20 65 54 79 70 65 20 3d  get;.    eType =
1b6c0 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
1b6d0 64 65 78 28 70 50 61 72 73 65 2c 20 70 58 2c 20  dex(pParse, pX, 
1b6e0 30 29 3b 0a 20 20 20 20 69 54 61 62 20 3d 20 70  0);.    iTab = p
1b6f0 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 73  X->iTable;.    s
1b700 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1b710 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
1b720 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  Tab, 0);.    ass
1b730 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  ert( pLevel->pla
1b740 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
1b750 45 5f 49 4e 5f 41 42 4c 45 20 29 3b 0a 20 20 20  E_IN_ABLE );.   
1b760 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 75 2e 69   if( pLevel->u.i
1b770 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  n.nIn==0 ){.    
1b780 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78    pLevel->addrNx
1b790 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
1b7a0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
1b7b0 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75   }.    pLevel->u
1b7c0 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70  .in.nIn++;.    p
1b7d0 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
1b7e0 6f 6f 70 20 3d 0a 20 20 20 20 20 20 20 73 71 6c  oop =.       sql
1b7f0 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
1b800 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
1b810 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
1b820 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  Loop,.          
1b830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b840 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76 65      sizeof(pLeve
1b850 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b  l->u.in.aInLoop[
1b860 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  0])*pLevel->u.in
1b870 2e 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e 20 3d  .nIn);.    pIn =
1b880 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49   pLevel->u.in.aI
1b890 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 70  nLoop;.    if( p
1b8a0 49 6e 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 20  In ){.      pIn 
1b8b0 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  += pLevel->u.in.
1b8c0 6e 49 6e 20 2d 20 31 3b 0a 20 20 20 20 20 20 70  nIn - 1;.      p
1b8d0 49 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61 62 3b  In->iCur = iTab;
1b8e0 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
1b8f0 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  ==IN_INDEX_ROWID
1b900 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d   ){.        pIn-
1b910 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c  >addrInTop = sql
1b920 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1b930 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62  , OP_Rowid, iTab
1b940 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  , iReg);.      }
1b950 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49  else{.        pI
1b960 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73  n->addrInTop = s
1b970 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1b980 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
1b990 54 61 62 2c 20 30 2c 20 69 52 65 67 29 3b 0a 20  Tab, 0, iReg);. 
1b9a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1b9b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
1b9c0 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69 52 65  , OP_IsNull, iRe
1b9d0 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g);.    }else{. 
1b9e0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69       pLevel->u.i
1b9f0 6e 2e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  n.nIn = 0;.    }
1ba00 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69  .#endif.  }.  di
1ba10 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
1ba20 2c 20 70 54 65 72 6d 29 3b 0a 20 20 72 65 74 75  , pTerm);.  retu
1ba30 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn iReg;.}../*.*
1ba40 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1ba50 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61  that will evalua
1ba60 74 65 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e  te all == and IN
1ba70 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72   constraints for
1ba80 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2a   an.** index..**
1ba90 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
1baa0 20 63 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20   consider table 
1bab0 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20  t1(a,b,c,d,e,f) 
1bac0 77 69 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c  with index i1(a,
1bad0 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65  b,c)..** Suppose
1bae0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1baf0 65 20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35  e is this:  a==5
1bb00 20 41 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33   AND b IN (1,2,3
1bb10 29 20 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c  ) AND c>5 AND c<
1bb20 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20  10.** The index 
1bb30 68 61 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74  has as many as t
1bb40 68 72 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f  hree equality co
1bb50 6e 73 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69  nstraints, but i
1bb60 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c  n this.** exampl
1bb70 65 2c 20 74 68 65 20 74 68 69 72 64 20 22 63 22  e, the third "c"
1bb80 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65   value is an ine
1bb90 71 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c  quality.  So onl
1bba0 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72  y two .** constr
1bbb0 61 69 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e  aints are coded.
1bbc0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
1bbd0 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64  ill generate cod
1bbe0 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a  e to evaluate.**
1bbf0 20 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28   a==5 and b IN (
1bc00 31 2c 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72  1,2,3).  The cur
1bc10 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20  rent values for 
1bc20 61 20 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20  a and b will be 
1bc30 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e  stored.** in con
1bc40 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65  secutive registe
1bc50 72 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  rs and the index
1bc60 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 65   of the first re
1bc70 67 69 73 74 65 72 20 69 73 20 72 65 74 75 72 6e  gister is return
1bc80 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  ed..**.** In the
1bc90 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e   example above n
1bca0 45 71 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73  Eq==2.  But this
1bcb0 20 73 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b   subroutine work
1bcc0 73 20 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a  s for any value.
1bcd0 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64  ** of nEq includ
1bce0 69 6e 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d  ing 0.  If nEq==
1bcf0 30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  0, this routine 
1bd00 69 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f  is nearly a no-o
1bd10 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74  p..** The only t
1bd20 68 69 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20  hing it does is 
1bd30 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65  allocate the pLe
1bd40 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79  vel->iMem memory
1bd50 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d   cell and.** com
1bd60 70 75 74 65 20 74 68 65 20 61 66 66 69 6e 69 74  pute the affinit
1bd70 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  y string..**.** 
1bd80 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 77  This routine alw
1bd90 61 79 73 20 61 6c 6c 6f 63 61 74 65 73 20 61 74  ays allocates at
1bda0 20 6c 65 61 73 74 20 6f 6e 65 20 6d 65 6d 6f 72   least one memor
1bdb0 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 74 75 72  y cell and retur
1bdc0 6e 73 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  ns.** the index 
1bdd0 6f 66 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63  of that memory c
1bde0 65 6c 6c 2e 20 54 68 65 20 63 6f 64 65 20 74 68  ell. The code th
1bdf0 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73  at.** calls this
1be00 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75 73   routine will us
1be10 65 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65  e that memory ce
1be20 6c 6c 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ll to store the 
1be30 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6b  termination.** k
1be40 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ey value of the 
1be50 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65 20 6f 72  loop.  If one or
1be60 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72 61 74 6f   more IN operato
1be70 72 73 20 61 70 70 65 61 72 2c 20 74 68 65 6e 0a  rs appear, then.
1be80 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
1be90 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20 61 64 64  allocates an add
1bea0 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f  itional nEq memo
1beb0 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 69 6e 74  ry cells for int
1bec0 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2a  ernal.** use..**
1bed0 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72  .** Before retur
1bee0 6e 69 6e 67 2c 20 2a 70 7a 41 66 66 20 69 73 20  ning, *pzAff is 
1bef0 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
1bf00 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
1bf10 69 6e 67 20 61 0a 2a 2a 20 63 6f 70 79 20 6f 66  ing a.** copy of
1bf20 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69   the column affi
1bf30 6e 69 74 79 20 73 74 72 69 6e 67 20 6f 66 20 74  nity string of t
1bf40 68 65 20 69 6e 64 65 78 20 61 6c 6c 6f 63 61 74  he index allocat
1bf50 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69  ed using.** sqli
1bf60 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 45  te3DbMalloc(). E
1bf70 78 63 65 70 74 2c 20 65 6e 74 72 69 65 73 20 69  xcept, entries i
1bf80 6e 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68  n the copy of th
1bf90 65 20 73 74 72 69 6e 67 20 61 73 73 6f 63 69 61  e string associa
1bfa0 74 65 64 0a 2a 2a 20 77 69 74 68 20 65 71 75 61  ted.** with equa
1bfb0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
1bfc0 20 74 68 61 74 20 75 73 65 20 4e 4f 4e 45 20 61   that use NONE a
1bfd0 66 66 69 6e 69 74 79 20 61 72 65 20 73 65 74 20  ffinity are set 
1bfe0 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46  to.** SQLITE_AFF
1bff0 5f 4e 4f 4e 45 2e 20 54 68 69 73 20 69 73 20 74  _NONE. This is t
1c000 6f 20 64 65 61 6c 20 77 69 74 68 20 53 51 4c 20  o deal with SQL 
1c010 73 75 63 68 20 61 73 20 74 68 65 20 66 6f 6c 6c  such as the foll
1c020 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43  owing:.**.**   C
1c030 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
1c040 20 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45   TEXT PRIMARY KE
1c050 59 2c 20 62 29 3b 0a 2a 2a 20 20 20 53 45 4c 45  Y, b);.**   SELE
1c060 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 41  CT ... FROM t1 A
1c070 53 20 74 32 2c 20 74 31 20 57 48 45 52 45 20 74  S t2, t1 WHERE t
1c080 31 2e 61 20 3d 20 74 32 2e 62 3b 0a 2a 2a 0a 2a  1.a = t2.b;.**.*
1c090 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65  * In the example
1c0a0 20 61 62 6f 76 65 2c 20 74 68 65 20 69 6e 64 65   above, the inde
1c0b0 78 20 6f 6e 20 74 31 28 61 29 20 68 61 73 20 54  x on t1(a) has T
1c0c0 45 58 54 20 61 66 66 69 6e 69 74 79 2e 20 42 75  EXT affinity. Bu
1c0d0 74 20 73 69 6e 63 65 0a 2a 2a 20 74 68 65 20 72  t since.** the r
1c0e0 69 67 68 74 20 68 61 6e 64 20 73 69 64 65 20 6f  ight hand side o
1c0f0 66 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 63  f the equality c
1c100 6f 6e 73 74 72 61 69 6e 74 20 28 74 32 2e 62 29  onstraint (t2.b)
1c110 20 68 61 73 20 4e 4f 4e 45 20 61 66 66 69 6e 69   has NONE affini
1c120 74 79 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e 76 65 72  ty,.** no conver
1c130 73 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 61  sion should be a
1c140 74 74 65 6d 70 74 65 64 20 62 65 66 6f 72 65 20  ttempted before 
1c150 75 73 69 6e 67 20 61 20 74 32 2e 62 20 76 61 6c  using a t2.b val
1c160 75 65 20 61 73 20 70 61 72 74 20 6f 66 0a 2a 2a  ue as part of.**
1c170 20 61 20 6b 65 79 20 74 6f 20 73 65 61 72 63 68   a key to search
1c180 20 74 68 65 20 69 6e 64 65 78 2e 20 48 65 6e 63   the index. Henc
1c190 65 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  e the first byte
1c1a0 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64   in the returned
1c1b0 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 73 74 72   affinity.** str
1c1c0 69 6e 67 20 69 6e 20 74 68 69 73 20 65 78 61 6d  ing in this exam
1c1d0 70 6c 65 20 77 6f 75 6c 64 20 62 65 20 73 65 74  ple would be set
1c1e0 20 74 6f 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e   to SQLITE_AFF_N
1c1f0 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ONE..*/.static i
1c200 6e 74 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69  nt codeAllEquali
1c210 74 79 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65  tyTerms(.  Parse
1c220 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1c230 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
1c240 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  ext */.  WhereLe
1c250 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 2f  vel *pLevel,   /
1c260 2a 20 57 68 69 63 68 20 6e 65 73 74 65 64 20 6c  * Which nested l
1c270 6f 6f 70 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  oop of the FROM 
1c280 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20 2a 2f  we are coding */
1c290 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
1c2a0 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  pWC,     /* The 
1c2b0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
1c2c0 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
1c2d0 64 79 2c 20 20 20 20 20 2f 2a 20 57 68 69 63 68  dy,     /* Which
1c2e0 20 70 61 72 74 73 20 6f 66 20 46 52 4f 4d 20 68   parts of FROM h
1c2f0 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  ave not yet been
1c300 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
1c310 6e 45 78 74 72 61 52 65 67 2c 20 20 20 20 20 20  nExtraReg,      
1c320 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
1c330 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20 74  xtra registers t
1c340 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
1c350 63 68 61 72 20 2a 2a 70 7a 41 66 66 20 20 20 20  char **pzAff    
1c360 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65        /* OUT: Se
1c370 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 66  t to point to af
1c380 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f  finity string */
1c390 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20  .){.  int nEq = 
1c3a0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71  pLevel->plan.nEq
1c3b0 3b 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65  ;   /* The numbe
1c3c0 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f  r of == or IN co
1c3d0 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 63 6f 64  nstraints to cod
1c3e0 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  e */.  Vdbe *v =
1c3f0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
1c400 20 20 20 20 20 2f 2a 20 54 68 65 20 76 6d 20 75       /* The vm u
1c410 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
1c420 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  n */.  Index *pI
1c430 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
1c440 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
1c450 78 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72  x being used for
1c460 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20   this loop */.  
1c470 69 6e 74 20 69 43 75 72 20 3d 20 70 4c 65 76 65  int iCur = pLeve
1c480 6c 2d 3e 69 54 61 62 43 75 72 3b 20 20 20 2f 2a  l->iTabCur;   /*
1c490 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74   The cursor of t
1c4a0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68  he table */.  Wh
1c4b0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
1c4c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1c4d0 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69   single constrai
1c4e0 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74  nt term */.  int
1c4f0 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
1c500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1c510 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
1c520 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20  int regBase;    
1c530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c540 20 42 61 73 65 20 72 65 67 69 73 74 65 72 20 2a   Base register *
1c550 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b 20 20 20  /.  int nReg;   
1c560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c570 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
1c580 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f  egisters to allo
1c590 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  cate */.  char *
1c5a0 7a 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  zAff;           
1c5b0 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e          /* Affin
1c5c0 69 74 79 20 73 74 72 69 6e 67 20 74 6f 20 72 65  ity string to re
1c5d0 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  turn */..  /* Th
1c5e0 69 73 20 6d 6f 64 75 6c 65 20 69 73 20 6f 6e 6c  is module is onl
1c5f0 79 20 63 61 6c 6c 65 64 20 6f 6e 20 71 75 65 72  y called on quer
1c600 79 20 70 6c 61 6e 73 20 74 68 61 74 20 75 73 65  y plans that use
1c610 20 61 6e 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20   an index. */.  
1c620 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
1c630 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
1c640 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 3b 0a  HERE_INDEXED );.
1c650 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d    pIdx = pLevel-
1c660 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 0a 20  >plan.u.pIdx;.. 
1c670 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
1c680 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20 63  ow many memory c
1c690 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65 65  ells we will nee
1c6a0 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20  d then allocate 
1c6b0 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 72 65 67  them..  */.  reg
1c6c0 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Base = pParse->n
1c6d0 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e 52 65 67 20  Mem + 1;.  nReg 
1c6e0 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e  = pLevel->plan.n
1c6f0 45 71 20 2b 20 6e 45 78 74 72 61 52 65 67 3b 0a  Eq + nExtraReg;.
1c700 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
1c710 3d 20 6e 52 65 67 3b 0a 0a 20 20 7a 41 66 66 20  = nReg;..  zAff 
1c720 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
1c730 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 71  p(pParse->db, sq
1c740 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
1c750 74 79 53 74 72 28 76 2c 20 70 49 64 78 29 29 3b  tyStr(v, pIdx));
1c760 0a 20 20 69 66 28 20 21 7a 41 66 66 20 29 7b 0a  .  if( !zAff ){.
1c770 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
1c780 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
1c790 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 76 61 6c  ;.  }..  /* Eval
1c7a0 75 61 74 65 20 74 68 65 20 65 71 75 61 6c 69 74  uate the equalit
1c7b0 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  y constraints.  
1c7c0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  */.  assert( pId
1c7d0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6e 45 71 20  x->nColumn>=nEq 
1c7e0 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  );.  for(j=0; j<
1c7f0 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  nEq; j++){.    i
1c800 6e 74 20 72 31 3b 0a 20 20 20 20 69 6e 74 20 6b  nt r1;.    int k
1c810 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
1c820 6e 5b 6a 5d 3b 0a 20 20 20 20 70 54 65 72 6d 20  n[j];.    pTerm 
1c830 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
1c840 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64  iCur, k, notRead
1c850 79 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  y, pLevel->plan.
1c860 77 73 46 6c 61 67 73 2c 20 70 49 64 78 29 3b 0a  wsFlags, pIdx);.
1c870 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 54      if( NEVER(pT
1c880 65 72 6d 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b  erm==0) ) break;
1c890 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
1c8a0 6f 77 69 6e 67 20 74 72 75 65 20 66 6f 72 20 69  owing true for i
1c8b0 6e 64 69 63 65 73 20 77 69 74 68 20 72 65 64 75  ndices with redu
1c8c0 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a  ndant columns. .
1c8d0 20 20 20 20 2a 2a 20 45 78 3a 20 43 52 45 41 54      ** Ex: CREAT
1c8e0 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
1c8f0 28 61 2c 62 2c 61 29 3b 20 53 45 4c 45 43 54 20  (a,b,a); SELECT 
1c900 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
1c910 61 3d 30 20 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a  a=0 AND b=0; */.
1c920 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
1c930 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
1c940 54 45 52 4d 5f 43 4f 44 45 44 29 21 3d 30 20 29  TERM_CODED)!=0 )
1c950 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1c960 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
1c970 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
1c980 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d   /* EV: R-30575-
1c990 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 72 31 20  11662 */.    r1 
1c9a0 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65  = codeEqualityTe
1c9b0 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  rm(pParse, pTerm
1c9c0 2c 20 70 4c 65 76 65 6c 2c 20 72 65 67 42 61 73  , pLevel, regBas
1c9d0 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20 72 31  e+j);.    if( r1
1c9e0 21 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a 20  !=regBase+j ){. 
1c9f0 20 20 20 20 20 69 66 28 20 6e 52 65 67 3d 3d 31       if( nReg==1
1ca00 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1ca10 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1ca20 67 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  g(pParse, regBas
1ca30 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 67 42  e);.        regB
1ca40 61 73 65 20 3d 20 72 31 3b 0a 20 20 20 20 20 20  ase = r1;.      
1ca50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
1ca60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1ca70 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31  (v, OP_SCopy, r1
1ca80 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20  , regBase+j);.  
1ca90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1caa0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
1cab0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1cac0 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65  ISNULL );.    te
1cad0 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
1cae0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
1caf0 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65   );.    if( (pTe
1cb00 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1cb10 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e  (WO_ISNULL|WO_IN
1cb20 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  ))==0 ){.      E
1cb30 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54  xpr *pRight = pT
1cb40 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
1cb50 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ht;.      sqlite
1cb60 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a  3ExprCodeIsNullJ
1cb70 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72  ump(v, pRight, r
1cb80 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c  egBase+j, pLevel
1cb90 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  ->addrBrk);.    
1cba0 20 20 69 66 28 20 7a 41 66 66 20 29 7b 0a 20 20    if( zAff ){.  
1cbb0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1cbc0 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
1cbd0 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d  (pRight, zAff[j]
1cbe0 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  )==SQLITE_AFF_NO
1cbf0 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NE ){.          
1cc00 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45  zAff[j] = SQLITE
1cc10 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
1cc20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1cc30 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64   sqlite3ExprNeed
1cc40 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67  sNoAffinityChang
1cc50 65 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a  e(pRight, zAff[j
1cc60 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
1cc70 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45  zAff[j] = SQLITE
1cc80 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
1cc90 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1cca0 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41 66 66 20   }.  }.  *pzAff 
1ccb0 3d 20 7a 41 66 66 3b 0a 20 20 72 65 74 75 72 6e  = zAff;.  return
1ccc0 20 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 23 69 66   regBase;.}..#if
1ccd0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1cce0 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 54  _EXPLAIN./*.** T
1ccf0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1cd00 20 68 65 6c 70 65 72 20 66 6f 72 20 65 78 70 6c   helper for expl
1cd10 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 29 20  ainIndexRange() 
1cd20 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20 70 53 74 72  below.**.** pStr
1cd30 20 68 6f 6c 64 73 20 74 68 65 20 74 65 78 74 20   holds the text 
1cd40 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
1cd50 20 74 68 61 74 20 77 65 20 61 72 65 20 62 75 69   that we are bui
1cd60 6c 64 69 6e 67 20 75 70 20 6f 6e 65 20 74 65 72  lding up one ter
1cd70 6d 0a 2a 2a 20 61 74 20 61 20 74 69 6d 65 2e 20  m.** at a time. 
1cd80 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64   This routine ad
1cd90 64 73 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f  ds a new term to
1cda0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1cdb0 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54  expression..** T
1cdc0 65 72 6d 73 20 61 72 65 20 73 65 70 61 72 61 74  erms are separat
1cdd0 65 64 20 62 79 20 41 4e 44 20 73 6f 20 61 64 64  ed by AND so add
1cde0 20 74 68 65 20 22 41 4e 44 22 20 74 65 78 74 20   the "AND" text 
1cdf0 66 6f 72 20 73 65 63 6f 6e 64 20 61 6e 64 20 73  for second and s
1ce00 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 65 72  ubsequent.** ter
1ce10 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74  ms only..*/.stat
1ce20 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 41  ic void explainA
1ce30 70 70 65 6e 64 54 65 72 6d 28 0a 20 20 53 74 72  ppendTerm(.  Str
1ce40 41 63 63 75 6d 20 2a 70 53 74 72 2c 20 20 20 20  Accum *pStr,    
1ce50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1ce60 74 65 78 74 20 65 78 70 72 65 73 73 69 6f 6e 20  text expression 
1ce70 62 65 69 6e 67 20 62 75 69 6c 74 20 2a 2f 0a 20  being built */. 
1ce80 20 69 6e 74 20 69 54 65 72 6d 2c 20 20 20 20 20   int iTerm,     
1ce90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cea0 49 6e 64 65 78 20 6f 66 20 74 68 69 73 20 74 65  Index of this te
1ceb0 72 6d 2e 20 20 46 69 72 73 74 20 69 73 20 7a 65  rm.  First is ze
1cec0 72 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ro */.  const ch
1ced0 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 20 20 20  ar *zColumn,    
1cee0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1cef0 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  he column */.  c
1cf00 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 20  onst char *zOp  
1cf10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
1cf20 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74  me of the operat
1cf30 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69  or */.){.  if( i
1cf40 54 65 72 6d 20 29 20 73 71 6c 69 74 65 33 53 74  Term ) sqlite3St
1cf50 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74  rAccumAppend(pSt
1cf60 72 2c 20 22 20 41 4e 44 20 22 2c 20 35 29 3b 0a  r, " AND ", 5);.
1cf70 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
1cf80 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a 43  mAppend(pStr, zC
1cf90 6f 6c 75 6d 6e 2c 20 2d 31 29 3b 0a 20 20 73 71  olumn, -1);.  sq
1cfa0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
1cfb0 65 6e 64 28 70 53 74 72 2c 20 7a 4f 70 2c 20 31  end(pStr, zOp, 1
1cfc0 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41  );.  sqlite3StrA
1cfd0 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c  ccumAppend(pStr,
1cfe0 20 22 3f 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a   "?", 1);.}../*.
1cff0 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c 65 76  ** Argument pLev
1d000 65 6c 20 64 65 73 63 72 69 62 65 73 20 61 20 73  el describes a s
1d010 74 72 61 74 65 67 79 20 66 6f 72 20 73 63 61 6e  trategy for scan
1d020 6e 69 6e 67 20 74 61 62 6c 65 20 70 54 61 62 2e  ning table pTab.
1d030 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   This .** functi
1d040 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  on returns a poi
1d050 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67  nter to a string
1d060 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
1d070 6e 67 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  ng a description
1d080 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 73 65  .** of the subse
1d090 74 20 6f 66 20 74 61 62 6c 65 20 72 6f 77 73 20  t of table rows 
1d0a0 73 63 61 6e 6e 65 64 20 62 79 20 74 68 65 20 73  scanned by the s
1d0b0 74 72 61 74 65 67 79 20 69 6e 20 74 68 65 20 66  trategy in the f
1d0c0 6f 72 6d 20 6f 66 20 61 6e 0a 2a 2a 20 53 51 4c  orm of an.** SQL
1d0d0 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 4f 72 2c   expression. Or,
1d0e0 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65   if all rows are
1d0f0 20 73 63 61 6e 6e 65 64 2c 20 4e 55 4c 4c 20 69   scanned, NULL i
1d100 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
1d110 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  * For example, i
1d120 66 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a  f the query:.**.
1d130 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
1d140 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31 20  OM t1 WHERE a=1 
1d150 41 4e 44 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20 69  AND b>2;.**.** i
1d160 73 20 72 75 6e 20 61 6e 64 20 74 68 65 72 65 20  s run and there 
1d170 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28  is an index on (
1d180 61 2c 20 62 29 2c 20 74 68 65 6e 20 74 68 69 73  a, b), then this
1d190 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
1d1a0 73 20 61 0a 2a 2a 20 73 74 72 69 6e 67 20 73 69  s a.** string si
1d1b0 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20  milar to:.**.** 
1d1c0 20 20 22 61 3d 3f 20 41 4e 44 20 62 3e 3f 22 0a    "a=? AND b>?".
1d1d0 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
1d1e0 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  ed pointer point
1d1f0 73 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  s to memory obta
1d200 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
1d210 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20  3DbMalloc()..** 
1d220 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
1d230 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
1d240 63 61 6c 6c 65 72 20 74 6f 20 66 72 65 65 20 74  caller to free t
1d250 68 65 20 62 75 66 66 65 72 20 77 68 65 6e 20 69  he buffer when i
1d260 74 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65  t is.** no longe
1d270 72 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73  r required..*/.s
1d280 74 61 74 69 63 20 63 68 61 72 20 2a 65 78 70 6c  tatic char *expl
1d290 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 73 71  ainIndexRange(sq
1d2a0 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
1d2b0 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 54  Level *pLevel, T
1d2c0 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 57  able *pTab){.  W
1d2d0 68 65 72 65 50 6c 61 6e 20 2a 70 50 6c 61 6e 20  herePlan *pPlan 
1d2e0 3d 20 26 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 3b  = &pLevel->plan;
1d2f0 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
1d300 20 3d 20 70 50 6c 61 6e 2d 3e 75 2e 70 49 64 78   = pPlan->u.pIdx
1d310 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 50  ;.  int nEq = pP
1d320 6c 61 6e 2d 3e 6e 45 71 3b 0a 20 20 69 6e 74 20  lan->nEq;.  int 
1d330 69 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  i, j;.  Column *
1d340 61 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  aCol = pTab->aCo
1d350 6c 3b 0a 20 20 69 6e 74 20 2a 61 69 43 6f 6c 75  l;.  int *aiColu
1d360 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43  mn = pIndex->aiC
1d370 6f 6c 75 6d 6e 3b 0a 20 20 53 74 72 41 63 63 75  olumn;.  StrAccu
1d380 6d 20 74 78 74 3b 0a 0a 20 20 69 66 28 20 6e 45  m txt;..  if( nE
1d390 71 3d 3d 30 20 26 26 20 28 70 50 6c 61 6e 2d 3e  q==0 && (pPlan->
1d3a0 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
1d3b0 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45  _BTM_LIMIT|WHERE
1d3c0 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d 30 20  _TOP_LIMIT))==0 
1d3d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1d3e0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74  .  }.  sqlite3St
1d3f0 72 41 63 63 75 6d 49 6e 69 74 28 26 74 78 74 2c  rAccumInit(&txt,
1d400 20 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 4d 41   0, 0, SQLITE_MA
1d410 58 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 74 78 74  X_LENGTH);.  txt
1d420 2e 64 62 20 3d 20 64 62 3b 0a 20 20 73 71 6c 69  .db = db;.  sqli
1d430 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
1d440 64 28 26 74 78 74 2c 20 22 20 28 22 2c 20 32 29  d(&txt, " (", 2)
1d450 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
1d460 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 65 78  Eq; i++){.    ex
1d470 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28  plainAppendTerm(
1d480 26 74 78 74 2c 20 69 2c 20 61 43 6f 6c 5b 61 69  &txt, i, aCol[ai
1d490 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65  Column[i]].zName
1d4a0 2c 20 22 3d 22 29 3b 0a 20 20 7d 0a 0a 20 20 6a  , "=");.  }..  j
1d4b0 20 3d 20 69 3b 0a 20 20 69 66 28 20 70 50 6c 61   = i;.  if( pPla
1d4c0 6e 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45  n->wsFlags&WHERE
1d4d0 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
1d4e0 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54    explainAppendT
1d4f0 65 72 6d 28 26 74 78 74 2c 20 69 2b 2b 2c 20 61  erm(&txt, i++, a
1d500 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d  Col[aiColumn[j]]
1d510 2e 7a 4e 61 6d 65 2c 20 22 3e 22 29 3b 0a 20 20  .zName, ">");.  
1d520 7d 0a 20 20 69 66 28 20 70 50 6c 61 6e 2d 3e 77  }.  if( pPlan->w
1d530 73 46 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50  sFlags&WHERE_TOP
1d540 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 65 78  _LIMIT ){.    ex
1d550 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28  plainAppendTerm(
1d560 26 74 78 74 2c 20 69 2c 20 61 43 6f 6c 5b 61 69  &txt, i, aCol[ai
1d570 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65  Column[j]].zName
1d580 2c 20 22 3c 22 29 3b 0a 20 20 7d 0a 20 20 73 71  , "<");.  }.  sq
1d590 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
1d5a0 65 6e 64 28 26 74 78 74 2c 20 22 29 22 2c 20 31  end(&txt, ")", 1
1d5b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
1d5c0 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73  te3StrAccumFinis
1d5d0 68 28 26 74 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  h(&txt);.}../*.*
1d5e0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1d5f0 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73  is a no-op unles
1d600 73 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63  s currently proc
1d610 65 73 73 69 6e 67 20 61 6e 20 45 58 50 4c 41 49  essing an EXPLAI
1d620 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 2a 2a 20  N QUERY PLAN.** 
1d630 63 6f 6d 6d 61 6e 64 2e 20 49 66 20 74 68 65 20  command. If the 
1d640 71 75 65 72 79 20 62 65 69 6e 67 20 63 6f 6d 70  query being comp
1d650 69 6c 65 64 20 69 73 20 61 6e 20 45 58 50 4c 41  iled is an EXPLA
1d660 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2c 20 61  IN QUERY PLAN, a
1d670 20 73 69 6e 67 6c 65 0a 2a 2a 20 72 65 63 6f 72   single.** recor
1d680 64 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  d is added to th
1d690 65 20 6f 75 74 70 75 74 20 74 6f 20 64 65 73 63  e output to desc
1d6a0 72 69 62 65 20 74 68 65 20 74 61 62 6c 65 20 73  ribe the table s
1d6b0 63 61 6e 20 73 74 72 61 74 65 67 79 20 69 6e 20  can strategy in 
1d6c0 0a 2a 2a 20 70 4c 65 76 65 6c 2e 0a 2a 2f 0a 73  .** pLevel..*/.s
1d6d0 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61  tatic void expla
1d6e0 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 50 61 72  inOneScan(.  Par
1d6f0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
1d700 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d710 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
1d720 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
1d730 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
1d740 20 20 20 2f 2a 20 54 61 62 6c 65 20 6c 69 73 74     /* Table list
1d750 20 74 68 69 73 20 6c 6f 6f 70 20 72 65 66 65 72   this loop refer
1d760 73 20 74 6f 20 2a 2f 0a 20 20 57 68 65 72 65 4c  s to */.  WhereL
1d770 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20  evel *pLevel,   
1d780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61            /* Sca
1d790 6e 20 74 6f 20 77 72 69 74 65 20 4f 50 5f 45 78  n to write OP_Ex
1d7a0 70 6c 61 69 6e 20 6f 70 63 6f 64 65 20 66 6f 72  plain opcode for
1d7b0 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c   */.  int iLevel
1d7c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d7d0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66        /* Value f
1d7e0 6f 72 20 22 6c 65 76 65 6c 22 20 63 6f 6c 75 6d  or "level" colum
1d7f0 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20  n of output */. 
1d800 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20   int iFrom,     
1d810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d820 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 66   /* Value for "f
1d830 72 6f 6d 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f  rom" column of o
1d840 75 74 70 75 74 20 2a 2f 0a 20 20 75 31 36 20 77  utput */.  u16 w
1d850 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20  ctrlFlags       
1d860 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
1d870 61 67 73 20 70 61 73 73 65 64 20 74 6f 20 73 71  ags passed to sq
1d880 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
1d890 29 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50  ) */.){.  if( pP
1d8a0 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
1d8b0 20 29 7b 0a 20 20 20 20 75 33 32 20 66 6c 61 67   ){.    u32 flag
1d8c0 73 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  s = pLevel->plan
1d8d0 2e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 73 74  .wsFlags;.    st
1d8e0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1d8f0 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62  m *pItem = &pTab
1d900 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
1d910 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 56 64 62 65  iFrom];.    Vdbe
1d920 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1d930 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 56 4d 20  dbe;      /* VM 
1d940 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65  being constructe
1d950 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  d */.    sqlite3
1d960 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1d970 62 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61  b;     /* Databa
1d980 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20  se handle */.   
1d990 20 63 68 61 72 20 2a 7a 4d 73 67 3b 20 20 20 20   char *zMsg;    
1d9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d9b0 2a 20 54 65 78 74 20 74 6f 20 61 64 64 20 74 6f  * Text to add to
1d9c0 20 45 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20   EQP output */. 
1d9d0 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
1d9e0 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20   nRow;          
1d9f0 20 2f 2a 20 45 78 70 65 63 74 65 64 20 6e 75 6d   /* Expected num
1da00 62 65 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69  ber of rows visi
1da10 74 65 64 20 62 79 20 73 63 61 6e 20 2a 2f 0a 20  ted by scan */. 
1da20 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70 50 61     int iId = pPa
1da30 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b 20  rse->iSelectId; 
1da40 20 2f 2a 20 53 65 6c 65 63 74 20 69 64 20 28 6c   /* Select id (l
1da50 65 66 74 2d 6d 6f 73 74 20 6f 75 74 70 75 74 20  eft-most output 
1da60 63 6f 6c 75 6d 6e 29 20 2a 2f 0a 20 20 20 20 69  column) */.    i
1da70 6e 74 20 69 73 53 65 61 72 63 68 3b 20 20 20 20  nt isSearch;    
1da80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1da90 54 72 75 65 20 66 6f 72 20 61 20 53 45 41 52 43  True for a SEARC
1daa0 48 2e 20 46 61 6c 73 65 20 66 6f 72 20 53 43 41  H. False for SCA
1dab0 4e 2e 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 28  N. */..    if( (
1dac0 66 6c 61 67 73 26 57 48 45 52 45 5f 4d 55 4c 54  flags&WHERE_MULT
1dad0 49 5f 4f 52 29 20 7c 7c 20 28 77 63 74 72 6c 46  I_OR) || (wctrlF
1dae0 6c 61 67 73 26 57 48 45 52 45 5f 4f 4e 45 54 41  lags&WHERE_ONETA
1daf0 42 4c 45 5f 4f 4e 4c 59 29 20 29 20 72 65 74 75  BLE_ONLY) ) retu
1db00 72 6e 3b 0a 0a 20 20 20 20 69 73 53 65 61 72 63  rn;..    isSearc
1db10 68 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  h = (pLevel->pla
1db20 6e 2e 6e 45 71 3e 30 29 0a 20 20 20 20 20 20 20  n.nEq>0).       
1db30 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26        || (flags&
1db40 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  (WHERE_BTM_LIMIT
1db50 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  |WHERE_TOP_LIMIT
1db60 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ))!=0.          
1db70 20 20 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67     || (wctrlFlag
1db80 73 26 28 57 48 45 52 45 5f 4f 52 44 45 52 42 59  s&(WHERE_ORDERBY
1db90 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52  _MIN|WHERE_ORDER
1dba0 42 59 5f 4d 41 58 29 29 3b 0a 0a 20 20 20 20 7a  BY_MAX));..    z
1dbb0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
1dbc0 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 69  intf(db, "%s", i
1dbd0 73 53 65 61 72 63 68 3f 22 53 45 41 52 43 48 22  sSearch?"SEARCH"
1dbe0 3a 22 53 43 41 4e 22 29 3b 0a 20 20 20 20 69 66  :"SCAN");.    if
1dbf0 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  ( pItem->pSelect
1dc00 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d   ){.      zMsg =
1dc10 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
1dc20 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 53  (db, zMsg, "%s S
1dc30 55 42 51 55 45 52 59 20 25 64 22 2c 20 7a 4d 73  UBQUERY %d", zMs
1dc40 67 2c 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74  g,pItem->iSelect
1dc50 49 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Id);.    }else{.
1dc60 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
1dc70 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
1dc80 20 7a 4d 73 67 2c 20 22 25 73 20 54 41 42 4c 45   zMsg, "%s TABLE
1dc90 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65   %s", zMsg, pIte
1dca0 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  m->zName);.    }
1dcb0 0a 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  ..    if( pItem-
1dcc0 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20  >zAlias ){.     
1dcd0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
1dce0 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
1dcf0 2c 20 22 25 73 20 41 53 20 25 73 22 2c 20 7a 4d  , "%s AS %s", zM
1dd00 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  sg, pItem->zAlia
1dd10 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  s);.    }.    if
1dd20 28 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45  ( (flags & WHERE
1dd30 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 7b 0a  _INDEXED)!=0 ){.
1dd40 20 20 20 20 20 20 63 68 61 72 20 2a 7a 57 68 65        char *zWhe
1dd50 72 65 20 3d 20 65 78 70 6c 61 69 6e 49 6e 64 65  re = explainInde
1dd60 78 52 61 6e 67 65 28 64 62 2c 20 70 4c 65 76 65  xRange(db, pLeve
1dd70 6c 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b  l, pItem->pTab);
1dd80 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  .      zMsg = sq
1dd90 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
1dda0 2c 20 7a 4d 73 67 2c 20 22 25 73 20 55 53 49 4e  , zMsg, "%s USIN
1ddb0 47 20 25 73 25 73 49 4e 44 45 58 25 73 25 73 25  G %s%sINDEX%s%s%
1ddc0 73 22 2c 20 7a 4d 73 67 2c 20 0a 20 20 20 20 20  s", zMsg, .     
1ddd0 20 20 20 20 20 28 28 66 6c 61 67 73 20 26 20 57       ((flags & W
1dde0 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29  HERE_TEMP_INDEX)
1ddf0 3f 22 41 55 54 4f 4d 41 54 49 43 20 22 3a 22 22  ?"AUTOMATIC ":""
1de00 29 2c 0a 20 20 20 20 20 20 20 20 20 20 28 28 66  ),.          ((f
1de10 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
1de20 5f 4f 4e 4c 59 29 3f 22 43 4f 56 45 52 49 4e 47  _ONLY)?"COVERING
1de30 20 22 3a 22 22 29 2c 0a 20 20 20 20 20 20 20 20   ":""),.        
1de40 20 20 28 28 66 6c 61 67 73 20 26 20 57 48 45 52    ((flags & WHER
1de50 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3f 22 22  E_TEMP_INDEX)?""
1de60 3a 22 20 22 29 2c 0a 20 20 20 20 20 20 20 20 20  :" "),.         
1de70 20 28 28 66 6c 61 67 73 20 26 20 57 48 45 52 45   ((flags & WHERE
1de80 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3f 22 22 3a  _TEMP_INDEX)?"":
1de90 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e   pLevel->plan.u.
1dea0 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 2c 0a 20 20  pIdx->zName),.  
1deb0 20 20 20 20 20 20 20 20 7a 57 68 65 72 65 0a 20          zWhere. 
1dec0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71       );.      sq
1ded0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1dee0 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 65 6c  zWhere);.    }el
1def0 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 28  se if( flags & (
1df00 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57  WHERE_ROWID_EQ|W
1df10 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
1df20 29 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20  ) ){.      zMsg 
1df30 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
1df40 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
1df50 55 53 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52  USING INTEGER PR
1df60 49 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73 67  IMARY KEY", zMsg
1df70 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 66 6c  );..      if( fl
1df80 61 67 73 26 57 48 45 52 45 5f 52 4f 57 49 44 5f  ags&WHERE_ROWID_
1df90 45 51 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d  EQ ){.        zM
1dfa0 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
1dfb0 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
1dfc0 25 73 20 28 72 6f 77 69 64 3d 3f 29 22 2c 20 7a  %s (rowid=?)", z
1dfd0 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Msg);.      }els
1dfe0 65 20 69 66 28 20 28 66 6c 61 67 73 26 57 48 45  e if( (flags&WHE
1dff0 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 29 3d 3d  RE_BOTH_LIMIT)==
1e000 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54  WHERE_BOTH_LIMIT
1e010 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67   ){.        zMsg
1e020 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
1e030 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
1e040 20 28 72 6f 77 69 64 3e 3f 20 41 4e 44 20 72 6f   (rowid>? AND ro
1e050 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a  wid<?)", zMsg);.
1e060 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1e070 66 6c 61 67 73 26 57 48 45 52 45 5f 42 54 4d 5f  flags&WHERE_BTM_
1e080 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20  LIMIT ){.       
1e090 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
1e0a0 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
1e0b0 2c 20 22 25 73 20 28 72 6f 77 69 64 3e 3f 29 22  , "%s (rowid>?)"
1e0c0 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d  , zMsg);.      }
1e0d0 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 26 57  else if( flags&W
1e0e0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29  HERE_TOP_LIMIT )
1e0f0 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d  {.        zMsg =
1e100 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
1e110 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28  (db, zMsg, "%s (
1e120 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29  rowid<?)", zMsg)
1e130 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1e140 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1e150 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1e160 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 28 66  .    else if( (f
1e170 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
1e180 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b  TUALTABLE)!=0 ){
1e190 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
1e1a0 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 56 74 61 62  ndex_info *pVtab
1e1b0 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c  Idx = pLevel->pl
1e1c0 61 6e 2e 75 2e 70 56 74 61 62 49 64 78 3b 0a 20  an.u.pVtabIdx;. 
1e1d0 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
1e1e0 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
1e1f0 7a 4d 73 67 2c 20 22 25 73 20 56 49 52 54 55 41  zMsg, "%s VIRTUA
1e200 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20 25 64  L TABLE INDEX %d
1e210 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a 20 20 20 20  :%s", zMsg,.    
1e220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56                pV
1e230 74 61 62 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20  tabIdx->idxNum, 
1e240 70 56 74 61 62 49 64 78 2d 3e 69 64 78 53 74 72  pVtabIdx->idxStr
1e250 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
1e260 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61      if( wctrlFla
1e270 67 73 26 28 57 48 45 52 45 5f 4f 52 44 45 52 42  gs&(WHERE_ORDERB
1e280 59 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f 52 44 45  Y_MIN|WHERE_ORDE
1e290 52 42 59 5f 4d 41 58 29 20 29 7b 0a 20 20 20 20  RBY_MAX) ){.    
1e2a0 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74 72    testcase( wctr
1e2b0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
1e2c0 52 44 45 52 42 59 5f 4d 49 4e 20 29 3b 0a 20 20  RDERBY_MIN );.  
1e2d0 20 20 20 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20      nRow = 1;.  
1e2e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
1e2f0 52 6f 77 20 3d 20 28 73 71 6c 69 74 65 33 5f 69  Row = (sqlite3_i
1e300 6e 74 36 34 29 70 4c 65 76 65 6c 2d 3e 70 6c 61  nt64)pLevel->pla
1e310 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20 7d 0a 20 20  n.nRow;.    }.  
1e320 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
1e330 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
1e340 67 2c 20 22 25 73 20 28 7e 25 6c 6c 64 20 72 6f  g, "%s (~%lld ro
1e350 77 73 29 22 2c 20 7a 4d 73 67 2c 20 6e 52 6f 77  ws)", zMsg, nRow
1e360 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1e370 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
1e380 78 70 6c 61 69 6e 2c 20 69 49 64 2c 20 69 4c 65  xplain, iId, iLe
1e390 76 65 6c 2c 20 69 46 72 6f 6d 2c 20 7a 4d 73 67  vel, iFrom, zMsg
1e3a0 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
1e3b0 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
1e3c0 69 6e 65 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63  ine explainOneSc
1e3d0 61 6e 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a  an(u,v,w,x,y,z).
1e3e0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1e3f0 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f  _OMIT_EXPLAIN */
1e400 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
1e410 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 73  e code for the s
1e420 74 61 72 74 20 6f 66 20 74 68 65 20 69 4c 65 76  tart of the iLev
1e430 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e 20 74 68  el-th loop in th
1e440 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a  e WHERE clause.*
1e450 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
1e460 20 64 65 73 63 72 69 62 65 64 20 62 79 20 70 57   described by pW
1e470 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Info..*/.static 
1e480 42 69 74 6d 61 73 6b 20 63 6f 64 65 4f 6e 65 4c  Bitmask codeOneL
1e490 6f 6f 70 53 74 61 72 74 28 0a 20 20 57 68 65 72  oopStart(.  Wher
1e4a0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20  eInfo *pWInfo,  
1e4b0 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 69 6e 66   /* Complete inf
1e4c0 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
1e4d0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1e4e0 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c  */.  int iLevel,
1e4f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69            /* Whi
1e500 63 68 20 6c 65 76 65 6c 20 6f 66 20 70 57 49 6e  ch level of pWIn
1e510 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64 20 62  fo->a[] should b
1e520 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 75 31 36  e coded */.  u16
1e530 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20   wctrlFlags,    
1e540 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
1e550 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65  WHERE_* flags de
1e560 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49  fined in sqliteI
1e570 6e 74 2e 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73  nt.h */.  Bitmas
1e580 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 2f  k notReady     /
1e590 2a 20 57 68 69 63 68 20 74 61 62 6c 65 73 20 61  * Which tables a
1e5a0 72 65 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61  re currently ava
1e5b0 69 6c 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69  ilable */.){.  i
1e5c0 6e 74 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20  nt j, k;        
1e5d0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
1e5e0 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ters */.  int iC
1e5f0 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ur;            /
1e600 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f  * The VDBE curso
1e610 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
1e620 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e 78 74  */.  int addrNxt
1e630 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65  ;         /* Whe
1e640 72 65 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f  re to jump to co
1e650 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20  ntinue with the 
1e660 6e 65 78 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a  next IN case */.
1e670 20 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b    int omitTable;
1e680 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1e690 66 20 77 65 20 75 73 65 20 74 68 65 20 69 6e 64  f we use the ind
1e6a0 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74  ex only */.  int
1e6b0 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20   bRev;          
1e6c0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20    /* True if we 
1e6d0 6e 65 65 64 20 74 6f 20 73 63 61 6e 20 69 6e 20  need to scan in 
1e6e0 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
1e6f0 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
1e700 4c 65 76 65 6c 3b 20 20 2f 2a 20 54 68 65 20 77  Level;  /* The w
1e710 68 65 72 65 20 6c 65 76 65 6c 20 74 6f 20 62 65  here level to be
1e720 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72   coded */.  Wher
1e730 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
1e740 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f   /* Decompositio
1e750 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  n of the entire 
1e760 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
1e770 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
1e780 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
1e790 20 20 2f 2a 20 41 20 57 48 45 52 45 20 63 6c 61    /* A WHERE cla
1e7a0 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 50 61  use term */.  Pa
1e7b0 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
1e7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e7d0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
1e7e0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
1e7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e800 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65        /* The pre
1e810 70 61 72 65 64 20 73 74 6d 74 20 75 6e 64 65 72  pared stmt under
1e820 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a   constructions *
1e830 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
1e840 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
1e850 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75  m;  /* FROM clau
1e860 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 63 6f  se term being co
1e870 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ded */.  int add
1e880 72 42 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20  rBrk;           
1e890 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
1e8a0 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f   here to break o
1e8b0 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a  ut of the loop *
1e8c0 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74  /.  int addrCont
1e8d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e8e0 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
1e8f0 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
1e900 68 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a  h next cycle */.
1e910 20 20 69 6e 74 20 69 52 6f 77 69 64 52 65 67 20    int iRowidReg 
1e920 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 52  = 0;        /* R
1e930 6f 77 69 64 20 69 73 20 73 74 6f 72 65 64 20 69  owid is stored i
1e940 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72 2c  n this register,
1e950 20 69 66 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a   if not zero */.
1e960 20 20 69 6e 74 20 69 52 65 6c 65 61 73 65 52 65    int iReleaseRe
1e970 67 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54  g = 0;      /* T
1e980 65 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f 20  emp register to 
1e990 66 72 65 65 20 62 65 66 6f 72 65 20 72 65 74 75  free before retu
1e9a0 72 6e 69 6e 67 20 2a 2f 0a 0a 20 20 70 50 61 72  rning */..  pPar
1e9b0 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
1e9c0 72 73 65 3b 0a 20 20 76 20 3d 20 70 50 61 72 73  rse;.  v = pPars
1e9d0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57 43 20  e->pVdbe;.  pWC 
1e9e0 3d 20 70 57 49 6e 66 6f 2d 3e 70 57 43 3b 0a 20  = pWInfo->pWC;. 
1e9f0 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
1ea00 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20  o->a[iLevel];.  
1ea10 70 54 61 62 49 74 65 6d 20 3d 20 26 70 57 49 6e  pTabItem = &pWIn
1ea20 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
1ea30 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
1ea40 20 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65    iCur = pTabIte
1ea50 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 62 52  m->iCursor;.  bR
1ea60 65 76 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 70 6c  ev = (pLevel->pl
1ea70 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
1ea80 52 45 5f 52 45 56 45 52 53 45 29 21 3d 30 3b 0a  RE_REVERSE)!=0;.
1ea90 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28 70    omitTable = (p
1eaa0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
1eab0 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
1eac0 4f 4e 4c 59 29 21 3d 30 20 0a 20 20 20 20 20 20  ONLY)!=0 .      
1ead0 20 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c       && (wctrlFl
1eae0 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f 52 43  ags & WHERE_FORC
1eaf0 45 5f 54 41 42 4c 45 29 3d 3d 30 3b 0a 0a 20 20  E_TABLE)==0;..  
1eb00 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73  /* Create labels
1eb10 20 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b 22   for the "break"
1eb20 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22 20   and "continue" 
1eb30 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 2a  instructions.  *
1eb40 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  * for the curren
1eb50 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f  t loop.  Jump to
1eb60 20 61 64 64 72 42 72 6b 20 74 6f 20 62 72 65 61   addrBrk to brea
1eb70 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e  k out of a loop.
1eb80 0a 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f  .  ** Jump to co
1eb90 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61  nt to go immedia
1eba0 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78 74  tely to the next
1ebb0 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
1ebc0 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a  e.  ** loop..  *
1ebd0 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 72  *.  ** When ther
1ebe0 65 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61  e is an IN opera
1ebf0 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68 61 76  tor, we also hav
1ec00 65 20 61 20 22 61 64 64 72 4e 78 74 22 20 6c 61  e a "addrNxt" la
1ec10 62 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20 6d 65  bel that.  ** me
1ec20 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ans to continue 
1ec30 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e  with the next IN
1ec40 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74 69   value combinati
1ec50 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a 20 74  on.  When.  ** t
1ec60 68 65 72 65 20 61 72 65 20 6e 6f 20 49 4e 20 6f  here are no IN o
1ec70 70 65 72 61 74 6f 72 73 20 69 6e 20 74 68 65 20  perators in the 
1ec80 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65  constraints, the
1ec90 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c   "addrNxt" label
1eca0 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d  .  ** is the sam
1ecb0 65 20 61 73 20 22 61 64 64 72 42 72 6b 22 2e 0a  e as "addrBrk"..
1ecc0 20 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b 20 3d    */.  addrBrk =
1ecd0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
1ece0 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e   = pLevel->addrN
1ecf0 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  xt = sqlite3Vdbe
1ed00 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1ed10 61 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65 76 65  addrCont = pLeve
1ed20 6c 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20 73 71  l->addrCont = sq
1ed30 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1ed40 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  el(v);..  /* If 
1ed50 74 68 69 73 20 69 73 20 74 68 65 20 72 69 67 68  this is the righ
1ed60 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46  t table of a LEF
1ed70 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c  T OUTER JOIN, al
1ed80 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a 2a 20  locate and.  ** 
1ed90 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d  initialize a mem
1eda0 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20 72 65  ory cell that re
1edb0 63 6f 72 64 73 20 69 66 20 74 68 69 73 20 74 61  cords if this ta
1edc0 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e 79 0a  ble matches any.
1edd0 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20    ** row of the 
1ede0 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 74 68  left table of th
1edf0 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69  e join..  */.  i
1ee00 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  f( pLevel->iFrom
1ee10 3e 30 20 26 26 20 28 70 54 61 62 49 74 65 6d 5b  >0 && (pTabItem[
1ee20 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  0].jointype & JT
1ee30 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20  _LEFT)!=0 ){.   
1ee40 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
1ee50 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  in = ++pParse->n
1ee60 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
1ee70 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1ee80 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4c 65  _Integer, 0, pLe
1ee90 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b  vel->iLeftJoin);
1eea0 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
1eeb0 28 28 76 2c 20 22 69 6e 69 74 20 4c 45 46 54 20  ((v, "init LEFT 
1eec0 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c  JOIN no-match fl
1eed0 61 67 22 29 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  ag"));.  }..#ifn
1eee0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1eef0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
1ef00 66 28 20 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  f(  (pLevel->pla
1ef10 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
1ef20 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
1ef30 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  =0 ){.    /* Cas
1ef40 65 20 30 3a 20 20 54 68 65 20 74 61 62 6c 65 20  e 0:  The table 
1ef50 69 73 20 61 20 76 69 72 74 75 61 6c 2d 74 61 62  is a virtual-tab
1ef60 6c 65 2e 20 20 55 73 65 20 74 68 65 20 56 46 69  le.  Use the VFi
1ef70 6c 74 65 72 20 61 6e 64 20 56 4e 65 78 74 0a 20  lter and VNext. 
1ef80 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 74     **          t
1ef90 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
1efa0 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  a..    */.    in
1efb0 74 20 69 52 65 67 3b 20 20 20 2f 2a 20 50 33 20  t iReg;   /* P3 
1efc0 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46 69  Value for OP_VFi
1efd0 6c 74 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69  lter */.    sqli
1efe0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
1eff0 70 56 74 61 62 49 64 78 20 3d 20 70 4c 65 76 65  pVtabIdx = pLeve
1f000 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62 49  l->plan.u.pVtabI
1f010 64 78 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e  dx;.    int nCon
1f020 73 74 72 61 69 6e 74 20 3d 20 70 56 74 61 62 49  straint = pVtabI
1f030 64 78 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  dx->nConstraint;
1f040 0a 20 20 20 20 73 74 72 75 63 74 20 73 71 6c 69  .    struct sqli
1f050 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
1f060 61 69 6e 74 5f 75 73 61 67 65 20 2a 61 55 73 61  aint_usage *aUsa
1f070 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  ge =.           
1f080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0a0 20 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e 61       pVtabIdx->a
1f0b0 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b  ConstraintUsage;
1f0c0 0a 20 20 20 20 63 6f 6e 73 74 20 73 74 72 75 63  .    const struc
1f0d0 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
1f0e0 63 6f 6e 73 74 72 61 69 6e 74 20 2a 61 43 6f 6e  constraint *aCon
1f0f0 73 74 72 61 69 6e 74 20 3d 0a 20 20 20 20 20 20  straint =.      
1f100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f120 20 20 20 20 20 20 20 20 20 20 70 56 74 61 62 49            pVtabI
1f130 64 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b  dx->aConstraint;
1f140 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ..    sqlite3Exp
1f150 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
1f160 65 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 73  e);.    iReg = s
1f170 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
1f180 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73  ge(pParse, nCons
1f190 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 66  traint+2);.    f
1f1a0 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 6e 43 6f 6e 73  or(j=1; j<=nCons
1f1b0 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20  traint; j++){.  
1f1c0 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e      for(k=0; k<n
1f1d0 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6b 2b 2b 29  Constraint; k++)
1f1e0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 55  {.        if( aU
1f1f0 73 61 67 65 5b 6b 5d 2e 61 72 67 76 49 6e 64 65  sage[k].argvInde
1f200 78 3d 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  x==j ){.        
1f210 20 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 61 43    int iTerm = aC
1f220 6f 6e 73 74 72 61 69 6e 74 5b 6b 5d 2e 69 54 65  onstraint[k].iTe
1f230 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  rmOffset;.      
1f240 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1f250 6f 64 65 28 70 50 61 72 73 65 2c 20 70 57 43 2d  ode(pParse, pWC-
1f260 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 2d  >a[iTerm].pExpr-
1f270 3e 70 52 69 67 68 74 2c 20 69 52 65 67 2b 6a 2b  >pRight, iReg+j+
1f280 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  1);.          br
1f290 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
1f2a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1f2b0 20 6b 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20   k==nConstraint 
1f2c0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
1f2d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f2e0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1f2f0 65 72 2c 20 70 56 74 61 62 49 64 78 2d 3e 69 64  er, pVtabIdx->id
1f300 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20 20 20  xNum, iReg);.   
1f310 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f320 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1f330 2c 20 6a 2d 31 2c 20 69 52 65 67 2b 31 29 3b 0a  , j-1, iReg+1);.
1f340 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1f350 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c  ddOp4(v, OP_VFil
1f360 74 65 72 2c 20 69 43 75 72 2c 20 61 64 64 72 42  ter, iCur, addrB
1f370 72 6b 2c 20 69 52 65 67 2c 20 70 56 74 61 62 49  rk, iReg, pVtabI
1f380 64 78 2d 3e 69 64 78 53 74 72 2c 0a 20 20 20 20  dx->idxStr,.    
1f390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3a0 20 20 70 56 74 61 62 49 64 78 2d 3e 6e 65 65 64    pVtabIdx->need
1f3b0 54 6f 46 72 65 65 49 64 78 53 74 72 20 3f 20 50  ToFreeIdxStr ? P
1f3c0 34 5f 4d 50 52 49 4e 54 46 20 3a 20 50 34 5f 53  4_MPRINTF : P4_S
1f3d0 54 41 54 49 43 29 3b 0a 20 20 20 20 70 56 74 61  TATIC);.    pVta
1f3e0 62 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65  bIdx->needToFree
1f3f0 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  IdxStr = 0;.    
1f400 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73  for(j=0; j<nCons
1f410 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20  traint; j++){.  
1f420 20 20 20 20 69 66 28 20 61 55 73 61 67 65 5b 6a      if( aUsage[j
1f430 5d 2e 6f 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  ].omit ){.      
1f440 20 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 61 43    int iTerm = aC
1f450 6f 6e 73 74 72 61 69 6e 74 5b 6a 5d 2e 69 54 65  onstraint[j].iTe
1f460 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  rmOffset;.      
1f470 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
1f480 65 76 65 6c 2c 20 26 70 57 43 2d 3e 61 5b 69 54  evel, &pWC->a[iT
1f490 65 72 6d 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  erm]);.      }. 
1f4a0 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d     }.    pLevel-
1f4b0 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a  >op = OP_VNext;.
1f4c0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
1f4d0 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65   iCur;.    pLeve
1f4e0 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56  l->p2 = sqlite3V
1f4f0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1f500 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
1f510 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
1f520 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f  Parse, iReg, nCo
1f530 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20  nstraint+2);.   
1f540 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1f550 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b  ePop(pParse, 1);
1f560 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20  .  }else.#endif 
1f570 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
1f580 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
1f590 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c    if( pLevel->pl
1f5a0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
1f5b0 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 7b 0a 20  RE_ROWID_EQ ){. 
1f5c0 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 57     /* Case 1:  W
1f5d0 65 20 63 61 6e 20 64 69 72 65 63 74 6c 79 20 72  e can directly r
1f5e0 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e 67 6c  eference a singl
1f5f0 65 20 72 6f 77 20 75 73 69 6e 67 20 61 6e 0a 20  e row using an. 
1f600 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 65     **          e
1f610 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73  quality comparis
1f620 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52  on against the R
1f630 4f 57 49 44 20 66 69 65 6c 64 2e 20 20 4f 72 0a  OWID field.  Or.
1f640 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1f650 77 65 20 72 65 66 65 72 65 6e 63 65 20 6d 75 6c  we reference mul
1f660 74 69 70 6c 65 20 72 6f 77 73 20 75 73 69 6e 67  tiple rows using
1f670 20 61 20 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e   a "rowid IN (..
1f680 2e 29 22 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  .)".    **      
1f690 20 20 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a 20      construct.. 
1f6a0 20 20 20 2a 2f 0a 20 20 20 20 69 52 65 6c 65 61     */.    iRelea
1f6b0 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47  seReg = sqlite3G
1f6c0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
1f6d0 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66  );.    pTerm = f
1f6e0 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
1f6f0 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c  r, -1, notReady,
1f700 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29   WO_EQ|WO_IN, 0)
1f710 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
1f720 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  erm!=0 );.    as
1f730 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78  sert( pTerm->pEx
1f740 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  pr!=0 );.    ass
1f750 65 72 74 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74  ert( pTerm->left
1f760 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a  Cursor==iCur );.
1f770 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74      assert( omit
1f780 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Table==0 );.    
1f790 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
1f7a0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1f7b0 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56  VIRTUAL ); /* EV
1f7c0 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20  : R-30575-11662 
1f7d0 2a 2f 0a 20 20 20 20 69 52 6f 77 69 64 52 65 67  */.    iRowidReg
1f7e0 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54   = codeEqualityT
1f7f0 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72  erm(pParse, pTer
1f800 6d 2c 20 70 4c 65 76 65 6c 2c 20 69 52 65 6c 65  m, pLevel, iRele
1f810 61 73 65 52 65 67 29 3b 0a 20 20 20 20 61 64 64  aseReg);.    add
1f820 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  rNxt = pLevel->a
1f830 64 64 72 4e 78 74 3b 0a 20 20 20 20 73 71 6c 69  ddrNxt;.    sqli
1f840 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1f850 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69   OP_MustBeInt, i
1f860 52 6f 77 69 64 52 65 67 2c 20 61 64 64 72 4e 78  RowidReg, addrNx
1f870 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
1f880 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1f890 4e 6f 74 45 78 69 73 74 73 2c 20 69 43 75 72 2c  NotExists, iCur,
1f8a0 20 61 64 64 72 4e 78 74 2c 20 69 52 6f 77 69 64   addrNxt, iRowid
1f8b0 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Reg);.    sqlite
1f8c0 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28  3ExprCacheStore(
1f8d0 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31  pParse, iCur, -1
1f8e0 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
1f8f0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1f900 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 70 4c  , "pk"));.    pL
1f910 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f  evel->op = OP_No
1f920 6f 70 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  op;.  }else if( 
1f930 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
1f940 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57  lags & WHERE_ROW
1f950 49 44 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20  ID_RANGE ){.    
1f960 2f 2a 20 43 61 73 65 20 32 3a 20 20 57 65 20 68  /* Case 2:  We h
1f970 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74  ave an inequalit
1f980 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61  y comparison aga
1f990 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66  inst the ROWID f
1f9a0 69 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ield..    */.   
1f9b0 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f 50   int testOp = OP
1f9c0 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 73  _Noop;.    int s
1f9d0 74 61 72 74 3b 0a 20 20 20 20 69 6e 74 20 6d 65  tart;.    int me
1f9e0 6d 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b 0a 20  mEndValue = 0;. 
1f9f0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 53     WhereTerm *pS
1fa00 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20  tart, *pEnd;..  
1fa10 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61    assert( omitTa
1fa20 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 53  ble==0 );.    pS
1fa30 74 61 72 74 20 3d 20 66 69 6e 64 54 65 72 6d 28  tart = findTerm(
1fa40 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e  pWC, iCur, -1, n
1fa50 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57  otReady, WO_GT|W
1fa60 4f 5f 47 45 2c 20 30 29 3b 0a 20 20 20 20 70 45  O_GE, 0);.    pE
1fa70 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  nd = findTerm(pW
1fa80 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74  C, iCur, -1, not
1fa90 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f  Ready, WO_LT|WO_
1faa0 4c 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  LE, 0);.    if( 
1fab0 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70 54  bRev ){.      pT
1fac0 65 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a 20 20  erm = pStart;.  
1fad0 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e      pStart = pEn
1fae0 64 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20  d;.      pEnd = 
1faf0 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  pTerm;.    }.   
1fb00 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20   if( pStart ){. 
1fb10 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20       Expr *pX;  
1fb20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1fb30 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
1fb40 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 73 74  t defines the st
1fb50 61 72 74 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20  art bound */.   
1fb60 20 20 20 69 6e 74 20 72 31 2c 20 72 54 65 6d 70     int r1, rTemp
1fb70 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69  ;        /* Regi
1fb80 73 74 65 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e  sters for holdin
1fb90 67 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e  g the start boun
1fba0 64 61 72 79 20 2a 2f 0a 0a 20 20 20 20 20 20 2f  dary */..      /
1fbb0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1fbc0 63 6f 6e 73 74 61 6e 74 20 6d 61 70 73 20 54 4b  constant maps TK
1fbd0 5f 78 78 20 63 6f 64 65 73 20 69 6e 74 6f 20 63  _xx codes into c
1fbe0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a 20 20  orresponding .  
1fbf0 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 70 63 6f      ** seek opco
1fc00 64 65 73 2e 20 20 49 74 20 64 65 70 65 6e 64 73  des.  It depends
1fc10 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   on a particular
1fc20 20 6f 72 64 65 72 69 6e 67 20 6f 66 20 54 4b 5f   ordering of TK_
1fc30 78 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  xx.      */.    
1fc40 20 20 63 6f 6e 73 74 20 75 38 20 61 4d 6f 76 65    const u8 aMove
1fc50 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  Op[] = {.       
1fc60 20 20 20 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20      /* TK_GT */ 
1fc70 20 4f 50 5f 53 65 65 6b 47 74 2c 0a 20 20 20 20   OP_SeekGt,.    
1fc80 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 45 20         /* TK_LE 
1fc90 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 65 2c 0a 20  */  OP_SeekLe,. 
1fca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
1fcb0 4c 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 74  LT */  OP_SeekLt
1fcc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,.           /* 
1fcd0 54 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f 53 65 65  TK_GE */  OP_See
1fce0 6b 47 65 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  kGe.      };.   
1fcf0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45     assert( TK_LE
1fd00 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b 20 20 20 20  ==TK_GT+1 );    
1fd10 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
1fd20 68 65 20 6f 72 64 65 72 69 6e 67 2e 2e 20 2a 2f  he ordering.. */
1fd30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1fd40 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b  K_LT==TK_GT+2 );
1fd50 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66        /*  ... of
1fd60 20 74 68 65 20 54 4b 5f 78 78 20 76 61 6c 75 65   the TK_xx value
1fd70 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  s... */.      as
1fd80 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f  sert( TK_GE==TK_
1fd90 47 54 2b 33 20 29 3b 20 20 20 20 20 20 2f 2a 20  GT+3 );      /* 
1fda0 20 2e 2e 2e 20 69 73 20 63 6f 72 72 65 63 63 74   ... is correcct
1fdb0 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73 74  . */..      test
1fdc0 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e 77 74  case( pStart->wt
1fdd0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
1fde0 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52  TUAL ); /* EV: R
1fdf0 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a  -30575-11662 */.
1fe00 20 20 20 20 20 20 70 58 20 3d 20 70 53 74 61 72        pX = pStar
1fe10 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  t->pExpr;.      
1fe20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b  assert( pX!=0 );
1fe30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1fe40 53 74 61 72 74 2d 3e 6c 65 66 74 43 75 72 73 6f  Start->leftCurso
1fe50 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20  r==iCur );.     
1fe60 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1fe70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1fe80 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 26 72  , pX->pRight, &r
1fe90 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Temp);.      sql
1fea0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1feb0 2c 20 61 4d 6f 76 65 4f 70 5b 70 58 2d 3e 6f 70  , aMoveOp[pX->op
1fec0 2d 54 4b 5f 47 54 5d 2c 20 69 43 75 72 2c 20 61  -TK_GT], iCur, a
1fed0 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20  ddrBrk, r1);.   
1fee0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
1fef0 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 20  v, "pk"));.     
1ff00 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1ff10 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
1ff20 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29 3b 0a  pParse, r1, 1);.
1ff30 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
1ff40 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1ff50 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20 20 20  se, rTemp);.    
1ff60 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
1ff70 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b 0a 20  evel, pStart);. 
1ff80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ff90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ffa0 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c  2(v, bRev ? OP_L
1ffb0 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c  ast : OP_Rewind,
1ffc0 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29 3b   iCur, addrBrk);
1ffd0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1ffe0 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70  End ){.      Exp
1fff0 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 70 58 20  r *pX;.      pX 
20000 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a 20  = pEnd->pExpr;. 
20010 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21       assert( pX!
20020 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
20030 72 74 28 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75  rt( pEnd->leftCu
20040 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20  rsor==iCur );.  
20050 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
20060 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  nd->wtFlags & TE
20070 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a  RM_VIRTUAL ); /*
20080 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36   EV: R-30575-116
20090 36 32 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 45  62 */.      memE
200a0 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72  ndValue = ++pPar
200b0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
200c0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
200d0 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
200e0 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 29  ht, memEndValue)
200f0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e  ;.      if( pX->
20100 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d  op==TK_LT || pX-
20110 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20  >op==TK_GT ){.  
20120 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62        testOp = b
20130 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50  Rev ? OP_Le : OP
20140 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _Ge;.      }else
20150 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70  {.        testOp
20160 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20   = bRev ? OP_Lt 
20170 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d  : OP_Gt;.      }
20180 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65  .      disableTe
20190 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29  rm(pLevel, pEnd)
201a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 72  ;.    }.    star
201b0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
201c0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
201d0 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
201e0 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a  bRev ? OP_Prev :
201f0 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c   OP_Next;.    pL
20200 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b  evel->p1 = iCur;
20210 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
20220 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 69 66 28  = start;.    if(
20230 20 70 53 74 61 72 74 3d 3d 30 20 26 26 20 70 45   pStart==0 && pE
20240 6e 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  nd==0 ){.      p
20250 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49  Level->p5 = SQLI
20260 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55  TE_STMTSTATUS_FU
20270 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20  LLSCAN_STEP;.   
20280 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
20290 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35  sert( pLevel->p5
202a0 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ==0 );.    }.   
202b0 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f   if( testOp!=OP_
202c0 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 69 52  Noop ){.      iR
202d0 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c 65 61  owidReg = iRelea
202e0 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47  seReg = sqlite3G
202f0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
20300 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
20310 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
20320 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 69 52  _Rowid, iCur, iR
20330 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
20340 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
20350 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43  Store(pParse, iC
20360 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65  ur, -1, iRowidRe
20370 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
20380 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 74  3VdbeAddOp3(v, t
20390 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56 61 6c  estOp, memEndVal
203a0 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 69 52 6f  ue, addrBrk, iRo
203b0 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73  widReg);.      s
203c0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
203d0 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41 46 46  P5(v, SQLITE_AFF
203e0 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c 49 54  _NUMERIC | SQLIT
203f0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
20400 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
20410 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
20420 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43  Flags & (WHERE_C
20430 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52  OLUMN_RANGE|WHER
20440 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 20 29 7b 0a  E_COLUMN_EQ) ){.
20450 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20 41      /* Case 3: A
20460 20 73 63 61 6e 20 75 73 69 6e 67 20 61 6e 20 69   scan using an i
20470 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ndex..    **.   
20480 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65 20   **         The 
20490 57 48 45 52 45 20 63 6c 61 75 73 65 20 6d 61 79  WHERE clause may
204a0 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 6f 72   contain zero or
204b0 20 6d 6f 72 65 20 65 71 75 61 6c 69 74 79 20 0a   more equality .
204c0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74      **         t
204d0 65 72 6d 73 20 28 22 3d 3d 22 20 6f 72 20 22 49  erms ("==" or "I
204e0 4e 22 20 6f 70 65 72 61 74 6f 72 73 29 20 74 68  N" operators) th
204f0 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  at refer to the 
20500 4e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  N.    **        
20510 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
20520 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  ns of the index.
20530 20 49 74 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e   It may also con
20540 74 61 69 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20  tain.    **     
20550 20 20 20 20 69 6e 65 71 75 61 6c 69 74 79 20 63      inequality c
20560 6f 6e 73 74 72 61 69 6e 74 73 20 28 3e 2c 20 3c  onstraints (>, <
20570 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e 20 74  , >= or <=) on t
20580 68 65 20 69 6e 64 65 78 65 64 0a 20 20 20 20 2a  he indexed.    *
20590 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  *         column
205a0 20 74 68 61 74 20 69 6d 6d 65 64 69 61 74 65 6c   that immediatel
205b0 79 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 4e 20  y follows the N 
205c0 65 71 75 61 6c 69 74 69 65 73 2e 20 4f 6e 6c 79  equalities. Only
205d0 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20   .    **        
205e0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
205f0 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e  column can be an
20600 20 69 6e 65 71 75 61 6c 69 74 79 20 2d 20 74 68   inequality - th
20610 65 20 72 65 73 74 20 6d 75 73 74 0a 20 20 20 20  e rest must.    
20620 2a 2a 20 20 20 20 20 20 20 20 20 75 73 65 20 74  **         use t
20630 68 65 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22  he "==" and "IN"
20640 20 6f 70 65 72 61 74 6f 72 73 2e 20 46 6f 72 20   operators. For 
20650 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
20660 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
20670 69 6e 64 65 78 20 69 73 20 6f 6e 20 28 78 2c 79  index is on (x,y
20680 2c 7a 29 2c 20 74 68 65 6e 20 74 68 65 20 66 6f  ,z), then the fo
20690 6c 6c 6f 77 69 6e 67 20 63 6c 61 75 73 65 73 20  llowing clauses 
206a0 61 72 65 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20  are all .    ** 
206b0 20 20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 65          optimize
206c0 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d:.    **.    **
206d0 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 0a              x=5.
206e0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
206f0 20 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 0a 20    x=5 AND y=10. 
20700 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
20710 20 78 3d 35 20 41 4e 44 20 79 3c 31 30 0a 20 20   x=5 AND y<10.  
20720 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
20730 78 3d 35 20 41 4e 44 20 79 3e 35 20 41 4e 44 20  x=5 AND y>5 AND 
20740 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20  y<10.    **     
20750 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
20760 3d 35 20 41 4e 44 20 7a 3c 3d 31 30 0a 20 20 20  =5 AND z<=10.   
20770 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
20780 20 20 20 54 68 65 20 7a 3c 31 30 20 74 65 72 6d     The z<10 term
20790 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
207a0 67 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  g cannot be used
207b0 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20  , only.    **   
207c0 20 20 20 20 20 20 74 68 65 20 78 3d 35 20 74 65        the x=5 te
207d0 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  rm:.    **.    *
207e0 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
207f0 20 41 4e 44 20 7a 3c 31 30 0a 20 20 20 20 2a 2a   AND z<10.    **
20800 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
20810 4e 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 69 66  N may be zero if
20820 20 74 68 65 72 65 20 61 72 65 20 69 6e 65 71 75   there are inequ
20830 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
20840 73 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  s..    **       
20850 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e    If there are n
20860 6f 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  o inequality con
20870 73 74 72 61 69 6e 74 73 2c 20 74 68 65 6e 20 4e  straints, then N
20880 20 69 73 20 61 74 0a 20 20 20 20 2a 2a 20 20 20   is at.    **   
20890 20 20 20 20 20 20 6c 65 61 73 74 20 6f 6e 65 2e        least one.
208a0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
208b0 20 20 20 20 20 20 20 54 68 69 73 20 63 61 73 65         This case
208c0 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68   is also used wh
208d0 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  en there are no 
208e0 57 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20  WHERE clause.   
208f0 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73   **         cons
20900 74 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69  traints but an i
20910 6e 64 65 78 20 69 73 20 73 65 6c 65 63 74 65 64  ndex is selected
20920 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65   anyway, in orde
20930 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  r.    **        
20940 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f 75   to force the ou
20950 74 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63 6f  tput order to co
20960 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45  nform to an ORDE
20970 52 20 42 59 2e 0a 20 20 20 20 2a 2f 20 20 0a 20  R BY..    */  . 
20980 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
20990 75 38 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d 20  u8 aStartOp[] = 
209a0 7b 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20  {.      0,.     
209b0 20 30 2c 0a 20 20 20 20 20 20 4f 50 5f 52 65 77   0,.      OP_Rew
209c0 69 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ind,           /
209d0 2a 20 32 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e  * 2: (!start_con
209e0 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61 72  straints && star
209f0 74 45 71 20 26 26 20 20 21 62 52 65 76 29 20 2a  tEq &&  !bRev) *
20a00 2f 0a 20 20 20 20 20 20 4f 50 5f 4c 61 73 74 2c  /.      OP_Last,
20a10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20a20 33 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74  3: (!start_const
20a30 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74 45  raints && startE
20a40 71 20 26 26 20 20 20 62 52 65 76 29 20 2a 2f 0a  q &&   bRev) */.
20a50 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 74 2c        OP_SeekGt,
20a60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 3a             /* 4:
20a70 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69   (start_constrai
20a80 6e 74 73 20 20 26 26 20 21 73 74 61 72 74 45 71  nts  && !startEq
20a90 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20   && !bRev) */.  
20aa0 20 20 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 20 20      OP_SeekLt,  
20ab0 20 20 20 20 20 20 20 20 20 2f 2a 20 35 3a 20 28           /* 5: (
20ac0 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
20ad0 73 20 20 26 26 20 21 73 74 61 72 74 45 71 20 26  s  && !startEq &
20ae0 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  &  bRev) */.    
20af0 20 20 4f 50 5f 53 65 65 6b 47 65 2c 20 20 20 20    OP_SeekGe,    
20b00 20 20 20 20 20 20 20 2f 2a 20 36 3a 20 28 73 74         /* 6: (st
20b10 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
20b20 20 26 26 20 20 73 74 61 72 74 45 71 20 26 26 20   &&  startEq && 
20b30 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
20b40 4f 50 5f 53 65 65 6b 4c 65 20 20 20 20 20 20 20  OP_SeekLe       
20b50 20 20 20 20 20 2f 2a 20 37 3a 20 28 73 74 61 72       /* 7: (star
20b60 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
20b70 26 20 20 73 74 61 72 74 45 71 20 26 26 20 20 62  &  startEq &&  b
20b80 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20  Rev) */.    };. 
20b90 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
20ba0 75 38 20 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a  u8 aEndOp[] = {.
20bb0 20 20 20 20 20 20 4f 50 5f 4e 6f 6f 70 2c 20 20        OP_Noop,  
20bc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a             /* 0:
20bd0 20 28 21 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e   (!end_constrain
20be0 74 73 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ts) */.      OP_
20bf0 49 64 78 47 45 2c 20 20 20 20 20 20 20 20 20 20  IdxGE,          
20c00 20 20 2f 2a 20 31 3a 20 28 65 6e 64 5f 63 6f 6e    /* 1: (end_con
20c10 73 74 72 61 69 6e 74 73 20 26 26 20 21 62 52 65  straints && !bRe
20c20 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49  v) */.      OP_I
20c30 64 78 4c 54 20 20 20 20 20 20 20 20 20 20 20 20  dxLT            
20c40 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73   /* 2: (end_cons
20c50 74 72 61 69 6e 74 73 20 26 26 20 62 52 65 76 29  traints && bRev)
20c60 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69   */.    };.    i
20c70 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d  nt nEq = pLevel-
20c80 3e 70 6c 61 6e 2e 6e 45 71 3b 20 20 2f 2a 20 4e  >plan.nEq;  /* N
20c90 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49  umber of == or I
20ca0 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69  N terms */.    i
20cb0 6e 74 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20  nt isMinQuery = 
20cc0 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  0;          /* I
20cd0 66 20 74 68 69 73 20 69 73 20 61 6e 20 6f 70 74  f this is an opt
20ce0 69 6d 69 7a 65 64 20 53 45 4c 45 43 54 20 6d 69  imized SELECT mi
20cf0 6e 28 78 29 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e  n(x).. */.    in
20d00 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20  t regBase;      
20d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61             /* Ba
20d20 73 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  se register hold
20d30 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  ing constraint v
20d40 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74  alues */.    int
20d50 20 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   r1;            
20d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
20d70 70 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  p register */.  
20d80 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61    WhereTerm *pRa
20d90 6e 67 65 53 74 61 72 74 20 3d 20 30 3b 20 20 2f  ngeStart = 0;  /
20da0 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  * Inequality con
20db0 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65  straint at range
20dc0 20 73 74 61 72 74 20 2a 2f 0a 20 20 20 20 57 68   start */.    Wh
20dd0 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 45  ereTerm *pRangeE
20de0 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6e  nd = 0;    /* In
20df0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
20e00 69 6e 74 20 61 74 20 72 61 6e 67 65 20 65 6e 64  int at range end
20e10 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72   */.    int star
20e20 74 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  tEq;            
20e30 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
20e40 72 61 6e 67 65 20 73 74 61 72 74 20 75 73 65 73  range start uses
20e50 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f   ==, >= or <= */
20e60 0a 20 20 20 20 69 6e 74 20 65 6e 64 45 71 3b 20  .    int endEq; 
20e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e80 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e    /* True if ran
20e90 67 65 20 65 6e 64 20 75 73 65 73 20 3d 3d 2c 20  ge end uses ==, 
20ea0 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20  >= or <= */.    
20eb0 69 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73 74 72  int start_constr
20ec0 61 69 6e 74 73 3b 20 20 20 20 20 20 20 2f 2a 20  aints;       /* 
20ed0 53 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20 69  Start of range i
20ee0 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 2a 2f  s constrained */
20ef0 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72  .    int nConstr
20f00 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  aint;           
20f10 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
20f20 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20  onstraint terms 
20f30 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
20f40 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
20f50 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
20f60 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e   we will be usin
20f70 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64  g */.    int iId
20f80 78 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20  xCur;           
20f90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
20fa0 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
20fb0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e   index */.    in
20fc0 74 20 6e 45 78 74 72 61 52 65 67 20 3d 20 30 3b  t nExtraReg = 0;
20fd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
20fe0 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65  mber of extra re
20ff0 67 69 73 74 65 72 73 20 6e 65 65 64 65 64 20 2a  gisters needed *
21000 2f 0a 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20  /.    int op;   
21010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21020 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f     /* Instructio
21030 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  n opcode */.    
21040 63 68 61 72 20 2a 7a 53 74 61 72 74 41 66 66 3b  char *zStartAff;
21050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21060 41 66 66 69 6e 69 74 79 20 66 6f 72 20 73 74 61  Affinity for sta
21070 72 74 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73  rt of range cons
21080 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 63 68  traint */.    ch
21090 61 72 20 2a 7a 45 6e 64 41 66 66 3b 20 20 20 20  ar *zEndAff;    
210a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
210b0 66 69 6e 69 74 79 20 66 6f 72 20 65 6e 64 20 6f  finity for end o
210c0 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  f range constrai
210d0 6e 74 20 2a 2f 0a 0a 20 20 20 20 70 49 64 78 20  nt */..    pIdx 
210e0 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75  = pLevel->plan.u
210f0 2e 70 49 64 78 3b 0a 20 20 20 20 69 49 64 78 43  .pIdx;.    iIdxC
21100 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ur = pLevel->iId
21110 78 43 75 72 3b 0a 20 20 20 20 6b 20 3d 20 70 49  xCur;.    k = pI
21120 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71  dx->aiColumn[nEq
21130 5d 3b 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  ];     /* Column
21140 20 66 6f 72 20 69 6e 65 71 75 61 6c 69 74 79 20   for inequality 
21150 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a  constraints */..
21160 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6c      /* If this l
21170 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20 61 20  oop satisfies a 
21180 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f 72 64  sort order (pOrd
21190 65 72 42 79 29 20 72 65 71 75 65 73 74 20 74 68  erBy) request th
211a0 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73 20 70  at .    ** was p
211b0 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
211c0 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d  nction to implem
211d0 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20 6d 69  ent a "SELECT mi
211e0 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20 2a  n(x) ..." .    *
211f0 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20 74 68  * query, then th
21200 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e  e caller will on
21210 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f  ly allow the loo
21220 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20 20 20  p to run for.   
21230 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69 74 65   ** a single ite
21240 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61  ration. This mea
21250 6e 73 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ns that the firs
21260 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 20  t row returned. 
21270 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74     ** should not
21280 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76 61 6c   have a NULL val
21290 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27 78 27  ue stored in 'x'
212a0 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78 27 20  . If column 'x' 
212b0 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  is.    ** the fi
212c0 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20 74 68  rst one after th
212d0 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79 20 63  e nEq equality c
212e0 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68  onstraints in th
212f0 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a 20  e index,.    ** 
21300 74 68 69 73 20 72 65 71 75 69 72 65 73 20 73 6f  this requires so
21310 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c  me special handl
21320 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ing..    */.    
21330 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 26  if( (wctrlFlags&
21340 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
21350 4e 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70  N)!=0.     && (p
21360 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
21370 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42  ags&WHERE_ORDERB
21380 59 29 0a 20 20 20 20 20 26 26 20 28 70 49 64 78  Y).     && (pIdx
21390 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 71 29 0a 20  ->nColumn>nEq). 
213a0 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61     ){.      /* a
213b0 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d  ssert( pOrderBy-
213c0 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 20 2a 2f 0a  >nExpr==1 ); */.
213d0 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
213e0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e   pOrderBy->a[0].
213f0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  pExpr->iColumn==
21400 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
21410 45 71 5d 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20  Eq] ); */.      
21420 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 31 3b 0a  isMinQuery = 1;.
21430 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20        nExtraReg 
21440 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
21450 2f 2a 20 46 69 6e 64 20 61 6e 79 20 69 6e 65 71  /* Find any ineq
21460 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
21470 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68 65 20  t terms for the 
21480 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 0a 20  start and end . 
21490 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 72 61 6e     ** of the ran
214a0 67 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ge. .    */.    
214b0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
214c0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
214d0 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _TOP_LIMIT ){.  
214e0 20 20 20 20 70 52 61 6e 67 65 45 6e 64 20 3d 20      pRangeEnd = 
214f0 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
21500 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c  ur, k, notReady,
21510 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 2c 20   (WO_LT|WO_LE), 
21520 70 49 64 78 29 3b 0a 20 20 20 20 20 20 6e 45 78  pIdx);.      nEx
21530 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20  traReg = 1;.    
21540 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  }.    if( pLevel
21550 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
21560 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
21570 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65   ){.      pRange
21580 53 74 61 72 74 20 3d 20 66 69 6e 64 54 65 72 6d  Start = findTerm
21590 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e  (pWC, iCur, k, n
215a0 6f 74 52 65 61 64 79 2c 20 28 57 4f 5f 47 54 7c  otReady, (WO_GT|
215b0 57 4f 5f 47 45 29 2c 20 70 49 64 78 29 3b 0a 20  WO_GE), pIdx);. 
215c0 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d       nExtraReg =
215d0 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   1;.    }..    /
215e0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
215f0 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20  to evaluate all 
21600 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73  constraint terms
21610 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a   using == or IN.
21620 20 20 20 20 2a 2a 20 61 6e 64 20 73 74 6f 72 65      ** and store
21630 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74   the values of t
21640 68 6f 73 65 20 74 65 72 6d 73 20 69 6e 20 61 6e  hose terms in an
21650 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
21660 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  ers.    ** start
21670 69 6e 67 20 61 74 20 72 65 67 42 61 73 65 2e 0a  ing at regBase..
21680 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 42 61      */.    regBa
21690 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45 71 75 61  se = codeAllEqua
216a0 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 20 20 20  lityTerms(.     
216b0 20 20 20 70 50 61 72 73 65 2c 20 70 4c 65 76 65     pParse, pLeve
216c0 6c 2c 20 70 57 43 2c 20 6e 6f 74 52 65 61 64 79  l, pWC, notReady
216d0 2c 20 6e 45 78 74 72 61 52 65 67 2c 20 26 7a 53  , nExtraReg, &zS
216e0 74 61 72 74 41 66 66 0a 20 20 20 20 29 3b 0a 20  tartAff.    );. 
216f0 20 20 20 7a 45 6e 64 41 66 66 20 3d 20 73 71 6c     zEndAff = sql
21700 69 74 65 33 44 62 53 74 72 44 75 70 28 70 50 61  ite3DbStrDup(pPa
21710 72 73 65 2d 3e 64 62 2c 20 7a 53 74 61 72 74 41  rse->db, zStartA
21720 66 66 29 3b 0a 20 20 20 20 61 64 64 72 4e 78 74  ff);.    addrNxt
21730 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e   = pLevel->addrN
21740 78 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77  xt;..    /* If w
21750 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 72 65  e are doing a re
21760 76 65 72 73 65 20 6f 72 64 65 72 20 73 63 61 6e  verse order scan
21770 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67   on an ascending
21780 20 69 6e 64 65 78 2c 20 6f 72 0a 20 20 20 20 2a   index, or.    *
21790 2a 20 61 20 66 6f 72 77 61 72 64 20 6f 72 64 65  * a forward orde
217a0 72 20 73 63 61 6e 20 6f 6e 20 61 20 64 65 73 63  r scan on a desc
217b0 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 69 6e  ending index, in
217c0 74 65 72 63 68 61 6e 67 65 20 74 68 65 20 0a 20  terchange the . 
217d0 20 20 20 2a 2a 20 73 74 61 72 74 20 61 6e 64 20     ** start and 
217e0 65 6e 64 20 74 65 72 6d 73 20 28 70 52 61 6e 67  end terms (pRang
217f0 65 53 74 61 72 74 20 61 6e 64 20 70 52 61 6e 67  eStart and pRang
21800 65 45 6e 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  eEnd)..    */.  
21810 20 20 69 66 28 20 6e 45 71 3c 70 49 64 78 2d 3e    if( nEq<pIdx->
21820 6e 43 6f 6c 75 6d 6e 20 26 26 20 62 52 65 76 3d  nColumn && bRev=
21830 3d 28 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  =(pIdx->aSortOrd
21840 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f  er[nEq]==SQLITE_
21850 53 4f 5f 41 53 43 29 20 29 7b 0a 20 20 20 20 20  SO_ASC) ){.     
21860 20 53 57 41 50 28 57 68 65 72 65 54 65 72 6d 20   SWAP(WhereTerm 
21870 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c 20 70 52  *, pRangeEnd, pR
21880 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20  angeStart);.    
21890 7d 0a 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  }..    testcase(
218a0 20 70 52 61 6e 67 65 53 74 61 72 74 20 26 26 20   pRangeStart && 
218b0 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70  pRangeStart->eOp
218c0 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29  erator & WO_LE )
218d0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
218e0 70 52 61 6e 67 65 53 74 61 72 74 20 26 26 20 70  pRangeStart && p
218f0 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65  RangeStart->eOpe
21900 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b  rator & WO_GE );
21910 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
21920 52 61 6e 67 65 45 6e 64 20 26 26 20 70 52 61 6e  RangeEnd && pRan
21930 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72  geEnd->eOperator
21940 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20   & WO_LE );.    
21950 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65  testcase( pRange
21960 45 6e 64 20 26 26 20 70 52 61 6e 67 65 45 6e 64  End && pRangeEnd
21970 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
21980 5f 47 45 20 29 3b 0a 20 20 20 20 73 74 61 72 74  _GE );.    start
21990 45 71 20 3d 20 21 70 52 61 6e 67 65 53 74 61 72  Eq = !pRangeStar
219a0 74 20 7c 7c 20 70 52 61 6e 67 65 53 74 61 72 74  t || pRangeStart
219b0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
219c0 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20  O_LE|WO_GE);.   
219d0 20 65 6e 64 45 71 20 3d 20 20 20 21 70 52 61 6e   endEq =   !pRan
219e0 67 65 45 6e 64 20 7c 7c 20 70 52 61 6e 67 65 45  geEnd || pRangeE
219f0 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  nd->eOperator & 
21a00 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20  (WO_LE|WO_GE);. 
21a10 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61     start_constra
21a20 69 6e 74 73 20 3d 20 70 52 61 6e 67 65 53 74 61  ints = pRangeSta
21a30 72 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a 20 20  rt || nEq>0;..  
21a40 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 69 6e    /* Seek the in
21a50 64 65 78 20 63 75 72 73 6f 72 20 74 6f 20 74 68  dex cursor to th
21a60 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72  e start of the r
21a70 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6e 43 6f  ange. */.    nCo
21a80 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a  nstraint = nEq;.
21a90 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 53 74      if( pRangeSt
21aa0 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70  art ){.      Exp
21ab0 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e  r *pRight = pRan
21ac0 67 65 53 74 61 72 74 2d 3e 70 45 78 70 72 2d 3e  geStart->pExpr->
21ad0 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71  pRight;.      sq
21ae0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
21af0 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65  arse, pRight, re
21b00 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20  gBase+nEq);.    
21b10 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
21b20 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70  eIsNullJump(v, p
21b30 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e  Right, regBase+n
21b40 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20  Eq, addrNxt);.  
21b50 20 20 20 20 69 66 28 20 7a 53 74 61 72 74 41 66      if( zStartAf
21b60 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  f ){.        if(
21b70 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
21b80 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20  ffinity(pRight, 
21b90 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29 3d  zStartAff[nEq])=
21ba0 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
21bb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
21bc0 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70 61 72  Since the compar
21bd0 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20 70 65  ison is to be pe
21be0 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f 20  rformed with no 
21bf0 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20 20  conversions.    
21c00 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69 65 64        ** applied
21c10 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e 64 73   to the operands
21c20 2c 20 73 65 74 20 74 68 65 20 61 66 66 69 6e 69  , set the affini
21c30 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70  ty to apply to p
21c40 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20 20 20  Right to .      
21c50 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46      ** SQLITE_AF
21c60 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20  F_NONE.  */.    
21c70 20 20 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b        zStartAff[
21c80 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46  nEq] = SQLITE_AF
21c90 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
21ca0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  }.        if( sq
21cb0 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f  lite3ExprNeedsNo
21cc0 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
21cd0 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41 66 66  Right, zStartAff
21ce0 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20 20 20  [nEq]) ){.      
21cf0 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b 6e 45      zStartAff[nE
21d00 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  q] = SQLITE_AFF_
21d10 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
21d20 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20 20 20        }  .      
21d30 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20  nConstraint++;. 
21d40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
21d50 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c  RangeStart->wtFl
21d60 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
21d70 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33  AL ); /* EV: R-3
21d80 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20  0575-11662 */.  
21d90 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4d 69    }else if( isMi
21da0 6e 51 75 65 72 79 20 29 7b 0a 20 20 20 20 20 20  nQuery ){.      
21db0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21dc0 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
21dd0 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
21de0 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74       nConstraint
21df0 2b 2b 3b 0a 20 20 20 20 20 20 73 74 61 72 74 45  ++;.      startE
21e00 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 61  q = 0;.      sta
21e10 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d  rt_constraints =
21e20 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f   1;.    }.    co
21e30 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  deApplyAffinity(
21e40 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c  pParse, regBase,
21e50 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 7a 53   nConstraint, zS
21e60 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 6f 70  tartAff);.    op
21e70 20 3d 20 61 53 74 61 72 74 4f 70 5b 28 73 74 61   = aStartOp[(sta
21e80 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3c 3c  rt_constraints<<
21e90 32 29 20 2b 20 28 73 74 61 72 74 45 71 3c 3c 31  2) + (startEq<<1
21ea0 29 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20 20 61  ) + bRev];.    a
21eb0 73 73 65 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a  ssert( op!=0 );.
21ec0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
21ed0 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20  ==OP_Rewind );. 
21ee0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
21ef0 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20 20  =OP_Last );.    
21f00 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
21f10 5f 53 65 65 6b 47 74 20 29 3b 0a 20 20 20 20 74  _SeekGt );.    t
21f20 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
21f30 53 65 65 6b 47 65 20 29 3b 0a 20 20 20 20 74 65  SeekGe );.    te
21f40 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53  stcase( op==OP_S
21f50 65 65 6b 4c 65 20 29 3b 0a 20 20 20 20 74 65 73  eekLe );.    tes
21f60 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65  tcase( op==OP_Se
21f70 65 6b 4c 74 20 29 3b 0a 20 20 20 20 73 71 6c 69  ekLt );.    sqli
21f80 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
21f90 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c  (v, op, iIdxCur,
21fa0 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73   addrNxt, regBas
21fb0 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b  e, nConstraint);
21fc0 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68  ..    /* Load th
21fd0 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  e value for the 
21fe0 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
21ff0 72 61 69 6e 74 20 61 74 20 74 68 65 20 65 6e 64  raint at the end
22000 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 72   of the.    ** r
22010 61 6e 67 65 20 28 69 66 20 61 6e 79 29 2e 0a 20  ange (if any).. 
22020 20 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74     */.    nConst
22030 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20  raint = nEq;.   
22040 20 69 66 28 20 70 52 61 6e 67 65 45 6e 64 20 29   if( pRangeEnd )
22050 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  {.      Expr *pR
22060 69 67 68 74 20 3d 20 70 52 61 6e 67 65 45 6e 64  ight = pRangeEnd
22070 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
22080 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
22090 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
220a0 61 72 73 65 2c 20 72 65 67 42 61 73 65 2b 6e 45  arse, regBase+nE
220b0 71 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  q, 1);.      sql
220c0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
220d0 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67  rse, pRight, reg
220e0 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20  Base+nEq);.     
220f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
22100 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52  IsNullJump(v, pR
22110 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45  ight, regBase+nE
22120 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20  q, addrNxt);.   
22130 20 20 20 69 66 28 20 7a 45 6e 64 41 66 66 20 29     if( zEndAff )
22140 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
22150 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
22160 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 45 6e  nity(pRight, zEn
22170 64 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49  dAff[nEq])==SQLI
22180 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20  TE_AFF_NONE){.  
22190 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65          /* Since
221a0 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
221b0 69 73 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d  is to be perform
221c0 65 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65  ed with no conve
221d0 72 73 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20  rsions.         
221e0 20 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74   ** applied to t
221f0 68 65 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74  he operands, set
22200 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f   the affinity to
22210 20 61 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74   apply to pRight
22220 20 74 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a   to .          *
22230 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
22240 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  E.  */.         
22250 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 20 3d 20   zEndAff[nEq] = 
22260 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
22270 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22280 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
22290 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
222a0 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20  yChange(pRight, 
222b0 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 29 20 29 7b  zEndAff[nEq]) ){
222c0 0a 20 20 20 20 20 20 20 20 20 20 7a 45 6e 64 41  .          zEndA
222d0 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45  ff[nEq] = SQLITE
222e0 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
222f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20     }.      }  . 
22300 20 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66       codeApplyAf
22310 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72  finity(pParse, r
22320 65 67 42 61 73 65 2c 20 6e 45 71 2b 31 2c 20 7a  egBase, nEq+1, z
22330 45 6e 64 41 66 66 29 3b 0a 20 20 20 20 20 20 6e  EndAff);.      n
22340 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
22350 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
22360 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73  angeEnd->wtFlags
22370 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
22380 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37  ); /* EV: R-3057
22390 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 7d  5-11662 */.    }
223a0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
223b0 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  ee(pParse->db, z
223c0 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 73  StartAff);.    s
223d0 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
223e0 72 73 65 2d 3e 64 62 2c 20 7a 45 6e 64 41 66 66  rse->db, zEndAff
223f0 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f  );..    /* Top o
22400 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20  f the loop body 
22410 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  */.    pLevel->p
22420 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
22430 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a  urrentAddr(v);..
22440 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
22450 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72  the index cursor
22460 20 69 73 20 70 61 73 74 20 74 68 65 20 65 6e 64   is past the end
22470 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a   of the range. *
22480 2f 0a 20 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f  /.    op = aEndO
22490 70 5b 28 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20  p[(pRangeEnd || 
224a0 6e 45 71 29 20 2a 20 28 31 20 2b 20 62 52 65 76  nEq) * (1 + bRev
224b0 29 5d 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  )];.    testcase
224c0 28 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 3b  ( op==OP_Noop );
224d0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
224e0 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20  p==OP_IdxGE );. 
224f0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
22500 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20  =OP_IdxLT );.   
22510 20 69 66 28 20 6f 70 21 3d 4f 50 5f 4e 6f 6f 70   if( op!=OP_Noop
22520 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
22530 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
22540 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61  , op, iIdxCur, a
22550 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c  ddrNxt, regBase,
22560 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20   nConstraint);. 
22570 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22580 43 68 61 6e 67 65 50 35 28 76 2c 20 65 6e 64 45  ChangeP5(v, endE
22590 71 21 3d 62 52 65 76 20 3f 31 3a 30 29 3b 0a 20  q!=bRev ?1:0);. 
225a0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
225b0 74 68 65 72 65 20 61 72 65 20 69 6e 65 71 75 61  there are inequa
225c0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
225d0 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  , check that the
225e0 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66   value.    ** of
225f0 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d   the table colum
22600 6e 20 74 68 61 74 20 74 68 65 20 69 6e 65 71 75  n that the inequ
22610 61 6c 69 74 79 20 63 6f 6e 74 72 61 69 6e 73 20  ality contrains 
22620 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20  is not NULL..   
22630 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 6a 75   ** If it is, ju
22640 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  mp to the next i
22650 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
22660 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
22670 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
22680 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
22690 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
226a0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
226b0 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
226c0 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 74 65 73  LIMIT );.    tes
226d0 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70  tcase( pLevel->p
226e0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
226f0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 3b  ERE_TOP_LIMIT );
22700 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c  .    if( (pLevel
22710 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
22720 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49   (WHERE_BTM_LIMI
22730 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  T|WHERE_TOP_LIMI
22740 54 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  T))!=0 ){.      
22750 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22760 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
22770 69 49 64 78 43 75 72 2c 20 6e 45 71 2c 20 72 31  iIdxCur, nEq, r1
22780 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22790 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
227a0 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 61 64 64  _IsNull, r1, add
227b0 72 43 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  rCont);.    }.  
227c0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
227d0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
227e0 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65  r1);..    /* See
227f0 6b 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 73  k the table curs
22800 6f 72 2c 20 69 66 20 72 65 71 75 69 72 65 64 20  or, if required 
22810 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65  */.    disableTe
22820 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67  rm(pLevel, pRang
22830 65 53 74 61 72 74 29 3b 0a 20 20 20 20 64 69 73  eStart);.    dis
22840 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
22850 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20   pRangeEnd);.   
22860 20 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65 20   if( !omitTable 
22870 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52  ){.      iRowidR
22880 65 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67  eg = iReleaseReg
22890 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
228a0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
228b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
228c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52  ddOp2(v, OP_IdxR
228d0 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20 69  owid, iIdxCur, i
228e0 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
228f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
22900 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
22910 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52  Cur, -1, iRowidR
22920 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
22930 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
22940 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20 69  OP_Seek, iCur, i
22950 52 6f 77 69 64 52 65 67 29 3b 20 20 2f 2a 20 44  RowidReg);  /* D
22960 65 66 65 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a  eferred seek */.
22970 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
22980 63 6f 72 64 20 74 68 65 20 69 6e 73 74 72 75 63  cord the instruc
22990 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 74 65 72  tion used to ter
229a0 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e  minate the loop.
229b0 20 44 69 73 61 62 6c 65 20 0a 20 20 20 20 2a 2a   Disable .    **
229c0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
229d0 72 6d 73 20 6d 61 64 65 20 72 65 64 75 6e 64 61  rms made redunda
229e0 6e 74 20 62 79 20 74 68 65 20 69 6e 64 65 78 20  nt by the index 
229f0 72 61 6e 67 65 20 73 63 61 6e 2e 0a 20 20 20 20  range scan..    
22a00 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  */.    pLevel->o
22a10 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72  p = bRev ? OP_Pr
22a20 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  ev : OP_Next;.  
22a30 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69    pLevel->p1 = i
22a40 49 64 78 43 75 72 3b 0a 20 20 7d 65 6c 73 65 0a  IdxCur;.  }else.
22a50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22a60 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
22a70 54 49 4f 4e 0a 20 20 69 66 28 20 70 4c 65 76 65  TION.  if( pLeve
22a80 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
22a90 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  & WHERE_MULTI_OR
22aa0 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
22ab0 34 3a 20 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20  4:  Two or more 
22ac0 73 65 70 61 72 61 74 65 6c 79 20 69 6e 64 65 78  separately index
22ad0 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74  ed terms connect
22ae0 65 64 20 62 79 20 4f 52 0a 20 20 20 20 2a 2a 0a  ed by OR.    **.
22af0 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a      ** Example:.
22b00 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
22b10 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
22b20 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20 20 2a 2a  a,b,c,d);.    **
22b30 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
22b40 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20 20  i1 ON t1(a);.   
22b50 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44   **   CREATE IND
22b60 45 58 20 69 32 20 4f 4e 20 74 31 28 62 29 3b 0a  EX i2 ON t1(b);.
22b70 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
22b80 49 4e 44 45 58 20 69 33 20 4f 4e 20 74 31 28 63  INDEX i3 ON t1(c
22b90 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
22ba0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
22bb0 20 74 31 20 57 48 45 52 45 20 61 3d 35 20 4f 52   t1 WHERE a=5 OR
22bc0 20 62 3d 37 20 4f 52 20 28 63 3d 31 31 20 41 4e   b=7 OR (c=11 AN
22bd0 44 20 64 3d 31 33 29 0a 20 20 20 20 2a 2a 0a 20  D d=13).    **. 
22be0 20 20 20 2a 2a 20 49 6e 20 74 68 65 20 65 78 61     ** In the exa
22bf0 6d 70 6c 65 2c 20 74 68 65 72 65 20 61 72 65 20  mple, there are 
22c00 74 68 72 65 65 20 69 6e 64 65 78 65 64 20 74 65  three indexed te
22c10 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  rms connected by
22c20 20 4f 52 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20   OR..    ** The 
22c30 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  top of the loop 
22c40 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a  looks like this:
22c50 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
22c60 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20          Null    
22c70 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
22c80 20 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72      # Zero the r
22c90 6f 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20  owset in reg 1. 
22ca0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
22cb0 6e 2c 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65  n, for each inde
22cc0 78 65 64 20 74 65 72 6d 2c 20 74 68 65 20 66 6f  xed term, the fo
22cd0 6c 6c 6f 77 69 6e 67 2e 20 54 68 65 20 61 72 67  llowing. The arg
22ce0 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 2a 2a  uments to.    **
22cf0 20 52 6f 77 53 65 74 54 65 73 74 20 61 72 65 20   RowSetTest are 
22d00 73 75 63 68 20 74 68 61 74 20 74 68 65 20 72 6f  such that the ro
22d10 77 69 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  wid of the curre
22d20 6e 74 20 72 6f 77 20 69 73 20 69 6e 73 65 72 74  nt row is insert
22d30 65 64 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74  ed.    ** into t
22d40 68 65 20 52 6f 77 53 65 74 2e 20 49 66 20 69 74  he RowSet. If it
22d50 20 69 73 20 61 6c 72 65 61 64 79 20 70 72 65 73   is already pres
22d60 65 6e 74 2c 20 63 6f 6e 74 72 6f 6c 20 73 6b 69  ent, control ski
22d70 70 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 6f  ps the.    ** Go
22d80 73 75 62 20 6f 70 63 6f 64 65 20 61 6e 64 20 6a  sub opcode and j
22d90 75 6d 70 73 20 73 74 72 61 69 67 68 74 20 74 6f  umps straight to
22da0 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
22db0 74 65 64 20 62 79 20 57 68 65 72 65 45 6e 64 28  ted by WhereEnd(
22dc0 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
22dd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
22de0 68 65 72 65 42 65 67 69 6e 28 3c 74 65 72 6d 3e  hereBegin(<term>
22df0 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ).    **        
22e00 20 20 52 6f 77 53 65 74 54 65 73 74 20 20 20 20    RowSetTest    
22e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
22e20 49 6e 73 65 72 74 20 72 6f 77 69 64 20 69 6e 74  Insert rowid int
22e30 6f 20 72 6f 77 73 65 74 0a 20 20 20 20 2a 2a 20  o rowset.    ** 
22e40 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 20           Gosub  
22e50 20 20 20 20 32 20 41 0a 20 20 20 20 2a 2a 20 20      2 A.    **  
22e60 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
22e70 72 65 45 6e 64 28 29 0a 20 20 20 20 2a 2a 0a 20  reEnd().    **. 
22e80 20 20 20 2a 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20     ** Following 
22e90 74 68 65 20 61 62 6f 76 65 2c 20 63 6f 64 65 20  the above, code 
22ea0 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
22eb0 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20 41 2c 20   loop. Label A, 
22ec0 74 68 65 20 74 61 72 67 65 74 0a 20 20 20 20 2a  the target.    *
22ed0 2a 20 6f 66 20 74 68 65 20 47 6f 73 75 62 20 61  * of the Gosub a
22ee0 62 6f 76 65 2c 20 6a 75 6d 70 73 20 74 6f 20 74  bove, jumps to t
22ef0 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 72  he instruction r
22f00 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20 47  ight after the G
22f10 6f 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  oto..    **.    
22f20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c  **          Null
22f30 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
22f40 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74          # Zero t
22f50 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67  he rowset in reg
22f60 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   1.    **       
22f70 20 20 20 47 6f 74 6f 20 20 20 20 20 20 20 42 20     Goto       B 
22f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
22f90 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 66 69 6e   The loop is fin
22fa0 69 73 68 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  ished..    **.  
22fb0 20 20 2a 2a 20 20 20 20 20 20 20 41 3a 20 3c 6c    **       A: <l
22fc0 6f 6f 70 20 62 6f 64 79 3e 20 20 20 20 20 20 20  oop body>       
22fd0 20 20 20 20 20 20 20 20 20 20 23 20 52 65 74 75            # Retu
22fe0 72 6e 20 64 61 74 61 2c 20 77 68 61 74 65 76 65  rn data, whateve
22ff0 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  r..    **.    **
23000 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e            Return
23010 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
23020 20 20 20 20 20 20 23 20 4a 75 6d 70 20 62 61 63        # Jump bac
23030 6b 20 74 6f 20 74 68 65 20 47 6f 73 75 62 0a 20  k to the Gosub. 
23040 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
23050 20 20 20 42 3a 20 3c 61 66 74 65 72 20 74 68 65     B: <after the
23060 20 6c 6f 6f 70 3e 0a 20 20 20 20 2a 2a 0a 20 20   loop>.    **.  
23070 20 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 43 6c    */.    WhereCl
23080 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20 20  ause *pOrWc;    
23090 2f 2a 20 54 68 65 20 4f 52 2d 63 6c 61 75 73 65  /* The OR-clause
230a0 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f   broken out into
230b0 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 20   subterms */.   
230c0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 46 69 6e   WhereTerm *pFin
230d0 61 6c 3b 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c  al;     /* Final
230e0 20 73 75 62 74 65 72 6d 20 77 69 74 68 69 6e 20   subterm within 
230f0 74 68 65 20 4f 52 2d 63 6c 61 75 73 65 2e 20 2a  the OR-clause. *
23100 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  /.    SrcList *p
23110 4f 72 54 61 62 3b 20 20 20 20 20 20 20 2f 2a 20  OrTab;       /* 
23120 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c 65 20  Shortened table 
23130 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61 75 73  list or OR-claus
23140 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a  e generation */.
23150 0a 20 20 20 20 69 6e 74 20 72 65 67 52 65 74 75  .    int regRetu
23160 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rn = ++pParse->n
23170 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Mem;           /
23180 2a 20 52 65 67 69 73 74 65 72 20 75 73 65 64 20  * Register used 
23190 77 69 74 68 20 4f 50 5f 47 6f 73 75 62 20 2a 2f  with OP_Gosub */
231a0 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 73  .    int regRows
231b0 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  et = 0;         
231c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
231d0 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 52  * Register for R
231e0 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a  owSet object */.
231f0 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64      int regRowid
23200 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
23210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23220 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
23230 67 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69  g rowid */.    i
23240 6e 74 20 69 4c 6f 6f 70 42 6f 64 79 20 3d 20 73  nt iLoopBody = s
23250 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
23260 62 65 6c 28 76 29 3b 20 20 2f 2a 20 53 74 61 72  bel(v);  /* Star
23270 74 20 6f 66 20 6c 6f 6f 70 20 62 6f 64 79 20 2a  t of loop body *
23280 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 74 49 6e  /.    int iRetIn
23290 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
232a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232b0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 72 65  /* Address of re
232c0 67 52 65 74 75 72 6e 20 69 6e 69 74 20 2a 2f 0a  gReturn init */.
232d0 20 20 20 20 69 6e 74 20 75 6e 74 65 73 74 65 64      int untested
232e0 54 65 72 6d 73 20 3d 20 30 3b 20 20 20 20 20 20  Terms = 0;      
232f0 20 20 20 20 20 20 20 2f 2a 20 53 6f 6d 65 20 74         /* Some t
23300 65 72 6d 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  erms not complet
23310 65 6c 79 20 74 65 73 74 65 64 20 2a 2f 0a 20 20  ely tested */.  
23320 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 0a 20 20    int ii;.   .  
23330 20 20 70 54 65 72 6d 20 3d 20 70 4c 65 76 65 6c    pTerm = pLevel
23340 2d 3e 70 6c 61 6e 2e 75 2e 70 54 65 72 6d 3b 0a  ->plan.u.pTerm;.
23350 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
23360 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  m!=0 );.    asse
23370 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  rt( pTerm->eOper
23380 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 29 3b 0a 20  ator==WO_OR );. 
23390 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72     assert( (pTer
233a0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
233b0 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20 29 3b 0a  M_ORINFO)!=0 );.
233c0 20 20 20 20 70 4f 72 57 63 20 3d 20 26 70 54 65      pOrWc = &pTe
233d0 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77  rm->u.pOrInfo->w
233e0 63 3b 0a 20 20 20 20 70 46 69 6e 61 6c 20 3d 20  c;.    pFinal = 
233f0 26 70 4f 72 57 63 2d 3e 61 5b 70 4f 72 57 63 2d  &pOrWc->a[pOrWc-
23400 3e 6e 54 65 72 6d 2d 31 5d 3b 0a 20 20 20 20 70  >nTerm-1];.    p
23410 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 52  Level->op = OP_R
23420 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65 76 65  eturn;.    pLeve
23430 6c 2d 3e 70 31 20 3d 20 72 65 67 52 65 74 75 72  l->p1 = regRetur
23440 6e 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75  n;..    /* Set u
23450 70 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  p a new SrcList 
23460 6e 69 20 70 4f 72 54 61 62 20 63 6f 6e 74 61 69  ni pOrTab contai
23470 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20 62  ning the table b
23480 65 69 6e 67 20 73 63 61 6e 6e 65 64 0a 20 20 20  eing scanned.   
23490 20 2a 2a 20 62 79 20 74 68 69 73 20 6c 6f 6f 70   ** by this loop
234a0 20 69 6e 20 74 68 65 20 61 5b 30 5d 20 73 6c 6f   in the a[0] slo
234b0 74 20 61 6e 64 20 61 6c 6c 20 6e 6f 74 52 65 61  t and all notRea
234c0 64 79 20 74 61 62 6c 65 73 20 69 6e 20 61 5b 31  dy tables in a[1
234d0 2e 2e 5d 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a  ..] slots..    *
234e0 2a 20 54 68 69 73 20 62 65 63 6f 6d 65 73 20 74  * This becomes t
234f0 68 65 20 53 72 63 4c 69 73 74 20 69 6e 20 74 68  he SrcList in th
23500 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c  e recursive call
23510 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
23520 42 65 67 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a  Begin()..    */.
23530 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
23540 6e 4c 65 76 65 6c 3e 31 20 29 7b 0a 20 20 20 20  nLevel>1 ){.    
23550 20 20 69 6e 74 20 6e 4e 6f 74 52 65 61 64 79 3b    int nNotReady;
23560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23570 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
23580 66 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65  f notReady table
23590 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63  s */.      struc
235a0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
235b0 6f 72 69 67 53 72 63 3b 20 20 20 20 20 2f 2a 20  origSrc;     /* 
235c0 4f 72 69 67 69 6e 61 6c 20 6c 69 73 74 20 6f 66  Original list of
235d0 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20   tables */.     
235e0 20 6e 4e 6f 74 52 65 61 64 79 20 3d 20 70 57 49   nNotReady = pWI
235f0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 2d 20 69 4c  nfo->nLevel - iL
23600 65 76 65 6c 20 2d 20 31 3b 0a 20 20 20 20 20 20  evel - 1;.      
23610 70 4f 72 54 61 62 20 3d 20 73 71 6c 69 74 65 33  pOrTab = sqlite3
23620 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28 70 50  StackAllocRaw(pP
23630 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20  arse->db,.      
23640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23650 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4f        sizeof(*pO
23660 72 54 61 62 29 2b 20 6e 4e 6f 74 52 65 61 64 79  rTab)+ nNotReady
23670 2a 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e  *sizeof(pOrTab->
23680 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  a[0]));.      if
23690 28 20 70 4f 72 54 61 62 3d 3d 30 20 29 20 72 65  ( pOrTab==0 ) re
236a0 74 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 20  turn notReady;. 
236b0 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 41 6c       pOrTab->nAl
236c0 6c 6f 63 20 3d 20 28 69 31 36 29 28 6e 4e 6f 74  loc = (i16)(nNot
236d0 52 65 61 64 79 20 2b 20 31 29 3b 0a 20 20 20 20  Ready + 1);.    
236e0 20 20 70 4f 72 54 61 62 2d 3e 6e 53 72 63 20 3d    pOrTab->nSrc =
236f0 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 3b   pOrTab->nAlloc;
23700 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f  .      memcpy(pO
23710 72 54 61 62 2d 3e 61 2c 20 70 54 61 62 49 74 65  rTab->a, pTabIte
23720 6d 2c 20 73 69 7a 65 6f 66 28 2a 70 54 61 62 49  m, sizeof(*pTabI
23730 74 65 6d 29 29 3b 0a 20 20 20 20 20 20 6f 72 69  tem));.      ori
23740 67 53 72 63 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  gSrc = pWInfo->p
23750 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20  TabList->a;.    
23760 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 6e 4e    for(k=1; k<=nN
23770 6f 74 52 65 61 64 79 3b 20 6b 2b 2b 29 7b 0a 20  otReady; k++){. 
23780 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
23790 4f 72 54 61 62 2d 3e 61 5b 6b 5d 2c 20 26 6f 72  OrTab->a[k], &or
237a0 69 67 53 72 63 5b 70 4c 65 76 65 6c 5b 6b 5d 2e  igSrc[pLevel[k].
237b0 69 46 72 6f 6d 5d 2c 20 73 69 7a 65 6f 66 28 70  iFrom], sizeof(p
237c0 4f 72 54 61 62 2d 3e 61 5b 6b 5d 29 29 3b 0a 20  OrTab->a[k]));. 
237d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
237e0 7b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d  {.      pOrTab =
237f0 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
23800 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  t;.    }..    /*
23810 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
23820 72 6f 77 73 65 74 20 72 65 67 69 73 74 65 72 20  rowset register 
23830 74 6f 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 2e  to contain NULL.
23840 20 41 6e 20 53 51 4c 20 4e 55 4c 4c 20 69 73 20   An SQL NULL is 
23850 0a 20 20 20 20 2a 2a 20 65 71 75 69 76 61 6c 65  .    ** equivale
23860 6e 74 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 72  nt to an empty r
23870 6f 77 73 65 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  owset..    **.  
23880 20 20 2a 2a 20 41 6c 73 6f 20 69 6e 69 74 69 61    ** Also initia
23890 6c 69 7a 65 20 72 65 67 52 65 74 75 72 6e 20 74  lize regReturn t
238a0 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 61 64  o contain the ad
238b0 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e 73  dress of the ins
238c0 74 72 75 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a  truction .    **
238d0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
238e0 6c 6f 77 69 6e 67 20 74 68 65 20 4f 50 5f 52 65  lowing the OP_Re
238f0 74 75 72 6e 20 61 74 20 74 68 65 20 62 6f 74 74  turn at the bott
23900 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  om of the loop. 
23910 54 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 72  This.    ** is r
23920 65 71 75 69 72 65 64 20 69 6e 20 61 20 66 65 77  equired in a few
23930 20 6f 62 73 63 75 72 65 20 4c 45 46 54 20 4a 4f   obscure LEFT JO
23940 49 4e 20 63 61 73 65 73 20 77 68 65 72 65 20 63  IN cases where c
23950 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 0a 20 20 20  ontrol jumps.   
23960 20 2a 2a 20 6f 76 65 72 20 74 68 65 20 74 6f 70   ** over the top
23970 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 6e 74   of the loop int
23980 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 69 74  o the body of it
23990 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
239a0 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65  he .    ** corre
239b0 63 74 20 72 65 73 70 6f 6e 73 65 20 66 6f 72 20  ct response for 
239c0 74 68 65 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20  the end-of-loop 
239d0 63 6f 64 65 20 28 74 68 65 20 4f 50 5f 52 65 74  code (the OP_Ret
239e0 75 72 6e 29 20 69 73 20 74 6f 20 0a 20 20 20 20  urn) is to .    
239f0 2a 2a 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  ** fall through 
23a00 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  to the next inst
23a10 72 75 63 74 69 6f 6e 2c 20 6a 75 73 74 20 61 73  ruction, just as
23a20 20 61 6e 20 4f 50 5f 4e 65 78 74 20 64 6f 65 73   an OP_Next does
23a30 20 69 66 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65   if.    ** calle
23a40 64 20 6f 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61  d on an uninitia
23a50 6c 69 7a 65 64 20 63 75 72 73 6f 72 2e 0a 20 20  lized cursor..  
23a60 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 63    */.    if( (wc
23a70 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
23a80 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d  _DUPLICATES_OK)=
23a90 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 67 52  =0 ){.      regR
23aa0 6f 77 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65  owset = ++pParse
23ab0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65  ->nMem;.      re
23ac0 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73  gRowid = ++pPars
23ad0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
23ae0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
23af0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
23b00 72 65 67 52 6f 77 73 65 74 29 3b 0a 20 20 20 20  regRowset);.    
23b10 7d 0a 20 20 20 20 69 52 65 74 49 6e 69 74 20 3d  }.    iRetInit =
23b20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
23b30 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
23b40 2c 20 30 2c 20 72 65 67 52 65 74 75 72 6e 29 3b  , 0, regReturn);
23b50 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ..    for(ii=0; 
23b60 69 69 3c 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b  ii<pOrWc->nTerm;
23b70 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68   ii++){.      Wh
23b80 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d  ereTerm *pOrTerm
23b90 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 69 69 5d   = &pOrWc->a[ii]
23ba0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54  ;.      if( pOrT
23bb0 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
23bc0 3d 69 43 75 72 20 7c 7c 20 70 4f 72 54 65 72 6d  =iCur || pOrTerm
23bd0 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
23be0 41 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 57  AND ){.        W
23bf0 68 65 72 65 49 6e 66 6f 20 2a 70 53 75 62 57 49  hereInfo *pSubWI
23c00 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  nfo;          /*
23c10 20 49 6e 66 6f 20 66 6f 72 20 73 69 6e 67 6c 65   Info for single
23c20 20 4f 52 2d 74 65 72 6d 20 73 63 61 6e 20 2a 2f   OR-term scan */
23c30 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70  .        /* Loop
23c40 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65   through table e
23c50 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61 74 63  ntries that matc
23c60 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20  h term pOrTerm. 
23c70 2a 2f 0a 20 20 20 20 20 20 20 20 70 53 75 62 57  */.        pSubW
23c80 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
23c90 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
23ca0 20 70 4f 72 54 61 62 2c 20 70 4f 72 54 65 72 6d   pOrTab, pOrTerm
23cb0 2d 3e 70 45 78 70 72 2c 20 30 2c 0a 20 20 20 20  ->pExpr, 0,.    
23cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23cd0 20 20 20 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f      WHERE_OMIT_O
23ce0 50 45 4e 20 7c 20 57 48 45 52 45 5f 4f 4d 49 54  PEN | WHERE_OMIT
23cf0 5f 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20  _CLOSE |.       
23d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d10 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42   WHERE_FORCE_TAB
23d20 4c 45 20 7c 20 57 48 45 52 45 5f 4f 4e 45 54 41  LE | WHERE_ONETA
23d30 42 4c 45 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 20  BLE_ONLY);.     
23d40 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f     if( pSubWInfo
23d50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65 78   ){.          ex
23d60 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20  plainOneScan(.  
23d70 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
23d80 73 65 2c 20 70 4f 72 54 61 62 2c 20 26 70 53 75  se, pOrTab, &pSu
23d90 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c  bWInfo->a[0], iL
23da0 65 76 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69 46  evel, pLevel->iF
23db0 72 6f 6d 2c 20 30 0a 20 20 20 20 20 20 20 20 20  rom, 0.         
23dc0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
23dd0 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
23de0 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53  WHERE_DUPLICATES
23df0 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  _OK)==0 ){.     
23e00 20 20 20 20 20 20 20 69 6e 74 20 69 53 65 74 20         int iSet 
23e10 3d 20 28 28 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e  = ((ii==pOrWc->n
23e20 54 65 72 6d 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a  Term-1)?-1:ii);.
23e30 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
23e40 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  r;.            r
23e50 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
23e60 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
23e70 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  se, pTabItem->pT
23e80 61 62 2c 20 2d 31 2c 20 69 43 75 72 2c 20 0a 20  ab, -1, iCur, . 
23e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23eb0 20 20 20 20 20 20 20 20 72 65 67 52 6f 77 69 64          regRowid
23ec0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
23ed0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
23ee0 49 6e 74 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74  Int(v, OP_RowSet
23ef0 54 65 73 74 2c 20 72 65 67 52 6f 77 73 65 74 2c  Test, regRowset,
23f00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72    sqlite3VdbeCur
23f30 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72  rentAddr(v)+2, r
23f40 2c 20 69 53 65 74 29 3b 0a 20 20 20 20 20 20 20  , iSet);.       
23f50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
23f60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
23f70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
23f80 67 52 65 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f  gReturn, iLoopBo
23f90 64 79 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  dy);..          
23fa0 2f 2a 20 54 68 65 20 70 53 75 62 57 49 6e 66 6f  /* The pSubWInfo
23fb0 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ->untestedTerms 
23fc0 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20  flag means that 
23fd0 74 68 69 73 20 4f 52 20 74 65 72 6d 0a 20 20 20  this OR term.   
23fe0 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69         ** contai
23ff0 6e 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ned one or more 
24000 41 4e 44 20 74 65 72 6d 20 66 72 6f 6d 20 61 20  AND term from a 
24010 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 2e 20  notReady table. 
24020 20 54 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   The.          *
24030 2a 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65  * terms from the
24040 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 20   notReady table 
24050 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 65 73  could not be tes
24060 74 65 64 20 61 6e 64 20 77 69 6c 6c 0a 20 20 20  ted and will.   
24070 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74         ** need t
24080 6f 20 62 65 20 74 65 73 74 65 64 20 6c 61 74 65  o be tested late
24090 72 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  r..          */.
240a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
240b0 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65  ubWInfo->unteste
240c0 64 54 65 72 6d 73 20 29 20 75 6e 74 65 73 74 65  dTerms ) unteste
240d0 64 54 65 72 6d 73 20 3d 20 31 3b 0a 0a 20 20 20  dTerms = 1;..   
240e0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69 73 68         /* Finish
240f0 20 74 68 65 20 6c 6f 6f 70 20 74 68 72 6f 75 67   the loop throug
24100 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20  h table entries 
24110 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20  that match term 
24120 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  pOrTerm. */.    
24130 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
24140 72 65 45 6e 64 28 70 53 75 62 57 49 6e 66 6f 29  reEnd(pSubWInfo)
24150 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
24160 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
24170 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
24180 31 28 76 2c 20 69 52 65 74 49 6e 69 74 2c 20 73  1(v, iRetInit, s
24190 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
241a0 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20 73  tAddr(v));.    s
241b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
241c0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
241d0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29  pLevel->addrBrk)
241e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
241f0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
24200 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20   iLoopBody);..  
24210 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c    if( pWInfo->nL
24220 65 76 65 6c 3e 31 20 29 20 73 71 6c 69 74 65 33  evel>1 ) sqlite3
24230 53 74 61 63 6b 46 72 65 65 28 70 50 61 72 73 65  StackFree(pParse
24240 2d 3e 64 62 2c 20 70 4f 72 54 61 62 29 3b 0a 20  ->db, pOrTab);. 
24250 20 20 20 69 66 28 20 21 75 6e 74 65 73 74 65 64     if( !untested
24260 54 65 72 6d 73 20 29 20 64 69 73 61 62 6c 65 54  Terms ) disableT
24270 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72  erm(pLevel, pTer
24280 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  m);.  }else.#end
24290 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
242a0 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
242b0 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a  N */..  {.    /*
242c0 20 43 61 73 65 20 35 3a 20 20 54 68 65 72 65 20   Case 5:  There 
242d0 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64  is no usable ind
242e0 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f 20  ex.  We must do 
242f0 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a  a complete.    *
24300 2a 20 20 20 20 20 20 20 20 20 20 73 63 61 6e 20  *          scan 
24310 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 61  of the entire ta
24320 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
24330 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
24340 61 53 74 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e  aStep[] = { OP_N
24350 65 78 74 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a  ext, OP_Prev };.
24360 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
24370 20 75 38 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b   u8 aStart[] = {
24380 20 4f 50 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c   OP_Rewind, OP_L
24390 61 73 74 20 7d 3b 0a 20 20 20 20 61 73 73 65 72  ast };.    asser
243a0 74 28 20 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52  t( bRev==0 || bR
243b0 65 76 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  ev==1 );.    ass
243c0 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d  ert( omitTable==
243d0 30 20 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  0 );.    pLevel-
243e0 3e 6f 70 20 3d 20 61 53 74 65 70 5b 62 52 65 76  >op = aStep[bRev
243f0 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  ];.    pLevel->p
24400 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c  1 = iCur;.    pL
24410 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73  evel->p2 = 1 + s
24420 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
24430 28 76 2c 20 61 53 74 61 72 74 5b 62 52 65 76 5d  (v, aStart[bRev]
24440 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29  , iCur, addrBrk)
24450 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35  ;.    pLevel->p5
24460 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54   = SQLITE_STMTST
24470 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54  ATUS_FULLSCAN_ST
24480 45 50 3b 0a 20 20 7d 0a 20 20 6e 6f 74 52 65 61  EP;.  }.  notRea
24490 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 70  dy &= ~getMask(p
244a0 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 69 43  WC->pMaskSet, iC
244b0 75 72 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73 65 72  ur);..  /* Inser
244c0 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65  t code to test e
244d0 76 65 72 79 20 73 75 62 65 78 70 72 65 73 73 69  very subexpressi
244e0 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20 63  on that can be c
244f0 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63  ompletely.  ** c
24500 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74 68  omputed using th
24510 65 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f 66  e current set of
24520 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
24530 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  ** IMPLEMENTATIO
24540 4e 2d 4f 46 3a 20 52 2d 34 39 35 32 35 2d 35 30  N-OF: R-49525-50
24550 39 33 35 20 54 65 72 6d 73 20 74 68 61 74 20 63  935 Terms that c
24560 61 6e 6e 6f 74 20 62 65 20 73 61 74 69 73 66 69  annot be satisfi
24570 65 64 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20  ed through.  ** 
24580 74 68 65 20 75 73 65 20 6f 66 20 69 6e 64 69 63  the use of indic
24590 65 73 20 62 65 63 6f 6d 65 20 74 65 73 74 73 20  es become tests 
245a0 74 68 61 74 20 61 72 65 20 65 76 61 6c 75 61 74  that are evaluat
245b0 65 64 20 61 67 61 69 6e 73 74 20 65 61 63 68 20  ed against each 
245c0 72 6f 77 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  row of.  ** the 
245d0 72 65 6c 65 76 61 6e 74 20 69 6e 70 75 74 20 74  relevant input t
245e0 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 6b 20  ables..  */.  k 
245f0 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d  = 0;.  for(pTerm
24600 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e  =pWC->a, j=pWC->
24610 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c  nTerm; j>0; j--,
24620 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45   pTerm++){.    E
24630 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 74 65 73  xpr *pE;.    tes
24640 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
24650 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
24660 54 55 41 4c 20 29 3b 20 2f 2a 20 49 4d 50 3a 20  TUAL ); /* IMP: 
24670 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f  R-30575-11662 */
24680 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
24690 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
246a0 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20  TERM_CODED );.  
246b0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
246c0 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
246d0 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
246e0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
246f0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
24700 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64  reqAll & notRead
24710 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 74  y)!=0 ){.      t
24720 65 73 74 63 61 73 65 28 20 70 57 49 6e 66 6f 2d  estcase( pWInfo-
24730 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 3d 3d  >untestedTerms==
24740 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
24750 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
24760 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
24770 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d  ONETABLE_ONLY)!=
24780 30 20 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  0 );.      pWInf
24790 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73  o->untestedTerms
247a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74   = 1;.      cont
247b0 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
247c0 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pE = pTerm->pExp
247d0 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
247e0 45 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  E!=0 );.    if( 
247f0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
24800 6e 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f  n && !ExprHasPro
24810 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f  perty(pE, EP_Fro
24820 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20  mJoin) ){.      
24830 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
24840 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
24850 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
24860 45 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c  E, addrCont, SQL
24870 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
24880 0a 20 20 20 20 6b 20 3d 20 31 3b 0a 20 20 20 20  .    k = 1;.    
24890 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
248a0 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20  = TERM_CODED;.  
248b0 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45  }..  /* For a LE
248c0 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67  FT OUTER JOIN, g
248d0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
248e0 74 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68  t will record th
248f0 65 20 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a  e fact that.  **
24900 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f   at least one ro
24910 77 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74  w of the right t
24920 61 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64  able has matched
24930 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e   the left table.
24940 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c    .  */.  if( pL
24950 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
24960 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61  ){.    pLevel->a
24970 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74  ddrFirst = sqlit
24980 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
24990 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(v);.    sqlite
249a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
249b0 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c  P_Integer, 1, pL
249c0 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29  evel->iLeftJoin)
249d0 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
249e0 74 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45  t((v, "record LE
249f0 46 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a  FT JOIN hit"));.
24a00 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
24a10 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
24a20 29 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d  );.    for(pTerm
24a30 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c  =pWC->a, j=0; j<
24a40 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c  pWC->nTerm; j++,
24a50 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
24a60 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
24a70 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
24a80 5f 56 49 52 54 55 41 4c 20 29 3b 20 20 2f 2a 20  _VIRTUAL );  /* 
24a90 49 4d 50 3a 20 52 2d 33 30 35 37 35 2d 31 31 36  IMP: R-30575-116
24aa0 36 32 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  62 */.      test
24ab0 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
24ac0 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
24ad0 44 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  D );.      if( p
24ae0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
24af0 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45  (TERM_VIRTUAL|TE
24b00 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74  RM_CODED) ) cont
24b10 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
24b20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
24b30 6c 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30  l & notReady)!=0
24b40 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
24b50 72 74 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65  rt( pWInfo->unte
24b60 73 74 65 64 54 65 72 6d 73 20 29 3b 0a 20 20 20  stedTerms );.   
24b70 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
24b80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
24b90 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70  ert( pTerm->pExp
24ba0 72 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r );.      sqlit
24bb0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
24bc0 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78  arse, pTerm->pEx
24bd0 70 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51  pr, addrCont, SQ
24be0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
24bf0 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77  ;.      pTerm->w
24c00 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
24c10 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ODED;.    }.  }.
24c20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
24c30 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
24c40 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 0a 20  iReleaseReg);.. 
24c50 20 72 65 74 75 72 6e 20 6e 6f 74 52 65 61 64 79   return notReady
24c60 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ;.}..#if defined
24c70 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a  (SQLITE_TEST)./*
24c80 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
24c90 67 20 76 61 72 69 61 62 6c 65 20 68 6f 6c 64 73  g variable holds
24ca0 20 61 20 74 65 78 74 20 64 65 73 63 72 69 70 74   a text descript
24cb0 69 6f 6e 20 6f 66 20 71 75 65 72 79 20 70 6c 61  ion of query pla
24cc0 6e 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 62  n generated.** b
24cd0 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  y the most recen
24ce0 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
24cf0 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e 20 20  3WhereBegin().  
24d00 45 61 63 68 20 63 61 6c 6c 20 74 6f 20 57 68 65  Each call to Whe
24d10 72 65 42 65 67 69 6e 0a 2a 2a 20 6f 76 65 72 77  reBegin.** overw
24d20 72 69 74 65 73 20 74 68 65 20 70 72 65 76 69 6f  rites the previo
24d30 75 73 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  us.  This inform
24d40 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f  ation is used fo
24d50 72 20 74 65 73 74 69 6e 67 20 61 6e 64 0a 2a 2a  r testing and.**
24d60 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a   analysis only..
24d70 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 5f  */.char sqlite3_
24d80 71 75 65 72 79 5f 70 6c 61 6e 5b 42 4d 53 2a 32  query_plan[BMS*2
24d90 2a 34 30 5d 3b 20 20 2f 2a 20 54 65 78 74 20 6f  *40];  /* Text o
24da0 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 73 74  f the join */.st
24db0 61 74 69 63 20 69 6e 74 20 6e 51 50 6c 61 6e 20  atic int nQPlan 
24dc0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
24dd0 20 20 2f 2a 20 4e 65 78 74 20 66 72 65 65 20 73    /* Next free s
24de0 6c 6f 77 20 69 6e 20 5f 71 75 65 72 79 5f 70 6c  low in _query_pl
24df0 61 6e 5b 5d 20 2a 2f 0a 0a 23 65 6e 64 69 66 20  an[] */..#endif 
24e00 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a  /* SQLITE_TEST *
24e10 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  /.../*.** Free a
24e20 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
24e30 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ture.*/.static v
24e40 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65  oid whereInfoFre
24e50 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
24e60 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
24e70 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  ){.  if( ALWAYS(
24e80 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 69  pWInfo) ){.    i
24e90 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
24ea0 30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65  0; i<pWInfo->nLe
24eb0 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  vel; i++){.     
24ec0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
24ed0 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 57 49  nfo *pInfo = pWI
24ee0 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 49 64 78 49 6e  nfo->a[i].pIdxIn
24ef0 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  fo;.      if( pI
24f00 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  nfo ){.        /
24f10 2a 20 61 73 73 65 72 74 28 20 70 49 6e 66 6f 2d  * assert( pInfo-
24f20 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
24f30 72 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  r==0 || db->mall
24f40 6f 63 46 61 69 6c 65 64 20 29 3b 20 2a 2f 0a 20  ocFailed ); */. 
24f50 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f         if( pInfo
24f60 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
24f70 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  tr ){.          
24f80 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e  sqlite3_free(pIn
24f90 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20  fo->idxStr);.   
24fa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
24fb0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
24fc0 20 70 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d   pInfo);.      }
24fd0 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
24fe0 6f 2d 3e 61 5b 69 5d 2e 70 6c 61 6e 2e 77 73 46  o->a[i].plan.wsF
24ff0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d  lags & WHERE_TEM
25000 50 5f 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 20  P_INDEX ){.     
25010 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d     Index *pIdx =
25020 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 6c   pWInfo->a[i].pl
25030 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20 20  an.u.pIdx;.     
25040 20 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20     if( pIdx ){. 
25050 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
25060 44 62 46 72 65 65 28 64 62 2c 20 70 49 64 78 2d  DbFree(db, pIdx-
25070 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20  >zColAff);.     
25080 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
25090 65 65 28 64 62 2c 20 70 49 64 78 29 3b 0a 20 20  ee(db, pIdx);.  
250a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
250b0 20 20 20 20 7d 0a 20 20 20 20 77 68 65 72 65 43      }.    whereC
250c0 6c 61 75 73 65 43 6c 65 61 72 28 70 57 49 6e 66  lauseClear(pWInf
250d0 6f 2d 3e 70 57 43 29 3b 0a 20 20 20 20 73 71 6c  o->pWC);.    sql
250e0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
250f0 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  WInfo);.  }.}...
25100 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
25110 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
25120 74 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f  the loop used fo
25130 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  r WHERE clause p
25140 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68  rocessing..** Th
25150 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
25160 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
25170 6e 20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75  n opaque structu
25180 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  re that contains
25190 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
251a0 6e 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e  needed to termin
251b0 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c  ate the loop.  L
251c0 61 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ater, the callin
251d0 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f  g routine.** sho
251e0 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74  uld invoke sqlit
251f0 65 33 57 68 65 72 65 45 6e 64 28 29 20 77 69 74  e3WhereEnd() wit
25200 68 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  h the return val
25210 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
25220 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  ion.** in order 
25230 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  to complete the 
25240 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
25250 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  cessing..**.** I
25260 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
25270 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
25280 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a  returns NULL..**
25290 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69 64  .** The basic id
252a0 65 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65  ea is to do a ne
252b0 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c  sted loop, one l
252c0 6f 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61 62  oop for each tab
252d0 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f  le in.** the FRO
252e0 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65  M clause of a se
252f0 6c 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61  lect.  (INSERT a
25300 6e 64 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  nd UPDATE statem
25310 65 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20  ents are the.** 
25320 73 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54  same as a SELECT
25330 20 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e   with only a sin
25340 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  gle table in the
25350 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20   FROM clause.)  
25360 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  For.** example, 
25370 69 66 20 74 68 65 20 53 51 4c 20 69 73 20 74 68  if the SQL is th
25380 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
25390 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
253a0 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e  , t2, t3 WHERE .
253b0 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74  ..;.**.** Then t
253c0 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
253d0 64 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c  d is conceptuall
253e0 79 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f  y like the follo
253f0 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
25400 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e   foreach row1 in
25410 20 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20   t1 do       \  
25420 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
25430 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61  .**        forea
25440 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f  ch row2 in t2 do
25450 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
25460 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
25470 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72  .**          for
25480 65 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20  each row3 in t3 
25490 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20  do   /.**       
254a0 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20       ....**     
254b0 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
254c0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 20               \  
254d0 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
254e0 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20  .**        end  
254f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25500 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
25510 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a  ite3WhereEnd().*
25520 2a 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20  *      end      
25530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25540 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20     /.**.** Note 
25550 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d  that the loops m
25560 69 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74  ight not be nest
25570 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ed in the order 
25580 69 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a  in which they.**
25590 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46   appear in the F
255a0 52 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20  ROM clause if a 
255b0 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20  different order 
255c0 69 73 20 62 65 74 74 65 72 20 61 62 6c 65 20 74  is better able t
255d0 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66  o make.** use of
255e0 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20   indices.  Note 
255f0 61 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74  also that when t
25600 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61  he IN operator a
25610 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65  ppears in.** the
25620 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69   WHERE clause, i
25630 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69  t might result i
25640 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73  n additional nes
25650 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a  ted loops for.**
25660 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
25670 68 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20  h all values on 
25680 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
25690 69 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a  ide of the IN..*
256a0 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42  *.** There are B
256b0 74 72 65 65 20 63 75 72 73 6f 72 73 20 61 73 73  tree cursors ass
256c0 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63  ociated with eac
256d0 68 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65  h table.  t1 use
256e0 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62  s cursor.** numb
256f0 65 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30  er pTabList->a[0
25700 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75  ].iCursor.  t2 u
25710 73 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 70  ses the cursor p
25720 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43  TabList->a[1].iC
25730 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f  ursor..** And so
25740 20 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f   forth.  This ro
25750 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
25760 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f  code to open tho
25770 73 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a  se VDBE cursors.
25780 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68  ** and sqlite3Wh
25790 65 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74  ereEnd() generat
257a0 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63  es the code to c
257b0 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  lose them..**.**
257c0 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 73   The code that s
257d0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
257e0 28 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61  () generates lea
257f0 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 73 20  ves the cursors 
25800 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62  named.** in pTab
25810 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  List pointing at
25820 20 74 68 65 69 72 20 61 70 70 72 6f 70 72 69 61   their appropria
25830 74 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65  te entries.  The
25840 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63   [...] code.** c
25850 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e  an use OP_Column
25860 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70   and OP_Rowid op
25870 63 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63  codes on these c
25880 75 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63  ursors to extrac
25890 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74  t.** data from t
258a0 68 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65  he various table
258b0 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a  s of the loop..*
258c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52  *.** If the WHER
258d0 45 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74  E clause is empt
258e0 79 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c  y, the foreach l
258f0 6f 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20 73  oops must each s
25900 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74  can their.** ent
25910 69 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75  ire tables.  Thu
25920 73 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f  s a three-way jo
25930 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20  in is an O(N^3) 
25940 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20  operation.  But 
25950 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73  if.** the tables
25960 20 68 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e   have indices an
25970 64 20 74 68 65 72 65 20 61 72 65 20 74 65 72 6d  d there are term
25980 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
25990 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65  lause that.** re
259a0 66 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64  fer to those ind
259b0 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65  ices, a complete
259c0 20 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20   table scan can 
259d0 62 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74  be avoided and t
259e0 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20  he.** code will 
259f0 72 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e  run much faster.
25a00 20 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f    Most of the wo
25a10 72 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  rk of this routi
25a20 6e 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a  ne is checking.*
25a30 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  * to see if ther
25a40 65 20 61 72 65 20 69 6e 64 69 63 65 73 20 74 68  e are indices th
25a50 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  at can be used t
25a60 6f 20 73 70 65 65 64 20 75 70 20 74 68 65 20 6c  o speed up the l
25a70 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73  oop..**.** Terms
25a80 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
25a90 61 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73  ause are also us
25aa0 65 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63  ed to limit whic
25ab0 68 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a  h rows actually.
25ac0 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68  ** make it to th
25ad0 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d  e "..." in the m
25ae0 69 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f  iddle of the loo
25af0 70 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 22  p.  After each "
25b00 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72  foreach",.** ter
25b10 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
25b20 63 6c 61 75 73 65 20 74 68 61 74 20 75 73 65 20  clause that use 
25b30 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68  only terms in th
25b40 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65  at loop and oute
25b50 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65  r.** loops are e
25b60 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20  valuated and if 
25b70 66 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20  false a jump is 
25b80 6d 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20  made around all 
25b90 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e  subsequent.** in
25ba0 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72  ner loops (or ar
25bb0 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69  ound the "..." i
25bc0 66 20 74 68 65 20 74 65 73 74 20 6f 63 63 75 72  f the test occur
25bd0 73 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e  s within the inn
25be0 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70  er-.** most loop
25bf0 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f  ).**.** OUTER JO
25c00 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74  INS.**.** An out
25c10 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65  er join of table
25c20 73 20 74 31 20 61 6e 64 20 74 32 20 69 73 20 63  s t1 and t2 is c
25c30 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64  onceptally coded
25c40 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
25c50 2a 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f  **    foreach ro
25c60 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20  w1 in t1 do.**  
25c70 20 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20      flag = 0.** 
25c80 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
25c90 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20  2 in t2 do.**   
25ca0 20 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20       start:.**  
25cb0 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20          ....**  
25cc0 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31          flag = 1
25cd0 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20  .**      end.** 
25ce0 20 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20       if flag==0 
25cf0 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d  then.**        m
25d00 6f 76 65 20 74 68 65 20 72 6f 77 32 20 63 75 72  ove the row2 cur
25d10 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f  sor to a null ro
25d20 77 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f  w.**        goto
25d30 20 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66   start.**      f
25d40 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a  i.**    end.**.*
25d50 2a 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53  * ORDER BY CLAUS
25d60 45 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a  E PROCESSING.**.
25d70 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73  ** *ppOrderBy is
25d80 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
25d90 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
25da0 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74  e of a SELECT st
25db0 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 69 66 20 74  atement,.** if t
25dc0 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66  here is one.  If
25dd0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
25de0 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20  ER BY clause or 
25df0 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  if this routine.
25e00 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f  ** is called fro
25e10 6d 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44  m an UPDATE or D
25e20 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c  ELETE statement,
25e30 20 74 68 65 6e 20 70 70 4f 72 64 65 72 42 79 20   then ppOrderBy 
25e40 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  is NULL..**.** I
25e50 66 20 61 6e 20 69 6e 64 65 78 20 63 61 6e 20 62  f an index can b
25e60 65 20 75 73 65 64 20 73 6f 20 74 68 61 74 20 74  e used so that t
25e70 68 65 20 6e 61 74 75 72 61 6c 20 6f 75 74 70 75  he natural outpu
25e80 74 20 6f 72 64 65 72 20 6f 66 20 74 68 65 20 74  t order of the t
25e90 61 62 6c 65 0a 2a 2a 20 73 63 61 6e 20 69 73 20  able.** scan is 
25ea0 63 6f 72 72 65 63 74 20 66 6f 72 20 74 68 65 20  correct for the 
25eb0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
25ec0 20 74 68 65 6e 20 74 68 61 74 20 69 6e 64 65 78   then that index
25ed0 20 69 73 20 75 73 65 64 20 61 6e 64 0a 2a 2a 20   is used and.** 
25ee0 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20 73 65  *ppOrderBy is se
25ef0 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73  t to NULL.  This
25f00 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
25f10 69 6f 6e 20 74 68 61 74 20 70 72 65 76 65 6e 74  ion that prevent
25f20 73 20 61 6e 0a 2a 2a 20 75 6e 6e 65 63 65 73 73  s an.** unnecess
25f30 61 72 79 20 73 6f 72 74 20 6f 66 20 74 68 65 20  ary sort of the 
25f40 72 65 73 75 6c 74 20 73 65 74 20 69 66 20 61 6e  result set if an
25f50 20 69 6e 64 65 78 20 61 70 70 72 6f 70 72 69 61   index appropria
25f60 74 65 20 66 6f 72 20 74 68 65 0a 2a 2a 20 4f 52  te for the.** OR
25f70 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6c  DER BY clause al
25f80 72 65 61 64 79 20 65 78 69 73 74 73 2e 0a 2a 2a  ready exists..**
25f90 0a 2a 2a 20 49 66 20 74 68 65 20 77 68 65 72 65  .** If the where
25fa0 20 63 6c 61 75 73 65 20 6c 6f 6f 70 73 20 63 61   clause loops ca
25fb0 6e 6e 6f 74 20 62 65 20 61 72 72 61 6e 67 65 64  nnot be arranged
25fc0 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20   to provide the 
25fd0 63 6f 72 72 65 63 74 0a 2a 2a 20 6f 75 74 70 75  correct.** outpu
25fe0 74 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 74 68  t order, then th
25ff0 65 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20  e *ppOrderBy is 
26000 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 57 68  unchanged..*/.Wh
26010 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  ereInfo *sqlite3
26020 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61  WhereBegin(.  Pa
26030 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
26040 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
26050 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
26060 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
26070 2c 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f  ,    /* A list o
26080 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  f all tables to 
26090 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20  be scanned */.  
260a0 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
260b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
260c0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
260d0 78 70 72 4c 69 73 74 20 2a 2a 70 70 4f 72 64 65  xprList **ppOrde
260e0 72 42 79 2c 20 2f 2a 20 41 6e 20 4f 52 44 45 52  rBy, /* An ORDER
260f0 20 42 59 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e   BY clause, or N
26100 55 4c 4c 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  ULL */.  u16 wct
26110 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20 2f  rlFlags        /
26120 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45  * One of the WHE
26130 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e  RE_* flags defin
26140 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e  ed in sqliteInt.
26150 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  h */.){.  int i;
26160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26170 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
26180 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  nter */.  int nB
26190 79 74 65 57 49 6e 66 6f 3b 20 20 20 20 20 20 20  yteWInfo;       
261a0 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79 74       /* Num. byt
261b0 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  es allocated for
261c0 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
261d0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62 4c  t */.  int nTabL
261e0 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
261f0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
26200 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54 61 62 4c  lements in pTabL
26210 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ist */.  WhereIn
26220 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
26230 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f      /* Will beco
26240 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  me the return va
26250 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  lue of this func
26260 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a  tion */.  Vdbe *
26270 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
26280 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74  e;   /* The virt
26290 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67  ual database eng
262a0 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ine */.  Bitmask
262b0 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20   notReady;      
262c0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 74      /* Cursors t
262d0 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74 20  hat are not yet 
262e0 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20  positioned */.  
262f0 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
26300 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54 68  askSet;    /* Th
26310 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73  e expression mas
26320 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65  k set */.  Where
26330 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20  Clause *pWC;    
26340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
26350 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74  composition of t
26360 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
26370 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
26380 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
26390 65 6d 3b 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65  em;  /* A single
263a0 20 65 6e 74 72 79 20 66 72 6f 6d 20 70 54 61 62   entry from pTab
263b0 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  List */.  WhereL
263c0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20  evel *pLevel;   
263d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
263e0 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20 74  ingle level in t
263f0 68 65 20 70 57 49 6e 66 6f 20 6c 69 73 74 20 2a  he pWInfo list *
26400 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 3b 20 20  /.  int iFrom;  
26410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26420 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75      /* First unu
26430 73 65 64 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  sed FROM clause 
26440 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  element */.  int
26450 20 61 6e 64 46 6c 61 67 73 3b 20 20 20 20 20 20   andFlags;      
26460 20 20 20 20 20 20 20 20 2f 2a 20 41 4e 44 2d 65          /* AND-e
26470 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  d combination of
26480 20 61 6c 6c 20 70 57 43 2d 3e 61 5b 5d 2e 77 74   all pWC->a[].wt
26490 46 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74  Flags */.  sqlit
264a0 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
264b0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
264c0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
264d0 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72  .  /* The number
264e0 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
264f0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
26500 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65 20   limited by the 
26510 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62  number of.  ** b
26520 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b  its in a Bitmask
26530 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73   .  */.  testcas
26540 65 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  e( pTabList->nSr
26550 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66 28 20  c==BMS );.  if( 
26560 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42  pTabList->nSrc>B
26570 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  MS ){.    sqlite
26580 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
26590 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61  , "at most %d ta
265a0 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c  bles in a join",
265b0 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72   BMS);.    retur
265c0 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  n 0;.  }..  /* T
265d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72  his function nor
265e0 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 73 20  mally generates 
265f0 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 66 6f  a nested loop fo
26600 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  r all tables in 
26610 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2e 20  .  ** pTabList. 
26620 20 42 75 74 20 69 66 20 74 68 65 20 57 48 45 52   But if the WHER
26630 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20  E_ONETABLE_ONLY 
26640 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
26650 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a 2a  n we should.  **
26660 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20 63   only generate c
26670 6f 64 65 20 66 6f 72 20 74 68 65 20 66 69 72 73  ode for the firs
26680 74 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c  t table in pTabL
26690 69 73 74 20 61 6e 64 20 61 73 73 75 6d 65 20 74  ist and assume t
266a0 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75 72  hat.  ** any cur
266b0 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  sors associated 
266c0 77 69 74 68 20 73 75 62 73 65 71 75 65 6e 74 20  with subsequent 
266d0 74 61 62 6c 65 73 20 61 72 65 20 75 6e 69 6e 69  tables are unini
266e0 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
266f0 20 6e 54 61 62 4c 69 73 74 20 3d 20 28 77 63 74   nTabList = (wct
26700 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
26710 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f  ONETABLE_ONLY) ?
26720 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e 6e   1 : pTabList->n
26730 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  Src;..  /* Alloc
26740 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
26750 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f  ze the WhereInfo
26760 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
26770 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a  will become the.
26780 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75    ** return valu
26790 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c 6f  e. A single allo
267a0 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  cation is used t
267b0 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68 65 72  o store the Wher
267c0 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75 63  eInfo.  ** struc
267d0 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  t, the contents 
267e0 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b 5d  of WhereInfo.a[]
267f0 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  , the WhereClaus
26800 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a  e structure.  **
26810 20 61 6e 64 20 74 68 65 20 57 68 65 72 65 4d 61   and the WhereMa
26820 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 2e  skSet structure.
26830 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c 61 75   Since WhereClau
26840 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 38  se contains an 8
26850 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c 64  -byte.  ** field
26860 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b 29 20   (type Bitmask) 
26870 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69 67 6e  it must be align
26880 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65 20  ed on an 8-byte 
26890 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a 2a  boundary on.  **
268a0 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63 74 75   some architectu
268b0 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20 52  res. Hence the R
268c0 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a 20  OUND8() below.. 
268d0 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
268e0 65 2d 3e 64 62 3b 0a 20 20 6e 42 79 74 65 57 49  e->db;.  nByteWI
268f0 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a  nfo = ROUND8(siz
26900 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28  eof(WhereInfo)+(
26910 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65  nTabList-1)*size
26920 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b  of(WhereLevel));
26930 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69  .  pWInfo = sqli
26940 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
26950 64 62 2c 20 0a 20 20 20 20 20 20 6e 42 79 74 65  db, .      nByte
26960 57 49 6e 66 6f 20 2b 20 0a 20 20 20 20 20 20 73  WInfo + .      s
26970 69 7a 65 6f 66 28 57 68 65 72 65 43 6c 61 75 73  izeof(WhereClaus
26980 65 29 20 2b 0a 20 20 20 20 20 20 73 69 7a 65 6f  e) +.      sizeo
26990 66 28 57 68 65 72 65 4d 61 73 6b 53 65 74 29 0a  f(WhereMaskSet).
269a0 20 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d    );.  if( db->m
269b0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
269c0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
269d0 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
269e0 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20    pWInfo = 0;.  
269f0 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
26a00 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57  nError;.  }.  pW
26a10 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e  Info->nLevel = n
26a20 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66  TabList;.  pWInf
26a30 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72  o->pParse = pPar
26a40 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54  se;.  pWInfo->pT
26a50 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  abList = pTabLis
26a60 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72  t;.  pWInfo->iBr
26a70 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
26a80 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
26a90 20 70 57 49 6e 66 6f 2d 3e 70 57 43 20 3d 20 70   pWInfo->pWC = p
26aa0 57 43 20 3d 20 28 57 68 65 72 65 43 6c 61 75 73  WC = (WhereClaus
26ab0 65 20 2a 29 26 28 28 75 38 20 2a 29 70 57 49 6e  e *)&((u8 *)pWIn
26ac0 66 6f 29 5b 6e 42 79 74 65 57 49 6e 66 6f 5d 3b  fo)[nByteWInfo];
26ad0 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  .  pWInfo->wctrl
26ae0 46 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61  Flags = wctrlFla
26af0 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61  gs;.  pWInfo->sa
26b00 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  vedNQueryLoop = 
26b10 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
26b20 6f 70 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d  op;.  pMaskSet =
26b30 20 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 29   (WhereMaskSet*)
26b40 26 70 57 43 5b 31 5d 3b 0a 0a 20 20 2f 2a 20 53  &pWC[1];..  /* S
26b50 70 6c 69 74 20 74 68 65 20 57 48 45 52 45 20 63  plit the WHERE c
26b60 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72  lause into separ
26b70 61 74 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  ate subexpressio
26b80 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a 20 20  ns where each.  
26b90 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
26ba0 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79   is separated by
26bb0 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
26bc0 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73  ..  */.  initMas
26bd0 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a  kSet(pMaskSet);.
26be0 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69    whereClauseIni
26bf0 74 28 70 57 43 2c 20 70 50 61 72 73 65 2c 20 70  t(pWC, pParse, p
26c00 4d 61 73 6b 53 65 74 29 3b 0a 20 20 73 71 6c 69  MaskSet);.  sqli
26c10 74 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73 74  te3ExprCodeConst
26c20 61 6e 74 73 28 70 50 61 72 73 65 2c 20 70 57 68  ants(pParse, pWh
26c30 65 72 65 29 3b 0a 20 20 77 68 65 72 65 53 70 6c  ere);.  whereSpl
26c40 69 74 28 70 57 43 2c 20 70 57 68 65 72 65 2c 20  it(pWC, pWhere, 
26c50 54 4b 5f 41 4e 44 29 3b 20 20 20 2f 2a 20 49 4d  TK_AND);   /* IM
26c60 50 3a 20 52 2d 31 35 38 34 32 2d 35 33 32 39 36  P: R-15842-53296
26c70 20 2a 2f 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70   */.    .  /* Sp
26c80 65 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48  ecial case: a WH
26c90 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
26ca0 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76  is constant.  Ev
26cb0 61 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  aluate the.  ** 
26cc0 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65  expression and e
26cd0 69 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20  ither jump over 
26ce0 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20  all of the code 
26cf0 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20  or fall thru..  
26d00 2a 2f 0a 20 20 69 66 28 20 70 57 68 65 72 65 20  */.  if( pWhere 
26d10 26 26 20 28 6e 54 61 62 4c 69 73 74 3d 3d 30 20  && (nTabList==0 
26d20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  || sqlite3ExprIs
26d30 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
26d40 70 57 68 65 72 65 29 29 20 29 7b 0a 20 20 20 20  pWhere)) ){.    
26d50 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
26d60 73 65 28 70 50 61 72 73 65 2c 20 70 57 68 65 72  se(pParse, pWher
26d70 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  e, pWInfo->iBrea
26d80 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  k, SQLITE_JUMPIF
26d90 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 57 68 65 72  NULL);.    pWher
26da0 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e = 0;.  }..  /*
26db0 20 41 73 73 69 67 6e 20 61 20 62 69 74 20 66 72   Assign a bit fr
26dc0 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20 74  om the bitmask t
26dd0 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  o every term in 
26de0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
26df0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
26e00 61 73 73 69 67 6e 69 6e 67 20 62 69 74 6d 61 73  assigning bitmas
26e10 6b 20 76 61 6c 75 65 73 20 74 6f 20 46 52 4f 4d  k values to FROM
26e20 20 63 6c 61 75 73 65 20 63 75 72 73 6f 72 73 2c   clause cursors,
26e30 20 69 74 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a   it must be.  **
26e40 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 69   the case that i
26e50 66 20 58 20 69 73 20 74 68 65 20 62 69 74 6d 61  f X is the bitma
26e60 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20  sk for the N-th 
26e70 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
26e80 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 62   then.  ** the b
26e90 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 46  itmask for all F
26ea0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ROM clause terms
26eb0 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
26ec0 74 68 65 20 4e 2d 74 68 20 74 65 72 6d 0a 20 20  the N-th term.  
26ed0 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20 20 20 41  ** is (X-1).   A
26ee0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f  n expression fro
26ef0 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  m the ON clause 
26f00 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63  of a LEFT JOIN c
26f10 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69 74 73 20  an use.  ** its 
26f20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54  Expr.iRightJoinT
26f30 61 62 6c 65 20 76 61 6c 75 65 20 74 6f 20 66 69  able value to fi
26f40 6e 64 20 74 68 65 20 62 69 74 6d 61 73 6b 20 6f  nd the bitmask o
26f50 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  f the right tabl
26f60 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6a 6f  e.  ** of the jo
26f70 69 6e 2e 20 20 53 75 62 74 72 61 63 74 69 6e 67  in.  Subtracting
26f80 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20 72 69   one from the ri
26f90 67 68 74 20 74 61 62 6c 65 20 62 69 74 6d 61 73  ght table bitmas
26fa0 6b 20 67 69 76 65 73 20 61 0a 20 20 2a 2a 20 62  k gives a.  ** b
26fb0 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 74  itmask for all t
26fc0 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66  ables to the lef
26fd0 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  t of the join.  
26fe0 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69 74 6d  Knowing the bitm
26ff0 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20 61 6c 6c  ask.  ** for all
27000 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
27010 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f  eft of a left jo
27020 69 6e 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e  in is important.
27030 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e 0a    Ticket #3015..
27040 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 66 69 67    **.  ** Config
27050 75 72 65 20 74 68 65 20 57 68 65 72 65 43 6c 61  ure the WhereCla
27060 75 73 65 2e 76 6d 61 73 6b 20 76 61 72 69 61 62  use.vmask variab
27070 6c 65 20 73 6f 20 74 68 61 74 20 62 69 74 73 20  le so that bits 
27080 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 0a  that correspond.
27090 20 20 2a 2a 20 74 6f 20 76 69 72 74 75 61 6c 20    ** to virtual 
270a0 74 61 62 6c 65 20 63 75 72 73 6f 72 73 20 61 72  table cursors ar
270b0 65 20 73 65 74 2e 20 54 68 69 73 20 69 73 20 75  e set. This is u
270c0 73 65 64 20 74 6f 20 73 65 6c 65 63 74 69 76 65  sed to selective
270d0 6c 79 20 64 69 73 61 62 6c 65 20 0a 20 20 2a 2a  ly disable .  **
270e0 20 74 68 65 20 4f 52 2d 74 6f 2d 49 4e 20 74 72   the OR-to-IN tr
270f0 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20  ansformation in 
27100 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72  exprAnalyzeOrTer
27110 6d 28 29 2e 20 49 74 20 69 73 20 6e 6f 74 20 68  m(). It is not h
27120 65 6c 70 66 75 6c 20 0a 20 20 2a 2a 20 77 69 74  elpful .  ** wit
27130 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  h virtual tables
27140 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65  ..  **.  ** Note
27150 20 74 68 61 74 20 62 69 74 6d 61 73 6b 73 20 61   that bitmasks a
27160 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61  re created for a
27170 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ll pTabList->nSr
27180 63 20 74 61 62 6c 65 73 20 69 6e 0a 20 20 2a 2a  c tables in.  **
27190 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a   pTabList, not j
271a0 75 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 54  ust the first nT
271b0 61 62 4c 69 73 74 20 74 61 62 6c 65 73 2e 20 20  abList tables.  
271c0 6e 54 61 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d  nTabList is norm
271d0 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75 61 6c 20  ally.  ** equal 
271e0 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  to pTabList->nSr
271f0 63 20 62 75 74 20 6d 69 67 68 74 20 62 65 20 73  c but might be s
27200 68 6f 72 74 65 6e 65 64 20 74 6f 20 31 20 69 66  hortened to 1 if
27210 20 74 68 65 0a 20 20 2a 2a 20 57 48 45 52 45 5f   the.  ** WHERE_
27220 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c  ONETABLE_ONLY fl
27230 61 67 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f 0a  ag is set..  */.
27240 20 20 61 73 73 65 72 74 28 20 70 57 43 2d 3e 76    assert( pWC->v
27250 6d 61 73 6b 3d 3d 30 20 26 26 20 70 4d 61 73 6b  mask==0 && pMask
27260 53 65 74 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 66  Set->n==0 );.  f
27270 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
27280 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
27290 20 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28 70      createMask(p
272a0 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73  MaskSet, pTabLis
272b0 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29  t->a[i].iCursor)
272c0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
272d0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
272e0 4c 45 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59  LE.    if( ALWAY
272f0 53 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  S(pTabList->a[i]
27300 2e 70 54 61 62 29 20 26 26 20 49 73 56 69 72 74  .pTab) && IsVirt
27310 75 61 6c 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ual(pTabList->a[
27320 69 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20 20 20  i].pTab) ){.    
27330 20 20 70 57 43 2d 3e 76 6d 61 73 6b 20 7c 3d 20    pWC->vmask |= 
27340 28 28 42 69 74 6d 61 73 6b 29 31 20 3c 3c 20 69  ((Bitmask)1 << i
27350 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
27360 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42    }.#ifndef NDEB
27370 55 47 0a 20 20 7b 0a 20 20 20 20 42 69 74 6d 61  UG.  {.    Bitma
27380 73 6b 20 74 6f 54 68 65 4c 65 66 74 20 3d 20 30  sk toTheLeft = 0
27390 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
273a0 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
273b0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 69 74   i++){.      Bit
273c0 6d 61 73 6b 20 6d 20 3d 20 67 65 74 4d 61 73 6b  mask m = getMask
273d0 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c  (pMaskSet, pTabL
273e0 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
273f0 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
27400 28 20 28 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c 65  ( (m-1)==toTheLe
27410 66 74 20 29 3b 0a 20 20 20 20 20 20 74 6f 54 68  ft );.      toTh
27420 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20 20 20 20  eLeft |= m;.    
27430 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
27440 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f  /* Analyze all o
27450 66 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73  f the subexpress
27460 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61 74  ions.  Note that
27470 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d   exprAnalyze() m
27480 69 67 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65  ight.  ** add ne
27490 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20  w virtual terms 
274a0 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
274b0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
274c0 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a  .  We do not.  *
274d0 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a  * want to analyz
274e0 65 20 74 68 65 73 65 20 76 69 72 74 75 61 6c 20  e these virtual 
274f0 74 65 72 6d 73 2c 20 73 6f 20 73 74 61 72 74 20  terms, so start 
27500 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74 68 65  analyzing at the
27510 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f   end.  ** and wo
27520 72 6b 20 66 6f 72 77 61 72 64 20 73 6f 20 74 68  rk forward so th
27530 61 74 20 74 68 65 20 61 64 64 65 64 20 76 69 72  at the added vir
27540 74 75 61 6c 20 74 65 72 6d 73 20 61 72 65 20 6e  tual terms are n
27550 65 76 65 72 20 70 72 6f 63 65 73 73 65 64 2e 0a  ever processed..
27560 20 20 2a 2f 0a 20 20 65 78 70 72 41 6e 61 6c 79    */.  exprAnaly
27570 7a 65 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20  zeAll(pTabList, 
27580 70 57 43 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  pWC);.  if( db->
27590 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
275a0 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
275b0 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20  ginError;.  }.. 
275c0 20 2f 2a 20 43 68 6f 73 65 20 74 68 65 20 62 65   /* Chose the be
275d0 73 74 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  st index to use 
275e0 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69  for each table i
275f0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
27600 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
27610 73 20 6c 6f 6f 70 20 66 69 6c 6c 73 20 69 6e 20  s loop fills in 
27620 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  the following fi
27630 65 6c 64 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  elds:.  **.  ** 
27640 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 49    pWInfo->a[].pI
27650 64 78 20 20 20 20 20 20 54 68 65 20 69 6e 64 65  dx      The inde
27660 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69  x to use for thi
27670 73 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 6c  s level of the l
27680 6f 6f 70 2e 0a 20 20 2a 2a 20 20 20 70 57 49 6e  oop..  **   pWIn
27690 66 6f 2d 3e 61 5b 5d 2e 77 73 46 6c 61 67 73 20  fo->a[].wsFlags 
276a0 20 20 57 48 45 52 45 5f 78 78 78 20 66 6c 61 67    WHERE_xxx flag
276b0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
276c0 68 20 70 49 64 78 0a 20 20 2a 2a 20 20 20 70 57  h pIdx.  **   pW
276d0 49 6e 66 6f 2d 3e 61 5b 5d 2e 6e 45 71 20 20 20  Info->a[].nEq   
276e0 20 20 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f      The number o
276f0 66 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73  f == and IN cons
27700 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 20 20 70  traints.  **   p
27710 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 46 72 6f 6d  WInfo->a[].iFrom
27720 20 20 20 20 20 57 68 69 63 68 20 74 65 72 6d 20       Which term 
27730 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
27740 73 65 20 69 73 20 62 65 69 6e 67 20 63 6f 64 65  se is being code
27750 64 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  d.  **   pWInfo-
27760 3e 61 5b 5d 2e 69 54 61 62 43 75 72 20 20 20 54  >a[].iTabCur   T
27770 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
27780 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
27790 74 61 62 6c 65 0a 20 20 2a 2a 20 20 20 70 57 49  table.  **   pWI
277a0 6e 66 6f 2d 3e 61 5b 5d 2e 69 49 64 78 43 75 72  nfo->a[].iIdxCur
277b0 20 20 20 54 68 65 20 56 44 42 45 20 63 75 72 73     The VDBE curs
277c0 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  or for the index
277d0 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
277e0 61 5b 5d 2e 70 54 65 72 6d 20 20 20 20 20 57 68  a[].pTerm     Wh
277f0 65 6e 20 77 73 46 6c 61 67 73 3d 3d 57 4f 5f 4f  en wsFlags==WO_O
27800 52 2c 20 74 68 65 20 4f 52 2d 63 6c 61 75 73 65  R, the OR-clause
27810 20 74 65 72 6d 0a 20 20 2a 2a 0a 20 20 2a 2a 20   term.  **.  ** 
27820 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 66  This loop also f
27830 69 67 75 72 65 73 20 6f 75 74 20 74 68 65 20 6e  igures out the n
27840 65 73 74 69 6e 67 20 6f 72 64 65 72 20 6f 66 20  esting order of 
27850 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
27860 4f 4d 0a 20 20 2a 2a 20 63 6c 61 75 73 65 2e 0a  OM.  ** clause..
27870 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20    */.  notReady 
27880 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20  = ~(Bitmask)0;. 
27890 20 70 54 61 62 49 74 65 6d 20 3d 20 70 54 61 62   pTabItem = pTab
278a0 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 4c 65 76 65  List->a;.  pLeve
278b0 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 3b 0a 20  l = pWInfo->a;. 
278c0 20 61 6e 64 46 6c 61 67 73 20 3d 20 7e 30 3b 0a   andFlags = ~0;.
278d0 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2a    WHERETRACE(("*
278e0 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74 61  ** Optimizer Sta
278f0 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 66  rt ***\n"));.  f
27900 6f 72 28 69 3d 69 46 72 6f 6d 3d 30 2c 20 70 4c  or(i=iFrom=0, pL
27910 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20  evel=pWInfo->a; 
27920 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 2b 2b 2c  i<nTabList; i++,
27930 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
27940 57 68 65 72 65 43 6f 73 74 20 62 65 73 74 50 6c  WhereCost bestPl
27950 61 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  an;         /* M
27960 6f 73 74 20 65 66 66 69 63 69 65 6e 74 20 70 6c  ost efficient pl
27970 61 6e 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a  an seen so far *
27980 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  /.    Index *pId
27990 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
279a0 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f 72 20 46    /* Index for F
279b0 52 4f 4d 20 74 61 62 6c 65 20 61 74 20 70 54 61  ROM table at pTa
279c0 62 49 74 65 6d 20 2a 2f 0a 20 20 20 20 69 6e 74  bItem */.    int
279d0 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
279e0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
279f0 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 46 52 4f  looping over FRO
27a00 4d 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  M tables */.    
27a10 69 6e 74 20 62 65 73 74 4a 20 3d 20 2d 31 3b 20  int bestJ = -1; 
27a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
27a30 68 65 20 76 61 6c 75 65 20 6f 66 20 6a 20 2a 2f  he value of j */
27a40 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b 20  .    Bitmask m; 
27a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a60 20 2f 2a 20 42 69 74 6d 61 73 6b 20 76 61 6c 75   /* Bitmask valu
27a70 65 20 66 6f 72 20 6a 20 6f 72 20 62 65 73 74 4a  e for j or bestJ
27a80 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 4f 70   */.    int isOp
27a90 74 69 6d 61 6c 3b 20 20 20 20 20 20 20 20 20 20  timal;          
27aa0 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
27ab0 66 6f 72 20 6f 70 74 69 6d 61 6c 2f 6e 6f 6e 2d  for optimal/non-
27ac0 6f 70 74 69 6d 61 6c 20 73 65 61 72 63 68 20 2a  optimal search *
27ad0 2f 0a 20 20 20 20 69 6e 74 20 6e 55 6e 63 6f 6e  /.    int nUncon
27ae0 73 74 72 61 69 6e 65 64 3b 20 20 20 20 20 20 20  strained;       
27af0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74 61 62 6c    /* Number tabl
27b00 65 73 20 77 69 74 68 6f 75 74 20 49 4e 44 45 58  es without INDEX
27b10 45 44 20 42 59 20 2a 2f 0a 20 20 20 20 42 69 74  ED BY */.    Bit
27b20 6d 61 73 6b 20 6e 6f 74 49 6e 64 65 78 65 64 3b  mask notIndexed;
27b30 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
27b40 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20   of tables that 
27b50 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 20 69 6e  cannot use an in
27b60 64 65 78 20 2a 2f 0a 0a 20 20 20 20 6d 65 6d 73  dex */..    mems
27b70 65 74 28 26 62 65 73 74 50 6c 61 6e 2c 20 30 2c  et(&bestPlan, 0,
27b80 20 73 69 7a 65 6f 66 28 62 65 73 74 50 6c 61 6e   sizeof(bestPlan
27b90 29 29 3b 0a 20 20 20 20 62 65 73 74 50 6c 61 6e  ));.    bestPlan
27ba0 2e 72 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f  .rCost = SQLITE_
27bb0 42 49 47 5f 44 42 4c 3b 0a 20 20 20 20 57 48 45  BIG_DBL;.    WHE
27bc0 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 42 65  RETRACE(("*** Be
27bd0 67 69 6e 20 73 65 61 72 63 68 20 66 6f 72 20 6c  gin search for l
27be0 6f 6f 70 20 25 64 20 2a 2a 2a 5c 6e 22 2c 20 69  oop %d ***\n", i
27bf0 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70  ));..    /* Loop
27c00 20 74 68 72 6f 75 67 68 20 74 68 65 20 72 65 6d   through the rem
27c10 61 69 6e 69 6e 67 20 65 6e 74 72 69 65 73 20 69  aining entries i
27c20 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
27c30 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 20 20  e to find the.  
27c40 20 20 2a 2a 20 6e 65 78 74 20 6e 65 73 74 65 64    ** next nested
27c50 20 6c 6f 6f 70 2e 20 54 68 65 20 6c 6f 6f 70 20   loop. The loop 
27c60 74 65 73 74 73 20 61 6c 6c 20 46 52 4f 4d 20 63  tests all FROM c
27c70 6c 61 75 73 65 20 65 6e 74 72 69 65 73 0a 20 20  lause entries.  
27c80 20 20 2a 2a 20 65 69 74 68 65 72 20 6f 6e 63 65    ** either once
27c90 20 6f 72 20 74 77 69 63 65 2e 20 0a 20 20 20 20   or twice. .    
27ca0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69  **.    ** The fi
27cb0 72 73 74 20 74 65 73 74 20 69 73 20 61 6c 77 61  rst test is alwa
27cc0 79 73 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20  ys performed if 
27cd0 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72  there are two or
27ce0 20 6d 6f 72 65 20 65 6e 74 72 69 65 73 0a 20 20   more entries.  
27cf0 20 20 2a 2a 20 72 65 6d 61 69 6e 69 6e 67 20 61    ** remaining a
27d00 6e 64 20 6e 65 76 65 72 20 70 65 72 66 6f 72 6d  nd never perform
27d10 65 64 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ed if there is o
27d20 6e 6c 79 20 6f 6e 65 20 46 52 4f 4d 20 63 6c 61  nly one FROM cla
27d30 75 73 65 20 65 6e 74 72 79 0a 20 20 20 20 2a 2a  use entry.    **
27d40 20 74 6f 20 63 68 6f 6f 73 65 20 66 72 6f 6d 2e   to choose from.
27d50 20 20 54 68 65 20 66 69 72 73 74 20 74 65 73 74    The first test
27d60 20 6c 6f 6f 6b 73 20 66 6f 72 20 61 6e 20 22 6f   looks for an "o
27d70 70 74 69 6d 61 6c 22 20 73 63 61 6e 2e 20 20 49  ptimal" scan.  I
27d80 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f  n.    ** this co
27d90 6e 74 65 78 74 20 61 6e 20 6f 70 74 69 6d 61 6c  ntext an optimal
27da0 20 73 63 61 6e 20 69 73 20 6f 6e 65 20 74 68 61   scan is one tha
27db0 74 20 75 73 65 73 20 74 68 65 20 73 61 6d 65 20  t uses the same 
27dc0 73 74 72 61 74 65 67 79 0a 20 20 20 20 2a 2a 20  strategy.    ** 
27dd0 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 46 52  for the given FR
27de0 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20  OM clause entry 
27df0 61 73 20 77 6f 75 6c 64 20 62 65 20 73 65 6c 65  as would be sele
27e00 63 74 65 64 20 69 66 20 74 68 65 20 65 6e 74 72  cted if the entr
27e10 79 0a 20 20 20 20 2a 2a 20 77 65 72 65 20 75 73  y.    ** were us
27e20 65 64 20 61 73 20 74 68 65 20 69 6e 6e 65 72 6d  ed as the innerm
27e30 6f 73 74 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2e  ost nested loop.
27e40 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
27e50 2c 20 61 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  , a table.    **
27e60 20 69 73 20 63 68 6f 73 65 6e 20 73 75 63 68 20   is chosen such 
27e70 74 68 61 74 20 74 68 65 20 63 6f 73 74 20 6f 66  that the cost of
27e80 20 72 75 6e 6e 69 6e 67 20 74 68 61 74 20 74 61   running that ta
27e90 62 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 65  ble cannot be re
27ea0 64 75 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  duced.    ** by 
27eb0 77 61 69 74 69 6e 67 20 66 6f 72 20 6f 74 68 65  waiting for othe
27ec0 72 20 74 61 62 6c 65 73 20 74 6f 20 72 75 6e 20  r tables to run 
27ed0 66 69 72 73 74 2e 20 20 54 68 69 73 20 22 6f 70  first.  This "op
27ee0 74 69 6d 61 6c 22 20 74 65 73 74 20 77 6f 72 6b  timal" test work
27ef0 73 0a 20 20 20 20 2a 2a 20 62 79 20 66 69 72 73  s.    ** by firs
27f00 74 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20  t assuming that 
27f10 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
27f20 69 73 20 6f 6e 20 74 68 65 20 69 6e 6e 65 72 20  is on the inner 
27f30 6c 6f 6f 70 20 61 6e 64 20 66 69 6e 64 69 6e 67  loop and finding
27f40 0a 20 20 20 20 2a 2a 20 69 74 73 20 71 75 65 72  .    ** its quer
27f50 79 20 70 6c 61 6e 2c 20 74 68 65 6e 20 63 68 65  y plan, then che
27f60 63 6b 69 6e 67 20 74 6f 20 73 65 65 20 69 66 20  cking to see if 
27f70 74 68 61 74 20 71 75 65 72 79 20 70 6c 61 6e 20  that query plan 
27f80 75 73 65 73 20 61 6e 79 0a 20 20 20 20 2a 2a 20  uses any.    ** 
27f90 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73  other FROM claus
27fa0 65 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65  e terms that are
27fb0 20 6e 6f 74 52 65 61 64 79 2e 20 20 49 66 20 6e   notReady.  If n
27fc0 6f 20 6e 6f 74 52 65 61 64 79 20 74 65 72 6d 73  o notReady terms
27fd0 20 61 72 65 0a 20 20 20 20 2a 2a 20 75 73 65 64   are.    ** used
27fe0 20 74 68 65 6e 20 74 68 65 20 22 6f 70 74 69 6d   then the "optim
27ff0 61 6c 22 20 71 75 65 72 79 20 70 6c 61 6e 20 77  al" query plan w
28000 6f 72 6b 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  orks..    **.   
28010 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
28020 65 20 57 68 65 72 65 43 6f 73 74 2e 6e 52 6f 77  e WhereCost.nRow
28030 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
28040 6e 20 6f 70 74 69 6d 61 6c 20 73 63 61 6e 20 6d  n optimal scan m
28050 69 67 68 74 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  ight.    ** not 
28060 62 65 20 61 73 20 73 6d 61 6c 6c 20 61 73 20 69  be as small as i
28070 74 20 77 6f 75 6c 64 20 62 65 20 69 66 20 74 68  t would be if th
28080 65 20 74 61 62 6c 65 20 72 65 61 6c 6c 79 20 77  e table really w
28090 65 72 65 20 74 68 65 20 69 6e 6e 65 72 6d 6f 73  ere the innermos
280a0 74 0a 20 20 20 20 2a 2a 20 6a 6f 69 6e 2e 20 20  t.    ** join.  
280b0 54 68 65 20 6e 52 6f 77 20 76 61 6c 75 65 20 63  The nRow value c
280c0 61 6e 20 62 65 20 72 65 64 75 63 65 64 20 62 79  an be reduced by
280d0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
280e0 6e 73 74 72 61 69 6e 74 73 0a 20 20 20 20 2a 2a  nstraints.    **
280f0 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 75 73 65   that do not use
28100 20 69 6e 64 69 63 65 73 2e 20 20 42 75 74 20 74   indices.  But t
28110 68 69 73 20 6e 52 6f 77 20 72 65 64 75 63 74 69  his nRow reducti
28120 6f 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  on only happens 
28130 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 61  if the.    ** ta
28140 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68  ble really is th
28150 65 20 69 6e 6e 65 72 6d 6f 73 74 20 6a 6f 69 6e  e innermost join
28160 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  .  .    **.    *
28170 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 6c 6f 6f  * The second loo
28180 70 20 69 74 65 72 61 74 69 6f 6e 20 69 73 20 6f  p iteration is o
28190 6e 6c 79 20 70 65 72 66 6f 72 6d 65 64 20 69 66  nly performed if
281a0 20 6e 6f 20 6f 70 74 69 6d 61 6c 20 73 63 61 6e   no optimal scan
281b0 0a 20 20 20 20 2a 2a 20 73 74 72 61 74 65 67 69  .    ** strategi
281c0 65 73 20 77 65 72 65 20 66 6f 75 6e 64 20 62 79  es were found by
281d0 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61   the first itera
281e0 74 69 6f 6e 2e 20 54 68 69 73 20 73 65 63 6f 6e  tion. This secon
281f0 64 20 69 74 65 72 61 74 69 6f 6e 0a 20 20 20 20  d iteration.    
28200 2a 2a 20 69 73 20 75 73 65 64 20 74 6f 20 73 65  ** is used to se
28210 61 72 63 68 20 66 6f 72 20 74 68 65 20 6c 6f 77  arch for the low
28220 65 73 74 20 63 6f 73 74 20 73 63 61 6e 20 6f 76  est cost scan ov
28230 65 72 61 6c 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20  erall..    **.  
28240 20 20 2a 2a 20 50 72 65 76 69 6f 75 73 20 76 65    ** Previous ve
28250 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
28260 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 6c 79 20   performed only 
28270 74 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61  the second itera
28280 74 69 6f 6e 20 2d 0a 20 20 20 20 2a 2a 20 74 68  tion -.    ** th
28290 65 20 6e 65 78 74 20 6f 75 74 65 72 6d 6f 73 74  e next outermost
282a0 20 6c 6f 6f 70 20 77 61 73 20 61 6c 77 61 79 73   loop was always
282b0 20 74 68 61 74 20 77 69 74 68 20 74 68 65 20 6c   that with the l
282c0 6f 77 65 73 74 20 6f 76 65 72 61 6c 6c 0a 20 20  owest overall.  
282d0 20 20 2a 2a 20 63 6f 73 74 2e 20 48 6f 77 65 76    ** cost. Howev
282e0 65 72 2c 20 74 68 69 73 20 6d 65 61 6e 74 20 74  er, this meant t
282f0 68 61 74 20 53 51 4c 69 74 65 20 63 6f 75 6c 64  hat SQLite could
28300 20 73 65 6c 65 63 74 20 74 68 65 20 77 72 6f 6e   select the wron
28310 67 20 70 6c 61 6e 0a 20 20 20 20 2a 2a 20 66 6f  g plan.    ** fo
28320 72 20 73 63 72 69 70 74 73 20 73 75 63 68 20 61  r scripts such a
28330 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
28340 0a 20 20 20 20 2a 2a 20 20 20 0a 20 20 20 20 2a  .    **   .    *
28350 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
28360 20 74 31 28 61 2c 20 62 29 3b 20 0a 20 20 20 20   t1(a, b); .    
28370 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
28380 45 20 74 32 28 63 2c 20 64 29 3b 0a 20 20 20 20  E t2(c, d);.    
28390 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
283a0 4f 4d 20 74 32 2c 20 74 31 20 57 48 45 52 45 20  OM t2, t1 WHERE 
283b0 74 32 2e 72 6f 77 69 64 20 3d 20 74 31 2e 61 3b  t2.rowid = t1.a;
283c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
283d0 68 65 20 62 65 73 74 20 73 74 72 61 74 65 67 79  he best strategy
283e0 20 69 73 20 74 6f 20 69 74 65 72 61 74 65 20 74   is to iterate t
283f0 68 72 6f 75 67 68 20 74 61 62 6c 65 20 74 31 20  hrough table t1 
28400 66 69 72 73 74 2e 20 48 6f 77 65 76 65 72 20 69  first. However i
28410 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  t.    ** is not 
28420 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 74 65  possible to dete
28430 72 6d 69 6e 65 20 74 68 69 73 20 77 69 74 68 20  rmine this with 
28440 61 20 73 69 6d 70 6c 65 20 67 72 65 65 64 79 20  a simple greedy 
28450 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 20 20 20 2a  algorithm..    *
28460 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f 73 74  * Since the cost
28470 20 6f 66 20 61 20 6c 69 6e 65 61 72 20 73 63 61   of a linear sca
28480 6e 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20  n through table 
28490 74 32 20 69 73 20 74 68 65 20 73 61 6d 65 20 0a  t2 is the same .
284a0 20 20 20 20 2a 2a 20 61 73 20 74 68 65 20 63 6f      ** as the co
284b0 73 74 20 6f 66 20 61 20 6c 69 6e 65 61 72 20 73  st of a linear s
284c0 63 61 6e 20 74 68 72 6f 75 67 68 20 74 61 62 6c  can through tabl
284d0 65 20 74 31 2c 20 61 20 73 69 6d 70 6c 65 20 67  e t1, a simple g
284e0 72 65 65 64 79 20 0a 20 20 20 20 2a 2a 20 61 6c  reedy .    ** al
284f0 67 6f 72 69 74 68 6d 20 6d 61 79 20 63 68 6f 6f  gorithm may choo
28500 73 65 20 74 6f 20 75 73 65 20 74 32 20 66 6f 72  se to use t2 for
28510 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2c   the outer loop,
28520 20 77 68 69 63 68 20 69 73 20 61 20 6d 75 63 68   which is a much
28530 0a 20 20 20 20 2a 2a 20 63 6f 73 74 6c 69 65 72  .    ** costlier
28540 20 61 70 70 72 6f 61 63 68 2e 0a 20 20 20 20 2a   approach..    *
28550 2f 0a 20 20 20 20 6e 55 6e 63 6f 6e 73 74 72 61  /.    nUnconstra
28560 69 6e 65 64 20 3d 20 30 3b 0a 20 20 20 20 6e 6f  ined = 0;.    no
28570 74 49 6e 64 65 78 65 64 20 3d 20 30 3b 0a 20 20  tIndexed = 0;.  
28580 20 20 66 6f 72 28 69 73 4f 70 74 69 6d 61 6c 3d    for(isOptimal=
28590 28 69 46 72 6f 6d 3c 6e 54 61 62 4c 69 73 74 2d  (iFrom<nTabList-
285a0 31 29 3b 20 69 73 4f 70 74 69 6d 61 6c 3e 3d 30  1); isOptimal>=0
285b0 20 26 26 20 62 65 73 74 4a 3c 30 3b 20 69 73 4f   && bestJ<0; isO
285c0 70 74 69 6d 61 6c 2d 2d 29 7b 0a 20 20 20 20 20  ptimal--){.     
285d0 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 3b 20 20   Bitmask mask;  
285e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
285f0 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 6e 6f 74  sk of tables not
28600 20 79 65 74 20 72 65 61 64 79 20 2a 2f 0a 20 20   yet ready */.  
28610 20 20 20 20 66 6f 72 28 6a 3d 69 46 72 6f 6d 2c      for(j=iFrom,
28620 20 70 54 61 62 49 74 65 6d 3d 26 70 54 61 62 4c   pTabItem=&pTabL
28630 69 73 74 2d 3e 61 5b 6a 5d 3b 20 6a 3c 6e 54 61  ist->a[j]; j<nTa
28640 62 4c 69 73 74 3b 20 6a 2b 2b 2c 20 70 54 61 62  bList; j++, pTab
28650 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
28660 20 69 6e 74 20 64 6f 4e 6f 74 52 65 6f 72 64 65   int doNotReorde
28670 72 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  r;    /* True if
28680 20 74 68 69 73 20 74 61 62 6c 65 20 73 68 6f 75   this table shou
28690 6c 64 20 6e 6f 74 20 62 65 20 72 65 6f 72 64 65  ld not be reorde
286a0 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 57  red */.        W
286b0 68 65 72 65 43 6f 73 74 20 73 43 6f 73 74 3b 20  hereCost sCost; 
286c0 20 20 20 20 2f 2a 20 43 6f 73 74 20 69 6e 66 6f      /* Cost info
286d0 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 62 65 73  rmation from bes
286e0 74 5b 56 69 72 74 75 61 6c 5d 49 6e 64 65 78 28  t[Virtual]Index(
286f0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70  ) */.        Exp
28700 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b  rList *pOrderBy;
28710 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 63 6c    /* ORDER BY cl
28720 61 75 73 65 20 66 6f 72 20 69 6e 64 65 78 20 74  ause for index t
28730 6f 20 6f 70 74 69 6d 69 7a 65 20 2a 2f 0a 20 20  o optimize */.  
28740 0a 20 20 20 20 20 20 20 20 64 6f 4e 6f 74 52 65  .        doNotRe
28750 6f 72 64 65 72 20 3d 20 20 28 70 54 61 62 49 74  order =  (pTabIt
28760 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 28  em->jointype & (
28770 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53  JT_LEFT|JT_CROSS
28780 29 29 21 3d 30 3b 0a 20 20 20 20 20 20 20 20 69  ))!=0;.        i
28790 66 28 20 6a 21 3d 69 46 72 6f 6d 20 26 26 20 64  f( j!=iFrom && d
287a0 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29 20 62 72  oNotReorder ) br
287b0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 6d 20 3d  eak;.        m =
287c0 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
287d0 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  t, pTabItem->iCu
287e0 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 69  rsor);.        i
287f0 66 28 20 28 6d 20 26 20 6e 6f 74 52 65 61 64 79  f( (m & notReady
28800 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
28810 20 20 69 66 28 20 6a 3d 3d 69 46 72 6f 6d 20 29    if( j==iFrom )
28820 20 69 46 72 6f 6d 2b 2b 3b 0a 20 20 20 20 20 20   iFrom++;.      
28830 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
28840 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28850 6d 61 73 6b 20 3d 20 28 69 73 4f 70 74 69 6d 61  mask = (isOptima
28860 6c 20 3f 20 6d 20 3a 20 6e 6f 74 52 65 61 64 79  l ? m : notReady
28870 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65  );.        pOrde
28880 72 42 79 20 3d 20 28 28 69 3d 3d 30 20 26 26 20  rBy = ((i==0 && 
28890 70 70 4f 72 64 65 72 42 79 20 29 3f 2a 70 70 4f  ppOrderBy )?*ppO
288a0 72 64 65 72 42 79 3a 30 29 3b 0a 20 20 20 20 20  rderBy:0);.     
288b0 20 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d     if( pTabItem-
288c0 3e 70 49 6e 64 65 78 3d 3d 30 20 29 20 6e 55 6e  >pIndex==0 ) nUn
288d0 63 6f 6e 73 74 72 61 69 6e 65 64 2b 2b 3b 0a 20  constrained++;. 
288e0 20 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54   .        WHERET
288f0 52 41 43 45 28 28 22 3d 3d 3d 20 74 72 79 69 6e  RACE(("=== tryin
28900 67 20 74 61 62 6c 65 20 25 64 20 77 69 74 68 20  g table %d with 
28910 69 73 4f 70 74 69 6d 61 6c 3d 25 64 20 3d 3d 3d  isOptimal=%d ===
28920 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
28930 20 20 20 20 20 20 20 20 20 6a 2c 20 69 73 4f 70           j, isOp
28940 74 69 6d 61 6c 29 29 3b 0a 20 20 20 20 20 20 20  timal));.       
28950 20 61 73 73 65 72 74 28 20 70 54 61 62 49 74 65   assert( pTabIte
28960 6d 2d 3e 70 54 61 62 20 29 3b 0a 23 69 66 6e 64  m->pTab );.#ifnd
28970 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
28980 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
28990 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
289a0 6c 28 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  l(pTabItem->pTab
289b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
289c0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
289d0 6f 20 2a 2a 70 70 20 3d 20 26 70 57 49 6e 66 6f  o **pp = &pWInfo
289e0 2d 3e 61 5b 6a 5d 2e 70 49 64 78 49 6e 66 6f 3b  ->a[j].pIdxInfo;
289f0 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74 56  .          bestV
28a00 69 72 74 75 61 6c 49 6e 64 65 78 28 70 50 61 72  irtualIndex(pPar
28a10 73 65 2c 20 70 57 43 2c 20 70 54 61 62 49 74 65  se, pWC, pTabIte
28a20 6d 2c 20 6d 61 73 6b 2c 20 6e 6f 74 52 65 61 64  m, mask, notRead
28a30 79 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20 20 20  y, pOrderBy,.   
28a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a50 20 20 20 20 20 20 20 20 26 73 43 6f 73 74 2c 20          &sCost, 
28a60 70 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  pp);.        }el
28a70 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  se .#endif.     
28a80 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 62     {.          b
28a90 65 73 74 42 74 72 65 65 49 6e 64 65 78 28 70 50  estBtreeIndex(pP
28aa0 61 72 73 65 2c 20 70 57 43 2c 20 70 54 61 62 49  arse, pWC, pTabI
28ab0 74 65 6d 2c 20 6d 61 73 6b 2c 20 6e 6f 74 52 65  tem, mask, notRe
28ac0 61 64 79 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20  ady, pOrderBy,. 
28ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ae0 20 20 20 20 20 20 20 20 26 73 43 6f 73 74 29 3b          &sCost);
28af0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28b00 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 74     assert( isOpt
28b10 69 6d 61 6c 20 7c 7c 20 28 73 43 6f 73 74 2e 75  imal || (sCost.u
28b20 73 65 64 26 6e 6f 74 52 65 61 64 79 29 3d 3d 30  sed&notReady)==0
28b30 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   );..        /* 
28b40 49 66 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59  If an INDEXED BY
28b50 20 63 6c 61 75 73 65 20 69 73 20 70 72 65 73 65   clause is prese
28b60 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 70 6c 61  nt, then the pla
28b70 6e 20 6d 75 73 74 20 75 73 65 20 74 68 61 74 0a  n must use that.
28b80 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78          ** index
28b90 20 69 66 20 69 74 20 75 73 65 73 20 61 6e 79 20   if it uses any 
28ba0 69 6e 64 65 78 20 61 74 20 61 6c 6c 20 2a 2f 0a  index at all */.
28bb0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
28bc0 70 54 61 62 49 74 65 6d 2d 3e 70 49 6e 64 65 78  pTabItem->pIndex
28bd0 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  ==0 .           
28be0 20 20 20 20 20 20 20 7c 7c 20 28 73 43 6f 73 74         || (sCost
28bf0 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
28c00 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43  WHERE_NOT_FULLSC
28c10 41 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  AN)==0.         
28c20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 43 6f 73           || sCos
28c30 74 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 70  t.plan.u.pIdx==p
28c40 54 61 62 49 74 65 6d 2d 3e 70 49 6e 64 65 78 20  TabItem->pIndex 
28c50 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  );..        if( 
28c60 69 73 4f 70 74 69 6d 61 6c 20 26 26 20 28 73 43  isOptimal && (sC
28c70 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  ost.plan.wsFlags
28c80 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c   & WHERE_NOT_FUL
28c90 4c 53 43 41 4e 29 3d 3d 30 20 29 7b 0a 20 20 20  LSCAN)==0 ){.   
28ca0 20 20 20 20 20 20 20 6e 6f 74 49 6e 64 65 78 65         notIndexe
28cb0 64 20 7c 3d 20 6d 3b 0a 20 20 20 20 20 20 20 20  d |= m;.        
28cc0 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  }..        /* Co
28cd0 6e 64 69 74 69 6f 6e 73 20 75 6e 64 65 72 20 77  nditions under w
28ce0 68 69 63 68 20 74 68 69 73 20 74 61 62 6c 65 20  hich this table 
28cf0 62 65 63 6f 6d 65 73 20 74 68 65 20 62 65 73 74  becomes the best
28d00 20 73 6f 20 66 61 72 3a 0a 20 20 20 20 20 20 20   so far:.       
28d10 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
28d20 20 28 31 29 20 54 68 65 20 74 61 62 6c 65 20 6d   (1) The table m
28d30 75 73 74 20 6e 6f 74 20 64 65 70 65 6e 64 20 6f  ust not depend o
28d40 6e 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20 74  n other tables t
28d50 68 61 74 20 68 61 76 65 20 6e 6f 74 0a 20 20 20  hat have not.   
28d60 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 79 65       **       ye
28d70 74 20 72 75 6e 2e 0a 20 20 20 20 20 20 20 20 2a  t run..        *
28d80 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 28  *.        **   (
28d90 32 29 20 41 20 66 75 6c 6c 2d 74 61 62 6c 65 2d  2) A full-table-
28da0 73 63 61 6e 20 70 6c 61 6e 20 63 61 6e 6e 6f 74  scan plan cannot
28db0 20 73 75 70 65 72 63 65 64 65 20 61 6e 6f 74 68   supercede anoth
28dc0 65 72 20 70 6c 61 6e 20 75 6e 6c 65 73 73 0a 20  er plan unless. 
28dd0 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20         **       
28de0 69 74 20 69 73 20 61 6e 20 22 6f 70 74 69 6d 61  it is an "optima
28df0 6c 22 20 70 6c 61 6e 20 61 73 20 64 65 66 69 6e  l" plan as defin
28e00 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20  ed above..      
28e10 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
28e20 20 20 28 33 29 20 41 6c 6c 20 74 61 62 6c 65 73    (3) All tables
28e30 20 68 61 76 65 20 61 6e 20 49 4e 44 45 58 45 44   have an INDEXED
28e40 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 74 68   BY clause or th
28e50 69 73 20 74 61 62 6c 65 20 6c 61 63 6b 73 20 61  is table lacks a
28e60 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  n.        **    
28e70 20 20 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c     INDEXED BY cl
28e80 61 75 73 65 20 6f 72 20 74 68 69 73 20 74 61 62  ause or this tab
28e90 6c 65 20 75 73 65 73 20 74 68 65 20 73 70 65 63  le uses the spec
28ea0 69 66 69 63 0a 20 20 20 20 20 20 20 20 2a 2a 20  ific.        ** 
28eb0 20 20 20 20 20 20 69 6e 64 65 78 20 73 70 65 63        index spec
28ec0 69 66 69 65 64 20 62 79 20 69 74 73 20 49 4e 44  ified by its IND
28ed0 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20  EXED BY clause. 
28ee0 20 54 68 69 73 20 72 75 6c 65 20 65 6e 73 75 72   This rule ensur
28ef0 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  es.        **   
28f00 20 20 20 20 74 68 61 74 20 61 20 62 65 73 74 2d      that a best-
28f10 73 6f 2d 66 61 72 20 69 73 20 61 6c 77 61 79 73  so-far is always
28f20 20 73 65 6c 65 63 74 65 64 20 65 76 65 6e 20 69   selected even i
28f30 66 20 61 6e 20 69 6d 70 6f 73 73 69 62 6c 65 0a  f an impossible.
28f40 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20          **      
28f50 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
28f60 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
28f70 65 73 20 61 72 65 20 67 69 76 65 6e 2e 20 20 54  es are given.  T
28f80 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20  he error.       
28f90 20 2a 2a 20 20 20 20 20 20 20 77 69 6c 6c 20 62   **       will b
28fa0 65 20 64 65 74 65 63 74 65 64 20 61 6e 64 20 72  e detected and r
28fb0 65 6c 61 79 65 64 20 62 61 63 6b 20 74 6f 20 74  elayed back to t
28fc0 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 6c  he application l
28fd0 61 74 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ater..        **
28fe0 20 20 20 20 20 20 20 54 68 65 20 4e 45 56 45 52         The NEVER
28ff0 28 29 20 63 6f 6d 65 73 20 61 62 6f 75 74 20 62  () comes about b
29000 65 63 61 75 73 65 20 72 75 6c 65 20 28 32 29 20  ecause rule (2) 
29010 61 62 6f 76 65 20 70 72 65 76 65 6e 74 73 0a 20  above prevents. 
29020 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20         **       
29030 41 6e 20 69 6e 64 65 78 61 62 6c 65 20 66 75 6c  An indexable ful
29040 6c 2d 74 61 62 6c 65 2d 73 63 61 6e 20 66 72 6f  l-table-scan fro
29050 6d 20 72 65 61 63 68 69 6e 67 20 72 75 6c 65 20  m reaching rule 
29060 28 33 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  (3)..        **.
29070 20 20 20 20 20 20 20 20 2a 2a 20 20 20 28 34 29          **   (4)
29080 20 54 68 65 20 70 6c 61 6e 20 63 6f 73 74 20 6d   The plan cost m
29090 75 73 74 20 62 65 20 6c 6f 77 65 72 20 74 68 61  ust be lower tha
290a0 6e 20 70 72 69 6f 72 20 70 6c 61 6e 73 20 6f 72  n prior plans or
290b0 20 65 6c 73 65 20 74 68 65 0a 20 20 20 20 20 20   else the.      
290c0 20 20 2a 2a 20 20 20 20 20 20 20 63 6f 73 74 20    **       cost 
290d0 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65  must be the same
290e0 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20   and the number 
290f0 6f 66 20 72 6f 77 73 20 6d 75 73 74 20 62 65 20  of rows must be 
29100 6c 6f 77 65 72 2e 0a 20 20 20 20 20 20 20 20 2a  lower..        *
29110 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 73  /.        if( (s
29120 43 6f 73 74 2e 75 73 65 64 26 6e 6f 74 52 65 61  Cost.used&notRea
29130 64 79 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20  dy)==0          
29140 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29150 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (1) */.         
29160 20 20 20 26 26 20 28 62 65 73 74 4a 3c 30 20 7c     && (bestJ<0 |
29170 7c 20 28 6e 6f 74 49 6e 64 65 78 65 64 26 6d 29  | (notIndexed&m)
29180 21 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20  !=0             
29190 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20    /* (2) */.    
291a0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
291b0 73 43 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61  sCost.plan.wsFla
291c0 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46  gs & WHERE_NOT_F
291d0 55 4c 4c 53 43 41 4e 29 21 3d 30 29 0a 20 20 20  ULLSCAN)!=0).   
291e0 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 55 6e           && (nUn
291f0 63 6f 6e 73 74 72 61 69 6e 65 64 3d 3d 30 20 7c  constrained==0 |
29200 7c 20 70 54 61 62 49 74 65 6d 2d 3e 70 49 6e 64  | pTabItem->pInd
29210 65 78 3d 3d 30 20 20 20 2f 2a 20 28 33 29 20 2a  ex==0   /* (3) *
29220 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
29230 20 20 7c 7c 20 4e 45 56 45 52 28 28 73 43 6f 73    || NEVER((sCos
29240 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  t.plan.wsFlags &
29250 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53   WHERE_NOT_FULLS
29260 43 41 4e 29 21 3d 30 29 29 0a 20 20 20 20 20 20  CAN)!=0)).      
29270 20 20 20 20 20 20 26 26 20 28 62 65 73 74 4a 3c        && (bestJ<
29280 30 20 7c 7c 20 73 43 6f 73 74 2e 72 43 6f 73 74  0 || sCost.rCost
29290 3c 62 65 73 74 50 6c 61 6e 2e 72 43 6f 73 74 20  <bestPlan.rCost 
292a0 20 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20       /* (4) */. 
292b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
292c0 7c 20 28 73 43 6f 73 74 2e 72 43 6f 73 74 3c 3d  | (sCost.rCost<=
292d0 62 65 73 74 50 6c 61 6e 2e 72 43 6f 73 74 20 0a  bestPlan.rCost .
292e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292f0 20 26 26 20 73 43 6f 73 74 2e 70 6c 61 6e 2e 6e   && sCost.plan.n
29300 52 6f 77 3c 62 65 73 74 50 6c 61 6e 2e 70 6c 61  Row<bestPlan.pla
29310 6e 2e 6e 52 6f 77 29 29 0a 20 20 20 20 20 20 20  n.nRow)).       
29320 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57 48   ){.          WH
29330 45 52 45 54 52 41 43 45 28 28 22 3d 3d 3d 20 74  ERETRACE(("=== t
29340 61 62 6c 65 20 25 64 20 69 73 20 62 65 73 74 20  able %d is best 
29350 73 6f 20 66 61 72 22 0a 20 20 20 20 20 20 20 20  so far".        
29360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
29370 77 69 74 68 20 63 6f 73 74 3d 25 67 20 61 6e 64  with cost=%g and
29380 20 6e 52 6f 77 3d 25 67 5c 6e 22 2c 0a 20 20 20   nRow=%g\n",.   
29390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293a0 20 20 20 6a 2c 20 73 43 6f 73 74 2e 72 43 6f 73     j, sCost.rCos
293b0 74 2c 20 73 43 6f 73 74 2e 70 6c 61 6e 2e 6e 52  t, sCost.plan.nR
293c0 6f 77 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ow));.          
293d0 62 65 73 74 50 6c 61 6e 20 3d 20 73 43 6f 73 74  bestPlan = sCost
293e0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74  ;.          best
293f0 4a 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 7d  J = j;.        }
29400 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 6f 4e  .        if( doN
29410 6f 74 52 65 6f 72 64 65 72 20 29 20 62 72 65 61  otReorder ) brea
29420 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
29430 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 65 73  .    assert( bes
29440 74 4a 3e 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  tJ>=0 );.    ass
29450 65 72 74 28 20 6e 6f 74 52 65 61 64 79 20 26 20  ert( notReady & 
29460 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
29470 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65  , pTabList->a[be
29480 73 74 4a 5d 2e 69 43 75 72 73 6f 72 29 20 29 3b  stJ].iCursor) );
29490 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
294a0 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20  ("*** Optimizer 
294b0 73 65 6c 65 63 74 73 20 74 61 62 6c 65 20 25 64  selects table %d
294c0 20 66 6f 72 20 6c 6f 6f 70 20 25 64 22 0a 20 20   for loop %d".  
294d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
294e0 77 69 74 68 20 63 6f 73 74 3d 25 67 20 61 6e 64  with cost=%g and
294f0 20 6e 52 6f 77 3d 25 67 5c 6e 22 2c 0a 20 20 20   nRow=%g\n",.   
29500 20 20 20 20 20 20 20 20 20 20 20 20 20 62 65 73               bes
29510 74 4a 2c 20 70 4c 65 76 65 6c 2d 70 57 49 6e 66  tJ, pLevel-pWInf
29520 6f 2d 3e 61 2c 20 62 65 73 74 50 6c 61 6e 2e 72  o->a, bestPlan.r
29530 43 6f 73 74 2c 20 62 65 73 74 50 6c 61 6e 2e 70  Cost, bestPlan.p
29540 6c 61 6e 2e 6e 52 6f 77 29 29 3b 0a 20 20 20 20  lan.nRow));.    
29550 69 66 28 20 28 62 65 73 74 50 6c 61 6e 2e 70 6c  if( (bestPlan.pl
29560 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
29570 52 45 5f 4f 52 44 45 52 42 59 29 21 3d 30 20 29  RE_ORDERBY)!=0 )
29580 7b 0a 20 20 20 20 20 20 2a 70 70 4f 72 64 65 72  {.      *ppOrder
29590 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  By = 0;.    }.  
295a0 20 20 61 6e 64 46 6c 61 67 73 20 26 3d 20 62 65    andFlags &= be
295b0 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c  stPlan.plan.wsFl
295c0 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ags;.    pLevel-
295d0 3e 70 6c 61 6e 20 3d 20 62 65 73 74 50 6c 61 6e  >plan = bestPlan
295e0 2e 70 6c 61 6e 3b 0a 20 20 20 20 74 65 73 74 63  .plan;.    testc
295f0 61 73 65 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c  ase( bestPlan.pl
29600 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
29610 52 45 5f 49 4e 44 45 58 45 44 20 29 3b 0a 20 20  RE_INDEXED );.  
29620 20 20 74 65 73 74 63 61 73 65 28 20 62 65 73 74    testcase( best
29630 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  Plan.plan.wsFlag
29640 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49  s & WHERE_TEMP_I
29650 4e 44 45 58 20 29 3b 0a 20 20 20 20 69 66 28 20  NDEX );.    if( 
29660 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73  bestPlan.plan.ws
29670 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49  Flags & (WHERE_I
29680 4e 44 45 58 45 44 7c 57 48 45 52 45 5f 54 45 4d  NDEXED|WHERE_TEM
29690 50 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20 20  P_INDEX) ){.    
296a0 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75    pLevel->iIdxCu
296b0 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
296c0 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ++;.    }else{. 
296d0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64       pLevel->iId
296e0 78 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  xCur = -1;.    }
296f0 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d  .    notReady &=
29700 20 7e 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53   ~getMask(pMaskS
29710 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
29720 62 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72 29 3b  bestJ].iCursor);
29730 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72  .    pLevel->iFr
29740 6f 6d 20 3d 20 28 75 38 29 62 65 73 74 4a 3b 0a  om = (u8)bestJ;.
29750 20 20 20 20 69 66 28 20 62 65 73 74 50 6c 61 6e      if( bestPlan
29760 2e 70 6c 61 6e 2e 6e 52 6f 77 3e 3d 28 64 6f 75  .plan.nRow>=(dou
29770 62 6c 65 29 31 20 29 7b 0a 20 20 20 20 20 20 70  ble)1 ){.      p
29780 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
29790 70 20 2a 3d 20 62 65 73 74 50 6c 61 6e 2e 70 6c  p *= bestPlan.pl
297a0 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20 7d 0a 0a  an.nRow;.    }..
297b0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
297c0 74 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73  t if the table s
297d0 63 61 6e 6e 65 64 20 62 79 20 74 68 69 73 20 6c  canned by this l
297e0 6f 6f 70 20 69 74 65 72 61 74 69 6f 6e 20 68 61  oop iteration ha
297f0 64 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4e 44 45  d an.    ** INDE
29800 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 61 74  XED BY clause at
29810 74 61 63 68 65 64 20 74 6f 20 69 74 2c 20 74 68  tached to it, th
29820 61 74 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64  at the named ind
29830 65 78 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20  ex is being.    
29840 2a 2a 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  ** used for the 
29850 73 63 61 6e 2e 20 49 66 20 6e 6f 74 2c 20 74 68  scan. If not, th
29860 65 6e 20 71 75 65 72 79 20 63 6f 6d 70 69 6c 61  en query compila
29870 74 69 6f 6e 20 68 61 73 20 66 61 69 6c 65 64 2e  tion has failed.
29880 0a 20 20 20 20 2a 2a 20 52 65 74 75 72 6e 20 61  .    ** Return a
29890 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a  n error..    */.
298a0 20 20 20 20 70 49 64 78 20 3d 20 70 54 61 62 4c      pIdx = pTabL
298b0 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 70 49  ist->a[bestJ].pI
298c0 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 49  ndex;.    if( pI
298d0 64 78 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  dx ){.      if( 
298e0 28 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77  (bestPlan.plan.w
298f0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
29900 4e 44 45 58 45 44 29 3d 3d 30 20 29 7b 0a 20 20  NDEXED)==0 ){.  
29910 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
29920 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
29930 61 6e 6e 6f 74 20 75 73 65 20 69 6e 64 65 78 3a  annot use index:
29940 20 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d   %s", pIdx->zNam
29950 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  e);.        goto
29960 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
29970 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
29980 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20         /* If an 
29990 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
299a0 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 20 62  e is used, the b
299b0 65 73 74 49 6e 64 65 78 28 29 20 66 75 6e 63 74  estIndex() funct
299c0 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 20 20 2a  ion is.        *
299d0 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  * guaranteed to 
299e0 66 69 6e 64 20 74 68 65 20 69 6e 64 65 78 20 73  find the index s
299f0 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20  pecified in the 
29a00 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
29a10 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20  e.        ** if 
29a20 69 74 20 66 69 6e 64 20 61 6e 20 69 6e 64 65 78  it find an index
29a30 20 61 74 20 61 6c 6c 2e 20 2a 2f 0a 20 20 20 20   at all. */.    
29a40 20 20 20 20 61 73 73 65 72 74 28 20 62 65 73 74      assert( best
29a50 50 6c 61 6e 2e 70 6c 61 6e 2e 75 2e 70 49 64 78  Plan.plan.u.pIdx
29a60 3d 3d 70 49 64 78 20 29 3b 0a 20 20 20 20 20 20  ==pIdx );.      
29a70 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 57 48  }.    }.  }.  WH
29a80 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f  ERETRACE(("*** O
29a90 70 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65  ptimizer Finishe
29aa0 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 69 66  d ***\n"));.  if
29ab0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
29ac0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
29ad0 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77  ed ){.    goto w
29ae0 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
29af0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
29b00 20 74 6f 74 61 6c 20 71 75 65 72 79 20 6f 6e 6c   total query onl
29b10 79 20 73 65 6c 65 63 74 73 20 61 20 73 69 6e 67  y selects a sing
29b20 6c 65 20 72 6f 77 2c 20 74 68 65 6e 20 74 68 65  le row, then the
29b30 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20 63   ORDER BY.  ** c
29b40 6c 61 75 73 65 20 69 73 20 69 72 72 65 6c 65 76  lause is irrelev
29b50 61 6e 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ant..  */.  if( 
29b60 28 61 6e 64 46 6c 61 67 73 20 26 20 57 48 45 52  (andFlags & WHER
29b70 45 5f 55 4e 49 51 55 45 29 21 3d 30 20 26 26 20  E_UNIQUE)!=0 && 
29b80 70 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  ppOrderBy ){.   
29b90 20 2a 70 70 4f 72 64 65 72 42 79 20 3d 20 30 3b   *ppOrderBy = 0;
29ba0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
29bb0 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20 55  e caller is an U
29bc0 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
29bd0 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69  statement that i
29be0 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20 2a  s requesting.  *
29bf0 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d 70  * to use a one-p
29c00 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20 64  ass algorithm, d
29c10 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69 73  etermine if this
29c20 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   is appropriate.
29c30 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d 70 61  .  ** The one-pa
29c40 73 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e 6c  ss algorithm onl
29c50 79 20 77 6f 72 6b 73 20 69 66 20 74 68 65 20 57  y works if the W
29c60 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
29c70 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 74 68 65  traints.  ** the
29c80 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 75 70   statement to up
29c90 64 61 74 65 20 61 20 73 69 6e 67 6c 65 20 72 6f  date a single ro
29ca0 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  w..  */.  assert
29cb0 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
29cc0 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
29cd0 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49  SIRED)==0 || pWI
29ce0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29  nfo->nLevel==1 )
29cf0 3b 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c  ;.  if( (wctrlFl
29d00 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
29d10 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20  ASS_DESIRED)!=0 
29d20 26 26 20 28 61 6e 64 46 6c 61 67 73 20 26 20 57  && (andFlags & W
29d30 48 45 52 45 5f 55 4e 49 51 55 45 29 21 3d 30 20  HERE_UNIQUE)!=0 
29d40 29 7b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6f  ){.    pWInfo->o
29d50 6b 4f 6e 65 50 61 73 73 20 3d 20 31 3b 0a 20 20  kOnePass = 1;.  
29d60 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70    pWInfo->a[0].p
29d70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 3d 20 7e  lan.wsFlags &= ~
29d80 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a  WHERE_IDX_ONLY;.
29d90 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61    }..  /* Open a
29da0 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ll tables in the
29db0 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 6e   pTabList and an
29dc0 79 20 69 6e 64 69 63 65 73 20 73 65 6c 65 63 74  y indices select
29dd0 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72  ed for.  ** sear
29de0 63 68 69 6e 67 20 74 68 6f 73 65 20 74 61 62 6c  ching those tabl
29df0 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  es..  */.  sqlit
29e00 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
29e10 6d 61 28 70 50 61 72 73 65 2c 20 2d 31 29 3b 20  ma(pParse, -1); 
29e20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 63 6f  /* Insert the co
29e30 6f 6b 69 65 20 76 65 72 69 66 69 65 72 20 47 6f  okie verifier Go
29e40 74 6f 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79  to */.  notReady
29e50 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
29e60 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75    pWInfo->nRowOu
29e70 74 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20  t = (double)1;. 
29e80 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c   for(i=0, pLevel
29e90 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 6e 54  =pWInfo->a; i<nT
29ea0 61 62 4c 69 73 74 3b 20 69 2b 2b 2c 20 70 4c 65  abList; i++, pLe
29eb0 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  vel++){.    Tabl
29ec0 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20  e *pTab;     /* 
29ed0 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  Table to open */
29ee0 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20  .    int iDb;   
29ef0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
29f00 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  f database conta
29f10 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65  ining table/inde
29f20 78 20 2a 2f 0a 0a 20 20 20 20 70 54 61 62 49 74  x */..    pTabIt
29f30 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
29f40 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
29f50 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54 61  ;.    pTab = pTa
29f60 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bItem->pTab;.   
29f70 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
29f80 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
29f90 72 73 6f 72 3b 0a 20 20 20 20 70 57 49 6e 66 6f  rsor;.    pWInfo
29fa0 2d 3e 6e 52 6f 77 4f 75 74 20 2a 3d 20 70 4c 65  ->nRowOut *= pLe
29fb0 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 3b 0a  vel->plan.nRow;.
29fc0 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
29fd0 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
29fe0 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
29ff0 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62  );.    if( (pTab
2a000 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
2a010 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c  Ephemeral)!=0 ||
2a020 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
2a030 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
2a040 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c  thing */.    }el
2a050 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  se.#ifndef SQLIT
2a060 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2a070 42 4c 45 0a 20 20 20 20 69 66 28 20 28 70 4c 65  BLE.    if( (pLe
2a080 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
2a090 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
2a0a0 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20  LTABLE)!=0 ){.  
2a0b0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2a0c0 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63  pVTab = (const c
2a0d0 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74  har *)sqlite3Get
2a0e0 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  VTable(db, pTab)
2a0f0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 75 72  ;.      int iCur
2a100 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
2a110 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  rsor;.      sqli
2a120 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
2a130 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c   OP_VOpen, iCur,
2a140 20 30 2c 20 30 2c 20 70 56 54 61 62 2c 20 50 34   0, 0, pVTab, P4
2a150 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73  _VTAB);.    }els
2a160 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  e.#endif.    if(
2a170 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
2a180 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
2a190 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20  DX_ONLY)==0.    
2a1a0 20 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c       && (wctrlFl
2a1b0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54  ags & WHERE_OMIT
2a1c0 5f 4f 50 45 4e 29 3d 3d 30 20 29 7b 0a 20 20 20  _OPEN)==0 ){.   
2a1d0 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 57 49 6e     int op = pWIn
2a1e0 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3f 20  fo->okOnePass ? 
2a1f0 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 3a 20 4f  OP_OpenWrite : O
2a200 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20  P_OpenRead;.    
2a210 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
2a220 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 49  le(pParse, pTabI
2a230 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44  tem->iCursor, iD
2a240 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20  b, pTab, op);.  
2a250 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
2a260 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20  ab->nCol==BMS-1 
2a270 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2a280 65 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42  e( pTab->nCol==B
2a290 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  MS );.      if( 
2a2a0 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61  !pWInfo->okOnePa
2a2b0 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c  ss && pTab->nCol
2a2c0 3c 42 4d 53 20 29 7b 0a 20 20 20 20 20 20 20 20  <BMS ){.        
2a2d0 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62  Bitmask b = pTab
2a2e0 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20  Item->colUsed;. 
2a2f0 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30         int n = 0
2a300 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20  ;.        for(; 
2a310 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b  b; b=b>>1, n++){
2a320 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
2a330 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
2a340 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2a350 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 0a 20  entAddr(v)-1, . 
2a360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a370 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
2a380 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c  E_INT_TO_PTR(n),
2a390 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20   P4_INT32);.    
2a3a0 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70      assert( n<=p
2a3b0 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
2a3c0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
2a3d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62        sqlite3Tab
2a3e0 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
2a3f0 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
2a400 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  0, pTab->zName);
2a410 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
2a420 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
2a430 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 69  ATIC_INDEX.    i
2a440 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  f( (pLevel->plan
2a450 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
2a460 5f 54 45 4d 50 5f 49 4e 44 45 58 29 21 3d 30 20  _TEMP_INDEX)!=0 
2a470 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72 75  ){.      constru
2a480 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78  ctAutomaticIndex
2a490 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 54  (pParse, pWC, pT
2a4a0 61 62 49 74 65 6d 2c 20 6e 6f 74 52 65 61 64 79  abItem, notReady
2a4b0 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 7d  , pLevel);.    }
2a4c0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
2a4d0 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  if( (pLevel->pla
2a4e0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
2a4f0 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 7b  E_INDEXED)!=0 ){
2a500 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
2a510 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  x = pLevel->plan
2a520 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20 20 20 4b  .u.pIdx;.      K
2a530 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73  eyInfo *pKey = s
2a540 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e  qlite3IndexKeyin
2a550 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78 29 3b  fo(pParse, pIx);
2a560 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 43  .      int iIdxC
2a570 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ur = pLevel->iId
2a580 78 43 75 72 3b 0a 20 20 20 20 20 20 61 73 73 65  xCur;.      asse
2a590 72 74 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61  rt( pIx->pSchema
2a5a0 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ==pTab->pSchema 
2a5b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2a5c0 20 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20   iIdxCur>=0 );. 
2a5d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2a5e0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
2a5f0 6e 52 65 61 64 2c 20 69 49 64 78 43 75 72 2c 20  nRead, iIdxCur, 
2a600 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a  pIx->tnum, iDb,.
2a610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a620 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
2a630 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  Key, P4_KEYINFO_
2a640 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20  HANDOFF);.      
2a650 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2a660 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65  "%s", pIx->zName
2a670 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ));.    }.    sq
2a680 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
2a690 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
2a6a0 62 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79  b);.    notReady
2a6b0 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 70 57 43   &= ~getMask(pWC
2a6c0 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  ->pMaskSet, pTab
2a6d0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
2a6e0 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54    }.  pWInfo->iT
2a6f0 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
2a700 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
2a710 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
2a720 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68  Failed ) goto wh
2a730 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a  ereBeginError;..
2a740 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
2a750 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65  e code to do the
2a760 20 73 65 61 72 63 68 2e 20 20 45 61 63 68 20 69   search.  Each i
2a770 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
2a780 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65  for.  ** loop be
2a790 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63 6f  low generates co
2a7a0 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  de for a single 
2a7b0 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74  nested loop of t
2a7c0 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72  he VM.  ** progr
2a7d0 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65  am..  */.  notRe
2a7e0 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29  ady = ~(Bitmask)
2a7f0 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
2a800 6e 54 61 62 4c 69 73 74 3b 20 69 2b 2b 29 7b 0a  nTabList; i++){.
2a810 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57      pLevel = &pW
2a820 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  Info->a[i];.    
2a830 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 70  explainOneScan(p
2a840 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
2a850 20 70 4c 65 76 65 6c 2c 20 69 2c 20 70 4c 65 76   pLevel, i, pLev
2a860 65 6c 2d 3e 69 46 72 6f 6d 2c 20 77 63 74 72 6c  el->iFrom, wctrl
2a870 46 6c 61 67 73 29 3b 0a 20 20 20 20 6e 6f 74 52  Flags);.    notR
2a880 65 61 64 79 20 3d 20 63 6f 64 65 4f 6e 65 4c 6f  eady = codeOneLo
2a890 6f 70 53 74 61 72 74 28 70 57 49 6e 66 6f 2c 20  opStart(pWInfo, 
2a8a0 69 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 6e  i, wctrlFlags, n
2a8b0 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70 57  otReady);.    pW
2a8c0 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20  Info->iContinue 
2a8d0 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f  = pLevel->addrCo
2a8e0 6e 74 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  nt;.  }..#ifdef 
2a8f0 53 51 4c 49 54 45 5f 54 45 53 54 20 20 2f 2a 20  SQLITE_TEST  /* 
2a900 46 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  For testing and 
2a910 64 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e  debugging use on
2a920 6c 79 20 2a 2f 0a 20 20 2f 2a 20 52 65 63 6f 72  ly */.  /* Recor
2a930 64 20 69 6e 20 74 68 65 20 71 75 65 72 79 20 70  d in the query p
2a940 6c 61 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  lan information 
2a950 61 62 6f 75 74 20 74 68 65 20 63 75 72 72 65 6e  about the curren
2a960 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20 61 6e 64  t table.  ** and
2a970 20 74 68 65 20 69 6e 64 65 78 20 75 73 65 64 20   the index used 
2a980 74 6f 20 61 63 63 65 73 73 20 69 74 20 28 69 66  to access it (if
2a990 20 61 6e 79 29 2e 20 20 49 66 20 74 68 65 20 74   any).  If the t
2a9a0 61 62 6c 65 20 69 74 73 65 6c 66 0a 20 20 2a 2a  able itself.  **
2a9b0 20 69 73 20 6e 6f 74 20 75 73 65 64 2c 20 69 74   is not used, it
2a9c0 73 20 6e 61 6d 65 20 69 73 20 6a 75 73 74 20 27  s name is just '
2a9d0 7b 7d 27 2e 20 20 49 66 20 6e 6f 20 69 6e 64 65  {}'.  If no inde
2a9e0 78 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 74  x is used.  ** t
2a9f0 68 65 20 69 6e 64 65 78 20 69 73 20 6c 69 73 74  he index is list
2aa00 65 64 20 61 73 20 22 7b 7d 22 2e 20 20 49 66 20  ed as "{}".  If 
2aa10 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
2aa20 69 73 20 75 73 65 64 20 74 68 65 0a 20 20 2a 2a  is used the.  **
2aa30 20 69 6e 64 65 78 20 6e 61 6d 65 20 69 73 20 27   index name is '
2aa40 2a 27 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  *'..  */.  for(i
2aa50 3d 30 3b 20 69 3c 6e 54 61 62 4c 69 73 74 3b 20  =0; i<nTabList; 
2aa60 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  i++){.    char *
2aa70 7a 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  z;.    int n;.  
2aa80 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e    pLevel = &pWIn
2aa90 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 54  fo->a[i];.    pT
2aaa0 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  abItem = &pTabLi
2aab0 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
2aac0 72 6f 6d 5d 3b 0a 20 20 20 20 7a 20 3d 20 70 54  rom];.    z = pT
2aad0 61 62 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a  abItem->zAlias;.
2aae0 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a      if( z==0 ) z
2aaf0 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
2ab00 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 20  b->zName;.    n 
2ab10 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
2ab20 30 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 2b  0(z);.    if( n+
2ab30 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28  nQPlan < sizeof(
2ab40 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
2ab50 61 6e 29 2d 31 30 20 29 7b 0a 20 20 20 20 20 20  an)-10 ){.      
2ab60 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
2ab70 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
2ab80 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20  _IDX_ONLY ){.   
2ab90 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c       memcpy(&sql
2aba0 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
2abb0 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 22 2c 20 32  nQPlan], "{}", 2
2abc0 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61  );.        nQPla
2abd0 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d 65  n += 2;.      }e
2abe0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
2abf0 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65  cpy(&sqlite3_que
2ac00 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c  ry_plan[nQPlan],
2ac10 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20   z, n);.        
2ac20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20  nQPlan += n;.   
2ac30 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
2ac40 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
2ac50 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20  Plan++] = ' ';. 
2ac60 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73     }.    testcas
2ac70 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  e( pLevel->plan.
2ac80 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2ac90 52 4f 57 49 44 5f 45 51 20 29 3b 0a 20 20 20 20  ROWID_EQ );.    
2aca0 74 65 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c  testcase( pLevel
2acb0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
2acc0 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e   WHERE_ROWID_RAN
2acd0 47 45 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  GE );.    if( pL
2ace0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
2acf0 67 73 20 26 20 28 57 48 45 52 45 5f 52 4f 57 49  gs & (WHERE_ROWI
2ad00 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44  D_EQ|WHERE_ROWID
2ad10 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20 20 20 20  _RANGE) ){.     
2ad20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33   memcpy(&sqlite3
2ad30 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
2ad40 61 6e 5d 2c 20 22 2a 20 22 2c 20 32 29 3b 0a 20  an], "* ", 2);. 
2ad50 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32       nQPlan += 2
2ad60 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2ad70 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
2ad80 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
2ad90 44 45 58 45 44 29 21 3d 30 20 29 7b 0a 20 20 20  DEXED)!=0 ){.   
2ada0 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74     n = sqlite3St
2adb0 72 6c 65 6e 33 30 28 70 4c 65 76 65 6c 2d 3e 70  rlen30(pLevel->p
2adc0 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d  lan.u.pIdx->zNam
2add0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 2b  e);.      if( n+
2ade0 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28  nQPlan < sizeof(
2adf0 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
2ae00 61 6e 29 2d 32 20 29 7b 0a 20 20 20 20 20 20 20  an)-2 ){.       
2ae10 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33   memcpy(&sqlite3
2ae20 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
2ae30 61 6e 5d 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  an], pLevel->pla
2ae40 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c  n.u.pIdx->zName,
2ae50 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50   n);.        nQP
2ae60 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20  lan += n;.      
2ae70 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f    sqlite3_query_
2ae80 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d  plan[nQPlan++] =
2ae90 20 27 20 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20   ' ';.      }.  
2aea0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
2aeb0 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71  emcpy(&sqlite3_q
2aec0 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
2aed0 5d 2c 20 22 7b 7d 20 22 2c 20 33 29 3b 0a 20 20  ], "{} ", 3);.  
2aee0 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 33 3b      nQPlan += 3;
2aef0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 69  .    }.  }.  whi
2af00 6c 65 28 20 6e 51 50 6c 61 6e 3e 30 20 26 26 20  le( nQPlan>0 && 
2af10 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
2af20 61 6e 5b 6e 51 50 6c 61 6e 2d 31 5d 3d 3d 27 20  an[nQPlan-1]==' 
2af30 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ' ){.    sqlite3
2af40 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 2d 2d 6e 51  _query_plan[--nQ
2af50 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20  Plan] = 0;.  }. 
2af60 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
2af70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b  lan[nQPlan] = 0;
2af80 0a 20 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 0a 23  .  nQPlan = 0;.#
2af90 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2afa0 54 45 53 54 20 2f 2f 20 54 65 73 74 69 6e 67 20  TEST // Testing 
2afb0 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75 73  and debugging us
2afc0 65 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a 20  e only */..  /* 
2afd0 52 65 63 6f 72 64 20 74 68 65 20 63 6f 6e 74 69  Record the conti
2afe0 6e 75 61 74 69 6f 6e 20 61 64 64 72 65 73 73 20  nuation address 
2aff0 69 6e 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f  in the WhereInfo
2b000 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
2b010 6e 0a 20 20 2a 2a 20 63 6c 65 61 6e 20 75 70 20  n.  ** clean up 
2b020 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f  and return..  */
2b030 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
2b040 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
2b050 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  e if malloc fail
2b060 73 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e 45  s */.whereBeginE
2b070 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 57 49 6e  rror:.  if( pWIn
2b080 66 6f 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  fo ){.    pParse
2b090 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  ->nQueryLoop = p
2b0a0 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65  WInfo->savedNQue
2b0b0 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72  ryLoop;.    wher
2b0c0 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57  eInfoFree(db, pW
2b0d0 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Info);.  }.  ret
2b0e0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2b0f0 47 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64  Generate the end
2b100 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f   of the WHERE lo
2b110 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74  op.  See comment
2b120 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33  s on .** sqlite3
2b130 57 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72  WhereBegin() for
2b140 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
2b150 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  rmation..*/.void
2b160 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
2b170 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
2b180 66 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  fo){.  Parse *pP
2b190 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
2b1a0 50 61 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76  Parse;.  Vdbe *v
2b1b0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
2b1c0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65  ;.  int i;.  Whe
2b1d0 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b  reLevel *pLevel;
2b1e0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
2b1f0 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  List = pWInfo->p
2b200 54 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74  TabList;.  sqlit
2b210 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
2b220 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  >db;..  /* Gener
2b230 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61  ate loop termina
2b240 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a  tion code..  */.
2b250 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
2b260 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
2b270 0a 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d  .  for(i=pWInfo-
2b280 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b  >nLevel-1; i>=0;
2b290 20 69 2d 2d 29 7b 0a 20 20 20 20 70 4c 65 76 65   i--){.    pLeve
2b2a0 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  l = &pWInfo->a[i
2b2b0 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ];.    sqlite3Vd
2b2c0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
2b2d0 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f  , pLevel->addrCo
2b2e0 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  nt);.    if( pLe
2b2f0 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70  vel->op!=OP_Noop
2b300 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2b310 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70  3VdbeAddOp2(v, p
2b320 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65  Level->op, pLeve
2b330 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70  l->p1, pLevel->p
2b340 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
2b350 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
2b360 20 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20   pLevel->p5);.  
2b370 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76    }.    if( pLev
2b380 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
2b390 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45   & WHERE_IN_ABLE
2b3a0 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e   && pLevel->u.in
2b3b0 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20  .nIn>0 ){.      
2b3c0 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70  struct InLoop *p
2b3d0 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  In;.      int j;
2b3e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2b3f0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
2b400 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  , pLevel->addrNx
2b410 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  t);.      for(j=
2b420 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
2b430 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75  , pIn=&pLevel->u
2b440 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d  .in.aInLoop[j-1]
2b450 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d  ; j>0; j--, pIn-
2b460 2d 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  -){.        sqli
2b470 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
2b480 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f  v, pIn->addrInTo
2b490 70 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  p+1);.        sq
2b4a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2b4b0 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 49 6e 2d  v, OP_Next, pIn-
2b4c0 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72  >iCur, pIn->addr
2b4d0 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  InTop);.        
2b4e0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2b4f0 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72  ere(v, pIn->addr
2b500 49 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20  InTop-1);.      
2b510 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  }.      sqlite3D
2b520 62 46 72 65 65 28 64 62 2c 20 70 4c 65 76 65 6c  bFree(db, pLevel
2b530 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b  ->u.in.aInLoop);
2b540 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2b550 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
2b560 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  el(v, pLevel->ad
2b570 64 72 42 72 6b 29 3b 0a 20 20 20 20 69 66 28 20  drBrk);.    if( 
2b580 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
2b590 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  n ){.      int a
2b5a0 64 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20  ddr;.      addr 
2b5b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
2b5c0 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op1(v, OP_IfPos,
2b5d0 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
2b5e0 69 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  in);.      asser
2b5f0 74 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  t( (pLevel->plan
2b600 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
2b610 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20  _IDX_ONLY)==0.  
2b620 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4c 65           || (pLe
2b630 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
2b640 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
2b650 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  D)!=0 );.      i
2b660 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  f( (pLevel->plan
2b670 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
2b680 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b  _IDX_ONLY)==0 ){
2b690 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2b6a0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2b6b0 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69  _NullRow, pTabLi
2b6c0 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
2b6d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2b6e0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64   if( pLevel->iId
2b6f0 78 43 75 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20  xCur>=0 ){.     
2b700 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2b710 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52  dOp1(v, OP_NullR
2b720 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  ow, pLevel->iIdx
2b730 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Cur);.      }.  
2b740 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
2b750 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29 7b  op==OP_Return ){
2b760 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2b770 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2b780 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d 3e  _Gosub, pLevel->
2b790 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  p1, pLevel->addr
2b7a0 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 65  First);.      }e
2b7b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
2b7c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2b7d0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c  , OP_Goto, 0, pL
2b7e0 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29  evel->addrFirst)
2b7f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2b800 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2b810 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
2b820 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
2b830 65 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20  e "break" point 
2b840 69 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61  is here, just pa
2b850 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
2b860 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20  e outer loop..  
2b870 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a  ** Set it..  */.
2b880 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
2b890 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49  olveLabel(v, pWI
2b8a0 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20  nfo->iBreak);.. 
2b8b0 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66   /* Close all of
2b8c0 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61   the cursors tha
2b8d0 74 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79  t were opened by
2b8e0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2b8f0 69 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  in..  */.  asser
2b900 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  t( pWInfo->nLeve
2b910 6c 3d 3d 31 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e  l==1 || pWInfo->
2b920 6e 4c 65 76 65 6c 3d 3d 70 54 61 62 4c 69 73 74  nLevel==pTabList
2b930 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72 28  ->nSrc );.  for(
2b940 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  i=0, pLevel=pWIn
2b950 66 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d  fo->a; i<pWInfo-
2b960 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c  >nLevel; i++, pL
2b970 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 72  evel++){.    str
2b980 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2b990 20 2a 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54   *pTabItem = &pT
2b9a0 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
2b9b0 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61  ->iFrom];.    Ta
2b9c0 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62  ble *pTab = pTab
2b9d0 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
2b9e0 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20  assert( pTab!=0 
2b9f0 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62  );.    if( (pTab
2ba00 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
2ba10 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 0a 20 20  Ephemeral)==0.  
2ba20 20 20 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c     && pTab->pSel
2ba30 65 63 74 3d 3d 30 0a 20 20 20 20 20 26 26 20 28  ect==0.     && (
2ba40 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
2ba50 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f  gs & WHERE_OMIT_
2ba60 43 4c 4f 53 45 29 3d 3d 30 0a 20 20 20 20 29 7b  CLOSE)==0.    ){
2ba70 0a 20 20 20 20 20 20 69 6e 74 20 77 73 20 3d 20  .      int ws = 
2ba80 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
2ba90 6c 61 67 73 3b 0a 20 20 20 20 20 20 69 66 28 20  lags;.      if( 
2baa0 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61  !pWInfo->okOnePa
2bab0 73 73 20 26 26 20 28 77 73 20 26 20 57 48 45 52  ss && (ws & WHER
2bac0 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29  E_IDX_ONLY)==0 )
2bad0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2bae0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2baf0 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49 74 65  P_Close, pTabIte
2bb00 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
2bb10 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
2bb20 77 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  ws & WHERE_INDEX
2bb30 45 44 29 21 3d 30 20 26 26 20 28 77 73 20 26 20  ED)!=0 && (ws & 
2bb40 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58  WHERE_TEMP_INDEX
2bb50 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2bb60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2bb70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70  1(v, OP_Close, p
2bb80 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b  Level->iIdxCur);
2bb90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2bba0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 73      /* If this s
2bbb0 63 61 6e 20 75 73 65 73 20 61 6e 20 69 6e 64 65  can uses an inde
2bbc0 78 2c 20 6d 61 6b 65 20 63 6f 64 65 20 73 75 62  x, make code sub
2bbd0 73 74 69 74 75 74 69 6f 6e 73 20 74 6f 20 72 65  stitutions to re
2bbe0 61 64 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66  ad data.    ** f
2bbf0 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 69 6e  rom the index in
2bc00 20 70 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74   preference to t
2bc10 68 65 20 74 61 62 6c 65 2e 20 53 6f 6d 65 74 69  he table. Someti
2bc20 6d 65 73 2c 20 74 68 69 73 20 6d 65 61 6e 73 0a  mes, this means.
2bc30 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65      ** the table
2bc40 20 6e 65 65 64 20 6e 65 76 65 72 20 62 65 20 72   need never be r
2bc50 65 61 64 20 66 72 6f 6d 2e 20 54 68 69 73 20 69  ead from. This i
2bc60 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  s a performance 
2bc70 62 6f 6f 73 74 2c 0a 20 20 20 20 2a 2a 20 61 73  boost,.    ** as
2bc80 20 74 68 65 20 76 64 62 65 20 6c 65 76 65 6c 20   the vdbe level 
2bc90 77 61 69 74 73 20 75 6e 74 69 6c 20 74 68 65 20  waits until the 
2bca0 74 61 62 6c 65 20 69 73 20 72 65 61 64 20 62 65  table is read be
2bcb0 66 6f 72 65 20 61 63 74 75 61 6c 6c 79 0a 20 20  fore actually.  
2bcc0 20 20 2a 2a 20 73 65 65 6b 69 6e 67 20 74 68 65    ** seeking the
2bcd0 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 74 6f   table cursor to
2bce0 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 72 72   the record corr
2bcf0 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
2bd00 20 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20   current.    ** 
2bd10 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20  position in the 
2bd20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 20 0a 20  index..    ** . 
2bd30 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74     ** Calls to t
2bd40 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
2bd50 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71 6c  r in between sql
2bd60 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 20 61  ite3WhereBegin a
2bd70 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  nd.    ** sqlite
2bd80 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20 68  3WhereEnd will h
2bd90 61 76 65 20 63 72 65 61 74 65 64 20 63 6f 64 65  ave created code
2bda0 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
2bdb0 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a   the table.    *
2bdc0 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69  * directly.  Thi
2bdd0 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c  s loop scans all
2bde0 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69   that code looki
2bdf0 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20  ng for opcodes. 
2be00 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65 72     ** that refer
2be10 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20 61  ence the table a
2be20 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65 6d  nd converts them
2be30 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74 68   into opcodes th
2be40 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65  at.    ** refere
2be50 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a 20  nce the index.. 
2be60 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
2be70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
2be80 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
2be90 58 45 44 29 21 3d 30 20 26 26 20 21 64 62 2d 3e  XED)!=0 && !db->
2bea0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 7b 0a 20  mallocFailed){. 
2beb0 20 20 20 20 20 69 6e 74 20 6b 2c 20 6a 2c 20 6c       int k, j, l
2bec0 61 73 74 3b 0a 20 20 20 20 20 20 56 64 62 65 4f  ast;.      VdbeO
2bed0 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 49 6e  p *pOp;.      In
2bee0 64 65 78 20 2a 70 49 64 78 20 3d 20 70 4c 65 76  dex *pIdx = pLev
2bef0 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b  el->plan.u.pIdx;
2bf00 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
2bf10 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 20 20 20  pIdx!=0 );.     
2bf20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
2bf30 62 65 47 65 74 4f 70 28 76 2c 20 70 57 49 6e 66  beGetOp(v, pWInf
2bf40 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20 20 20 20 20  o->iTop);.      
2bf50 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  last = sqlite3Vd
2bf60 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
2bf70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 57  ;.      for(k=pW
2bf80 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20 6b 3c 6c 61  Info->iTop; k<la
2bf90 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b  st; k++, pOp++){
2bfa0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
2bfb0 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54  ->p1!=pLevel->iT
2bfc0 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  abCur ) continue
2bfd0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
2bfe0 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f  p->opcode==OP_Co
2bff0 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
2c000 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64    for(j=0; j<pId
2c010 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29  x->nColumn; j++)
2c020 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
2c030 28 20 70 4f 70 2d 3e 70 32 3d 3d 70 49 64 78 2d  ( pOp->p2==pIdx-
2c040 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b 0a  >aiColumn[j] ){.
2c050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f                pO
2c060 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20 20 20 20  p->p2 = j;.     
2c070 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31           pOp->p1
2c080 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   = pLevel->iIdxC
2c090 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ur;.            
2c0a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2c0b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2c0c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73   }.          ass
2c0d0 65 72 74 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c  ert( (pLevel->pl
2c0e0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
2c0f0 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a  RE_IDX_ONLY)==0.
2c100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
2c110 7c 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  | j<pIdx->nColum
2c120 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  n );.        }el
2c130 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  se if( pOp->opco
2c140 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a  de==OP_Rowid ){.
2c150 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
2c160 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  1 = pLevel->iIdx
2c170 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Cur;.          p
2c180 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
2c190 49 64 78 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  IdxRowid;.      
2c1a0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2c1b0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61  }.  }..  /* Fina
2c1c0 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20  l cleanup.  */. 
2c1d0 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
2c1e0 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61  oop = pWInfo->sa
2c1f0 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20  vedNQueryLoop;. 
2c200 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64   whereInfoFree(d
2c210 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65  b, pWInfo);.  re
2c220 74 75 72 6e 3b 0a 7d 0a                          turn;.}.