/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 8bbb34e8a836165d92a7d60b80f60be2da9615f9:


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 64 6f 75 62 6c 65 20 6e 52  y */.  double nR
2070: 6f 77 3b 20 20 20 20 20 20 20 2f 2a 20 45 73 74  ow;       /* Est
2080: 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  imated number of
2090: 20 6f 75 74 70 75 74 20 72 6f 77 73 20 2a 2f 0a   output rows */.
20a0: 20 20 42 69 74 6d 61 73 6b 20 75 73 65 64 3b 20    Bitmask used; 
20b0: 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20       /* Bitmask 
20c0: 6f 66 20 63 75 72 73 6f 72 73 20 75 73 65 64 20  of cursors used 
20d0: 62 79 20 74 68 69 73 20 70 6c 61 6e 20 2a 2f 0a  by this plan */.
20e0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 6d 61 73  };../*.** Bitmas
20f0: 6b 73 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61  ks for the opera
2100: 74 6f 72 73 20 74 68 61 74 20 69 6e 64 69 63 65  tors that indice
2110: 73 20 61 72 65 20 61 62 6c 65 20 74 6f 20 65 78  s are able to ex
2120: 70 6c 6f 69 74 2e 20 20 41 6e 0a 2a 2a 20 4f 52  ploit.  An.** OR
2130: 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  -ed combination 
2140: 6f 66 20 74 68 65 73 65 20 76 61 6c 75 65 73 20  of these values 
2150: 63 61 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e  can be used when
2160: 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 0a 2a   searching for.*
2170: 2a 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 77  * terms in the w
2180: 68 65 72 65 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  here clause..*/.
2190: 23 64 65 66 69 6e 65 20 57 4f 5f 49 4e 20 20 20  #define WO_IN   
21a0: 20 20 30 78 30 30 31 0a 23 64 65 66 69 6e 65 20    0x001.#define 
21b0: 57 4f 5f 45 51 20 20 20 20 20 30 78 30 30 32 0a  WO_EQ     0x002.
21c0: 23 64 65 66 69 6e 65 20 57 4f 5f 4c 54 20 20 20  #define WO_LT   
21d0: 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 54    (WO_EQ<<(TK_LT
21e0: 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65  -TK_EQ)).#define
21f0: 20 57 4f 5f 4c 45 20 20 20 20 20 28 57 4f 5f 45   WO_LE     (WO_E
2200: 51 3c 3c 28 54 4b 5f 4c 45 2d 54 4b 5f 45 51 29  Q<<(TK_LE-TK_EQ)
2210: 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47 54 20  ).#define WO_GT 
2220: 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f      (WO_EQ<<(TK_
2230: 47 54 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69  GT-TK_EQ)).#defi
2240: 6e 65 20 57 4f 5f 47 45 20 20 20 20 20 28 57 4f  ne WO_GE     (WO
2250: 5f 45 51 3c 3c 28 54 4b 5f 47 45 2d 54 4b 5f 45  _EQ<<(TK_GE-TK_E
2260: 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4d  Q)).#define WO_M
2270: 41 54 43 48 20 20 30 78 30 34 30 0a 23 64 65 66  ATCH  0x040.#def
2280: 69 6e 65 20 57 4f 5f 49 53 4e 55 4c 4c 20 30 78  ine WO_ISNULL 0x
2290: 30 38 30 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4f  080.#define WO_O
22a0: 52 20 20 20 20 20 30 78 31 30 30 20 20 20 20 20  R     0x100     
22b0: 20 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f 72 65    /* Two or more
22c0: 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65   OR-connected te
22d0: 72 6d 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  rms */.#define W
22e0: 4f 5f 41 4e 44 20 20 20 20 30 78 32 30 30 20 20  O_AND    0x200  
22f0: 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20 6d       /* Two or m
2300: 6f 72 65 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65  ore AND-connecte
2310: 64 20 74 65 72 6d 73 20 2a 2f 0a 0a 23 64 65 66  d terms */..#def
2320: 69 6e 65 20 57 4f 5f 41 4c 4c 20 20 20 20 30 78  ine WO_ALL    0x
2330: 66 66 66 20 20 20 20 20 20 20 2f 2a 20 4d 61 73  fff       /* Mas
2340: 6b 20 6f 66 20 61 6c 6c 20 70 6f 73 73 69 62 6c  k of all possibl
2350: 65 20 57 4f 5f 2a 20 76 61 6c 75 65 73 20 2a 2f  e WO_* values */
2360: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 53 49 4e 47  .#define WO_SING
2370: 4c 45 20 30 78 30 66 66 20 20 20 20 20 20 20 2f  LE 0x0ff       /
2380: 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 6e 6f  * Mask of all no
2390: 6e 2d 63 6f 6d 70 6f 75 6e 64 20 57 4f 5f 2a 20  n-compound WO_* 
23a0: 76 61 6c 75 65 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  values */../*.**
23b0: 20 56 61 6c 75 65 20 66 6f 72 20 77 73 46 6c 61   Value for wsFla
23c0: 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 62  gs returned by b
23d0: 65 73 74 49 6e 64 65 78 28 29 20 61 6e 64 20 73  estIndex() and s
23e0: 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 57 68 65 72  tored in.** Wher
23f0: 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67 73 2e 20  eLevel.wsFlags. 
2400: 20 54 68 65 73 65 20 66 6c 61 67 73 20 64 65 74   These flags det
2410: 65 72 6d 69 6e 65 20 77 68 69 63 68 20 73 65 61  ermine which sea
2420: 72 63 68 0a 2a 2a 20 73 74 72 61 74 65 67 69 65  rch.** strategie
2430: 73 20 61 72 65 20 61 70 70 72 6f 70 72 69 61 74  s are appropriat
2440: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 61  e..**.** The lea
2450: 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74 20 31  st significant 1
2460: 32 20 62 69 74 73 20 69 73 20 72 65 73 65 72 76  2 bits is reserv
2470: 65 64 20 61 73 20 61 20 6d 61 73 6b 20 66 6f 72  ed as a mask for
2480: 20 57 4f 5f 20 76 61 6c 75 65 73 20 61 62 6f 76   WO_ values abov
2490: 65 2e 0a 2a 2a 20 54 68 65 20 57 68 65 72 65 4c  e..** The WhereL
24a0: 65 76 65 6c 2e 77 73 46 6c 61 67 73 20 66 69 65  evel.wsFlags fie
24b0: 6c 64 20 69 73 20 75 73 75 61 6c 6c 79 20 73 65  ld is usually se
24c0: 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f 5f 45 51  t to WO_IN|WO_EQ
24d0: 7c 57 4f 5f 49 53 4e 55 4c 4c 2e 0a 2a 2a 20 42  |WO_ISNULL..** B
24e0: 75 74 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ut if the table 
24f0: 69 73 20 74 68 65 20 72 69 67 68 74 20 74 61 62  is the right tab
2500: 6c 65 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69  le of a left joi
2510: 6e 2c 20 57 68 65 72 65 4c 65 76 65 6c 2e 77 73  n, WhereLevel.ws
2520: 46 6c 61 67 73 0a 2a 2a 20 69 73 20 73 65 74 20  Flags.** is set 
2530: 74 6f 20 57 4f 5f 49 4e 7c 57 4f 5f 45 51 2e 20  to WO_IN|WO_EQ. 
2540: 20 54 68 65 20 57 68 65 72 65 4c 65 76 65 6c 2e   The WhereLevel.
2550: 77 73 46 6c 61 67 73 20 66 69 65 6c 64 20 63 61  wsFlags field ca
2560: 6e 20 74 68 65 6e 20 62 65 20 75 73 65 64 20 61  n then be used a
2570: 73 0a 2a 2a 20 74 68 65 20 22 6f 70 22 20 70 61  s.** the "op" pa
2580: 72 61 6d 65 74 65 72 20 74 6f 20 66 69 6e 64 54  rameter to findT
2590: 65 72 6d 20 77 68 65 6e 20 77 65 20 61 72 65 20  erm when we are 
25a0: 72 65 73 6f 6c 76 69 6e 67 20 65 71 75 61 6c 69  resolving equali
25b0: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a  ty constraints..
25c0: 2a 2a 20 49 53 4e 55 4c 4c 20 63 6f 6e 73 74 72  ** ISNULL constr
25d0: 61 69 6e 74 73 20 77 69 6c 6c 20 74 68 65 6e 20  aints will then 
25e0: 6e 6f 74 20 62 65 20 75 73 65 64 20 6f 6e 20 74  not be used on t
25f0: 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f  he right table o
2600: 66 20 61 20 6c 65 66 74 0a 2a 2a 20 6a 6f 69 6e  f a left.** join
2610: 2e 20 20 54 69 63 6b 65 74 73 20 23 32 31 37 37  .  Tickets #2177
2620: 20 61 6e 64 20 23 32 31 38 39 2e 0a 2a 2f 0a 23   and #2189..*/.#
2630: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52 4f 57  define WHERE_ROW
2640: 49 44 5f 45 51 20 20 20 20 20 30 78 30 30 30 30  ID_EQ     0x0000
2650: 31 30 30 30 20 20 2f 2a 20 72 6f 77 69 64 3d 45  1000  /* rowid=E
2660: 58 50 52 20 6f 72 20 72 6f 77 69 64 20 49 4e 20  XPR or rowid IN 
2670: 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e 65  (...) */.#define
2680: 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e   WHERE_ROWID_RAN
2690: 47 45 20 20 30 78 30 30 30 30 32 30 30 30 20 20  GE  0x00002000  
26a0: 2f 2a 20 72 6f 77 69 64 3c 45 58 50 52 20 61 6e  /* rowid<EXPR an
26b0: 64 2f 6f 72 20 72 6f 77 69 64 3e 45 58 50 52 20  d/or rowid>EXPR 
26c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
26d0: 5f 43 4f 4c 55 4d 4e 5f 45 51 20 20 20 20 30 78  _COLUMN_EQ    0x
26e0: 30 30 30 31 30 30 30 30 20 20 2f 2a 20 78 3d 45  00010000  /* x=E
26f0: 58 50 52 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e  XPR or x IN (...
2700: 29 20 6f 72 20 78 20 49 53 20 4e 55 4c 4c 20 2a  ) or x IS NULL *
2710: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
2720: 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 30 78 30  COLUMN_RANGE 0x0
2730: 30 30 32 30 30 30 30 20 20 2f 2a 20 78 3c 45 58  0020000  /* x<EX
2740: 50 52 20 61 6e 64 2f 6f 72 20 78 3e 45 58 50 52  PR and/or x>EXPR
2750: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
2760: 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 20 20 20 30  E_COLUMN_IN    0
2770: 78 30 30 30 34 30 30 30 30 20 20 2f 2a 20 78 20  x00040000  /* x 
2780: 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66  IN (...) */.#def
2790: 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  ine WHERE_COLUMN
27a0: 5f 4e 55 4c 4c 20 20 30 78 30 30 30 38 30 30 30  _NULL  0x0008000
27b0: 30 20 20 2f 2a 20 78 20 49 53 20 4e 55 4c 4c 20  0  /* x IS NULL 
27c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
27d0: 5f 49 4e 44 45 58 45 44 20 20 20 20 20 20 30 78  _INDEXED      0x
27e0: 30 30 30 66 30 30 30 30 20 20 2f 2a 20 41 6e 79  000f0000  /* Any
27f0: 74 68 69 6e 67 20 74 68 61 74 20 75 73 65 73 20  thing that uses 
2800: 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 23 64 65 66  an index */.#def
2810: 69 6e 65 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c  ine WHERE_IN_ABL
2820: 45 20 20 20 20 20 20 30 78 30 30 30 66 31 30 30  E      0x000f100
2830: 30 20 20 2f 2a 20 41 62 6c 65 20 74 6f 20 73 75  0  /* Able to su
2840: 70 70 6f 72 74 20 61 6e 20 49 4e 20 6f 70 65 72  pport an IN oper
2850: 61 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ator */.#define 
2860: 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
2870: 20 20 20 30 78 30 30 31 30 30 30 30 30 20 20 2f     0x00100000  /
2880: 2a 20 78 3c 45 58 50 52 20 6f 72 20 78 3c 3d 45  * x<EXPR or x<=E
2890: 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  XPR constraint *
28a0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
28b0: 42 54 4d 5f 4c 49 4d 49 54 20 20 20 20 30 78 30  BTM_LIMIT    0x0
28c0: 30 32 30 30 30 30 30 20 20 2f 2a 20 78 3e 45 58  0200000  /* x>EX
28d0: 50 52 20 6f 72 20 78 3e 3d 45 58 50 52 20 63 6f  PR or x>=EXPR co
28e0: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66  nstraint */.#def
28f0: 69 6e 65 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  ine WHERE_IDX_ON
2900: 4c 59 20 20 20 20 20 30 78 30 30 38 30 30 30 30  LY     0x0080000
2910: 30 20 20 2f 2a 20 55 73 65 20 69 6e 64 65 78 20  0  /* Use index 
2920: 6f 6e 6c 79 20 2d 20 6f 6d 69 74 20 74 61 62 6c  only - omit tabl
2930: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  e */.#define WHE
2940: 52 45 5f 4f 52 44 45 52 42 59 20 20 20 20 20 20  RE_ORDERBY      
2950: 30 78 30 31 30 30 30 30 30 30 20 20 2f 2a 20 4f  0x01000000  /* O
2960: 75 74 70 75 74 20 77 69 6c 6c 20 61 70 70 65 61  utput will appea
2970: 72 20 69 6e 20 63 6f 72 72 65 63 74 20 6f 72 64  r in correct ord
2980: 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  er */.#define WH
2990: 45 52 45 5f 52 45 56 45 52 53 45 20 20 20 20 20  ERE_REVERSE     
29a0: 20 30 78 30 32 30 30 30 30 30 30 20 20 2f 2a 20   0x02000000  /* 
29b0: 53 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20  Scan in reverse 
29c0: 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65  order */.#define
29d0: 20 57 48 45 52 45 5f 55 4e 49 51 55 45 20 20 20   WHERE_UNIQUE   
29e0: 20 20 20 20 30 78 30 34 30 30 30 30 30 30 20 20      0x04000000  
29f0: 2f 2a 20 53 65 6c 65 63 74 73 20 6e 6f 20 6d 6f  /* Selects no mo
2a00: 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77 20  re than one row 
2a10: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
2a20: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 30 78  _VIRTUALTABLE 0x
2a30: 30 38 30 30 30 30 30 30 20 20 2f 2a 20 55 73 65  08000000  /* Use
2a40: 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 20 70   virtual-table p
2a50: 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 23 64 65  rocessing */.#de
2a60: 66 69 6e 65 20 57 48 45 52 45 5f 4d 55 4c 54 49  fine WHERE_MULTI
2a70: 5f 4f 52 20 20 20 20 20 30 78 31 30 30 30 30 30  _OR     0x100000
2a80: 30 30 20 20 2f 2a 20 4f 52 20 75 73 69 6e 67 20  00  /* OR using 
2a90: 6d 75 6c 74 69 70 6c 65 20 69 6e 64 69 63 65 73  multiple indices
2aa0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69   */../*.** Initi
2ab0: 61 6c 69 7a 65 20 61 20 70 72 65 61 6c 6c 6f 63  alize a prealloc
2ac0: 61 74 65 64 20 57 68 65 72 65 43 6c 61 75 73 65  ated WhereClause
2ad0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
2ae0: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
2af0: 43 6c 61 75 73 65 49 6e 69 74 28 0a 20 20 57 68  ClauseInit(.  Wh
2b00: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
2b10: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68         /* The Wh
2b20: 65 72 65 43 6c 61 75 73 65 20 74 6f 20 62 65 20  ereClause to be 
2b30: 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20  initialized */. 
2b40: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2b50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2b60: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
2b70: 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53   */.  WhereMaskS
2b80: 65 74 20 2a 70 4d 61 73 6b 53 65 74 20 20 20 2f  et *pMaskSet   /
2b90: 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74  * Mapping from t
2ba0: 61 62 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  able cursor numb
2bb0: 65 72 73 20 74 6f 20 62 69 74 6d 61 73 6b 73 20  ers to bitmasks 
2bc0: 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d 3e 70 50 61  */.){.  pWC->pPa
2bd0: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
2be0: 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 20 3d 20  pWC->pMaskSet = 
2bf0: 70 4d 61 73 6b 53 65 74 3b 0a 20 20 70 57 43 2d  pMaskSet;.  pWC-
2c00: 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 57  >nTerm = 0;.  pW
2c10: 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41 72 72 61 79  C->nSlot = Array
2c20: 53 69 7a 65 28 70 57 43 2d 3e 61 53 74 61 74 69  Size(pWC->aStati
2c30: 63 29 3b 0a 20 20 70 57 43 2d 3e 61 20 3d 20 70  c);.  pWC->a = p
2c40: 57 43 2d 3e 61 53 74 61 74 69 63 3b 0a 20 20 70  WC->aStatic;.  p
2c50: 57 43 2d 3e 76 6d 61 73 6b 20 3d 20 30 3b 0a 7d  WC->vmask = 0;.}
2c60: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
2c70: 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
2c80: 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73   void whereClaus
2c90: 65 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61 75  eClear(WhereClau
2ca0: 73 65 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 61  se*);../*.** Dea
2cb0: 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d 6f  llocate all memo
2cc0: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
2cd0: 74 68 20 61 20 57 68 65 72 65 4f 72 49 6e 66 6f  th a WhereOrInfo
2ce0: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
2cf0: 69 63 20 76 6f 69 64 20 77 68 65 72 65 4f 72 49  ic void whereOrI
2d00: 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c 69 74 65  nfoDelete(sqlite
2d10: 33 20 2a 64 62 2c 20 57 68 65 72 65 4f 72 49 6e  3 *db, WhereOrIn
2d20: 66 6f 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 43  fo *p){.  whereC
2d30: 6c 61 75 73 65 43 6c 65 61 72 28 26 70 2d 3e 77  lauseClear(&p->w
2d40: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  c);.  sqlite3DbF
2d50: 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  ree(db, p);.}../
2d60: 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
2d70: 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  all memory assoc
2d80: 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68 65  iated with a Whe
2d90: 72 65 41 6e 64 49 6e 66 6f 20 6f 62 6a 65 63 74  reAndInfo object
2da0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2db0: 20 77 68 65 72 65 41 6e 64 49 6e 66 6f 44 65 6c   whereAndInfoDel
2dc0: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
2dd0: 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70   WhereAndInfo *p
2de0: 29 7b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65  ){.  whereClause
2df0: 43 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20  Clear(&p->wc);. 
2e00: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
2e10: 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
2e20: 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 57 68 65  Deallocate a Whe
2e30: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
2e40: 72 65 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c  re.  The WhereCl
2e50: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a  ause structure.*
2e60: 2a 20 69 74 73 65 6c 66 20 69 73 20 6e 6f 74 20  * itself is not 
2e70: 66 72 65 65 64 2e 20 20 54 68 69 73 20 72 6f 75  freed.  This rou
2e80: 74 69 6e 65 20 69 73 20 74 68 65 20 69 6e 76 65  tine is the inve
2e90: 72 73 65 20 6f 66 20 77 68 65 72 65 43 6c 61 75  rse of whereClau
2ea0: 73 65 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61  seInit()..*/.sta
2eb0: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c  tic void whereCl
2ec0: 61 75 73 65 43 6c 65 61 72 28 57 68 65 72 65 43  auseClear(WhereC
2ed0: 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 69  lause *pWC){.  i
2ee0: 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72  nt i;.  WhereTer
2ef0: 6d 20 2a 61 3b 0a 20 20 73 71 6c 69 74 65 33 20  m *a;.  sqlite3 
2f00: 2a 64 62 20 3d 20 70 57 43 2d 3e 70 50 61 72 73  *db = pWC->pPars
2f10: 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d 70  e->db;.  for(i=p
2f20: 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d 70  WC->nTerm-1, a=p
2f30: 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d  WC->a; i>=0; i--
2f40: 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , a++){.    if( 
2f50: 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  a->wtFlags & TER
2f60: 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20  M_DYNAMIC ){.   
2f70: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
2f80: 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70 45 78 70  lete(db, a->pExp
2f90: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  r);.    }.    if
2fa0: 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  ( a->wtFlags & T
2fb0: 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20 20  ERM_ORINFO ){.  
2fc0: 20 20 20 20 77 68 65 72 65 4f 72 49 6e 66 6f 44      whereOrInfoD
2fd0: 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70  elete(db, a->u.p
2fe0: 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65 6c  OrInfo);.    }el
2ff0: 73 65 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67  se if( a->wtFlag
3000: 73 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f  s & TERM_ANDINFO
3010: 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 41   ){.      whereA
3020: 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c  ndInfoDelete(db,
3030: 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29 3b   a->u.pAndInfo);
3040: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
3050: 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61 53   pWC->a!=pWC->aS
3060: 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71 6c  tatic ){.    sql
3070: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
3080: 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  WC->a);.  }.}../
3090: 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c  *.** Add a singl
30a0: 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20  e new WhereTerm 
30b0: 65 6e 74 72 79 20 74 6f 20 74 68 65 20 57 68 65  entry to the Whe
30c0: 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20  reClause object 
30d0: 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77 20  pWC..** The new 
30e0: 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74  WhereTerm object
30f0: 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64 20   is constructed 
3100: 66 72 6f 6d 20 45 78 70 72 20 70 20 61 6e 64 20  from Expr p and 
3110: 77 69 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a 2a  with wtFlags..**
3120: 20 54 68 65 20 69 6e 64 65 78 20 69 6e 20 70 57   The index in pW
3130: 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e 65  C->a[] of the ne
3140: 77 20 57 68 65 72 65 54 65 72 6d 20 69 73 20 72  w WhereTerm is r
3150: 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
3160: 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74 75  ss..** 0 is retu
3170: 72 6e 65 64 20 69 66 20 74 68 65 20 6e 65 77 20  rned if the new 
3180: 57 68 65 72 65 54 65 72 6d 20 63 6f 75 6c 64 20  WhereTerm could 
3190: 6e 6f 74 20 62 65 20 61 64 64 65 64 20 64 75 65  not be added due
31a0: 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a 20   to a memory.** 
31b0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
31c0: 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61 6c  .  The memory al
31d0: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65  location failure
31e0: 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64 65   will be recorde
31f0: 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d 3e  d in.** the db->
3200: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
3210: 67 20 73 6f 20 74 68 61 74 20 68 69 67 68 65 72  g so that higher
3220: 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e 73  -level functions
3230: 20 63 61 6e 20 64 65 74 65 63 74 20 69 74 2e 0a   can detect it..
3240: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
3250: 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65  ne will increase
3260: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
3270: 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79 20   pWC->a[] array 
3280: 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  as necessary..**
3290: 0a 2a 2a 20 49 66 20 74 68 65 20 77 74 46 6c 61  .** If the wtFla
32a0: 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e 63 6c  gs argument incl
32b0: 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d 49  udes TERM_DYNAMI
32c0: 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e 73 69  C, then responsi
32d0: 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66 72  bility.** for fr
32e0: 65 65 69 6e 67 20 74 68 65 20 65 78 70 72 65 73  eeing the expres
32f0: 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75 6d 65  sion p is assume
3300: 64 20 62 79 20 74 68 65 20 57 68 65 72 65 43 6c  d by the WhereCl
3310: 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43 2e  ause object pWC.
3320: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 72 75 65  .** This is true
3330: 20 65 76 65 6e 20 69 66 20 74 68 69 73 20 72 6f   even if this ro
3340: 75 74 69 6e 65 20 66 61 69 6c 73 20 74 6f 20 61  utine fails to a
3350: 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68  llocate a new Wh
3360: 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 57  ereTerm..**.** W
3370: 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72 6f  ARNING:  This ro
3380: 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61 6c  utine might real
3390: 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61 63 65  locate the space
33a0: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a   used to store.*
33b0: 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20 41  * WhereTerms.  A
33c0: 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 57  ll pointers to W
33d0: 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c 64  hereTerms should
33e0: 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20   be invalidated 
33f0: 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e 67  after.** calling
3400: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
3410: 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20 6d 61  Such pointers ma
3420: 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c 69 7a  y be reinitializ
3430: 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 69 6e  ed by referencin
3440: 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61 5b  g.** the pWC->a[
3450: 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  ] array..*/.stat
3460: 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c 61 75  ic int whereClau
3470: 73 65 49 6e 73 65 72 74 28 57 68 65 72 65 43 6c  seInsert(WhereCl
3480: 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20  ause *pWC, Expr 
3490: 2a 70 2c 20 75 38 20 77 74 46 6c 61 67 73 29 7b  *p, u8 wtFlags){
34a0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
34b0: 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  erm;.  int idx;.
34c0: 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d    if( pWC->nTerm
34d0: 3e 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20 29 7b 0a  >=pWC->nSlot ){.
34e0: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
34f0: 4f 6c 64 20 3d 20 70 57 43 2d 3e 61 3b 0a 20 20  Old = pWC->a;.  
3500: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
3510: 70 57 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  pWC->pParse->db;
3520: 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71  .    pWC->a = sq
3530: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
3540: 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d  (db, sizeof(pWC-
3550: 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f  >a[0])*pWC->nSlo
3560: 74 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70  t*2 );.    if( p
3570: 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20  WC->a==0 ){.    
3580: 20 20 69 66 28 20 77 74 46 6c 61 67 73 20 26 20    if( wtFlags & 
3590: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a  TERM_DYNAMIC ){.
35a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
35b0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29  xprDelete(db, p)
35c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
35d0: 70 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20  pWC->a = pOld;. 
35e0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
35f0: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
3600: 70 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69  pWC->a, pOld, si
3610: 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a  zeof(pWC->a[0])*
3620: 70 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20  pWC->nTerm);.   
3630: 20 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e   if( pOld!=pWC->
3640: 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20  aStatic ){.     
3650: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
3660: 62 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a  b, pOld);.    }.
3670: 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d      pWC->nSlot =
3680: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
3690: 53 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29  Size(db, pWC->a)
36a0: 2f 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30  /sizeof(pWC->a[0
36b0: 5d 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20  ]);.  }.  pTerm 
36c0: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20  = &pWC->a[idx = 
36d0: 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20  pWC->nTerm++];. 
36e0: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 3d 20   pTerm->pExpr = 
36f0: 70 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c  p;.  pTerm->wtFl
3700: 61 67 73 20 3d 20 77 74 46 6c 61 67 73 3b 0a 20  ags = wtFlags;. 
3710: 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20 70 57   pTerm->pWC = pW
3720: 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72  C;.  pTerm->iPar
3730: 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  ent = -1;.  retu
3740: 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn idx;.}../*.**
3750: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 64   This routine id
3760: 65 6e 74 69 66 69 65 73 20 73 75 62 65 78 70 72  entifies subexpr
3770: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57  essions in the W
3780: 48 45 52 45 20 63 6c 61 75 73 65 20 77 68 65 72  HERE clause wher
3790: 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65 78 70  e.** each subexp
37a0: 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72  ression is separ
37b0: 61 74 65 64 20 62 79 20 74 68 65 20 41 4e 44 20  ated by the AND 
37c0: 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f 6d 65  operator or some
37d0: 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72 61 74   other.** operat
37e0: 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  or specified in 
37f0: 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72  the op parameter
3800: 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c 61 75  .  The WhereClau
3810: 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  se structure.** 
3820: 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 70  is filled with p
3830: 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62 65 78  ointers to subex
3840: 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f 72 20  pressions.  For 
3850: 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  example:.**.**  
3860: 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68 65 6c    WHERE  a=='hel
3870: 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73 63 65  lo' AND coalesce
3880: 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20 28 63  (b,11)<10 AND (c
3890: 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32 32 29  +12!=d OR c==22)
38a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 5c 5f  .**           \_
38b0: 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f  _______/     \__
38c0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20  _____________/  
38d0: 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
38e0: 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20  ____/.**        
38f0: 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20 20 20      slot[0]     
3900: 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d 20 20         slot[1]  
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f               slo
3920: 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  t[2].**.** The o
3930: 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c  riginal WHERE cl
3940: 61 75 73 65 20 69 6e 20 70 45 78 70 72 20 69 73  ause in pExpr is
3950: 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41 6c 6c   unaltered.  All
3960: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
3970: 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 6c   does is make sl
3980: 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70 6f 69  ot[] entries poi
3990: 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63 74 75  nt to substructu
39a0: 72 65 20 77 69 74 68 69 6e 20 70 45 78 70 72 2e  re within pExpr.
39b0: 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 70 72  .**.** In the pr
39c0: 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 20  evious sentence 
39d0: 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61 67 72  and in the diagr
39e0: 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72 65 66  am, "slot[]" ref
39f0: 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 57 68  ers to.** the Wh
3a00: 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20 61 72  ereClause.a[] ar
3a10: 72 61 79 2e 20 20 54 68 65 20 73 6c 6f 74 5b 5d  ray.  The slot[]
3a20: 20 61 72 72 61 79 20 67 72 6f 77 73 20 61 73 20   array grows as 
3a30: 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e 74 61 69  needed to contai
3a40: 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73 20 6f  n.** all terms o
3a50: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
3a60: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  se..*/.static vo
3a70: 69 64 20 77 68 65 72 65 53 70 6c 69 74 28 57 68  id whereSplit(Wh
3a80: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
3a90: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
3aa0: 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f 70 20   op){.  pWC->op 
3ab0: 3d 20 28 75 38 29 6f 70 3b 0a 20 20 69 66 28 20  = (u8)op;.  if( 
3ac0: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
3ad0: 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  n;.  if( pExpr->
3ae0: 6f 70 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68  op!=op ){.    wh
3af0: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
3b00: 70 57 43 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  pWC, pExpr, 0);.
3b10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 65    }else{.    whe
3b20: 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78  reSplit(pWC, pEx
3b30: 70 72 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a  pr->pLeft, op);.
3b40: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70      whereSplit(p
3b50: 57 43 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  WC, pExpr->pRigh
3b60: 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  t, op);.  }.}../
3b70: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
3b80: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61  an expression ma
3b90: 73 6b 20 73 65 74 20 28 61 20 57 68 65 72 65 4d  sk set (a WhereM
3ba0: 61 73 6b 53 65 74 20 6f 62 6a 65 63 74 29 0a 2a  askSet object).*
3bb0: 2f 0a 23 64 65 66 69 6e 65 20 69 6e 69 74 4d 61  /.#define initMa
3bc0: 73 6b 53 65 74 28 50 29 20 20 6d 65 6d 73 65 74  skSet(P)  memset
3bd0: 28 50 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 50  (P, 0, sizeof(*P
3be0: 29 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ))../*.** Return
3bf0: 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
3c00: 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
3c10: 72 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72  r number.  Retur
3c20: 6e 20 30 20 69 66 0a 2a 2a 20 69 43 75 72 73 6f  n 0 if.** iCurso
3c30: 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  r is not in the 
3c40: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  set..*/.static B
3c50: 69 74 6d 61 73 6b 20 67 65 74 4d 61 73 6b 28 57  itmask getMask(W
3c60: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
3c70: 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73  skSet, int iCurs
3c80: 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  or){.  int i;.  
3c90: 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74  assert( pMaskSet
3ca0: 2d 3e 6e 3c 3d 73 69 7a 65 6f 66 28 42 69 74 6d  ->n<=sizeof(Bitm
3cb0: 61 73 6b 29 2a 38 20 29 3b 0a 20 20 66 6f 72 28  ask)*8 );.  for(
3cc0: 69 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d  i=0; i<pMaskSet-
3cd0: 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  >n; i++){.    if
3ce0: 28 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69  ( pMaskSet->ix[i
3cf0: 5d 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  ]==iCursor ){.  
3d00: 20 20 20 20 72 65 74 75 72 6e 20 28 28 42 69 74      return ((Bit
3d10: 6d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 20 20  mask)1)<<i;.    
3d20: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
3d30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
3d40: 65 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72  e a new mask for
3d50: 20 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e   cursor iCursor.
3d60: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
3d70: 6f 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20 74  one cursor per t
3d80: 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
3d90: 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e 75   clause.  The nu
3da0: 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65  mber of.** table
3db0: 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
3dc0: 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20  ause is limited 
3dd0: 62 79 20 61 20 74 65 73 74 20 65 61 72 6c 79 20  by a test early 
3de0: 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  in the.** sqlite
3df0: 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 72 6f  3WhereBegin() ro
3e00: 75 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e  utine.  So we kn
3e10: 6f 77 20 74 68 61 74 20 74 68 65 20 70 4d 61 73  ow that the pMas
3e20: 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72  kSet->ix[].** ar
3e30: 72 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f  ray will never o
3e40: 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74  verflow..*/.stat
3e50: 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61  ic void createMa
3e60: 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  sk(WhereMaskSet 
3e70: 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69  *pMaskSet, int i
3e80: 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65 72  Cursor){.  asser
3e90: 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c  t( pMaskSet->n <
3ea0: 20 41 72 72 61 79 53 69 7a 65 28 70 4d 61 73 6b   ArraySize(pMask
3eb0: 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d  Set->ix) );.  pM
3ec0: 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b  askSet->ix[pMask
3ed0: 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72  Set->n++] = iCur
3ee0: 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  sor;.}../*.** Th
3ef0: 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73  is routine walks
3f00: 20 28 72 65 63 75 72 73 69 76 65 6c 79 29 20 61   (recursively) a
3f10: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
3f20: 65 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 0a  e and generates.
3f30: 2a 2a 20 61 20 62 69 74 6d 61 73 6b 20 69 6e 64  ** a bitmask ind
3f40: 69 63 61 74 69 6e 67 20 77 68 69 63 68 20 74 61  icating which ta
3f50: 62 6c 65 73 20 61 72 65 20 75 73 65 64 20 69 6e  bles are used in
3f60: 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e   that expression
3f70: 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  .** tree..**.** 
3f80: 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69  In order for thi
3f90: 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 77 6f 72  s routine to wor
3fa0: 6b 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  k, the calling f
3fb0: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 68 61 76  unction must hav
3fc0: 65 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20  e.** previously 
3fd0: 69 6e 76 6f 6b 65 64 20 73 71 6c 69 74 65 33 52  invoked sqlite3R
3fe0: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
3ff0: 29 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  ) on the express
4000: 69 6f 6e 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65  ion.  See.** the
4010: 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20   header comment 
4020: 6f 6e 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20  on that routine 
4030: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
4040: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 54  nformation..** T
4050: 68 65 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  he sqlite3Resolv
4060: 65 45 78 70 72 4e 61 6d 65 73 28 29 20 72 6f 75  eExprNames() rou
4070: 74 69 6e 65 73 20 6c 6f 6f 6b 73 20 66 6f 72 20  tines looks for 
4080: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64  column names and
4090: 0a 2a 2a 20 73 65 74 73 20 74 68 65 69 72 20 6f  .** sets their o
40a0: 70 63 6f 64 65 73 20 74 6f 20 54 4b 5f 43 4f 4c  pcodes to TK_COL
40b0: 55 4d 4e 20 61 6e 64 20 74 68 65 69 72 20 45 78  UMN and their Ex
40c0: 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64 73  pr.iTable fields
40d0: 20 74 6f 0a 2a 2a 20 74 68 65 20 56 44 42 45 20   to.** the VDBE 
40e0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
40f0: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69   the table.  Thi
4100: 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 68  s routine just h
4110: 61 73 20 74 6f 0a 2a 2a 20 74 72 61 6e 73 6c 61  as to.** transla
4120: 74 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  te the cursor nu
4130: 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74 6d 61  mbers into bitma
4140: 73 6b 20 76 61 6c 75 65 73 20 61 6e 64 20 4f 52  sk values and OR
4150: 20 61 6c 6c 0a 2a 2a 20 74 68 65 20 62 69 74 6d   all.** the bitm
4160: 61 73 6b 73 20 74 6f 67 65 74 68 65 72 2e 0a 2a  asks together..*
4170: 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  /.static Bitmask
4180: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
4190: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
41a0: 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73  *, ExprList*);.s
41b0: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
41c0: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
41d0: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  ge(WhereMaskSet*
41e0: 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74  , Select*);.stat
41f0: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54  ic Bitmask exprT
4200: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
4210: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
4220: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69  , Expr *p){.  Bi
4230: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
4240: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
4250: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  urn 0;.  if( p->
4260: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
4270: 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d  .    mask = getM
4280: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  ask(pMaskSet, p-
4290: 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65  >iTable);.    re
42a0: 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20  turn mask;.  }. 
42b0: 20 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c   mask = exprTabl
42c0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
42d0: 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d   p->pRight);.  m
42e0: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
42f0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
4300: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  p->pLeft);.  if(
4310: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
4320: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
4330: 29 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  ) ){.    mask |=
4340: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
4350: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
4360: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  p->x.pSelect);. 
4370: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b   }else{.    mask
4380: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
4390: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
43a0: 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20   p->x.pList);.  
43b0: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
43c0: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
43d0: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
43e0: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
43f0: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70  t *pMaskSet, Exp
4400: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
4410: 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73   int i;.  Bitmas
4420: 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66  k mask = 0;.  if
4430: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
4440: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
4450: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
4460: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
4470: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
4480: 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  Set, pList->a[i]
4490: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  .pExpr);.    }. 
44a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
44b0: 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61  ;.}.static Bitma
44c0: 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  sk exprSelectTab
44d0: 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73  leUsage(WhereMas
44e0: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
44f0: 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42  Select *pS){.  B
4500: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
4510: 0a 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a  .  while( pS ){.
4520: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
4530: 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70  ListTableUsage(p
4540: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c  MaskSet, pS->pEL
4550: 69 73 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  ist);.    mask |
4560: 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  = exprListTableU
4570: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
4580: 53 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  S->pGroupBy);.  
4590: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
45a0: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
45b0: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65  skSet, pS->pOrde
45c0: 72 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  rBy);.    mask |
45d0: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
45e0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
45f0: 57 68 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b  Where);.    mask
4600: 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61   |= exprTableUsa
4610: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
4620: 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 70  >pHaving);.    p
4630: 53 20 3d 20 70 53 2d 3e 70 50 72 69 6f 72 3b 0a  S = pS->pPrior;.
4640: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73    }.  return mas
4650: 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  k;.}../*.** Retu
4660: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
4670: 69 76 65 6e 20 6f 70 65 72 61 74 6f 72 20 69 73  iven operator is
4680: 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72   one of the oper
4690: 61 74 6f 72 73 20 74 68 61 74 20 69 73 0a 2a 2a  ators that is.**
46a0: 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 61 6e 20   allowed for an 
46b0: 69 6e 64 65 78 61 62 6c 65 20 57 48 45 52 45 20  indexable WHERE 
46c0: 63 6c 61 75 73 65 20 74 65 72 6d 2e 20 20 54 68  clause term.  Th
46d0: 65 20 61 6c 6c 6f 77 65 64 20 6f 70 65 72 61 74  e allowed operat
46e0: 6f 72 73 20 61 72 65 0a 2a 2a 20 22 3d 22 2c 20  ors are.** "=", 
46f0: 22 3c 22 2c 20 22 3e 22 2c 20 22 3c 3d 22 2c 20  "<", ">", "<=", 
4700: 22 3e 3d 22 2c 20 61 6e 64 20 22 49 4e 22 2e 0a  ">=", and "IN"..
4710: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
4720: 6c 6f 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b  lowedOp(int op){
4730: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54  .  assert( TK_GT
4740: 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c  >TK_EQ && TK_GT<
4750: 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TK_GE );.  asser
4760: 74 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26  t( TK_LT>TK_EQ &
4770: 26 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b  & TK_LT<TK_GE );
4780: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45  .  assert( TK_LE
4790: 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c  >TK_EQ && TK_LE<
47a0: 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TK_GE );.  asser
47b0: 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b  t( TK_GE==TK_EQ+
47c0: 34 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70  4 );.  return op
47d0: 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d  ==TK_IN || (op>=
47e0: 54 4b 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f  TK_EQ && op<=TK_
47f0: 47 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53  GE) || op==TK_IS
4800: 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  NULL;.}../*.** S
4810: 77 61 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20  wap two objects 
4820: 6f 66 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f  of type TYPE..*/
4830: 0a 23 64 65 66 69 6e 65 20 53 57 41 50 28 54 59  .#define SWAP(TY
4840: 50 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d  PE,A,B) {TYPE t=
4850: 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f  A; A=B; B=t;}../
4860: 2a 0a 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63  *.** Commute a c
4870: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
4880: 6f 72 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73  or.  Expressions
4890: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
48a0: 6f 70 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e  op Y".** are con
48b0: 76 65 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f  verted into "Y o
48c0: 70 20 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  p X"..**.** If a
48d0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
48e0: 6e 63 65 20 69 73 20 61 73 73 6f 63 69 61 74 65  nce is associate
48f0: 64 20 77 69 74 68 20 65 69 74 68 65 72 20 74 68  d with either th
4900: 65 20 6c 65 66 74 20 6f 72 20 72 69 67 68 74 0a  e left or right.
4910: 2a 2a 20 73 69 64 65 20 6f 66 20 74 68 65 20 63  ** side of the c
4920: 6f 6d 70 61 72 69 73 6f 6e 2c 20 69 74 20 72 65  omparison, it re
4930: 6d 61 69 6e 73 20 61 73 73 6f 63 69 61 74 65 64  mains associated
4940: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 73   with the same s
4950: 69 64 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65  ide after.** the
4960: 20 63 6f 6d 6d 75 74 61 74 69 6f 6e 2e 20 53 6f   commutation. So
4970: 20 22 59 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41   "Y collate NOCA
4980: 53 45 20 6f 70 20 58 22 20 62 65 63 6f 6d 65 73  SE op X" becomes
4990: 20 0a 2a 2a 20 22 58 20 63 6f 6c 6c 61 74 65 20   .** "X collate 
49a0: 4e 4f 43 41 53 45 20 6f 70 20 59 22 2e 20 54 68  NOCASE op Y". Th
49b0: 69 73 20 69 73 20 62 65 63 61 75 73 65 20 61 6e  is is because an
49c0: 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  y collation sequ
49d0: 65 6e 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c  ence on.** the l
49e0: 65 66 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66  eft hand side of
49f0: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 76   a comparison ov
4a00: 65 72 72 69 64 65 73 20 61 6e 79 20 63 6f 6c 6c  errides any coll
4a10: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 0a  ation sequence .
4a20: 2a 2a 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  ** attached to t
4a30: 68 65 20 72 69 67 68 74 2e 20 46 6f 72 20 74 68  he right. For th
4a40: 65 20 73 61 6d 65 20 72 65 61 73 6f 6e 20 74 68  e same reason th
4a50: 65 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20  e EP_ExpCollate 
4a60: 66 6c 61 67 0a 2a 2a 20 69 73 20 6e 6f 74 20 63  flag.** is not c
4a70: 6f 6d 6d 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  ommuted..*/.stat
4a80: 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 6d 6d  ic void exprComm
4a90: 75 74 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ute(Parse *pPars
4aa0: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
4ab0: 0a 20 20 75 31 36 20 65 78 70 52 69 67 68 74 20  .  u16 expRight 
4ac0: 3d 20 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  = (pExpr->pRight
4ad0: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
4ae0: 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 75 31 36 20  Collate);.  u16 
4af0: 65 78 70 4c 65 66 74 20 3d 20 28 70 45 78 70 72  expLeft = (pExpr
4b00: 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26  ->pLeft->flags &
4b10: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3b   EP_ExpCollate);
4b20: 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77  .  assert( allow
4b30: 65 64 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29 20  edOp(pExpr->op) 
4b40: 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  && pExpr->op!=TK
4b50: 5f 49 4e 20 29 3b 0a 20 20 70 45 78 70 72 2d 3e  _IN );.  pExpr->
4b60: 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 20 3d 20  pRight->pColl = 
4b70: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
4b80: 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
4b90: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70 45 78  ->pRight);.  pEx
4ba0: 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c  pr->pLeft->pColl
4bb0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
4bc0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
4bd0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 53  xpr->pLeft);.  S
4be0: 57 41 50 28 43 6f 6c 6c 53 65 71 2a 2c 70 45 78  WAP(CollSeq*,pEx
4bf0: 70 72 2d 3e 70 52 69 67 68 74 2d 3e 70 43 6f 6c  pr->pRight->pCol
4c00: 6c 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  l,pExpr->pLeft->
4c10: 70 43 6f 6c 6c 29 3b 0a 20 20 70 45 78 70 72 2d  pColl);.  pExpr-
4c20: 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 3d  >pRight->flags =
4c30: 20 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d   (pExpr->pRight-
4c40: 3e 66 6c 61 67 73 20 26 20 7e 45 50 5f 45 78 70  >flags & ~EP_Exp
4c50: 43 6f 6c 6c 61 74 65 29 20 7c 20 65 78 70 4c 65  Collate) | expLe
4c60: 66 74 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c 65  ft;.  pExpr->pLe
4c70: 66 74 2d 3e 66 6c 61 67 73 20 3d 20 28 70 45 78  ft->flags = (pEx
4c80: 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73  pr->pLeft->flags
4c90: 20 26 20 7e 45 50 5f 45 78 70 43 6f 6c 6c 61 74   & ~EP_ExpCollat
4ca0: 65 29 20 7c 20 65 78 70 52 69 67 68 74 3b 0a 20  e) | expRight;. 
4cb0: 20 53 57 41 50 28 45 78 70 72 2a 2c 70 45 78 70   SWAP(Expr*,pExp
4cc0: 72 2d 3e 70 52 69 67 68 74 2c 70 45 78 70 72 2d  r->pRight,pExpr-
4cd0: 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70  >pLeft);.  if( p
4ce0: 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20  Expr->op>=TK_GT 
4cf0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  ){.    assert( T
4d00: 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b  K_LT==TK_GT+2 );
4d10: 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f  .    assert( TK_
4d20: 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20  GE==TK_LE+2 );. 
4d30: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
4d40: 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61 73  >TK_EQ );.    as
4d50: 73 65 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c  sert( TK_GT<TK_L
4d60: 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
4d70: 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47   pExpr->op>=TK_G
4d80: 54 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c 3d  T && pExpr->op<=
4d90: 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 70 45 78  TK_GE );.    pEx
4da0: 70 72 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70 72  pr->op = ((pExpr
4db0: 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b 54  ->op-TK_GT)^2)+T
4dc0: 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  K_GT;.  }.}../*.
4dd0: 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f  ** Translate fro
4de0: 6d 20 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f 72  m TK_xx operator
4df0: 20 74 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61 73   to WO_xx bitmas
4e00: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  k..*/.static u16
4e10: 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 69 6e   operatorMask(in
4e20: 74 20 6f 70 29 7b 0a 20 20 75 31 36 20 63 3b 0a  t op){.  u16 c;.
4e30: 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65    assert( allowe
4e40: 64 4f 70 28 6f 70 29 20 29 3b 0a 20 20 69 66 28  dOp(op) );.  if(
4e50: 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20   op==TK_IN ){.  
4e60: 20 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d    c = WO_IN;.  }
4e70: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
4e80: 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63 20  ISNULL ){.    c 
4e90: 3d 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d  = WO_ISNULL;.  }
4ea0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
4eb0: 28 20 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b  ( (WO_EQ<<(op-TK
4ec0: 5f 45 51 29 29 20 3c 20 30 78 37 66 66 66 20 29  _EQ)) < 0x7fff )
4ed0: 3b 0a 20 20 20 20 63 20 3d 20 28 75 31 36 29 28  ;.    c = (u16)(
4ee0: 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51  WO_EQ<<(op-TK_EQ
4ef0: 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ));.  }.  assert
4f00: 28 20 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op!=TK_ISNULL 
4f10: 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20  || c==WO_ISNULL 
4f20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
4f30: 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_IN || c==WO_
4f40: 49 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IN );.  assert( 
4f50: 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d  op!=TK_EQ || c==
4f60: 57 4f 5f 45 51 20 29 3b 0a 20 20 61 73 73 65 72  WO_EQ );.  asser
4f70: 74 28 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20  t( op!=TK_LT || 
4f80: 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61 73  c==WO_LT );.  as
4f90: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45 20  sert( op!=TK_LE 
4fa0: 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20  || c==WO_LE );. 
4fb0: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
4fc0: 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20 29  GT || c==WO_GT )
4fd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
4fe0: 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47  TK_GE || c==WO_G
4ff0: 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b  E );.  return c;
5000: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  .}../*.** Search
5010: 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e 20 74   for a term in t
5020: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
5030: 74 68 61 74 20 69 73 20 6f 66 20 74 68 65 20 66  that is of the f
5040: 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70  orm "X <op> <exp
5050: 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58 20 69  r>".** where X i
5060: 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
5070: 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20   the iColumn of 
5080: 74 61 62 6c 65 20 69 43 75 72 20 61 6e 64 20 3c  table iCur and <
5090: 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a  op> is one of.**
50a0: 20 74 68 65 20 57 4f 5f 78 78 20 6f 70 65 72 61   the WO_xx opera
50b0: 74 6f 72 20 63 6f 64 65 73 20 73 70 65 63 69 66  tor codes specif
50c0: 69 65 64 20 62 79 20 74 68 65 20 6f 70 20 70 61  ied by the op pa
50d0: 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52 65 74 75  rameter..** Retu
50e0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
50f0: 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74 75 72  the term.  Retur
5100: 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  n 0 if not found
5110: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72  ..*/.static Wher
5120: 65 54 65 72 6d 20 2a 66 69 6e 64 54 65 72 6d 28  eTerm *findTerm(
5130: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
5140: 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  pWC,     /* The 
5150: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
5160: 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20  be searched */. 
5170: 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20   int iCur,      
5180: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
5190: 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a   number of LHS *
51a0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c  /.  int iColumn,
51b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
51c0: 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48  umn number of LH
51d0: 53 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  S */.  Bitmask n
51e0: 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20  otReady,     /* 
51f0: 52 48 53 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65  RHS must not ove
5200: 72 6c 61 70 20 77 69 74 68 20 74 68 69 73 20 6d  rlap with this m
5210: 61 73 6b 20 2a 2f 0a 20 20 75 33 32 20 6f 70 2c  ask */.  u32 op,
5220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5230: 2a 20 4d 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20  * Mask of WO_xx 
5240: 76 61 6c 75 65 73 20 64 65 73 63 72 69 62 69 6e  values describin
5250: 67 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  g operator */.  
5260: 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20  Index *pIdx     
5270: 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65        /* Must be
5280: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
5290: 20 74 68 69 73 20 69 6e 64 65 78 2c 20 69 66 20   this index, if 
52a0: 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20  not NULL */.){. 
52b0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
52c0: 6d 3b 0a 20 20 69 6e 74 20 6b 3b 0a 20 20 61 73  m;.  int k;.  as
52d0: 73 65 72 74 28 20 69 43 75 72 3e 3d 30 20 29 3b  sert( iCur>=0 );
52e0: 0a 20 20 6f 70 20 26 3d 20 57 4f 5f 41 4c 4c 3b  .  op &= WO_ALL;
52f0: 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
5300: 2d 3e 61 2c 20 6b 3d 70 57 43 2d 3e 6e 54 65 72  ->a, k=pWC->nTer
5310: 6d 3b 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d  m; k; k--, pTerm
5320: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  ++){.    if( pTe
5330: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
5340: 69 43 75 72 0a 20 20 20 20 20 20 20 26 26 20 28  iCur.       && (
5350: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
5360: 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d  ht & notReady)==
5370: 30 0a 20 20 20 20 20 20 20 26 26 20 70 54 65 72  0.       && pTer
5380: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d  m->u.leftColumn=
5390: 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20  =iColumn.       
53a0: 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  && (pTerm->eOper
53b0: 61 74 6f 72 20 26 20 6f 70 29 21 3d 30 0a 20 20  ator & op)!=0.  
53c0: 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70    ){.      if( p
53d0: 49 64 78 20 26 26 20 70 54 65 72 6d 2d 3e 65 4f  Idx && pTerm->eO
53e0: 70 65 72 61 74 6f 72 21 3d 57 4f 5f 49 53 4e 55  perator!=WO_ISNU
53f0: 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  LL ){.        Ex
5400: 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e  pr *pX = pTerm->
5410: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 43  pExpr;.        C
5420: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
5430: 20 20 20 20 20 20 20 63 68 61 72 20 69 64 78 61         char idxa
5440: 66 66 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ff;.        int 
5450: 6a 3b 0a 20 20 20 20 20 20 20 20 50 61 72 73 65  j;.        Parse
5460: 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e   *pParse = pWC->
5470: 70 50 61 72 73 65 3b 0a 0a 20 20 20 20 20 20 20  pParse;..       
5480: 20 69 64 78 61 66 66 20 3d 20 70 49 64 78 2d 3e   idxaff = pIdx->
5490: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f  pTable->aCol[iCo
54a0: 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  lumn].affinity;.
54b0: 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c          if( !sql
54c0: 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
54d0: 79 4f 6b 28 70 58 2c 20 69 64 78 61 66 66 29 20  yOk(pX, idxaff) 
54e0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
54f0: 20 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f       /* Figure o
5500: 75 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ut the collation
5510: 20 73 65 71 75 65 6e 63 65 20 72 65 71 75 69 72   sequence requir
5520: 65 64 20 66 72 6f 6d 20 61 6e 20 69 6e 64 65 78  ed from an index
5530: 20 66 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20   for.        ** 
5540: 69 74 20 74 6f 20 62 65 20 75 73 65 66 75 6c 20  it to be useful 
5550: 66 6f 72 20 6f 70 74 69 6d 69 73 69 6e 67 20 65  for optimising e
5560: 78 70 72 65 73 73 69 6f 6e 20 70 58 2e 20 53 74  xpression pX. St
5570: 6f 72 65 20 74 68 69 73 0a 20 20 20 20 20 20 20  ore this.       
5580: 20 2a 2a 20 76 61 6c 75 65 20 69 6e 20 76 61 72   ** value in var
5590: 69 61 62 6c 65 20 70 43 6f 6c 6c 2e 0a 20 20 20  iable pColl..   
55a0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
55b0: 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65 66 74  assert(pX->pLeft
55c0: 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  );.        pColl
55d0: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
55e0: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
55f0: 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74  Parse, pX->pLeft
5600: 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
5610: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70 43         assert(pC
5620: 6f 6c 6c 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  oll || pParse->n
5630: 45 72 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 66  Err);..        f
5640: 6f 72 28 6a 3d 30 3b 20 70 49 64 78 2d 3e 61 69  or(j=0; pIdx->ai
5650: 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75  Column[j]!=iColu
5660: 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; j++){.      
5670: 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 6a 3e      if( NEVER(j>
5680: 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20  =pIdx->nColumn) 
5690: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
56a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
56b0: 28 20 70 43 6f 6c 6c 20 26 26 20 73 71 6c 69 74  ( pColl && sqlit
56c0: 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d  e3StrICmp(pColl-
56d0: 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a  >zName, pIdx->az
56e0: 43 6f 6c 6c 5b 6a 5d 29 20 29 20 63 6f 6e 74 69  Coll[j]) ) conti
56f0: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
5700: 20 20 20 72 65 74 75 72 6e 20 70 54 65 72 6d 3b     return pTerm;
5710: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
5720: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  urn 0;.}../* For
5730: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
5740: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
5750: 70 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c 69 73  prAnalyze(SrcLis
5760: 74 2a 2c 20 57 68 65 72 65 43 6c 61 75 73 65 2a  t*, WhereClause*
5770: 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43  , int);../*.** C
5780: 61 6c 6c 20 65 78 70 72 41 6e 61 6c 79 7a 65 20  all exprAnalyze 
5790: 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 69 6e 20  on all terms in 
57a0: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  a WHERE clause. 
57b0: 20 0a 2a 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69   .**.**.*/.stati
57c0: 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79  c void exprAnaly
57d0: 7a 65 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73 74  zeAll(.  SrcList
57e0: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20   *pTabList,     
57f0: 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    /* the FROM cl
5800: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
5810: 6c 61 75 73 65 20 2a 70 57 43 20 20 20 20 20 20  lause *pWC      
5820: 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20     /* the WHERE 
5830: 63 6c 61 75 73 65 20 74 6f 20 62 65 20 61 6e 61  clause to be ana
5840: 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  lyzed */.){.  in
5850: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43  t i;.  for(i=pWC
5860: 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b  ->nTerm-1; i>=0;
5870: 20 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72 41   i--){.    exprA
5880: 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c  nalyze(pTabList,
5890: 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a   pWC, i);.  }.}.
58a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
58b0: 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49  OMIT_LIKE_OPTIMI
58c0: 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65  ZATION./*.** Che
58d0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
58e0: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
58f0: 6e 20 69 73 20 61 20 4c 49 4b 45 20 6f 72 20 47  n is a LIKE or G
5900: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 74 68 61  LOB operator tha
5910: 74 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74 69  t.** can be opti
5920: 6d 69 7a 65 64 20 75 73 69 6e 67 20 69 6e 65 71  mized using ineq
5930: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
5940: 74 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  ts.  Return TRUE
5950: 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20   if it is.** so 
5960: 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74  and false if not
5970: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72  ..**.** In order
5980: 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f   for the operato
5990: 72 20 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69  r to be optimizi
59a0: 62 6c 65 2c 20 74 68 65 20 52 48 53 20 6d 75 73  ble, the RHS mus
59b0: 74 20 62 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a  t be a string.**
59c0: 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 64 6f   literal that do
59d0: 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74  es not begin wit
59e0: 68 20 61 20 77 69 6c 64 63 61 72 64 2e 20 20 0a  h a wildcard.  .
59f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
5a00: 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50 61  LikeOrGlob(.  Pa
5a10: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
5a20: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
5a30: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
5a40: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
5a50: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a   *pExpr,      /*
5a60: 20 54 65 73 74 20 74 68 69 73 20 65 78 70 72 65   Test this expre
5a70: 73 73 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20  ssion */.  Expr 
5a80: 2a 2a 70 70 50 72 65 66 69 78 2c 20 20 2f 2a 20  **ppPrefix,  /* 
5a90: 50 6f 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53 54  Pointer to TK_ST
5aa0: 52 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20  RING expression 
5ab0: 77 69 74 68 20 70 61 74 74 65 72 6e 20 70 72 65  with pattern pre
5ac0: 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  fix */.  int *pi
5ad0: 73 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54 72  sComplete, /* Tr
5ae0: 75 65 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77  ue if the only w
5af0: 69 6c 64 63 61 72 64 20 69 73 20 25 20 69 6e 20  ildcard is % in 
5b00: 74 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74  the last charact
5b10: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f  er */.  int *pno
5b20: 43 61 73 65 20 20 20 20 20 20 2f 2a 20 54 72 75  Case      /* Tru
5b30: 65 20 69 66 20 75 70 70 65 72 63 61 73 65 20 69  e if uppercase i
5b40: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
5b50: 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b 0a  lowercase */.){.
5b60: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
5b70: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
5b80: 53 74 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f 66  String on RHS of
5b90: 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a   LIKE operator *
5ba0: 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  /.  Expr *pRight
5bb0: 2c 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 2f  , *pLeft;      /
5bc0: 2a 20 52 69 67 68 74 20 61 6e 64 20 6c 65 66 74  * Right and left
5bd0: 20 73 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f 70   size of LIKE op
5be0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72  erator */.  Expr
5bf0: 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20  List *pList;    
5c00: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
5c10: 66 20 6f 70 65 72 61 6e 64 73 20 74 6f 20 74 68  f operands to th
5c20: 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20  e LIKE operator 
5c30: 2a 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20 20 20  */.  int c;     
5c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c50: 2f 2a 20 4f 6e 65 20 63 68 61 72 61 63 74 65 72  /* One character
5c60: 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74   in z[] */.  int
5c70: 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20   cnt;           
5c80: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5c90: 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72  r of non-wildcar
5ca0: 64 20 70 72 65 66 69 78 20 63 68 61 72 61 63 74  d prefix charact
5cb0: 65 72 73 20 2a 2f 0a 20 20 63 68 61 72 20 77 63  ers */.  char wc
5cc0: 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [3];            
5cd0: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20      /* Wildcard 
5ce0: 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20  characters */.  
5cf0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
5d00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
5d10: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
5d20: 20 66 6f 72 20 4c 48 53 20 2a 2f 0a 20 20 73 71   for LHS */.  sq
5d30: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
5d40: 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61  se->db;  /* Data
5d50: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
5d60: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
5d70: 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20  ue *pVal = 0;.  
5d80: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
5d90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
5da0: 63 6f 64 65 20 6f 66 20 70 52 69 67 68 74 20 2a  code of pRight *
5db0: 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  /..  if( !sqlite
5dc0: 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28  3IsLikeFunction(
5dd0: 64 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43 61  db, pExpr, pnoCa
5de0: 73 65 2c 20 77 63 29 20 29 7b 0a 20 20 20 20 72  se, wc) ){.    r
5df0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66  eturn 0;.  }.#if
5e00: 64 65 66 20 53 51 4c 49 54 45 5f 45 42 43 44 49  def SQLITE_EBCDI
5e10: 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61 73 65  C.  if( *pnoCase
5e20: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e   ) return 0;.#en
5e30: 64 69 66 0a 20 20 70 4c 69 73 74 20 3d 20 70 45  dif.  pList = pE
5e40: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
5e50: 70 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61  pLeft = pList->a
5e60: 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28  [1].pExpr;.  if(
5e70: 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43   pLeft->op!=TK_C
5e80: 4f 4c 55 4d 4e 20 7c 7c 20 73 71 6c 69 74 65 33  OLUMN || sqlite3
5e90: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65  ExprAffinity(pLe
5ea0: 66 74 29 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ft)!=SQLITE_AFF_
5eb0: 54 45 58 54 20 29 7b 0a 20 20 20 20 2f 2a 20 49  TEXT ){.    /* I
5ec0: 4d 50 3a 20 52 2d 30 32 30 36 35 2d 34 39 34 36  MP: R-02065-4946
5ed0: 35 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20  5 The left-hand 
5ee0: 73 69 64 65 20 6f 66 20 74 68 65 20 4c 49 4b 45  side of the LIKE
5ef0: 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f   or GLOB operato
5f00: 72 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65  r must.    ** be
5f10: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20   the name of an 
5f20: 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20 77  indexed column w
5f30: 69 74 68 20 54 45 58 54 20 61 66 66 69 6e 69 74  ith TEXT affinit
5f40: 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  y. */.    return
5f50: 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
5f60: 28 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  ( pLeft->iColumn
5f70: 21 3d 28 2d 31 29 20 29 3b 20 2f 2a 20 42 65 63  !=(-1) ); /* Bec
5f80: 61 75 73 65 20 49 50 4b 20 6e 65 76 65 72 20 68  ause IPK never h
5f90: 61 73 20 41 46 46 5f 54 45 58 54 20 2a 2f 0a 20  as AFF_TEXT */. 
5fa0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
5fb0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
5fc0: 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 69 66  se, pLeft);.  if
5fd0: 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 72 65 74  ( pColl==0 ) ret
5fe0: 75 72 6e 20 30 3b 20 20 2f 2a 20 48 61 70 70 65  urn 0;  /* Happe
5ff0: 6e 73 20 77 68 65 6e 20 4c 48 53 20 68 61 73 20  ns when LHS has 
6000: 61 6e 20 75 6e 64 65 66 69 6e 65 64 20 63 6f 6c  an undefined col
6010: 6c 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20  lation */.  if( 
6020: 28 70 43 6f 6c 6c 2d 3e 74 79 70 65 21 3d 53 51  (pColl->type!=SQ
6030: 4c 49 54 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52 59  LITE_COLL_BINARY
6040: 20 7c 7c 20 2a 70 6e 6f 43 61 73 65 29 20 26 26   || *pnoCase) &&
6050: 0a 20 20 20 20 20 20 28 70 43 6f 6c 6c 2d 3e 74  .      (pColl->t
6060: 79 70 65 21 3d 53 51 4c 49 54 45 5f 43 4f 4c 4c  ype!=SQLITE_COLL
6070: 5f 4e 4f 43 41 53 45 20 7c 7c 20 21 2a 70 6e 6f  _NOCASE || !*pno
6080: 43 61 73 65 29 20 29 7b 0a 20 20 20 20 2f 2a 20  Case) ){.    /* 
6090: 49 4d 50 3a 20 52 2d 30 39 30 30 33 2d 33 32 30  IMP: R-09003-320
60a0: 34 36 20 46 6f 72 20 74 68 65 20 47 4c 4f 42 20  46 For the GLOB 
60b0: 6f 70 65 72 61 74 6f 72 2c 20 74 68 65 20 63 6f  operator, the co
60c0: 6c 75 6d 6e 20 6d 75 73 74 20 75 73 65 20 74 68  lumn must use th
60d0: 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74  e.    ** default
60e0: 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6e   BINARY collatin
60f0: 67 20 73 65 71 75 65 6e 63 65 2e 0a 20 20 20 20  g sequence..    
6100: 2a 2a 20 49 4d 50 3a 20 52 2d 34 31 34 30 38 2d  ** IMP: R-41408-
6110: 32 38 33 30 36 20 46 6f 72 20 74 68 65 20 4c 49  28306 For the LI
6120: 4b 45 20 6f 70 65 72 61 74 6f 72 2c 20 69 66 20  KE operator, if 
6130: 63 61 73 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c  case_sensitive_l
6140: 69 6b 65 20 6d 6f 64 65 0a 20 20 20 20 2a 2a 20  ike mode.    ** 
6150: 69 73 20 65 6e 61 62 6c 65 64 20 74 68 65 6e 20  is enabled then 
6160: 74 68 65 20 63 6f 6c 75 6d 6e 20 6d 75 73 74 20  the column must 
6170: 75 73 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  use the default 
6180: 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6e 67  BINARY collating
6190: 0a 20 20 20 20 2a 2a 20 73 65 71 75 65 6e 63 65  .    ** sequence
61a0: 2c 20 6f 72 20 69 66 20 63 61 73 65 5f 73 65 6e  , or if case_sen
61b0: 73 69 74 69 76 65 5f 6c 69 6b 65 20 6d 6f 64 65  sitive_like mode
61c0: 20 69 73 20 64 69 73 61 62 6c 65 64 20 74 68 65   is disabled the
61d0: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20  n the column.   
61e0: 20 2a 2a 20 6d 75 73 74 20 75 73 65 20 74 68 65   ** must use the
61f0: 20 62 75 69 6c 74 2d 69 6e 20 4e 4f 43 41 53 45   built-in NOCASE
6200: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
6210: 6e 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nce..    */.    
6220: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
6230: 20 70 52 69 67 68 74 20 3d 20 70 4c 69 73 74 2d   pRight = pList-
6240: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 6f  >a[0].pExpr;.  o
6250: 70 20 3d 20 70 52 69 67 68 74 2d 3e 6f 70 3b 0a  p = pRight->op;.
6260: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
6270: 49 53 54 45 52 20 29 7b 0a 20 20 20 20 6f 70 20  ISTER ){.    op 
6280: 3d 20 70 52 69 67 68 74 2d 3e 6f 70 32 3b 0a 20  = pRight->op2;. 
6290: 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f   }.  if( op==TK_
62a0: 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20 20  VARIABLE ){.    
62b0: 56 64 62 65 20 2a 70 52 65 70 72 65 70 61 72 65  Vdbe *pReprepare
62c0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 52 65 70 72   = pParse->pRepr
62d0: 65 70 61 72 65 3b 0a 20 20 20 20 70 56 61 6c 20  epare;.    pVal 
62e0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
62f0: 56 61 6c 75 65 28 70 52 65 70 72 65 70 61 72 65  Value(pReprepare
6300: 2c 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d  , pRight->iColum
6310: 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  n, SQLITE_AFF_NO
6320: 4e 45 29 3b 0a 20 20 20 20 69 66 28 20 70 56 61  NE);.    if( pVa
6330: 6c 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c  l && sqlite3_val
6340: 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3d 3d 53  ue_type(pVal)==S
6350: 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20  QLITE_TEXT ){.  
6360: 20 20 20 20 7a 20 3d 20 28 63 68 61 72 20 2a 29      z = (char *)
6370: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
6380: 78 74 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a  xt(pVal);.    }.
6390: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
63a0: 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65  etVarmask(pParse
63b0: 2d 3e 70 56 64 62 65 2c 20 70 52 69 67 68 74 2d  ->pVdbe, pRight-
63c0: 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 61  >iColumn);.    a
63d0: 73 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e 6f  ssert( pRight->o
63e0: 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 7c  p==TK_VARIABLE |
63f0: 7c 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  | pRight->op==TK
6400: 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 7d  _REGISTER );.  }
6410: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
6420: 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 7a 20  STRING ){.    z 
6430: 3d 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b  = pRight->u.zTok
6440: 65 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20  en;.  }.  if( z 
6450: 29 7b 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a  ){.    cnt = 0;.
6460: 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 7a 5b      while( (c=z[
6470: 63 6e 74 5d 29 21 3d 30 20 26 26 20 63 21 3d 77  cnt])!=0 && c!=w
6480: 63 5b 30 5d 20 26 26 20 63 21 3d 77 63 5b 31 5d  c[0] && c!=wc[1]
6490: 20 26 26 20 63 21 3d 77 63 5b 32 5d 20 29 7b 0a   && c!=wc[2] ){.
64a0: 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
64b0: 20 7d 0a 20 20 20 20 69 66 28 20 63 6e 74 21 3d   }.    if( cnt!=
64c0: 30 20 26 26 20 63 21 3d 30 20 26 26 20 32 35 35  0 && c!=0 && 255
64d0: 21 3d 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29  !=(u8)z[cnt-1] )
64e0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 50  {.      Expr *pP
64f0: 72 65 66 69 78 3b 0a 20 20 20 20 20 20 2a 70 69  refix;.      *pi
6500: 73 43 6f 6d 70 6c 65 74 65 20 3d 20 7a 5b 63 6e  sComplete = z[cn
6510: 74 5d 3d 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63  t]==wc[0] && z[c
6520: 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20 20 20 20 20  nt+1]==0;.      
6530: 70 50 72 65 66 69 78 20 3d 20 73 71 6c 69 74 65  pPrefix = sqlite
6540: 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 53 54 52  3Expr(db, TK_STR
6550: 49 4e 47 2c 20 7a 29 3b 0a 20 20 20 20 20 20 69  ING, z);.      i
6560: 66 28 20 70 50 72 65 66 69 78 20 29 20 70 50 72  f( pPrefix ) pPr
6570: 65 66 69 78 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 63  efix->u.zToken[c
6580: 6e 74 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 2a  nt] = 0;.      *
6590: 70 70 50 72 65 66 69 78 20 3d 20 70 50 72 65 66  ppPrefix = pPref
65a0: 69 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70  ix;.      if( op
65b0: 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b  ==TK_VARIABLE ){
65c0: 0a 20 20 20 20 20 20 20 20 56 64 62 65 20 2a 76  .        Vdbe *v
65d0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
65e0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
65f0: 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28  3VdbeSetVarmask(
6600: 76 2c 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75  v, pRight->iColu
6610: 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  mn);.        if(
6620: 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 26 26   *pisComplete &&
6630: 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65   pRight->u.zToke
6640: 6e 5b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  n[1] ){.        
6650: 20 20 2f 2a 20 49 66 20 74 68 65 20 72 68 73 20    /* If the rhs 
6660: 6f 66 20 74 68 65 20 4c 49 4b 45 20 65 78 70 72  of the LIKE expr
6670: 65 73 73 69 6f 6e 20 69 73 20 61 20 76 61 72 69  ession is a vari
6680: 61 62 6c 65 2c 20 61 6e 64 20 74 68 65 20 63 75  able, and the cu
6690: 72 72 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20  rrent.          
66a0: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ** value of the 
66b0: 76 61 72 69 61 62 6c 65 20 6d 65 61 6e 73 20 74  variable means t
66c0: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
66d0: 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 4c 49  to invoke the LI
66e0: 4b 45 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  KE.          ** 
66f0: 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 6e  function, then n
6700: 6f 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 77 69  o OP_Variable wi
6710: 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  ll be added to t
6720: 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20  he program..    
6730: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61        ** This ca
6740: 75 73 65 73 20 70 72 6f 62 6c 65 6d 73 20 66 6f  uses problems fo
6750: 72 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69  r the sqlite3_bi
6760: 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
6770: 65 28 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  e().          **
6780: 20 41 50 49 2e 20 54 6f 20 77 6f 72 6b 61 72 6f   API. To workaro
6790: 75 6e 64 20 74 68 65 6d 2c 20 61 64 64 20 61 20  und them, add a 
67a0: 64 75 6d 6d 79 20 4f 50 5f 56 61 72 69 61 62 6c  dummy OP_Variabl
67b0: 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 20 20  e here..        
67c0: 20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20    */ .          
67d0: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
67e0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
67f0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
6800: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
6810: 67 65 74 28 70 50 61 72 73 65 2c 20 70 52 69 67  get(pParse, pRig
6820: 68 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  ht, r1);.       
6830: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
6840: 61 6e 67 65 50 33 28 76 2c 20 73 71 6c 69 74 65  angeP3(v, sqlite
6850: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
6860: 28 76 29 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20  (v)-1, 0);.     
6870: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
6880: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
6890: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  e, r1);.        
68a0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
68b0: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 30  lse{.      z = 0
68c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
68d0: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
68e0: 70 56 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  pVal);.  return 
68f0: 28 7a 21 3d 30 29 3b 0a 7d 0a 23 65 6e 64 69 66  (z!=0);.}.#endif
6900: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
6910: 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  LIKE_OPTIMIZATIO
6920: 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53  N */...#ifndef S
6930: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
6940: 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68  ALTABLE./*.** Ch
6950: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
6960: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
6970: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
6980: 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  m.**.**         
6990: 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70  column MATCH exp
69a0: 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73  r.**.** If it is
69b0: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 54 52 55   then return TRU
69c0: 45 2e 20 20 49 66 20 6e 6f 74 2c 20 72 65 74 75  E.  If not, retu
69d0: 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61  rn FALSE..*/.sta
69e0: 74 69 63 20 69 6e 74 20 69 73 4d 61 74 63 68 4f  tic int isMatchO
69f0: 66 43 6f 6c 75 6d 6e 28 0a 20 20 45 78 70 72 20  fColumn(.  Expr 
6a00: 2a 70 45 78 70 72 20 20 20 20 20 20 2f 2a 20 54  *pExpr      /* T
6a10: 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73 73  est this express
6a20: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ion */.){.  Expr
6a30: 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 0a 20 20  List *pList;..  
6a40: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
6a50: 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20  K_FUNCTION ){.  
6a60: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
6a70: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
6a80: 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  ICmp(pExpr->u.zT
6a90: 6f 6b 65 6e 2c 22 6d 61 74 63 68 22 29 21 3d 30  oken,"match")!=0
6aa0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
6ab0: 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20  ;.  }.  pList = 
6ac0: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
6ad0: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78    if( pList->nEx
6ae0: 70 72 21 3d 32 20 29 7b 0a 20 20 20 20 72 65 74  pr!=2 ){.    ret
6af0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
6b00: 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78   pList->a[1].pEx
6b10: 70 72 2d 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f 4c  pr->op != TK_COL
6b20: 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  UMN ){.    retur
6b30: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
6b40: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
6b50: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
6b60: 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a  TUALTABLE */../*
6b70: 0a 2a 2a 20 49 66 20 74 68 65 20 70 42 61 73 65  .** If the pBase
6b80: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67   expression orig
6b90: 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e  inated in the ON
6ba0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
6bb0: 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74   of.** a join, t
6bc0: 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65  hen transfer the
6bd0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 61 72   appropriate mar
6be0: 6b 69 6e 67 73 20 6f 76 65 72 20 74 6f 20 64 65  kings over to de
6bf0: 72 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  rived..*/.static
6c00: 20 76 6f 69 64 20 74 72 61 6e 73 66 65 72 4a 6f   void transferJo
6c10: 69 6e 4d 61 72 6b 69 6e 67 73 28 45 78 70 72 20  inMarkings(Expr 
6c20: 2a 70 44 65 72 69 76 65 64 2c 20 45 78 70 72 20  *pDerived, Expr 
6c30: 2a 70 42 61 73 65 29 7b 0a 20 20 70 44 65 72 69  *pBase){.  pDeri
6c40: 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42  ved->flags |= pB
6c50: 61 73 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ase->flags & EP_
6c60: 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 70 44 65 72  FromJoin;.  pDer
6c70: 69 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  ived->iRightJoin
6c80: 54 61 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e 69  Table = pBase->i
6c90: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a  RightJoinTable;.
6ca0: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
6cb0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
6cc0: 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20  PTIMIZATION) && 
6cd0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6ce0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 2f  OMIT_SUBQUERY)./
6cf0: 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74  *.** Analyze a t
6d00: 65 72 6d 20 74 68 61 74 20 63 6f 6e 73 69 73 74  erm that consist
6d10: 73 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  s of two or more
6d20: 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a   OR-connected.**
6d30: 20 73 75 62 74 65 72 6d 73 2e 20 20 53 6f 20 69   subterms.  So i
6d40: 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e  n:.**.**     ...
6d50: 20 57 48 45 52 45 20 20 28 61 3d 35 29 20 41 4e   WHERE  (a=5) AN
6d60: 44 20 28 62 3d 37 20 4f 52 20 63 3d 39 20 4f 52  D (b=7 OR c=9 OR
6d70: 20 64 3d 31 33 29 20 41 4e 44 20 28 64 3d 31 33   d=13) AND (d=13
6d80: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ).**            
6d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5e 5e                ^^
6da0: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e  ^^^^^^^^^^^^^^^^
6db0: 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ^^.**.** This ro
6dc0: 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74  utine analyzes t
6dd0: 65 72 6d 73 20 73 75 63 68 20 61 73 20 74 68 65  erms such as the
6de0: 20 6d 69 64 64 6c 65 20 74 65 72 6d 20 69 6e 20   middle term in 
6df0: 74 68 65 20 61 62 6f 76 65 20 65 78 61 6d 70 6c  the above exampl
6e00: 65 2e 0a 2a 2a 20 41 20 57 68 65 72 65 4f 72 54  e..** A WhereOrT
6e10: 65 72 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f  erm object is co
6e20: 6d 70 75 74 65 64 20 61 6e 64 20 61 74 74 61 63  mputed and attac
6e30: 68 65 64 20 74 6f 20 74 68 65 20 74 65 72 6d 20  hed to the term 
6e40: 75 6e 64 65 72 0a 2a 2a 20 61 6e 61 6c 79 73 69  under.** analysi
6e50: 73 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  s, regardless of
6e60: 20 74 68 65 20 6f 75 74 63 6f 6d 65 20 6f 66 20   the outcome of 
6e70: 74 68 65 20 61 6e 61 6c 79 73 69 73 2e 20 20 48  the analysis.  H
6e80: 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ence:.**.**     
6e90: 57 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61 67  WhereTerm.wtFlag
6ea0: 73 20 20 20 7c 3d 20 20 54 45 52 4d 5f 4f 52 49  s   |=  TERM_ORI
6eb0: 4e 46 4f 0a 2a 2a 20 20 20 20 20 57 68 65 72 65  NFO.**     Where
6ec0: 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20 20  Term.u.pOrInfo  
6ed0: 3d 20 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  =  a dynamically
6ee0: 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65   allocated Where
6ef0: 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2a  OrTerm object.**
6f00: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69  .** The term bei
6f10: 6e 67 20 61 6e 61 6c 79 7a 65 64 20 6d 75 73 74  ng analyzed must
6f20: 20 68 61 76 65 20 74 77 6f 20 6f 72 20 6d 6f 72   have two or mor
6f30: 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e 65 63 74 65  e of OR-connecte
6f40: 64 20 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 41  d subterms..** A
6f50: 20 73 69 6e 67 6c 65 20 73 75 62 74 65 72 6d 20   single subterm 
6f60: 6d 69 67 68 74 20 62 65 20 61 20 73 65 74 20 6f  might be a set o
6f70: 66 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20  f AND-connected 
6f80: 73 75 62 2d 73 75 62 74 65 72 6d 73 2e 0a 2a 2a  sub-subterms..**
6f90: 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 74 65 72   Examples of ter
6fa0: 6d 73 20 75 6e 64 65 72 20 61 6e 61 6c 79 73 69  ms under analysi
6fb0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 41 29  s:.**.**     (A)
6fc0: 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f       t1.x=t2.y O
6fd0: 52 20 74 31 2e 78 3d 74 32 2e 7a 20 4f 52 20 74  R t1.x=t2.z OR t
6fe0: 31 2e 79 3d 31 35 20 4f 52 20 74 31 2e 7a 3d 74  1.y=15 OR t1.z=t
6ff0: 33 2e 61 2b 35 0a 2a 2a 20 20 20 20 20 28 42 29  3.a+5.**     (B)
7000: 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20       x=expr1 OR 
7010: 65 78 70 72 32 3d 78 20 4f 52 20 78 3d 65 78 70  expr2=x OR x=exp
7020: 72 33 0a 2a 2a 20 20 20 20 20 28 43 29 20 20 20  r3.**     (C)   
7030: 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20 28    t1.x=t2.y OR (
7040: 74 31 2e 78 3d 74 32 2e 7a 20 41 4e 44 20 74 31  t1.x=t2.z AND t1
7050: 2e 79 3d 31 35 29 0a 2a 2a 20 20 20 20 20 28 44  .y=15).**     (D
7060: 29 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52  )     x=expr1 OR
7070: 20 28 79 3e 31 31 20 41 4e 44 20 79 3c 32 32 20   (y>11 AND y<22 
7080: 41 4e 44 20 7a 20 4c 49 4b 45 20 27 2a 68 65 6c  AND z LIKE '*hel
7090: 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20 20 28 45 29  lo*').**     (E)
70a0: 20 20 20 20 20 28 70 2e 61 3d 31 20 41 4e 44 20       (p.a=1 AND 
70b0: 71 2e 62 3d 32 20 41 4e 44 20 72 2e 63 3d 33 29  q.b=2 AND r.c=3)
70c0: 20 4f 52 20 28 70 2e 78 3d 34 20 41 4e 44 20 71   OR (p.x=4 AND q
70d0: 2e 79 3d 35 20 41 4e 44 20 72 2e 7a 3d 36 29 0a  .y=5 AND r.z=6).
70e0: 2a 2a 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a 2a  **.** CASE 1:.**
70f0: 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65  .** If all subte
7100: 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20 66  rms are of the f
7110: 6f 72 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f 72  orm T.C=expr for
7120: 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f 6c   some single col
7130: 75 6d 6e 20 6f 66 20 43 0a 2a 2a 20 61 20 73 69  umn of C.** a si
7140: 6e 67 6c 65 20 74 61 62 6c 65 20 54 20 28 61 73  ngle table T (as
7150: 20 73 68 6f 77 6e 20 69 6e 20 65 78 61 6d 70 6c   shown in exampl
7160: 65 20 42 20 61 62 6f 76 65 29 20 74 68 65 6e 20  e B above) then 
7170: 63 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72  create a new vir
7180: 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 74 68 61  tual.** term tha
7190: 74 20 69 73 20 61 6e 20 65 71 75 69 76 61 6c 65  t is an equivale
71a0: 6e 74 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e  nt IN expression
71b0: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
71c0: 73 2c 20 69 66 20 74 68 65 20 74 65 72 6d 0a 2a  s, if the term.*
71d0: 2a 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64  * being analyzed
71e0: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20   is:.**.**      
71f0: 78 20 3d 20 65 78 70 72 31 20 20 4f 52 20 20 65  x = expr1  OR  e
7200: 78 70 72 32 20 3d 20 78 20 20 4f 52 20 20 78 20  xpr2 = x  OR  x 
7210: 3d 20 65 78 70 72 33 0a 2a 2a 0a 2a 2a 20 74 68  = expr3.**.** th
7220: 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  en create a new 
7230: 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6c 69 6b  virtual term lik
7240: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
7250: 20 20 20 78 20 49 4e 20 28 65 78 70 72 31 2c 65     x IN (expr1,e
7260: 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a 0a 2a  xpr2,expr3).**.*
7270: 2a 20 43 41 53 45 20 32 3a 0a 2a 2a 0a 2a 2a 20  * CASE 2:.**.** 
7280: 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d 73 20  If all subterms 
7290: 61 72 65 20 69 6e 64 65 78 61 62 6c 65 20 62 79  are indexable by
72a0: 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
72b0: 54 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 0a 2a  T, then set.**.*
72c0: 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e  *     WhereTerm.
72d0: 65 4f 70 65 72 61 74 6f 72 20 20 20 20 20 20 20  eOperator       
72e0: 20 20 20 20 20 20 20 3d 20 20 57 4f 5f 4f 52 0a         =  WO_OR.
72f0: 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  **     WhereTerm
7300: 2e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65  .u.pOrInfo->inde
7310: 78 61 62 6c 65 20 20 7c 3d 20 20 74 68 65 20 63  xable  |=  the c
7320: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
7330: 20 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a 2a 20 41   table T.**.** A
7340: 20 73 75 62 74 65 72 6d 20 69 73 20 22 69 6e 64   subterm is "ind
7350: 65 78 61 62 6c 65 22 20 69 66 20 69 74 20 69 73  exable" if it is
7360: 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20   of the form.** 
7370: 22 54 2e 43 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  "T.C <op> <expr>
7380: 22 20 77 68 65 72 65 20 43 20 69 73 20 61 6e 79  " where C is any
7390: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65   column of table
73a0: 20 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f 70 3e 20   T and .** <op> 
73b0: 69 73 20 6f 6e 65 20 6f 66 20 22 3d 22 2c 20 22  is one of "=", "
73c0: 3c 22 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c 20 22  <", "<=", ">", "
73d0: 3e 3d 22 2c 20 22 49 53 20 4e 55 4c 4c 22 2c 20  >=", "IS NULL", 
73e0: 6f 72 20 22 49 4e 22 2e 0a 2a 2a 20 41 20 73 75  or "IN"..** A su
73f0: 62 74 65 72 6d 20 69 73 20 61 6c 73 6f 20 69 6e  bterm is also in
7400: 64 65 78 61 62 6c 65 20 69 66 20 69 74 20 69 73  dexable if it is
7410: 20 61 6e 20 41 4e 44 20 6f 66 20 74 77 6f 20 6f   an AND of two o
7420: 72 20 6d 6f 72 65 0a 2a 2a 20 73 75 62 73 75 62  r more.** subsub
7430: 74 65 72 6d 73 20 61 74 20 6c 65 61 73 74 20 6f  terms at least o
7440: 6e 65 20 6f 66 20 77 68 69 63 68 20 69 73 20 69  ne of which is i
7450: 6e 64 65 78 61 62 6c 65 2e 20 20 49 6e 64 65 78  ndexable.  Index
7460: 61 62 6c 65 20 41 4e 44 20 0a 2a 2a 20 73 75 62  able AND .** sub
7470: 74 65 72 6d 73 20 68 61 76 65 20 74 68 65 69 72  terms have their
7480: 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74   eOperator set t
7490: 6f 20 57 4f 5f 41 4e 44 20 61 6e 64 20 74 68 65  o WO_AND and the
74a0: 79 20 68 61 76 65 0a 2a 2a 20 75 2e 70 41 6e 64  y have.** u.pAnd
74b0: 49 6e 66 6f 20 73 65 74 20 74 6f 20 61 20 64 79  Info set to a dy
74c0: 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
74d0: 74 65 64 20 57 68 65 72 65 41 6e 64 54 65 72 6d  ted WhereAndTerm
74e0: 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 46   object..**.** F
74f0: 72 6f 6d 20 61 6e 6f 74 68 65 72 20 70 6f 69 6e  rom another poin
7500: 74 20 6f 66 20 76 69 65 77 2c 20 22 69 6e 64 65  t of view, "inde
7510: 78 61 62 6c 65 22 20 6d 65 61 6e 73 20 74 68 61  xable" means tha
7520: 74 20 74 68 65 20 73 75 62 74 65 72 6d 20 63 6f  t the subterm co
7530: 75 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c  uld.** potential
7540: 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ly be used with 
7550: 61 6e 20 69 6e 64 65 78 20 69 66 20 61 6e 20 61  an index if an a
7560: 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65 78  ppropriate index
7570: 20 65 78 69 73 74 73 2e 0a 2a 2a 20 54 68 69 73   exists..** This
7580: 20 61 6e 61 6c 79 73 69 73 20 64 6f 65 73 20 6e   analysis does n
7590: 6f 74 20 63 6f 6e 73 69 64 65 72 20 77 68 65 74  ot consider whet
75a0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 69  her or not the i
75b0: 6e 64 65 78 20 65 78 69 73 74 73 3b 20 74 68 61  ndex exists; tha
75c0: 74 0a 2a 2a 20 69 73 20 73 6f 6d 65 74 68 69 6e  t.** is somethin
75d0: 67 20 74 68 65 20 62 65 73 74 49 6e 64 65 78 28  g the bestIndex(
75e0: 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  ) routine will d
75f0: 65 74 65 72 6d 69 6e 65 2e 20 20 54 68 69 73 20  etermine.  This 
7600: 61 6e 61 6c 79 73 69 73 0a 2a 2a 20 6f 6e 6c 79  analysis.** only
7610: 20 6c 6f 6f 6b 73 20 61 74 20 77 68 65 74 68 65   looks at whethe
7620: 72 20 73 75 62 74 65 72 6d 73 20 61 70 70 72 6f  r subterms appro
7630: 70 72 69 61 74 65 20 66 6f 72 20 69 6e 64 65 78  priate for index
7640: 69 6e 67 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a  ing exist..**.**
7650: 20 41 6c 6c 20 65 78 61 6d 70 6c 65 73 20 41 20   All examples A 
7660: 74 68 72 6f 75 67 68 20 45 20 61 62 6f 76 65 20  through E above 
7670: 61 6c 6c 20 73 61 74 69 73 66 79 20 63 61 73 65  all satisfy case
7680: 20 32 2e 20 20 42 75 74 20 69 66 20 61 20 74 65   2.  But if a te
7690: 72 6d 0a 2a 2a 20 61 6c 73 6f 20 73 74 61 74 69  rm.** also stati
76a0: 73 66 69 65 73 20 63 61 73 65 20 31 20 28 73 75  sfies case 1 (su
76b0: 63 68 20 61 73 20 42 29 20 77 65 20 6b 6e 6f 77  ch as B) we know
76c0: 20 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69   that the optimi
76d0: 7a 65 72 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77 61  zer will.** alwa
76e0: 79 73 20 70 72 65 66 65 72 20 63 61 73 65 20 31  ys prefer case 1
76f0: 2c 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73  , so in that cas
7700: 65 20 77 65 20 70 72 65 74 65 6e 64 20 74 68 61  e we pretend tha
7710: 74 20 63 61 73 65 20 32 20 69 73 20 6e 6f 74 0a  t case 2 is not.
7720: 2a 2a 20 73 61 74 69 73 66 69 65 64 2e 0a 2a 2a  ** satisfied..**
7730: 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 62 65 20  .** It might be 
7740: 74 68 65 20 63 61 73 65 20 74 68 61 74 20 6d 75  the case that mu
7750: 6c 74 69 70 6c 65 20 74 61 62 6c 65 73 20 61 72  ltiple tables ar
7760: 65 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 46 6f  e indexable.  Fo
7770: 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28 45  r example,.** (E
7780: 29 20 61 62 6f 76 65 20 69 73 20 69 6e 64 65 78  ) above is index
7790: 61 62 6c 65 20 6f 6e 20 74 61 62 6c 65 73 20 50  able on tables P
77a0: 2c 20 51 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a 2a  , Q, and R..**.*
77b0: 2a 20 54 65 72 6d 73 20 74 68 61 74 20 73 61 74  * Terms that sat
77c0: 69 73 66 79 20 63 61 73 65 20 32 20 61 72 65 20  isfy case 2 are 
77d0: 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20 6c  candidates for l
77e0: 6f 6f 6b 75 70 20 62 79 20 75 73 69 6e 67 0a 2a  ookup by using.*
77f0: 2a 20 73 65 70 61 72 61 74 65 20 69 6e 64 69 63  * separate indic
7800: 65 73 20 74 6f 20 66 69 6e 64 20 72 6f 77 69 64  es to find rowid
7810: 73 20 66 6f 72 20 65 61 63 68 20 73 75 62 74 65  s for each subte
7820: 72 6d 20 61 6e 64 20 63 6f 6d 70 6f 73 69 6e 67  rm and composing
7830: 0a 2a 2a 20 74 68 65 20 75 6e 69 6f 6e 20 6f 66  .** the union of
7840: 20 61 6c 6c 20 72 6f 77 69 64 73 20 75 73 69 6e   all rowids usin
7850: 67 20 61 20 52 6f 77 53 65 74 20 6f 62 6a 65 63  g a RowSet objec
7860: 74 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d 69  t.  This is simi
7870: 6c 61 72 0a 2a 2a 20 74 6f 20 22 62 69 74 6d 61  lar.** to "bitma
7880: 70 20 69 6e 64 69 63 65 73 22 20 69 6e 20 6f 74  p indices" in ot
7890: 68 65 72 20 64 61 74 61 62 61 73 65 20 65 6e 67  her database eng
78a0: 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48 45  ines..**.** OTHE
78b0: 52 57 49 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66 20  RWISE:.**.** If 
78c0: 6e 65 69 74 68 65 72 20 63 61 73 65 20 31 20 6e  neither case 1 n
78d0: 6f 72 20 63 61 73 65 20 32 20 61 70 70 6c 79 2c  or case 2 apply,
78e0: 20 74 68 65 6e 20 6c 65 61 76 65 20 74 68 65 20   then leave the 
78f0: 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f  eOperator set to
7900: 0a 2a 2a 20 7a 65 72 6f 2e 20 20 54 68 69 73 20  .** zero.  This 
7910: 74 65 72 6d 20 69 73 20 6e 6f 74 20 75 73 65 66  term is not usef
7920: 75 6c 20 66 6f 72 20 73 65 61 72 63 68 2e 0a 2a  ul for search..*
7930: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
7940: 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28  prAnalyzeOrTerm(
7950: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
7960: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
7970: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
7980: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
7990: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f   *pWC,         /
79a0: 2a 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 57  * the complete W
79b0: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
79c0: 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20   int idxTerm    
79d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
79e0: 64 65 78 20 6f 66 20 74 68 65 20 4f 52 2d 74 65  dex of the OR-te
79f0: 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  rm to be analyze
7a00: 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  d */.){.  Parse 
7a10: 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70  *pParse = pWC->p
7a20: 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
7a30: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
7a40: 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
7a50: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
7a60: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
7a70: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
7a80: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65  nection */.  Whe
7a90: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20  reTerm *pTerm = 
7aa0: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
7ab0: 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d  ;    /* The term
7ac0: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
7ad0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
7ae0: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
7af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7b00: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  The expression o
7b10: 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20  f the term */.  
7b20: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
7b30: 61 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d  askSet = pWC->pM
7b40: 61 73 6b 53 65 74 3b 20 2f 2a 20 54 61 62 6c 65  askSet; /* Table
7b50: 20 75 73 65 20 6d 61 73 6b 73 20 2a 2f 0a 20 20   use masks */.  
7b60: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
7b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b80: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
7b90: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68  counters */.  Wh
7ba0: 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63  ereClause *pOrWc
7bb0: 3b 20 20 20 20 20 20 20 2f 2a 20 42 72 65 61 6b  ;       /* Break
7bc0: 75 70 20 6f 66 20 70 54 65 72 6d 20 69 6e 74 6f  up of pTerm into
7bd0: 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 57   subterms */.  W
7be0: 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72  hereTerm *pOrTer
7bf0: 6d 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 53 75  m;       /* A Su
7c00: 62 2d 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68  b-term within th
7c10: 65 20 70 4f 72 57 63 20 2a 2f 0a 20 20 57 68 65  e pOrWc */.  Whe
7c20: 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66  reOrInfo *pOrInf
7c30: 6f 3b 20 20 20 20 20 2f 2a 20 41 64 64 69 74 69  o;     /* Additi
7c40: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
7c50: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
7c60: 20 70 54 65 72 6d 20 2a 2f 0a 20 20 42 69 74 6d   pTerm */.  Bitm
7c70: 61 73 6b 20 63 68 6e 67 54 6f 49 4e 3b 20 20 20  ask chngToIN;   
7c80: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
7c90: 74 68 61 74 20 6d 69 67 68 74 20 73 61 74 69 73  that might satis
7ca0: 66 79 20 63 61 73 65 20 31 20 2a 2f 0a 20 20 42  fy case 1 */.  B
7cb0: 69 74 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c 65  itmask indexable
7cc0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c  ;        /* Tabl
7cd0: 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 64 65  es that are inde
7ce0: 78 61 62 6c 65 2c 20 73 61 74 69 73 66 79 69 6e  xable, satisfyin
7cf0: 67 20 63 61 73 65 20 32 20 2a 2f 0a 0a 20 20 2f  g case 2 */..  /
7d00: 2a 0a 20 20 2a 2a 20 42 72 65 61 6b 20 74 68 65  *.  ** Break the
7d10: 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20   OR clause into 
7d20: 69 74 73 20 73 65 70 61 72 61 74 65 20 73 75 62  its separate sub
7d30: 74 65 72 6d 73 2e 20 20 54 68 65 20 73 75 62 74  terms.  The subt
7d40: 65 72 6d 73 20 61 72 65 0a 20 20 2a 2a 20 73 74  erms are.  ** st
7d50: 6f 72 65 64 20 69 6e 20 61 20 57 68 65 72 65 43  ored in a WhereC
7d60: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 20  lause structure 
7d70: 63 6f 6e 74 61 69 6e 69 6e 67 20 77 69 74 68 69  containing withi
7d80: 6e 20 74 68 65 20 57 68 65 72 65 4f 72 49 6e 66  n the WhereOrInf
7d90: 6f 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20 74 68  o.  ** object th
7da0: 61 74 20 69 73 20 61 74 74 61 63 68 65 64 20 74  at is attached t
7db0: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4f  o the original O
7dc0: 52 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 20  R clause term.. 
7dd0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
7de0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
7df0: 28 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45  (TERM_DYNAMIC|TE
7e00: 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f 41  RM_ORINFO|TERM_A
7e10: 4e 44 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20  NDINFO))==0 );. 
7e20: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
7e30: 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 70  op==TK_OR );.  p
7e40: 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 20  Term->u.pOrInfo 
7e50: 3d 20 70 4f 72 49 6e 66 6f 20 3d 20 73 71 6c 69  = pOrInfo = sqli
7e60: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
7e70: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4f 72 49  db, sizeof(*pOrI
7e80: 6e 66 6f 29 29 3b 0a 20 20 69 66 28 20 70 4f 72  nfo));.  if( pOr
7e90: 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e  Info==0 ) return
7ea0: 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  ;.  pTerm->wtFla
7eb0: 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e 46  gs |= TERM_ORINF
7ec0: 4f 3b 0a 20 20 70 4f 72 57 63 20 3d 20 26 70 4f  O;.  pOrWc = &pO
7ed0: 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 77 68 65  rInfo->wc;.  whe
7ee0: 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70 4f 72  reClauseInit(pOr
7ef0: 57 63 2c 20 70 57 43 2d 3e 70 50 61 72 73 65 2c  Wc, pWC->pParse,
7f00: 20 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 77 68   pMaskSet);.  wh
7f10: 65 72 65 53 70 6c 69 74 28 70 4f 72 57 63 2c 20  ereSplit(pOrWc, 
7f20: 70 45 78 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20  pExpr, TK_OR);. 
7f30: 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28   exprAnalyzeAll(
7f40: 70 53 72 63 2c 20 70 4f 72 57 63 29 3b 0a 20 20  pSrc, pOrWc);.  
7f50: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
7f60: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
7f70: 20 61 73 73 65 72 74 28 20 70 4f 72 57 63 2d 3e   assert( pOrWc->
7f80: 6e 54 65 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f  nTerm>=2 );..  /
7f90: 2a 0a 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 74  *.  ** Compute t
7fa0: 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73  he set of tables
7fb0: 20 74 68 61 74 20 6d 69 67 68 74 20 73 61 74 69   that might sati
7fc0: 73 66 79 20 63 61 73 65 73 20 31 20 6f 72 20 32  sfy cases 1 or 2
7fd0: 2e 0a 20 20 2a 2f 0a 20 20 69 6e 64 65 78 61 62  ..  */.  indexab
7fe0: 6c 65 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  le = ~(Bitmask)0
7ff0: 3b 0a 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 7e  ;.  chngToIN = ~
8000: 28 70 57 43 2d 3e 76 6d 61 73 6b 29 3b 0a 20 20  (pWC->vmask);.  
8010: 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65  for(i=pOrWc->nTe
8020: 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f  rm-1, pOrTerm=pO
8030: 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 20 26 26 20  rWc->a; i>=0 && 
8040: 69 6e 64 65 78 61 62 6c 65 3b 20 69 2d 2d 2c 20  indexable; i--, 
8050: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
8060: 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f  if( (pOrTerm->eO
8070: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 53 49 4e  perator & WO_SIN
8080: 47 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  GLE)==0 ){.     
8090: 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70   WhereAndInfo *p
80a0: 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61  AndInfo;.      a
80b0: 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e  ssert( pOrTerm->
80c0: 65 4f 70 65 72 61 74 6f 72 3d 3d 30 20 29 3b 0a  eOperator==0 );.
80d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
80e0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
80f0: 26 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c  & (TERM_ANDINFO|
8100: 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30  TERM_ORINFO))==0
8110: 20 29 3b 0a 20 20 20 20 20 20 63 68 6e 67 54 6f   );.      chngTo
8120: 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 41  IN = 0;.      pA
8130: 6e 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  ndInfo = sqlite3
8140: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
8150: 73 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f  sizeof(*pAndInfo
8160: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41  ));.      if( pA
8170: 6e 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  ndInfo ){.      
8180: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
8190: 41 6e 64 57 43 3b 0a 20 20 20 20 20 20 20 20 57  AndWC;.        W
81a0: 68 65 72 65 54 65 72 6d 20 2a 70 41 6e 64 54 65  hereTerm *pAndTe
81b0: 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  rm;.        int 
81c0: 6a 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  j;.        Bitma
81d0: 73 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  sk b = 0;.      
81e0: 20 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e    pOrTerm->u.pAn
81f0: 64 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f  dInfo = pAndInfo
8200: 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72  ;.        pOrTer
8210: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
8220: 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20  RM_ANDINFO;.    
8230: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70      pOrTerm->eOp
8240: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b  erator = WO_AND;
8250: 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57 43 20  .        pAndWC 
8260: 3d 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b  = &pAndInfo->wc;
8270: 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 43 6c  .        whereCl
8280: 61 75 73 65 49 6e 69 74 28 70 41 6e 64 57 43 2c  auseInit(pAndWC,
8290: 20 70 57 43 2d 3e 70 50 61 72 73 65 2c 20 70 4d   pWC->pParse, pM
82a0: 61 73 6b 53 65 74 29 3b 0a 20 20 20 20 20 20 20  askSet);.       
82b0: 20 77 68 65 72 65 53 70 6c 69 74 28 70 41 6e 64   whereSplit(pAnd
82c0: 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  WC, pOrTerm->pEx
82d0: 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20  pr, TK_AND);.   
82e0: 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65       exprAnalyze
82f0: 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e 64 57 43  All(pSrc, pAndWC
8300: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
8310: 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ase( db->mallocF
8320: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
8330: 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
8340: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
8350: 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41 6e      for(j=0, pAn
8360: 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61 3b  dTerm=pAndWC->a;
8370: 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72 6d   j<pAndWC->nTerm
8380: 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d 2b  ; j++, pAndTerm+
8390: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
83a0: 61 73 73 65 72 74 28 20 70 41 6e 64 54 65 72 6d  assert( pAndTerm
83b0: 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->pExpr );.     
83c0: 20 20 20 20 20 20 20 69 66 28 20 61 6c 6c 6f 77         if( allow
83d0: 65 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e 70  edOp(pAndTerm->p
83e0: 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20 20  Expr->op) ){.   
83f0: 20 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d 20             b |= 
8400: 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
8410: 2c 20 70 41 6e 64 54 65 72 6d 2d 3e 6c 65 66 74  , pAndTerm->left
8420: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20  Cursor);.       
8430: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
8440: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
8450: 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26       indexable &
8460: 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = b;.      }.   
8470: 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65   }else if( pOrTe
8480: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
8490: 52 4d 5f 43 4f 50 49 45 44 20 29 7b 0a 20 20 20  RM_COPIED ){.   
84a0: 20 20 20 2f 2a 20 53 6b 69 70 20 74 68 69 73 20     /* Skip this 
84b0: 74 65 72 6d 20 66 6f 72 20 6e 6f 77 2e 20 20 57  term for now.  W
84c0: 65 20 72 65 76 69 73 69 74 20 69 74 20 77 68 65  e revisit it whe
84d0: 6e 20 77 65 20 70 72 6f 63 65 73 73 20 74 68 65  n we process the
84e0: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 73  .      ** corres
84f0: 70 6f 6e 64 69 6e 67 20 54 45 52 4d 5f 56 49 52  ponding TERM_VIR
8500: 54 55 41 4c 20 74 65 72 6d 20 2a 2f 0a 20 20 20  TUAL term */.   
8510: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69   }else{.      Bi
8520: 74 6d 61 73 6b 20 62 3b 0a 20 20 20 20 20 20 62  tmask b;.      b
8530: 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   = getMask(pMask
8540: 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65  Set, pOrTerm->le
8550: 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  ftCursor);.     
8560: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74   if( pOrTerm->wt
8570: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
8580: 54 55 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  TUAL ){.        
8590: 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65  WhereTerm *pOthe
85a0: 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 70 4f  r = &pOrWc->a[pO
85b0: 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b  rTerm->iParent];
85c0: 0a 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67 65  .        b |= ge
85d0: 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
85e0: 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75 72 73  pOther->leftCurs
85f0: 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
8600: 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20     indexable &= 
8610: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  b;.      if( pOr
8620: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21  Term->eOperator!
8630: 3d 57 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20 20  =WO_EQ ){.      
8640: 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a    chngToIN = 0;.
8650: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8660: 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 26 3d       chngToIN &=
8670: 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   b;.      }.    
8680: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  }.  }..  /*.  **
8690: 20 52 65 63 6f 72 64 20 74 68 65 20 73 65 74 20   Record the set 
86a0: 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 73  of tables that s
86b0: 61 74 69 73 66 79 20 63 61 73 65 20 32 2e 20 20  atisfy case 2.  
86c0: 54 68 65 20 73 65 74 20 6d 69 67 68 74 20 62 65  The set might be
86d0: 0a 20 20 2a 2a 20 65 6d 70 74 79 2e 0a 20 20 2a  .  ** empty..  *
86e0: 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64  /.  pOrInfo->ind
86f0: 65 78 61 62 6c 65 20 3d 20 69 6e 64 65 78 61 62  exable = indexab
8700: 6c 65 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70  le;.  pTerm->eOp
8710: 65 72 61 74 6f 72 20 3d 20 69 6e 64 65 78 61 62  erator = indexab
8720: 6c 65 3d 3d 30 20 3f 20 30 20 3a 20 57 4f 5f 4f  le==0 ? 0 : WO_O
8730: 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 68  R;..  /*.  ** ch
8740: 6e 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61 20 73  ngToIN holds a s
8750: 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61  et of tables tha
8760: 74 20 2a 6d 69 67 68 74 2a 20 73 61 74 69 73 66  t *might* satisf
8770: 79 20 63 61 73 65 20 31 2e 20 20 42 75 74 0a 20  y case 1.  But. 
8780: 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20 64   ** we have to d
8790: 6f 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61  o some additiona
87a0: 6c 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 73 65  l checking to se
87b0: 65 20 69 66 20 63 61 73 65 20 31 20 72 65 61 6c  e if case 1 real
87c0: 6c 79 0a 20 20 2a 2a 20 69 73 20 73 61 74 69 73  ly.  ** is satis
87d0: 66 69 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  fied..  **.  ** 
87e0: 63 68 6e 67 54 6f 49 4e 20 77 69 6c 6c 20 68 6f  chngToIN will ho
87f0: 6c 64 20 65 69 74 68 65 72 20 30 2c 20 31 2c 20  ld either 0, 1, 
8800: 6f 72 20 32 20 62 69 74 73 2e 20 20 54 68 65 20  or 2 bits.  The 
8810: 30 2d 62 69 74 20 63 61 73 65 20 6d 65 61 6e 73  0-bit case means
8820: 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 72 65  .  ** that there
8830: 20 69 73 20 6e 6f 20 70 6f 73 73 69 62 69 6c 69   is no possibili
8840: 74 79 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d 69  ty of transformi
8850: 6e 67 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  ng the OR clause
8860: 20 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20 49 4e   into an.  ** IN
8870: 20 6f 70 65 72 61 74 6f 72 20 62 65 63 61 75 73   operator becaus
8880: 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 65  e one or more te
8890: 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 20 63 6c  rms in the OR cl
88a0: 61 75 73 65 20 63 6f 6e 74 61 69 6e 0a 20 20 2a  ause contain.  *
88b0: 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65  * something othe
88c0: 72 20 74 68 61 6e 20 3d 3d 20 6f 6e 20 61 20 63  r than == on a c
88d0: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73 69 6e  olumn in the sin
88e0: 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  gle table.  The 
88f0: 31 2d 62 69 74 0a 20 20 2a 2a 20 63 61 73 65 20  1-bit.  ** case 
8900: 6d 65 61 6e 73 20 74 68 61 74 20 65 76 65 72 79  means that every
8910: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 20   term of the OR 
8920: 63 6c 61 75 73 65 20 69 73 20 6f 66 20 74 68 65  clause is of the
8930: 20 66 6f 72 6d 0a 20 20 2a 2a 20 22 74 61 62 6c   form.  ** "tabl
8940: 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72 22 20 66  e.column=expr" f
8950: 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 74  or some single t
8960: 61 62 6c 65 2e 20 20 54 68 65 20 6f 6e 65 20 62  able.  The one b
8970: 69 74 20 74 68 61 74 20 69 73 20 73 65 74 0a 20  it that is set. 
8980: 20 2a 2a 20 77 69 6c 6c 20 63 6f 72 72 65 73 70   ** will corresp
8990: 6f 6e 64 20 74 6f 20 74 68 65 20 63 6f 6d 6d 6f  ond to the commo
89a0: 6e 20 74 61 62 6c 65 2e 20 20 57 65 20 73 74 69  n table.  We sti
89b0: 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b  ll need to check
89c0: 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75   to make.  ** su
89d0: 72 65 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75  re the same colu
89e0: 6d 6e 20 69 73 20 75 73 65 64 20 6f 6e 20 61 6c  mn is used on al
89f0: 6c 20 74 65 72 6d 73 2e 20 20 54 68 65 20 32 2d  l terms.  The 2-
8a00: 62 69 74 20 63 61 73 65 20 69 73 20 77 68 65 6e  bit case is when
8a10: 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 20 74 65  .  ** the all te
8a20: 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20 66  rms are of the f
8a30: 6f 72 6d 20 22 74 61 62 6c 65 31 2e 63 6f 6c 75  orm "table1.colu
8a40: 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e  mn=table2.column
8a50: 22 2e 20 20 49 74 0a 20 20 2a 2a 20 6d 69 67 68  ".  It.  ** migh
8a60: 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  t be possible to
8a70: 20 66 6f 72 6d 20 61 6e 20 49 4e 20 6f 70 65 72   form an IN oper
8a80: 61 74 6f 72 20 77 69 74 68 20 65 69 74 68 65 72  ator with either
8a90: 20 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 0a 20   table1.column. 
8aa0: 20 2a 2a 20 6f 72 20 74 61 62 6c 65 32 2e 63 6f   ** or table2.co
8ab0: 6c 75 6d 6e 20 61 73 20 74 68 65 20 4c 48 53 20  lumn as the LHS 
8ac0: 69 66 20 65 69 74 68 65 72 20 69 73 20 63 6f 6d  if either is com
8ad0: 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72  mon to every ter
8ae0: 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 4f 52  m of.  ** the OR
8af0: 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20   clause..  **.  
8b00: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 65 72  ** Note that ter
8b10: 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ms of the form "
8b20: 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d 74 61  table.column1=ta
8b30: 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20 28 74 68  ble.column2" (th
8b40: 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61 62 6c  e.  ** same tabl
8b50: 65 20 6f 6e 20 62 6f 74 68 20 73 69 7a 65 73 20  e on both sizes 
8b60: 6f 66 20 74 68 65 20 3d 3d 29 20 63 61 6e 6e 6f  of the ==) canno
8b70: 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 2e 0a  t be optimized..
8b80: 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e 67 54    */.  if( chngT
8b90: 6f 49 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  oIN ){.    int o
8ba0: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b  kToChngToIN = 0;
8bb0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
8bc0: 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74  the conversion t
8bd0: 6f 20 49 4e 20 69 73 20 76 61 6c 69 64 20 2a 2f  o IN is valid */
8be0: 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  .    int iColumn
8bf0: 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f   = -1;         /
8c00: 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f  * Column index o
8c10: 6e 20 6c 68 73 20 6f 66 20 49 4e 20 6f 70 65 72  n lhs of IN oper
8c20: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ator */.    int 
8c30: 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 20 20 20  iCursor = -1;   
8c40: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 63        /* Table c
8c50: 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74 6f 20  ursor common to 
8c60: 61 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  all terms */.   
8c70: 20 69 6e 74 20 6a 20 3d 20 30 3b 20 20 20 20 20   int j = 0;     
8c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
8c90: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
8ca0: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
8cb0: 20 61 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c   a table and col
8cc0: 75 6d 6e 20 74 68 61 74 20 61 70 70 65 61 72 73  umn that appears
8cd0: 20 6f 6e 20 6f 6e 65 20 73 69 64 65 20 6f 72 20   on one side or 
8ce0: 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  the.    ** other
8cf0: 20 6f 66 20 74 68 65 20 3d 3d 20 6f 70 65 72 61   of the == opera
8d00: 74 6f 72 20 69 6e 20 65 76 65 72 79 20 73 75 62  tor in every sub
8d10: 74 65 72 6d 2e 20 20 54 68 61 74 20 74 61 62 6c  term.  That tabl
8d20: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20 20 20  e and column.   
8d30: 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 63 6f   ** will be reco
8d40: 72 64 65 64 20 69 6e 20 69 43 75 72 73 6f 72 20  rded in iCursor 
8d50: 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20 20 54 68  and iColumn.  Th
8d60: 65 72 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  ere might not be
8d70: 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63 68   any.    ** such
8d80: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
8d90: 6e 2e 20 20 53 65 74 20 6f 6b 54 6f 43 68 6e 67  n.  Set okToChng
8da0: 54 6f 49 4e 20 69 66 20 61 6e 20 61 70 70 72 6f  ToIN if an appro
8db0: 70 72 69 61 74 65 20 74 61 62 6c 65 0a 20 20 20  priate table.   
8dc0: 20 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69   ** and column i
8dd0: 73 20 66 6f 75 6e 64 20 62 75 74 20 6c 65 61 76  s found but leav
8de0: 65 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 66  e okToChngToIN f
8df0: 61 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f 75 6e  alse if not foun
8e00: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
8e10: 72 28 6a 3d 30 3b 20 6a 3c 32 20 26 26 20 21 6f  r(j=0; j<2 && !o
8e20: 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a 2b 2b  kToChngToIN; j++
8e30: 29 7b 0a 20 20 20 20 20 20 70 4f 72 54 65 72 6d  ){.      pOrTerm
8e40: 20 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a 20 20 20   = pOrWc->a;.   
8e50: 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e     for(i=pOrWc->
8e60: 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69  nTerm-1; i>=0; i
8e70: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
8e80: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8e90: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
8ea0: 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20  or==WO_EQ );.   
8eb0: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74       pOrTerm->wt
8ec0: 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f  Flags &= ~TERM_O
8ed0: 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66  R_OK;.        if
8ee0: 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
8ef0: 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29  ursor==iCursor )
8f00: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
8f10: 68 69 73 20 69 73 20 74 68 65 20 32 2d 62 69 74  his is the 2-bit
8f20: 20 63 61 73 65 20 61 6e 64 20 77 65 20 61 72 65   case and we are
8f30: 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69   on the second i
8f40: 74 65 72 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20  teration and.   
8f50: 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e         ** curren
8f60: 74 20 74 65 72 6d 20 69 73 20 66 72 6f 6d 20 74  t term is from t
8f70: 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69  he first iterati
8f80: 6f 6e 2e 20 20 53 6f 20 73 6b 69 70 20 74 68 69  on.  So skip thi
8f90: 73 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20  s term. */.     
8fa0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d       assert( j==
8fb0: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  1 );.          c
8fc0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
8fd0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
8fe0: 63 68 6e 67 54 6f 49 4e 20 26 20 67 65 74 4d 61  chngToIN & getMa
8ff0: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 4f 72  sk(pMaskSet, pOr
9000: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
9010: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))==0 ){.       
9020: 20 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20     /* This term 
9030: 6d 75 73 74 20 62 65 20 6f 66 20 74 68 65 20 66  must be of the f
9040: 6f 72 6d 20 74 31 2e 61 3d 3d 74 32 2e 62 20 77  orm t1.a==t2.b w
9050: 68 65 72 65 20 74 32 20 69 73 20 69 6e 20 74 68  here t2 is in th
9060: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  e.          ** c
9070: 68 6e 67 54 6f 49 4e 20 73 65 74 20 62 75 74 20  hngToIN set but 
9080: 74 31 20 69 73 20 6e 6f 74 2e 20 20 54 68 69 73  t1 is not.  This
9090: 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 65 69   term will be ei
90a0: 74 68 65 72 20 70 72 65 63 65 65 64 65 64 0a 20  ther preceeded. 
90b0: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 66           ** or f
90c0: 6f 6c 6c 77 65 64 20 62 79 20 61 6e 20 69 6e 76  ollwed by an inv
90d0: 65 72 74 65 64 20 63 6f 70 79 20 28 74 32 2e 62  erted copy (t2.b
90e0: 3d 3d 74 31 2e 61 29 2e 20 20 53 6b 69 70 20 74  ==t1.a).  Skip t
90f0: 68 69 73 20 74 65 72 6d 20 0a 20 20 20 20 20 20  his term .      
9100: 20 20 20 20 2a 2a 20 61 6e 64 20 75 73 65 20 69      ** and use i
9110: 74 73 20 69 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f  ts inversion. */
9120: 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
9130: 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74  ase( pOrTerm->wt
9140: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50  Flags & TERM_COP
9150: 49 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 20  IED );.         
9160: 20 74 65 73 74 63 61 73 65 28 20 70 4f 72 54 65   testcase( pOrTe
9170: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
9180: 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
9190: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
91a0: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
91b0: 20 26 20 28 54 45 52 4d 5f 43 4f 50 49 45 44 7c   & (TERM_COPIED|
91c0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 20 29 3b  TERM_VIRTUAL) );
91d0: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
91e0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
91f0: 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d         iColumn =
9200: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   pOrTerm->u.left
9210: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
9220: 69 43 75 72 73 6f 72 20 3d 20 70 4f 72 54 65 72  iCursor = pOrTer
9230: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20  m->leftCursor;. 
9240: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9250: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
9260: 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  i<0 ){.        /
9270: 2a 20 4e 6f 20 63 61 6e 64 69 64 61 74 65 20 74  * No candidate t
9280: 61 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61 73 20  able+column was 
9290: 66 6f 75 6e 64 2e 20 20 54 68 69 73 20 63 61 6e  found.  This can
92a0: 20 6f 6e 6c 79 20 6f 63 63 75 72 0a 20 20 20 20   only occur.    
92b0: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 65      ** on the se
92c0: 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 2a  cond iteration *
92d0: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
92e0: 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ( j==1 );.      
92f0: 20 20 61 73 73 65 72 74 28 20 28 63 68 6e 67 54    assert( (chngT
9300: 6f 49 4e 26 28 63 68 6e 67 54 6f 49 4e 2d 31 29  oIN&(chngToIN-1)
9310: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
9320: 61 73 73 65 72 74 28 20 63 68 6e 67 54 6f 49 4e  assert( chngToIN
9330: 3d 3d 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  ==getMask(pMaskS
9340: 65 74 2c 20 69 43 75 72 73 6f 72 29 20 29 3b 0a  et, iCursor) );.
9350: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9360: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
9370: 74 63 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a 0a  tcase( j==1 );..
9380: 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65        /* We have
9390: 20 66 6f 75 6e 64 20 61 20 63 61 6e 64 69 64 61   found a candida
93a0: 74 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  te table and col
93b0: 75 6d 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  umn.  Check to s
93c0: 65 65 20 69 66 20 74 68 61 74 0a 20 20 20 20 20  ee if that.     
93d0: 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 63 6f   ** table and co
93e0: 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20 74  lumn is common t
93f0: 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  o every term in 
9400: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 2a 2f  the OR clause */
9410: 0a 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54  .      okToChngT
9420: 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 66  oIN = 1;.      f
9430: 6f 72 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 54  or(; i>=0 && okT
9440: 6f 43 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c 20  oChngToIN; i--, 
9450: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
9460: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
9470: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
9480: 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20  WO_EQ );.       
9490: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
94a0: 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 73 6f  ftCursor!=iCurso
94b0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  r ){.          p
94c0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
94d0: 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a  &= ~TERM_OR_OK;.
94e0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
94f0: 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66  ( pOrTerm->u.lef
9500: 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e  tColumn!=iColumn
9510: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 6b   ){.          ok
9520: 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a  ToChngToIN = 0;.
9530: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
9540: 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 66 66           int aff
9550: 4c 65 66 74 2c 20 61 66 66 52 69 67 68 74 3b 0a  Left, affRight;.
9560: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
9570: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
9580: 69 64 65 20 69 73 20 61 6c 73 6f 20 61 20 63 6f  ide is also a co
9590: 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20 61  lumn, then the a
95a0: 66 66 69 6e 69 74 69 65 73 0a 20 20 20 20 20 20  ffinities.      
95b0: 20 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68 20 72      ** of both r
95c0: 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69  ight and left si
95d0: 64 65 73 20 6d 75 73 74 20 62 65 20 73 75 63 68  des must be such
95e0: 20 74 68 61 74 20 6e 6f 20 74 79 70 65 0a 20 20   that no type.  
95f0: 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 76 65          ** conve
9600: 72 73 69 6f 6e 73 20 61 72 65 20 72 65 71 75 69  rsions are requi
9610: 72 65 64 20 6f 6e 20 74 68 65 20 72 69 67 68 74  red on the right
9620: 2e 20 20 28 54 69 63 6b 65 74 20 23 32 32 34 39  .  (Ticket #2249
9630: 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ).          */. 
9640: 20 20 20 20 20 20 20 20 20 61 66 66 52 69 67 68           affRigh
9650: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  t = sqlite3ExprA
9660: 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d  ffinity(pOrTerm-
9670: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b  >pExpr->pRight);
9680: 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 4c 65  .          affLe
9690: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
96a0: 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d  Affinity(pOrTerm
96b0: 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  ->pExpr->pLeft);
96c0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
96d0: 66 66 52 69 67 68 74 21 3d 30 20 26 26 20 61 66  ffRight!=0 && af
96e0: 66 52 69 67 68 74 21 3d 61 66 66 4c 65 66 74 20  fRight!=affLeft 
96f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  ){.            o
9700: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b  kToChngToIN = 0;
9710: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
9720: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f  {.            pO
9730: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  rTerm->wtFlags |
9740: 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20  = TERM_OR_OK;.  
9750: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9760: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
9770: 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
9780: 73 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43 68 6e  s point, okToChn
9790: 67 54 6f 49 4e 20 69 73 20 74 72 75 65 20 69 66  gToIN is true if
97a0: 20 6f 72 69 67 69 6e 61 6c 20 70 54 65 72 6d 20   original pTerm 
97b0: 73 61 74 69 73 66 69 65 73 0a 20 20 20 20 2a 2a  satisfies.    **
97c0: 20 63 61 73 65 20 31 2e 20 20 49 6e 20 74 68 61   case 1.  In tha
97d0: 74 20 63 61 73 65 2c 20 63 6f 6e 73 74 72 75 63  t case, construc
97e0: 74 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20  t a new virtual 
97f0: 74 65 72 6d 20 74 68 61 74 20 69 73 20 0a 20 20  term that is .  
9800: 20 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e 76 65    ** pTerm conve
9810: 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 49 4e 20  rted into an IN 
9820: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f  operator..    */
9830: 0a 20 20 20 20 69 66 28 20 6f 6b 54 6f 43 68 6e  .    if( okToChn
9840: 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45  gToIN ){.      E
9850: 78 70 72 20 2a 70 44 75 70 3b 20 20 20 20 20 20  xpr *pDup;      
9860: 20 20 20 20 20 20 2f 2a 20 41 20 74 72 61 6e 73        /* A trans
9870: 69 65 6e 74 20 64 75 70 6c 69 63 61 74 65 20 65  ient duplicate e
9880: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
9890: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
98a0: 73 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65  st = 0;   /* The
98b0: 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
98c0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
98d0: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 30   Expr *pLeft = 0
98e0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c  ;       /* The L
98f0: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
9900: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45  rator */.      E
9910: 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  xpr *pNew;      
9920: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
9930: 70 6c 65 74 65 20 49 4e 20 6f 70 65 72 61 74 6f  plete IN operato
9940: 72 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28  r */..      for(
9950: 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31  i=pOrWc->nTerm-1
9960: 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d  , pOrTerm=pOrWc-
9970: 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  >a; i>=0; i--, p
9980: 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  OrTerm++){.     
9990: 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d     if( (pOrTerm-
99a0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
99b0: 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74  OR_OK)==0 ) cont
99c0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 73  inue;.        as
99d0: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65  sert( pOrTerm->e
99e0: 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20  Operator==WO_EQ 
99f0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
9a00: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  t( pOrTerm->left
9a10: 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20  Cursor==iCursor 
9a20: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
9a30: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65  t( pOrTerm->u.le
9a40: 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d  ftColumn==iColum
9a50: 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 75  n );.        pDu
9a60: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
9a70: 75 70 28 64 62 2c 20 70 4f 72 54 65 72 6d 2d 3e  up(db, pOrTerm->
9a80: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 30  pExpr->pRight, 0
9a90: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  );.        pList
9aa0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
9ab0: 73 74 41 70 70 65 6e 64 28 70 57 43 2d 3e 70 50  stAppend(pWC->pP
9ac0: 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 44 75  arse, pList, pDu
9ad0: 70 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 66  p);.        pLef
9ae0: 74 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  t = pOrTerm->pEx
9af0: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
9b00: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
9b10: 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20   pLeft!=0 );.   
9b20: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
9b30: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65  3ExprDup(db, pLe
9b40: 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e  ft, 0);.      pN
9b50: 65 77 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  ew = sqlite3PExp
9b60: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c  r(pParse, TK_IN,
9b70: 20 70 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20   pDup, 0, 0);.  
9b80: 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
9b90: 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e          int idxN
9ba0: 65 77 3b 0a 20 20 20 20 20 20 20 20 74 72 61 6e  ew;.        tran
9bb0: 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73  sferJoinMarkings
9bc0: 28 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20  (pNew, pExpr);. 
9bd0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
9be0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9bf0: 70 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65  pNew, EP_xIsSele
9c00: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ct) );.        p
9c10: 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70  New->x.pList = p
9c20: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69 64  List;.        id
9c30: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
9c40: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
9c50: 65 77 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  ew, TERM_VIRTUAL
9c60: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
9c70: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
9c80: 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20  ( idxNew==0 );. 
9c90: 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79         exprAnaly
9ca0: 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  ze(pSrc, pWC, id
9cb0: 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70  xNew);.        p
9cc0: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
9cd0: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20  dxTerm];.       
9ce0: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e   pWC->a[idxNew].
9cf0: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
9d00: 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  m;.        pTerm
9d10: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
9d20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9d30: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
9d40: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
9d50: 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
9d60: 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61     pTerm->eOpera
9d70: 74 6f 72 20 3d 20 30 3b 20 20 2f 2a 20 63 61 73  tor = 0;  /* cas
9d80: 65 20 31 20 74 72 75 6d 70 73 20 63 61 73 65 20  e 1 trumps case 
9d90: 32 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  2 */.    }.  }.}
9da0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
9db0: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
9dc0: 49 5a 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49  IZATION && !SQLI
9dd0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
9de0: 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   */.../*.** The 
9df0: 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f  input to this ro
9e00: 75 74 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72  utine is an Wher
9e10: 65 54 65 72 6d 20 73 74 72 75 63 74 75 72 65 20  eTerm structure 
9e20: 77 69 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a  with only the.**
9e30: 20 22 70 45 78 70 72 22 20 66 69 65 6c 64 20 66   "pExpr" field f
9e40: 69 6c 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a  illed in.  The j
9e50: 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ob of this routi
9e60: 6e 65 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65  ne is to analyze
9e70: 20 74 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65   the.** subexpre
9e80: 73 73 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61  ssion and popula
9e90: 74 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72  te all the other
9ea0: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57   fields of the W
9eb0: 68 65 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75  hereTerm.** stru
9ec0: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
9ed0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
9ee0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c  s of the form "<
9ef0: 65 78 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74  expr> <op> X" it
9f00: 20 67 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a   gets commuted.*
9f10: 2a 20 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72  * to the standar
9f20: 64 20 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70  d form of "X <op
9f30: 3e 20 3c 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a  > <expr>"..**.**
9f40: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
9f50: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
9f60: 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65  m "X <op> Y" whe
9f70: 72 65 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20  re both X and Y 
9f80: 61 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20  are.** columns, 
9f90: 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  then the origina
9fa0: 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  l expression is 
9fb0: 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20  unchanged and a 
9fc0: 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74  new virtual.** t
9fd0: 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  erm of the form 
9fe0: 22 59 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64  "Y <op> X" is ad
9ff0: 64 65 64 20 74 6f 20 74 68 65 20 57 48 45 52 45  ded to the WHERE
a000: 20 63 6c 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61   clause and.** a
a010: 6e 61 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65  nalyzed separate
a020: 6c 79 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61  ly.  The origina
a030: 6c 20 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64  l term is marked
a040: 20 77 69 74 68 20 54 45 52 4d 5f 43 4f 50 49 45   with TERM_COPIE
a050: 44 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77  D.** and the new
a060: 20 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20   term is marked 
a070: 77 69 74 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49  with TERM_DYNAMI
a080: 43 20 28 62 65 63 61 75 73 65 20 69 74 27 73 20  C (because it's 
a090: 70 45 78 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74  pExpr.** needs t
a0a0: 6f 20 62 65 20 66 72 65 65 64 20 77 69 74 68 20  o be freed with 
a0b0: 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 29  the WhereClause)
a0c0: 20 61 6e 64 20 54 45 52 4d 5f 56 49 52 54 55 41   and TERM_VIRTUA
a0d0: 4c 20 28 62 65 63 61 75 73 65 20 69 74 0a 2a 2a  L (because it.**
a0e0: 20 69 73 20 61 20 63 6f 6d 6d 75 74 65 64 20 63   is a commuted c
a0f0: 6f 70 79 20 6f 66 20 61 20 70 72 69 6f 72 20 74  opy of a prior t
a100: 65 72 6d 2e 29 20 20 54 68 65 20 6f 72 69 67 69  erm.)  The origi
a110: 6e 61 6c 20 74 65 72 6d 20 68 61 73 20 6e 43 68  nal term has nCh
a120: 69 6c 64 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65  ild=1.** and the
a130: 20 63 6f 70 79 20 68 61 73 20 69 64 78 50 61 72   copy has idxPar
a140: 65 6e 74 20 73 65 74 20 74 6f 20 74 68 65 20 69  ent set to the i
a150: 6e 64 65 78 20 6f 66 20 74 68 65 20 6f 72 69 67  ndex of the orig
a160: 69 6e 61 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74  inal term..*/.st
a170: 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e  atic void exprAn
a180: 61 6c 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74  alyze(.  SrcList
a190: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20   *pSrc,         
a1a0: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
a1b0: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
a1c0: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
a1d0: 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52       /* the WHER
a1e0: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  E clause */.  in
a1f0: 74 20 69 64 78 54 65 72 6d 20 20 20 20 20 20 20  t idxTerm       
a200: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
a210: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 74 6f 20   of the term to 
a220: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29  be analyzed */.)
a230: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
a240: 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
a250: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d       /* The term
a260: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
a270: 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
a280: 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20  t *pMaskSet;    
a290: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20        /* Set of 
a2a0: 74 61 62 6c 65 20 69 6e 64 65 78 20 6d 61 73 6b  table index mask
a2b0: 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  s */.  Expr *pEx
a2c0: 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
a2d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
a2e0: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
a2f0: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42 69  analyzed */.  Bi
a300: 74 6d 61 73 6b 20 70 72 65 72 65 71 4c 65 66 74  tmask prereqLeft
a310: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
a320: 2a 20 50 72 65 72 65 71 75 65 73 69 74 65 73 20  * Prerequesites 
a330: 6f 66 20 74 68 65 20 70 45 78 70 72 2d 3e 70 4c  of the pExpr->pL
a340: 65 66 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  eft */.  Bitmask
a350: 20 70 72 65 72 65 71 41 6c 6c 3b 20 20 20 20 20   prereqAll;     
a360: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
a370: 72 65 71 75 65 73 69 74 65 73 20 6f 66 20 70 45  requesites of pE
a380: 78 70 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  xpr */.  Bitmask
a390: 20 65 78 74 72 61 52 69 67 68 74 20 3d 20 30 3b   extraRight = 0;
a3a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
a3b0: 72 61 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  ra dependencies 
a3c0: 6f 6e 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a  on LEFT JOIN */.
a3d0: 20 20 45 78 70 72 20 2a 70 53 74 72 31 20 3d 20    Expr *pStr1 = 
a3e0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
a3f0: 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b     /* RHS of LIK
a400: 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20  E/GLOB operator 
a410: 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c  */.  int isCompl
a420: 65 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ete = 0;        
a430: 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20        /* RHS of 
a440: 4c 49 4b 45 2f 47 4c 4f 42 20 65 6e 64 73 20 77  LIKE/GLOB ends w
a450: 69 74 68 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a  ith wildcard */.
a460: 20 20 69 6e 74 20 6e 6f 43 61 73 65 20 3d 20 30    int noCase = 0
a470: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a480: 20 20 20 2f 2a 20 4c 49 4b 45 2f 47 4c 4f 42 20     /* LIKE/GLOB 
a490: 64 69 73 74 69 6e 67 75 69 73 68 65 73 20 63 61  distinguishes ca
a4a0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20  se */.  int op; 
a4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 2d           /* Top-
a4d0: 6c 65 76 65 6c 20 6f 70 65 72 61 74 6f 72 2e 20  level operator. 
a4e0: 20 70 45 78 70 72 2d 3e 6f 70 20 2a 2f 0a 20 20   pExpr->op */.  
a4f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
a500: 70 57 43 2d 3e 70 50 61 72 73 65 3b 20 20 20 20  pWC->pParse;    
a510: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
a520: 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
a530: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
a540: 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  b;        /* Dat
a550: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
a560: 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d   */..  if( db->m
a570: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
a580: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
a590: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
a5a0: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 70 4d 61  [idxTerm];.  pMa
a5b0: 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61  skSet = pWC->pMa
a5c0: 73 6b 53 65 74 3b 0a 20 20 70 45 78 70 72 20 3d  skSet;.  pExpr =
a5d0: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
a5e0: 20 70 72 65 72 65 71 4c 65 66 74 20 3d 20 65 78   prereqLeft = ex
a5f0: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
a600: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c  skSet, pExpr->pL
a610: 65 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70 45 78  eft);.  op = pEx
a620: 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70  pr->op;.  if( op
a630: 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61  ==TK_IN ){.    a
a640: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52  ssert( pExpr->pR
a650: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69  ight==0 );.    i
a660: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
a670: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
a680: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
a690: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
a6a0: 67 68 74 20 3d 20 65 78 70 72 53 65 6c 65 63 74  ght = exprSelect
a6b0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
a6c0: 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53  Set, pExpr->x.pS
a6d0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73  elect);.    }els
a6e0: 65 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  e{.      pTerm->
a6f0: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78  prereqRight = ex
a700: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
a710: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
a720: 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
a730: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  }.  }else if( op
a740: 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  ==TK_ISNULL ){. 
a750: 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71     pTerm->prereq
a760: 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  Right = 0;.  }el
a770: 73 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70  se{.    pTerm->p
a780: 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70  rereqRight = exp
a790: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
a7a0: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  kSet, pExpr->pRi
a7b0: 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72  ght);.  }.  prer
a7c0: 65 71 41 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c  eqAll = exprTabl
a7d0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
a7e0: 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 45   pExpr);.  if( E
a7f0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
a800: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
a810: 6e 29 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73  n) ){.    Bitmas
a820: 6b 20 78 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d  k x = getMask(pM
a830: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 69  askSet, pExpr->i
a840: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b  RightJoinTable);
a850: 0a 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20 7c  .    prereqAll |
a860: 3d 20 78 3b 0a 20 20 20 20 65 78 74 72 61 52 69  = x;.    extraRi
a870: 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f  ght = x-1;  /* O
a880: 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d  N clause terms m
a890: 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77  ay not be used w
a8a0: 69 74 68 20 61 6e 20 69 6e 64 65 78 0a 20 20 20  ith an index.   
a8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8c0: 20 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 74      ** on left t
a8d0: 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  able of a LEFT J
a8e0: 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20 23 33 30  OIN.  Ticket #30
a8f0: 31 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 65 72  15 */.  }.  pTer
a900: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70  m->prereqAll = p
a910: 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72  rereqAll;.  pTer
a920: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  m->leftCursor = 
a930: 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61  -1;.  pTerm->iPa
a940: 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65  rent = -1;.  pTe
a950: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
a960: 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65 64  0;.  if( allowed
a970: 4f 70 28 6f 70 29 20 26 26 20 28 70 54 65 72 6d  Op(op) && (pTerm
a980: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
a990: 70 72 65 72 65 71 4c 65 66 74 29 3d 3d 30 20 29  prereqLeft)==0 )
a9a0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66  {.    Expr *pLef
a9b0: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
a9c0: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67  ;.    Expr *pRig
a9d0: 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67  ht = pExpr->pRig
a9e0: 68 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66  ht;.    if( pLef
a9f0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
aa00: 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d   ){.      pTerm-
aa10: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
aa20: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
aa30: 20 20 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74     pTerm->u.left
aa40: 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e  Column = pLeft->
aa50: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70  iColumn;.      p
aa60: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
aa70: 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 6f  = operatorMask(o
aa80: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  p);.    }.    if
aa90: 28 20 70 52 69 67 68 74 20 26 26 20 70 52 69 67  ( pRight && pRig
aaa0: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  ht->op==TK_COLUM
aab0: 4e 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  N ){.      Where
aac0: 54 65 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Term *pNew;.    
aad0: 20 20 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20    Expr *pDup;.  
aae0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
aaf0: 65 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a  eftCursor>=0 ){.
ab00: 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e          int idxN
ab10: 65 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70  ew;.        pDup
ab20: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
ab30: 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  p(db, pExpr, 0);
ab40: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
ab50: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
ab60: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
ab70: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
ab80: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20   pDup);.        
ab90: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
aba0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 64 78 4e    }.        idxN
abb0: 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  ew = whereClause
abc0: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75 70  Insert(pWC, pDup
abd0: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
abe0: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
abf0: 20 20 20 20 20 20 69 66 28 20 69 64 78 4e 65 77        if( idxNew
ac00: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
ac10: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57        pNew = &pW
ac20: 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20  C->a[idxNew];.  
ac30: 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 50 61 72        pNew->iPar
ac40: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
ac50: 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26         pTerm = &
ac60: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
ac70: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  .        pTerm->
ac80: 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
ac90: 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
aca0: 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45  gs |= TERM_COPIE
acb0: 44 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  D;.      }else{.
acc0: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 70          pDup = p
acd0: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e  Expr;.        pN
ace0: 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  ew = pTerm;.    
acf0: 20 20 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f    }.      exprCo
ad00: 6d 6d 75 74 65 28 70 50 61 72 73 65 2c 20 70 44  mmute(pParse, pD
ad10: 75 70 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74  up);.      pLeft
ad20: 20 3d 20 70 44 75 70 2d 3e 70 4c 65 66 74 3b 0a   = pDup->pLeft;.
ad30: 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74        pNew->left
ad40: 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e  Cursor = pLeft->
ad50: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e  iTable;.      pN
ad60: 65 77 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  ew->u.leftColumn
ad70: 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
ad80: 6e 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  n;.      testcas
ad90: 65 28 20 28 70 72 65 72 65 71 4c 65 66 74 20 7c  e( (prereqLeft |
ada0: 20 65 78 74 72 61 52 69 67 68 74 29 20 21 3d 20   extraRight) != 
adb0: 70 72 65 72 65 71 4c 65 66 74 20 29 3b 0a 20 20  prereqLeft );.  
adc0: 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
add0: 52 69 67 68 74 20 3d 20 70 72 65 72 65 71 4c 65  Right = prereqLe
ade0: 66 74 20 7c 20 65 78 74 72 61 52 69 67 68 74 3b  ft | extraRight;
adf0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  .      pNew->pre
ae00: 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41  reqAll = prereqA
ae10: 6c 6c 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ll;.      pNew->
ae20: 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72  eOperator = oper
ae30: 61 74 6f 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f  atorMask(pDup->o
ae40: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  p);.    }.  }..#
ae50: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ae60: 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d  IT_BETWEEN_OPTIM
ae70: 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20  IZATION.  /* If 
ae80: 61 20 74 65 72 6d 20 69 73 20 74 68 65 20 42 45  a term is the BE
ae90: 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20  TWEEN operator, 
aea0: 63 72 65 61 74 65 20 74 77 6f 20 6e 65 77 20 76  create two new v
aeb0: 69 72 74 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a  irtual terms.  *
aec0: 2a 20 74 68 61 74 20 64 65 66 69 6e 65 20 74 68  * that define th
aed0: 65 20 72 61 6e 67 65 20 74 68 61 74 20 74 68 65  e range that the
aee0: 20 42 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65   BETWEEN impleme
aef0: 6e 74 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  nts.  For exampl
af00: 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  e:.  **.  **    
af10: 20 20 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e    a BETWEEN b AN
af20: 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73  D c.  **.  ** is
af30: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 3a   converted into:
af40: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
af50: 28 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44  (a BETWEEN b AND
af60: 20 63 29 20 41 4e 44 20 28 61 3e 3d 62 29 20 41   c) AND (a>=b) A
af70: 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a 20  ND (a<=c).  **. 
af80: 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e 65 77 20   ** The two new 
af90: 74 65 72 6d 73 20 61 72 65 20 61 64 64 65 64 20  terms are added 
afa0: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
afb0: 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  the WhereClause 
afc0: 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65  object..  ** The
afd0: 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20 22   new terms are "
afe0: 64 79 6e 61 6d 69 63 22 20 61 6e 64 20 61 72 65  dynamic" and are
aff0: 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74 68 65   children of the
b000: 20 6f 72 69 67 69 6e 61 6c 20 42 45 54 57 45 45   original BETWEE
b010: 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54 68  N.  ** term.  Th
b020: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66  at means that if
b030: 20 74 68 65 20 42 45 54 57 45 45 4e 20 74 65 72   the BETWEEN ter
b040: 6d 20 69 73 20 63 6f 64 65 64 2c 20 74 68 65 20  m is coded, the 
b050: 63 68 69 6c 64 72 65 6e 20 61 72 65 0a 20 20 2a  children are.  *
b060: 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c 20  * skipped.  Or, 
b070: 69 66 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20  if the children 
b080: 61 72 65 20 73 61 74 69 73 66 69 65 64 20 62 79  are satisfied by
b090: 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f   an index, the o
b0a0: 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45 54  riginal.  ** BET
b0b0: 57 45 45 4e 20 74 65 72 6d 20 69 73 20 73 6b 69  WEEN term is ski
b0c0: 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  pped..  */.  els
b0d0: 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d  e if( pExpr->op=
b0e0: 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26 26 20 70  =TK_BETWEEN && p
b0f0: 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  WC->op==TK_AND )
b100: 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
b110: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
b120: 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20  .pList;.    int 
b130: 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  i;.    static co
b140: 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b  nst u8 ops[] = {
b150: 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20  TK_GE, TK_LE};. 
b160: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
b170: 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
b180: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  t( pList->nExpr=
b190: 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  =2 );.    for(i=
b1a0: 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<2; i++){.  
b1b0: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
b1c0: 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64  pr;.      int id
b1d0: 78 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77  xNew;.      pNew
b1e0: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
b1f0: 78 70 72 28 70 50 61 72 73 65 2c 20 6f 70 73 5b  xpr(pParse, ops[
b200: 69 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  i], .           
b210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b220: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
b230: 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  (db, pExpr->pLef
b240: 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20  t, 0),.         
b250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b260: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
b270: 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  up(db, pList->a[
b280: 69 5d 2e 70 45 78 70 72 2c 20 30 29 2c 20 30 29  i].pExpr, 0), 0)
b290: 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d  ;.      idxNew =
b2a0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
b2b0: 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72  rt(pWC, pNewExpr
b2c0: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
b2d0: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
b2e0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64      testcase( id
b2f0: 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20  xNew==0 );.     
b300: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
b310: 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b  c, pWC, idxNew);
b320: 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26  .      pTerm = &
b330: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
b340: 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64  .      pWC->a[id
b350: 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20  xNew].iParent = 
b360: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20  idxTerm;.    }. 
b370: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
b380: 20 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 2;.  }.#endif
b390: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
b3a0: 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41  BETWEEN_OPTIMIZA
b3b0: 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64 65  TION */..#if !de
b3c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
b3d0: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
b3e0: 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  N) && !defined(S
b3f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
b400: 45 52 59 29 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a  ERY).  /* Analyz
b410: 65 20 61 20 74 65 72 6d 20 74 68 61 74 20 69 73  e a term that is
b420: 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20 74 77 6f   composed of two
b430: 20 6f 72 20 6d 6f 72 65 20 73 75 62 74 65 72 6d   or more subterm
b440: 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20  s connected by. 
b450: 20 2a 2a 20 61 6e 20 4f 52 20 6f 70 65 72 61 74   ** an OR operat
b460: 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  or..  */.  else 
b470: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
b480: 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 61 73 73 65  K_OR ){.    asse
b490: 72 74 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f  rt( pWC->op==TK_
b4a0: 41 4e 44 20 29 3b 0a 20 20 20 20 65 78 70 72 41  AND );.    exprA
b4b0: 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 70 53 72  nalyzeOrTerm(pSr
b4c0: 63 2c 20 70 57 43 2c 20 69 64 78 54 65 72 6d 29  c, pWC, idxTerm)
b4d0: 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70  ;.    pTerm = &p
b4e0: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
b4f0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
b500: 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
b510: 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69  IMIZATION */..#i
b520: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b530: 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54  T_LIKE_OPTIMIZAT
b540: 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e  ION.  /* Add con
b550: 73 74 72 61 69 6e 74 73 20 74 6f 20 72 65 64 75  straints to redu
b560: 63 65 20 74 68 65 20 73 65 61 72 63 68 20 73 70  ce the search sp
b570: 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72  ace on a LIKE or
b580: 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61   GLOB.  ** opera
b590: 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  tor..  **.  ** A
b5a0: 20 6c 69 6b 65 20 70 61 74 74 65 72 6e 20 6f 66   like pattern of
b5b0: 20 74 68 65 20 66 6f 72 6d 20 22 78 20 4c 49 4b   the form "x LIK
b5c0: 45 20 27 61 62 63 25 27 22 20 69 73 20 63 68 61  E 'abc%'" is cha
b5d0: 6e 67 65 64 20 69 6e 74 6f 20 63 6f 6e 73 74 72  nged into constr
b5e0: 61 69 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20  aints.  **.  ** 
b5f0: 20 20 20 20 20 20 20 20 20 78 3e 3d 27 61 62 63           x>='abc
b600: 27 20 41 4e 44 20 78 3c 27 61 62 64 27 20 41 4e  ' AND x<'abd' AN
b610: 44 20 78 20 4c 49 4b 45 20 27 61 62 63 25 27 0a  D x LIKE 'abc%'.
b620: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 61    **.  ** The la
b630: 73 74 20 63 68 61 72 61 63 74 65 72 20 6f 66 20  st character of 
b640: 74 68 65 20 70 72 65 66 69 78 20 22 61 62 63 22  the prefix "abc"
b650: 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
b660: 74 6f 20 66 6f 72 6d 20 74 68 65 0a 20 20 2a 2a  to form the.  **
b670: 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e   termination con
b680: 64 69 74 69 6f 6e 20 22 61 62 64 22 2e 0a 20 20  dition "abd"..  
b690: 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e 6f 70  */.  if( pWC->op
b6a0: 3d 3d 54 4b 5f 41 4e 44 20 0a 20 20 20 26 26 20  ==TK_AND .   && 
b6b0: 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 50 61  isLikeOrGlob(pPa
b6c0: 72 73 65 2c 20 70 45 78 70 72 2c 20 26 70 53 74  rse, pExpr, &pSt
b6d0: 72 31 2c 20 26 69 73 43 6f 6d 70 6c 65 74 65 2c  r1, &isComplete,
b6e0: 20 26 6e 6f 43 61 73 65 29 0a 20 20 29 7b 0a 20   &noCase).  ){. 
b6f0: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20     Expr *pLeft; 
b700: 20 20 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66 20        /* LHS of 
b710: 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74  LIKE/GLOB operat
b720: 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a  or */.    Expr *
b730: 70 53 74 72 32 3b 20 20 20 20 20 20 20 2f 2a 20  pStr2;       /* 
b740: 43 6f 70 79 20 6f 66 20 70 53 74 72 31 20 2d 20  Copy of pStr1 - 
b750: 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42  RHS of LIKE/GLOB
b760: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
b770: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 31   Expr *pNewExpr1
b780: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  ;.    Expr *pNew
b790: 45 78 70 72 32 3b 0a 20 20 20 20 69 6e 74 20 69  Expr2;.    int i
b7a0: 64 78 4e 65 77 31 3b 0a 20 20 20 20 69 6e 74 20  dxNew1;.    int 
b7b0: 69 64 78 4e 65 77 32 3b 0a 0a 20 20 20 20 70 4c  idxNew2;..    pL
b7c0: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  eft = pExpr->x.p
b7d0: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
b7e0: 3b 0a 20 20 20 20 70 53 74 72 32 20 3d 20 73 71  ;.    pStr2 = sq
b7f0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
b800: 20 70 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20   pStr1, 0);.    
b810: 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
b820: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 75  ailed ){.      u
b830: 38 20 63 2c 20 2a 70 43 3b 20 20 20 20 20 20 20  8 c, *pC;       
b840: 2f 2a 20 4c 61 73 74 20 63 68 61 72 61 63 74 65  /* Last characte
b850: 72 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  r before the fir
b860: 73 74 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20  st wildcard */. 
b870: 20 20 20 20 20 70 43 20 3d 20 28 75 38 2a 29 26       pC = (u8*)&
b880: 70 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pStr2->u.zToken[
b890: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
b8a0: 70 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pStr2->u.zToken)
b8b0: 2d 31 5d 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a  -1];.      c = *
b8c0: 70 43 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f  pC;.      if( no
b8d0: 43 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Case ){.        
b8e0: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 20 69 73 20  /* The point is 
b8f0: 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  to increment the
b900: 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20   last character 
b910: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
b920: 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 64  .        ** wild
b930: 63 61 72 64 2e 20 20 42 75 74 20 69 66 20 77 65  card.  But if we
b940: 20 69 6e 63 72 65 6d 65 6e 74 20 27 40 27 2c 20   increment '@', 
b950: 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20 69  that will push i
b960: 74 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  t into the.     
b970: 20 20 20 2a 2a 20 61 6c 70 68 61 62 65 74 69 63     ** alphabetic
b980: 20 72 61 6e 67 65 20 77 68 65 72 65 20 63 61 73   range where cas
b990: 65 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 77 69  e conversions wi
b9a0: 6c 6c 20 6d 65 73 73 20 75 70 20 74 68 65 20 0a  ll mess up the .
b9b0: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 65 71 75          ** inequ
b9c0: 61 6c 69 74 79 2e 20 20 54 6f 20 61 76 6f 69 64  ality.  To avoid
b9d0: 20 74 68 69 73 2c 20 6d 61 6b 65 20 73 75 72 65   this, make sure
b9e0: 20 74 6f 20 61 6c 73 6f 20 72 75 6e 20 74 68 65   to also run the
b9f0: 20 66 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a   full.        **
ba00: 20 4c 49 4b 45 20 6f 6e 20 61 6c 6c 20 63 61 6e   LIKE on all can
ba10: 64 69 64 61 74 65 20 65 78 70 72 65 73 73 69 6f  didate expressio
ba20: 6e 73 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74  ns by clearing t
ba30: 68 65 20 69 73 43 6f 6d 70 6c 65 74 65 20 66 6c  he isComplete fl
ba40: 61 67 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ag.        */.  
ba50: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 41 27        if( c=='A'
ba60: 2d 31 20 29 20 69 73 43 6f 6d 70 6c 65 74 65 20  -1 ) isComplete 
ba70: 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 63 20  = 0;..        c 
ba80: 3d 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f  = sqlite3UpperTo
ba90: 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20 20 20 20 20  Lower[c];.      
baa0: 7d 0a 20 20 20 20 20 20 2a 70 43 20 3d 20 63 20  }.      *pC = c 
bab0: 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  + 1;.    }.    p
bac0: 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74  NewExpr1 = sqlit
bad0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
bae0: 54 4b 5f 47 45 2c 20 73 71 6c 69 74 65 33 45 78  TK_GE, sqlite3Ex
baf0: 70 72 44 75 70 28 64 62 2c 70 4c 65 66 74 2c 30  prDup(db,pLeft,0
bb00: 29 2c 70 53 74 72 31 2c 30 29 3b 0a 20 20 20 20  ),pStr1,0);.    
bb10: 69 64 78 4e 65 77 31 20 3d 20 77 68 65 72 65 43  idxNew1 = whereC
bb20: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
bb30: 20 70 4e 65 77 45 78 70 72 31 2c 20 54 45 52 4d   pNewExpr1, TERM
bb40: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
bb50: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73 74  NAMIC);.    test
bb60: 63 61 73 65 28 20 69 64 78 4e 65 77 31 3d 3d 30  case( idxNew1==0
bb70: 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c   );.    exprAnal
bb80: 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69  yze(pSrc, pWC, i
bb90: 64 78 4e 65 77 31 29 3b 0a 20 20 20 20 70 4e 65  dxNew1);.    pNe
bba0: 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65 33  wExpr2 = sqlite3
bbb0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
bbc0: 5f 4c 54 2c 20 73 71 6c 69 74 65 33 45 78 70 72  _LT, sqlite3Expr
bbd0: 44 75 70 28 64 62 2c 70 4c 65 66 74 2c 30 29 2c  Dup(db,pLeft,0),
bbe0: 70 53 74 72 32 2c 30 29 3b 0a 20 20 20 20 69 64  pStr2,0);.    id
bbf0: 78 4e 65 77 32 20 3d 20 77 68 65 72 65 43 6c 61  xNew2 = whereCla
bc00: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
bc10: 4e 65 77 45 78 70 72 32 2c 20 54 45 52 4d 5f 56  NewExpr2, TERM_V
bc20: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
bc30: 4d 49 43 29 3b 0a 20 20 20 20 74 65 73 74 63 61  MIC);.    testca
bc40: 73 65 28 20 69 64 78 4e 65 77 32 3d 3d 30 20 29  se( idxNew2==0 )
bc50: 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  ;.    exprAnalyz
bc60: 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78  e(pSrc, pWC, idx
bc70: 4e 65 77 32 29 3b 0a 20 20 20 20 70 54 65 72 6d  New2);.    pTerm
bc80: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
bc90: 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 43  rm];.    if( isC
bca0: 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  omplete ){.     
bcb0: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31 5d   pWC->a[idxNew1]
bcc0: 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
bcd0: 72 6d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61  rm;.      pWC->a
bce0: 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61 72 65 6e  [idxNew2].iParen
bcf0: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
bd00: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
bd10: 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 2;.    }.  }.
bd20: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
bd30: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
bd40: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e  IZATION */..#ifn
bd50: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
bd60: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f  VIRTUALTABLE.  /
bd70: 2a 20 41 64 64 20 61 20 57 4f 5f 4d 41 54 43 48  * Add a WO_MATCH
bd80: 20 61 75 78 69 6c 69 61 72 79 20 74 65 72 6d 20   auxiliary term 
bd90: 74 6f 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  to the constrain
bda0: 74 20 73 65 74 20 69 66 20 74 68 65 0a 20 20 2a  t set if the.  *
bdb0: 2a 20 63 75 72 72 65 6e 74 20 65 78 70 72 65 73  * current expres
bdc0: 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66  sion is of the f
bdd0: 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41 54  orm:  column MAT
bde0: 43 48 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54 68  CH expr..  ** Th
bdf0: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
be00: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 78 42  s used by the xB
be10: 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 73  estIndex methods
be20: 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c   of.  ** virtual
be30: 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20 6e 61   tables.  The na
be40: 74 69 76 65 20 71 75 65 72 79 20 6f 70 74 69 6d  tive query optim
be50: 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20 61 74  izer does not at
be60: 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f  tempt.  ** to do
be70: 20 61 6e 79 74 68 69 6e 67 20 77 69 74 68 20 4d   anything with M
be80: 41 54 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  ATCH functions..
be90: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61 74    */.  if( isMat
bea0: 63 68 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70 72  chOfColumn(pExpr
beb0: 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78  ) ){.    int idx
bec0: 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  New;.    Expr *p
bed0: 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20  Right, *pLeft;. 
bee0: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e     WhereTerm *pN
bef0: 65 77 54 65 72 6d 3b 0a 20 20 20 20 42 69 74 6d  ewTerm;.    Bitm
bf00: 61 73 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e  ask prereqColumn
bf10: 2c 20 70 72 65 72 65 71 45 78 70 72 3b 0a 0a 20  , prereqExpr;.. 
bf20: 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70     pRight = pExp
bf30: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d  r->x.pList->a[0]
bf40: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 4c 65 66  .pExpr;.    pLef
bf50: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
bf60: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
bf70: 20 20 20 20 70 72 65 72 65 71 45 78 70 72 20 3d      prereqExpr =
bf80: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
bf90: 70 4d 61 73 6b 53 65 74 2c 20 70 52 69 67 68 74  pMaskSet, pRight
bfa0: 29 3b 0a 20 20 20 20 70 72 65 72 65 71 43 6f 6c  );.    prereqCol
bfb0: 75 6d 6e 20 3d 20 65 78 70 72 54 61 62 6c 65 55  umn = exprTableU
bfc0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
bfd0: 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 28  Left);.    if( (
bfe0: 70 72 65 72 65 71 45 78 70 72 20 26 20 70 72 65  prereqExpr & pre
bff0: 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b  reqColumn)==0 ){
c000: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
c010: 77 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65  wExpr;.      pNe
c020: 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  wExpr = sqlite3P
c030: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
c040: 4d 41 54 43 48 2c 20 0a 20 20 20 20 20 20 20 20  MATCH, .        
c050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c060: 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33        0, sqlite3
c070: 45 78 70 72 44 75 70 28 64 62 2c 20 70 52 69 67  ExprDup(db, pRig
c080: 68 74 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20 20  ht, 0), 0);.    
c090: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
c0a0: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
c0b0: 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d  , pNewExpr, TERM
c0c0: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
c0d0: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65  NAMIC);.      te
c0e0: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d  stcase( idxNew==
c0f0: 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  0 );.      pNewT
c100: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
c110: 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65  xNew];.      pNe
c120: 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  wTerm->prereqRig
c130: 68 74 20 3d 20 70 72 65 72 65 71 45 78 70 72 3b  ht = prereqExpr;
c140: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
c150: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
c160: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
c170: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c     pNewTerm->u.l
c180: 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66  eftColumn = pLef
c190: 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
c1a0: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65    pNewTerm->eOpe
c1b0: 72 61 74 6f 72 20 3d 20 57 4f 5f 4d 41 54 43 48  rator = WO_MATCH
c1c0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
c1d0: 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ->iParent = idxT
c1e0: 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  erm;.      pTerm
c1f0: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
c200: 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  rm];.      pTerm
c210: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
c220: 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
c230: 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45  gs |= TERM_COPIE
c240: 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  D;.      pNewTer
c250: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70  m->prereqAll = p
c260: 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b  Term->prereqAll;
c270: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
c280: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
c290: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
c2a0: 0a 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 4f  ..  /* Prevent O
c2b0: 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f  N clause terms o
c2c0: 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 66 72  f a LEFT JOIN fr
c2d0: 6f 6d 20 62 65 69 6e 67 20 75 73 65 64 20 74 6f  om being used to
c2e0: 20 64 72 69 76 65 0a 20 20 2a 2a 20 61 6e 20 69   drive.  ** an i
c2f0: 6e 64 65 78 20 66 6f 72 20 74 61 62 6c 65 73 20  ndex for tables 
c300: 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74  to the left of t
c310: 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20  he join..  */.  
c320: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
c330: 68 74 20 7c 3d 20 65 78 74 72 61 52 69 67 68 74  ht |= extraRight
c340: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
c350: 6e 20 54 52 55 45 20 69 66 20 61 6e 79 20 6f 66  n TRUE if any of
c360: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
c370: 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69   in pList->a[iFi
c380: 72 73 74 2e 2e 2e 5d 20 63 6f 6e 74 61 69 6e 0a  rst...] contain.
c390: 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ** a reference t
c3a0: 6f 20 61 6e 79 20 74 61 62 6c 65 20 6f 74 68 65  o any table othe
c3b0: 72 20 74 68 61 6e 20 74 68 65 20 69 42 61 73 65  r than the iBase
c3c0: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
c3d0: 63 20 69 6e 74 20 72 65 66 65 72 65 6e 63 65 73  c int references
c3e0: 4f 74 68 65 72 54 61 62 6c 65 73 28 0a 20 20 45  OtherTables(.  E
c3f0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
c400: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72           /* Sear
c410: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  ch expressions i
c420: 6e 20 74 68 73 20 6c 69 73 74 20 2a 2f 0a 20 20  n ths list */.  
c430: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
c440: 61 73 6b 53 65 74 2c 20 20 20 2f 2a 20 4d 61 70  askSet,   /* Map
c450: 70 69 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65 73  ping from tables
c460: 20 74 6f 20 62 69 74 6d 61 70 73 20 2a 2f 0a 20   to bitmaps */. 
c470: 20 69 6e 74 20 69 46 69 72 73 74 2c 20 20 20 20   int iFirst,    
c480: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65             /* Be
c490: 20 73 65 61 72 63 68 69 6e 67 20 77 69 74 68 20   searching with 
c4a0: 74 68 65 20 69 46 69 72 73 74 2d 74 68 20 65 78  the iFirst-th ex
c4b0: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
c4c0: 74 20 69 42 61 73 65 20 20 20 20 20 20 20 20 20  t iBase         
c4d0: 20 20 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72          /* Ignor
c4e0: 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
c4f0: 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  this table */.){
c500: 0a 20 20 42 69 74 6d 61 73 6b 20 61 6c 6c 6f 77  .  Bitmask allow
c510: 65 64 20 3d 20 7e 67 65 74 4d 61 73 6b 28 70 4d  ed = ~getMask(pM
c520: 61 73 6b 53 65 74 2c 20 69 42 61 73 65 29 3b 0a  askSet, iBase);.
c530: 20 20 77 68 69 6c 65 28 20 69 46 69 72 73 74 3c    while( iFirst<
c540: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  pList->nExpr ){.
c550: 20 20 20 20 69 66 28 20 28 65 78 70 72 54 61 62      if( (exprTab
c560: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
c570: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73  , pList->a[iFirs
c580: 74 2b 2b 5d 2e 70 45 78 70 72 29 26 61 6c 6c 6f  t++].pExpr)&allo
c590: 77 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  wed)!=0 ){.     
c5a0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
c5b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
c5c0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
c5d0: 72 6f 75 74 69 6e 65 20 64 65 63 69 64 65 73 20  routine decides 
c5e0: 69 66 20 70 49 64 78 20 63 61 6e 20 62 65 20 75  if pIdx can be u
c5f0: 73 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 74  sed to satisfy t
c600: 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63  he ORDER BY.** c
c610: 6c 61 75 73 65 2e 20 20 49 66 20 69 74 20 63 61  lause.  If it ca
c620: 6e 2c 20 69 74 20 72 65 74 75 72 6e 73 20 31 2e  n, it returns 1.
c630: 20 20 49 66 20 70 49 64 78 20 63 61 6e 6e 6f 74    If pIdx cannot
c640: 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a 20   satisfy the.** 
c650: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
c660: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
c670: 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 70  turns 0..**.** p
c680: 4f 72 64 65 72 42 79 20 69 73 20 61 6e 20 4f 52  OrderBy is an OR
c690: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 72  DER BY clause fr
c6a0: 6f 6d 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  om a SELECT stat
c6b0: 65 6d 65 6e 74 2e 20 20 70 54 61 62 20 69 73 20  ement.  pTab is 
c6c0: 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74  the.** left-most
c6d0: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52   table in the FR
c6e0: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61  OM clause of tha
c6f0: 74 20 73 61 6d 65 20 53 45 4c 45 43 54 20 73 74  t same SELECT st
c700: 61 74 65 6d 65 6e 74 20 61 6e 64 0a 2a 2a 20 74  atement and.** t
c710: 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 63  he table has a c
c720: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
c730: 22 62 61 73 65 22 2e 20 20 70 49 64 78 20 69 73  "base".  pIdx is
c740: 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 70 54 61   an index on pTa
c750: 62 2e 0a 2a 2a 0a 2a 2a 20 6e 45 71 43 6f 6c 20  b..**.** nEqCol 
c760: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
c770: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 70 49 64 78   columns of pIdx
c780: 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20 61   that are used a
c790: 73 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 63 6f  s equality.** co
c7a0: 6e 73 74 72 61 69 6e 74 73 2e 20 20 41 6e 79 20  nstraints.  Any 
c7b0: 6f 66 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73  of these columns
c7c0: 20 6d 61 79 20 62 65 20 6d 69 73 73 69 6e 67 20   may be missing 
c7d0: 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20 42  from the ORDER B
c7e0: 59 0a 2a 2a 20 63 6c 61 75 73 65 20 61 6e 64 20  Y.** clause and 
c7f0: 74 68 65 20 6d 61 74 63 68 20 63 61 6e 20 73 74  the match can st
c800: 69 6c 6c 20 62 65 20 61 20 73 75 63 63 65 73 73  ill be a success
c810: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 65 72 6d  ..**.** All term
c820: 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  s of the ORDER B
c830: 59 20 74 68 61 74 20 6d 61 74 63 68 20 61 67 61  Y that match aga
c840: 69 6e 73 74 20 74 68 65 20 69 6e 64 65 78 20 6d  inst the index m
c850: 75 73 74 20 62 65 20 65 69 74 68 65 72 0a 2a 2a  ust be either.**
c860: 20 41 53 43 20 6f 72 20 44 45 53 43 2e 20 20 28   ASC or DESC.  (
c870: 54 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44  Terms of the ORD
c880: 45 52 20 42 59 20 63 6c 61 75 73 65 20 70 61 73  ER BY clause pas
c890: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 55  t the end of a U
c8a0: 4e 49 51 55 45 0a 2a 2a 20 69 6e 64 65 78 20 64  NIQUE.** index d
c8b0: 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 73 61  o not need to sa
c8c0: 74 69 73 66 79 20 74 68 69 73 20 63 6f 6e 73 74  tisfy this const
c8d0: 72 61 69 6e 74 2e 29 20 20 54 68 65 20 2a 70 62  raint.)  The *pb
c8e0: 52 65 76 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20  Rev value is.** 
c8f0: 73 65 74 20 74 6f 20 31 20 69 66 20 74 68 65 20  set to 1 if the 
c900: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
c910: 69 73 20 61 6c 6c 20 44 45 53 43 20 61 6e 64 20  is all DESC and 
c920: 69 74 20 69 73 20 73 65 74 20 74 6f 20 30 20 69  it is set to 0 i
c930: 66 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42  f.** the ORDER B
c940: 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c 6c 20  Y clause is all 
c950: 41 53 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ASC..*/.static i
c960: 6e 74 20 69 73 53 6f 72 74 69 6e 67 49 6e 64 65  nt isSortingInde
c970: 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
c980: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
c990: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
c9a0: 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
c9b0: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 2f 2a 20  t *pMaskSet, /* 
c9c0: 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 61 62  Mapping from tab
c9d0: 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  le cursor number
c9e0: 73 20 74 6f 20 62 69 74 6d 61 70 73 20 2a 2f 0a  s to bitmaps */.
c9f0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
ca00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
ca10: 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 74 65   index we are te
ca20: 73 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 62  sting */.  int b
ca30: 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ase,            
ca40: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
ca50: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
ca60: 65 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a  e to be sorted *
ca70: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
ca80: 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 54  rderBy,     /* T
ca90: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
caa0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 43  se */.  int nEqC
cab0: 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
cac0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64  /* Number of ind
cad0: 65 78 20 63 6f 6c 75 6d 6e 73 20 77 69 74 68 20  ex columns with 
cae0: 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  == constraints *
caf0: 2f 0a 20 20 69 6e 74 20 2a 70 62 52 65 76 20 20  /.  int *pbRev  
cb00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
cb10: 65 74 20 74 6f 20 31 20 69 66 20 4f 52 44 45 52  et to 1 if ORDER
cb20: 20 42 59 20 69 73 20 44 45 53 43 20 2a 2f 0a 29   BY is DESC */.)
cb30: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
cb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb50: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
cb60: 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 73 6f  ters */.  int so
cb70: 72 74 4f 72 64 65 72 20 3d 20 30 3b 20 20 20 20  rtOrder = 0;    
cb80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58 4f 52            /* XOR
cb90: 20 6f 66 20 69 6e 64 65 78 20 61 6e 64 20 4f 52   of index and OR
cba0: 44 45 52 20 42 59 20 73 6f 72 74 20 64 69 72 65  DER BY sort dire
cbb0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  ction */.  int n
cbc0: 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
cbd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
cbe0: 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59  mber of ORDER BY
cbf0: 20 74 65 72 6d 73 20 2a 2f 0a 20 20 73 74 72 75   terms */.  stru
cc00: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
cc10: 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20 41   *pTerm;    /* A
cc20: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44   term of the ORD
cc30: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
cc40: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
cc50: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 61  pParse->db;..  a
cc60: 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21  ssert( pOrderBy!
cc70: 3d 30 20 29 3b 0a 20 20 6e 54 65 72 6d 20 3d 20  =0 );.  nTerm = 
cc80: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
cc90: 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 72 6d  .  assert( nTerm
cca0: 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 72 67 75  >0 );..  /* Argu
ccb0: 6d 65 6e 74 20 70 49 64 78 20 6d 75 73 74 20 65  ment pIdx must e
ccc0: 69 74 68 65 72 20 70 6f 69 6e 74 20 74 6f 20 61  ither point to a
ccd0: 20 27 72 65 61 6c 27 20 6e 61 6d 65 64 20 69 6e   'real' named in
cce0: 64 65 78 20 73 74 72 75 63 74 75 72 65 2c 20 0a  dex structure, .
ccf0: 20 20 2a 2a 20 6f 72 20 61 6e 20 69 6e 64 65 78    ** or an index
cd00: 20 73 74 72 75 63 74 75 72 65 20 61 6c 6c 6f 63   structure alloc
cd10: 61 74 65 64 20 6f 6e 20 74 68 65 20 73 74 61 63  ated on the stac
cd20: 6b 20 62 79 20 62 65 73 74 42 74 72 65 65 49 6e  k by bestBtreeIn
cd30: 64 65 78 28 29 20 74 6f 0a 20 20 2a 2a 20 72 65  dex() to.  ** re
cd40: 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69  present the rowi
cd50: 64 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20  d index that is 
cd60: 70 61 72 74 20 6f 66 20 65 76 65 72 79 20 74 61  part of every ta
cd70: 62 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ble.  */.  asser
cd80: 74 28 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 7c  t( pIdx->zName |
cd90: 7c 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  | (pIdx->nColumn
cda0: 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e 61 69 43  ==1 && pIdx->aiC
cdb0: 6f 6c 75 6d 6e 5b 30 5d 3d 3d 2d 31 29 20 29 3b  olumn[0]==-1) );
cdc0: 0a 0a 20 20 2f 2a 20 4d 61 74 63 68 20 74 65 72  ..  /* Match ter
cdd0: 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
cde0: 42 59 20 63 6c 61 75 73 65 20 61 67 61 69 6e 73  BY clause agains
cdf0: 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 2a  t columns of.  *
ce00: 2a 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a  * the index..  *
ce10: 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74  *.  ** Note that
ce20: 20 69 6e 64 69 63 65 73 20 68 61 76 65 20 70 49   indices have pI
ce30: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 72 65 67 75  dx->nColumn regu
ce40: 6c 61 72 20 63 6f 6c 75 6d 6e 73 20 70 6c 75 73  lar columns plus
ce50: 0a 20 20 2a 2a 20 6f 6e 65 20 61 64 64 69 74 69  .  ** one additi
ce60: 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74  onal column cont
ce70: 61 69 6e 69 6e 67 20 74 68 65 20 72 6f 77 69 64  aining the rowid
ce80: 2e 20 20 54 68 65 20 72 6f 77 69 64 20 63 6f 6c  .  The rowid col
ce90: 75 6d 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  umn.  ** of the 
cea0: 69 6e 64 65 78 20 69 73 20 61 6c 73 6f 20 61 6c  index is also al
ceb0: 6c 6f 77 65 64 20 74 6f 20 6d 61 74 63 68 20 61  lowed to match a
cec0: 67 61 69 6e 73 74 20 74 68 65 20 4f 52 44 45 52  gainst the ORDER
ced0: 20 42 59 0a 20 20 2a 2a 20 63 6c 61 75 73 65 2e   BY.  ** clause.
cee0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6a 3d  .  */.  for(i=j=
cef0: 30 2c 20 70 54 65 72 6d 3d 70 4f 72 64 65 72 42  0, pTerm=pOrderB
cf00: 79 2d 3e 61 3b 20 6a 3c 6e 54 65 72 6d 20 26 26  y->a; j<nTerm &&
cf10: 20 69 3c 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   i<=pIdx->nColum
cf20: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  n; i++){.    Exp
cf30: 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20  r *pExpr;       
cf40: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
cf50: 6e 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  n of the ORDER B
cf60: 59 20 70 54 65 72 6d 20 2a 2f 0a 20 20 20 20 43  Y pTerm */.    C
cf70: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
cf80: 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69    /* The collati
cf90: 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20 70  ng sequence of p
cfa0: 45 78 70 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  Expr */.    int 
cfb0: 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 3b 20 2f  termSortOrder; /
cfc0: 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 66 6f 72  * Sort order for
cfd0: 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20   this term */.  
cfe0: 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20    int iColumn;  
cff0: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68       /* The i-th
d000: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
d010: 6e 64 65 78 2e 20 20 2d 31 20 66 6f 72 20 72 6f  ndex.  -1 for ro
d020: 77 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  wid */.    int i
d030: 53 6f 72 74 4f 72 64 65 72 3b 20 20 20 20 2f 2a  SortOrder;    /*
d040: 20 31 20 66 6f 72 20 44 45 53 43 2c 20 30 20 66   1 for DESC, 0 f
d050: 6f 72 20 41 53 43 20 6f 6e 20 74 68 65 20 69 2d  or ASC on the i-
d060: 74 68 20 69 6e 64 65 78 20 74 65 72 6d 20 2a 2f  th index term */
d070: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
d080: 2a 7a 43 6f 6c 6c 3b 20 2f 2a 20 4e 61 6d 65 20  *zColl; /* Name 
d090: 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  of the collating
d0a0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 69 2d   sequence for i-
d0b0: 74 68 20 69 6e 64 65 78 20 74 65 72 6d 20 2a 2f  th index term */
d0c0: 0a 0a 20 20 20 20 70 45 78 70 72 20 3d 20 70 54  ..    pExpr = pT
d0d0: 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
d0e0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
d0f0: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70  K_COLUMN || pExp
d100: 72 2d 3e 69 54 61 62 6c 65 21 3d 62 61 73 65 20  r->iTable!=base 
d110: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 6e 20  ){.      /* Can 
d120: 6e 6f 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78  not use an index
d130: 20 73 6f 72 74 20 6f 6e 20 61 6e 79 74 68 69 6e   sort on anythin
d140: 67 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20  g that is not a 
d150: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 0a 20 20  column in the.  
d160: 20 20 20 20 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74      ** left-most
d170: 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 46 52   table of the FR
d180: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
d190: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d1a0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
d1b0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
d1c0: 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
d1d0: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b     if( !pColl ){
d1e0: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64  .      pColl = d
d1f0: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
d200: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64 78    }.    if( pIdx
d210: 2d 3e 7a 4e 61 6d 65 20 26 26 20 69 3c 70 49 64  ->zName && i<pId
d220: 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  x->nColumn ){.  
d230: 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49      iColumn = pI
d240: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  dx->aiColumn[i];
d250: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75  .      if( iColu
d260: 6d 6e 3d 3d 70 49 64 78 2d 3e 70 54 61 62 6c 65  mn==pIdx->pTable
d270: 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20  ->iPKey ){.     
d280: 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b     iColumn = -1;
d290: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
d2a0: 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 49 64 78  SortOrder = pIdx
d2b0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b  ->aSortOrder[i];
d2c0: 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70  .      zColl = p
d2d0: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  Idx->azColl[i];.
d2e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d2f0: 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20   iColumn = -1;. 
d300: 20 20 20 20 20 69 53 6f 72 74 4f 72 64 65 72 20       iSortOrder 
d310: 3d 20 30 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c  = 0;.      zColl
d320: 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b   = pColl->zName;
d330: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
d340: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69  Expr->iColumn!=i
d350: 43 6f 6c 75 6d 6e 20 7c 7c 20 73 71 6c 69 74 65  Column || sqlite
d360: 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
d370: 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b  zName, zColl) ){
d380: 0a 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 6a  .      /* Term j
d390: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
d3a0: 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74   clause does not
d3b0: 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 69 20   match column i 
d3c0: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  of the index */.
d3d0: 20 20 20 20 20 20 69 66 28 20 69 3c 6e 45 71 43        if( i<nEqC
d3e0: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ol ){.        /*
d3f0: 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c   If an index col
d400: 75 6d 6e 20 74 68 61 74 20 69 73 20 63 6f 6e 73  umn that is cons
d410: 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 20 66 61  trained by == fa
d420: 69 6c 73 20 74 6f 20 6d 61 74 63 68 20 61 6e 0a  ils to match an.
d430: 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52          ** ORDER
d440: 20 42 59 20 74 65 72 6d 2c 20 74 68 61 74 20 69   BY term, that i
d450: 73 20 4f 4b 2e 20 20 4a 75 73 74 20 69 67 6e 6f  s OK.  Just igno
d460: 72 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 6f  re that column o
d470: 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20  f the index.    
d480: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63      */.        c
d490: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
d4a0: 65 6c 73 65 20 69 66 28 20 69 3d 3d 70 49 64 78  else if( i==pIdx
d4b0: 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->nColumn ){.   
d4c0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 63 6f       /* Index co
d4d0: 6c 75 6d 6e 20 69 20 69 73 20 74 68 65 20 72 6f  lumn i is the ro
d4e0: 77 69 64 2e 20 20 41 6c 6c 20 6f 74 68 65 72 20  wid.  All other 
d4f0: 74 65 72 6d 73 20 6d 61 74 63 68 2e 20 2a 2f 0a  terms match. */.
d500: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
d510: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d520: 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 69 6e 64      /* If an ind
d530: 65 78 20 63 6f 6c 75 6d 6e 20 66 61 69 6c 73 20  ex column fails 
d540: 74 6f 20 6d 61 74 63 68 20 61 6e 64 20 69 73 20  to match and is 
d550: 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65 64 20  not constrained 
d560: 62 79 20 3d 3d 0a 20 20 20 20 20 20 20 20 2a 2a  by ==.        **
d570: 20 74 68 65 6e 20 74 68 65 20 69 6e 64 65 78 20   then the index 
d580: 63 61 6e 6e 6f 74 20 73 61 74 69 73 66 79 20 74  cannot satisfy t
d590: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6f 6e 73  he ORDER BY cons
d5a0: 74 72 61 69 6e 74 2e 0a 20 20 20 20 20 20 20 20  traint..        
d5b0: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
d5c0: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
d5d0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
d5e0: 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21  Idx->aSortOrder!
d5f0: 3d 30 20 7c 7c 20 69 43 6f 6c 75 6d 6e 3d 3d 2d  =0 || iColumn==-
d600: 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
d610: 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65   pTerm->sortOrde
d620: 72 3d 3d 30 20 7c 7c 20 70 54 65 72 6d 2d 3e 73  r==0 || pTerm->s
d630: 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29 3b 0a 20  ortOrder==1 );. 
d640: 20 20 20 61 73 73 65 72 74 28 20 69 53 6f 72 74     assert( iSort
d650: 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 69 53 6f 72  Order==0 || iSor
d660: 74 4f 72 64 65 72 3d 3d 31 20 29 3b 0a 20 20 20  tOrder==1 );.   
d670: 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 20 3d   termSortOrder =
d680: 20 69 53 6f 72 74 4f 72 64 65 72 20 5e 20 70 54   iSortOrder ^ pT
d690: 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a  erm->sortOrder;.
d6a0: 20 20 20 20 69 66 28 20 69 3e 6e 45 71 43 6f 6c      if( i>nEqCol
d6b0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 74 65   ){.      if( te
d6c0: 72 6d 53 6f 72 74 4f 72 64 65 72 21 3d 73 6f 72  rmSortOrder!=sor
d6d0: 74 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 20 20  tOrder ){.      
d6e0: 20 20 2f 2a 20 49 6e 64 69 63 65 73 20 63 61 6e    /* Indices can
d6f0: 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 69 66   only be used if
d700: 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20 74 65   all ORDER BY te
d710: 72 6d 73 20 70 61 73 74 20 74 68 65 0a 20 20 20  rms past the.   
d720: 20 20 20 20 20 2a 2a 20 65 71 75 61 6c 69 74 79       ** equality
d730: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
d740: 20 61 6c 6c 20 65 69 74 68 65 72 20 44 45 53 43   all either DESC
d750: 20 6f 72 20 41 53 43 2e 20 2a 2f 0a 20 20 20 20   or ASC. */.    
d760: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
d770: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
d780: 0a 20 20 20 20 20 20 73 6f 72 74 4f 72 64 65 72  .      sortOrder
d790: 20 3d 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72   = termSortOrder
d7a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b  ;.    }.    j++;
d7b0: 0a 20 20 20 20 70 54 65 72 6d 2b 2b 3b 0a 20 20  .    pTerm++;.  
d7c0: 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20    if( iColumn<0 
d7d0: 26 26 20 21 72 65 66 65 72 65 6e 63 65 73 4f 74  && !referencesOt
d7e0: 68 65 72 54 61 62 6c 65 73 28 70 4f 72 64 65 72  herTables(pOrder
d7f0: 42 79 2c 20 70 4d 61 73 6b 53 65 74 2c 20 6a 2c  By, pMaskSet, j,
d800: 20 62 61 73 65 29 20 29 7b 0a 20 20 20 20 20 20   base) ){.      
d810: 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 65  /* If the indexe
d820: 64 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20  d column is the 
d830: 70 72 69 6d 61 72 79 20 6b 65 79 20 61 6e 64 20  primary key and 
d840: 65 76 65 72 79 74 68 69 6e 67 20 6d 61 74 63 68  everything match
d850: 65 73 0a 20 20 20 20 20 20 2a 2a 20 73 6f 20 66  es.      ** so f
d860: 61 72 20 61 6e 64 20 6e 6f 6e 65 20 6f 66 20 74  ar and none of t
d870: 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  he ORDER BY term
d880: 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 72  s to the right r
d890: 65 66 65 72 65 6e 63 65 20 6f 74 68 65 72 0a 20  eference other. 
d8a0: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 69       ** tables i
d8b0: 6e 20 74 68 65 20 6a 6f 69 6e 2c 20 74 68 65 6e  n the join, then
d8c0: 20 77 65 20 61 72 65 20 61 73 73 75 72 65 64 20   we are assured 
d8d0: 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 63  that the index c
d8e0: 61 6e 20 62 65 20 75 73 65 64 20 0a 20 20 20 20  an be used .    
d8f0: 20 20 2a 2a 20 74 6f 20 73 6f 72 74 20 62 65 63    ** to sort bec
d900: 61 75 73 65 20 74 68 65 20 70 72 69 6d 61 72 79  ause the primary
d910: 20 6b 65 79 20 69 73 20 75 6e 69 71 75 65 20 61   key is unique a
d920: 6e 64 20 73 6f 20 6e 6f 6e 65 20 6f 66 20 74 68  nd so none of th
d930: 65 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  e other.      **
d940: 20 63 6f 6c 75 6d 6e 73 20 77 69 6c 6c 20 6d 61   columns will ma
d950: 6b 65 20 61 6e 79 20 64 69 66 66 65 72 65 6e 63  ke any differenc
d960: 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  e.      */.     
d970: 20 6a 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20   j = nTerm;.    
d980: 7d 0a 20 20 7d 0a 0a 20 20 2a 70 62 52 65 76 20  }.  }..  *pbRev 
d990: 3d 20 73 6f 72 74 4f 72 64 65 72 21 3d 30 3b 0a  = sortOrder!=0;.
d9a0: 20 20 69 66 28 20 6a 3e 3d 6e 54 65 72 6d 20 29    if( j>=nTerm )
d9b0: 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 74 65 72  {.    /* All ter
d9c0: 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
d9d0: 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 63 6f  BY clause are co
d9e0: 76 65 72 65 64 20 62 79 20 74 68 69 73 20 69 6e  vered by this in
d9f0: 64 65 78 20 73 6f 0a 20 20 20 20 2a 2a 20 74 68  dex so.    ** th
da00: 69 73 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20  is index can be 
da10: 75 73 65 64 20 66 6f 72 20 73 6f 72 74 69 6e 67  used for sorting
da20: 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
da30: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64  1;.  }.  if( pId
da40: 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
da50: 6f 6e 65 20 26 26 20 69 3d 3d 70 49 64 78 2d 3e  one && i==pIdx->
da60: 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 26 26  nColumn.      &&
da70: 20 21 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65   !referencesOthe
da80: 72 54 61 62 6c 65 73 28 70 4f 72 64 65 72 42 79  rTables(pOrderBy
da90: 2c 20 70 4d 61 73 6b 53 65 74 2c 20 6a 2c 20 62  , pMaskSet, j, b
daa0: 61 73 65 29 20 29 7b 0a 20 20 20 20 2f 2a 20 41  ase) ){.    /* A
dab0: 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 69 73  ll terms of this
dac0: 20 69 6e 64 65 78 20 6d 61 74 63 68 20 73 6f 6d   index match som
dad0: 65 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20  e prefix of the 
dae0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a  ORDER BY clause.
daf0: 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 69      ** and the i
db00: 6e 64 65 78 20 69 73 20 55 4e 49 51 55 45 20 61  ndex is UNIQUE a
db10: 6e 64 20 6e 6f 20 74 65 72 6d 73 20 6f 6e 20 74  nd no terms on t
db20: 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20 4f  he tail of the O
db30: 52 44 45 52 20 42 59 0a 20 20 20 20 2a 2a 20 63  RDER BY.    ** c
db40: 6c 61 75 73 65 20 72 65 66 65 72 65 6e 63 65 20  lause reference 
db50: 6f 74 68 65 72 20 74 61 62 6c 65 73 20 69 6e 20  other tables in 
db60: 61 20 6a 6f 69 6e 2e 20 20 49 66 20 74 68 69 73  a join.  If this
db70: 20 69 73 20 61 6c 6c 20 74 72 75 65 20 74 68 65   is all true the
db80: 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 64  n.    ** the ord
db90: 65 72 20 62 79 20 63 6c 61 75 73 65 20 69 73 20  er by clause is 
dba0: 73 75 70 65 72 66 6c 75 6f 75 73 2e 20 2a 2f 0a  superfluous. */.
dbb0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
dbc0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
dbd0: 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61  ./*.** Prepare a
dbe0: 20 63 72 75 64 65 20 65 73 74 69 6d 61 74 65 20   crude estimate 
dbf0: 6f 66 20 74 68 65 20 6c 6f 67 61 72 69 74 68 6d  of the logarithm
dc00: 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 76 61   of the input va
dc10: 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75  lue..** The resu
dc20: 6c 74 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 20  lts need not be 
dc30: 65 78 61 63 74 2e 20 20 54 68 69 73 20 69 73 20  exact.  This is 
dc40: 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 65 73  only used for es
dc50: 74 69 6d 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20  timating.** the 
dc60: 74 6f 74 61 6c 20 63 6f 73 74 20 6f 66 20 70 65  total cost of pe
dc70: 72 66 6f 72 6d 69 6e 67 20 6f 70 65 72 61 74 69  rforming operati
dc80: 6f 6e 73 20 77 69 74 68 20 4f 28 6c 6f 67 4e 29  ons with O(logN)
dc90: 20 6f 72 20 4f 28 4e 6c 6f 67 4e 29 0a 2a 2a 20   or O(NlogN).** 
dca0: 63 6f 6d 70 6c 65 78 69 74 79 2e 20 20 42 65 63  complexity.  Bec
dcb0: 61 75 73 65 20 4e 20 69 73 20 6a 75 73 74 20 61  ause N is just a
dcc0: 20 67 75 65 73 73 2c 20 69 74 20 69 73 20 6e 6f   guess, it is no
dcd0: 20 67 72 65 61 74 20 74 72 61 67 65 64 79 20 69   great tragedy i
dce0: 66 0a 2a 2a 20 6c 6f 67 4e 20 69 73 20 61 20 6c  f.** logN is a l
dcf0: 69 74 74 6c 65 20 6f 66 66 2e 0a 2a 2f 0a 73 74  ittle off..*/.st
dd00: 61 74 69 63 20 64 6f 75 62 6c 65 20 65 73 74 4c  atic double estL
dd10: 6f 67 28 64 6f 75 62 6c 65 20 4e 29 7b 0a 20 20  og(double N){.  
dd20: 64 6f 75 62 6c 65 20 6c 6f 67 4e 20 3d 20 31 3b  double logN = 1;
dd30: 0a 20 20 64 6f 75 62 6c 65 20 78 20 3d 20 31 30  .  double x = 10
dd40: 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e 78 20 29  ;.  while( N>x )
dd50: 7b 0a 20 20 20 20 6c 6f 67 4e 20 2b 3d 20 31 3b  {.    logN += 1;
dd60: 0a 20 20 20 20 78 20 2a 3d 20 31 30 3b 0a 20 20  .    x *= 10;.  
dd70: 7d 0a 20 20 72 65 74 75 72 6e 20 6c 6f 67 4e 3b  }.  return logN;
dd80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f  .}../*.** Two ro
dd90: 75 74 69 6e 65 73 20 66 6f 72 20 70 72 69 6e 74  utines for print
dda0: 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ing the content 
ddb0: 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e  of an sqlite3_in
ddc0: 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75  dex_info.** stru
ddd0: 63 74 75 72 65 2e 20 20 55 73 65 64 20 66 6f 72  cture.  Used for
dde0: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
ddf0: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66  ugging only.  If
de00: 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49   neither.** SQLI
de10: 54 45 5f 54 45 53 54 20 6f 72 20 53 51 4c 49 54  TE_TEST or SQLIT
de20: 45 5f 44 45 42 55 47 20 61 72 65 20 64 65 66 69  E_DEBUG are defi
de30: 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 73 65 20  ned, then these 
de40: 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20  routines.** are 
de50: 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21  no-ops..*/.#if !
de60: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
de70: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
de80: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
de90: 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69  ITE_DEBUG).stati
dea0: 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58  c void TRACE_IDX
deb0: 5f 49 4e 50 55 54 53 28 73 71 6c 69 74 65 33 5f  _INPUTS(sqlite3_
dec0: 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a  index_info *p){.
ded0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21    int i;.  if( !
dee0: 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
def0: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  e ) return;.  fo
df00: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e  r(i=0; i<p->nCon
df10: 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  straint; i++){. 
df20: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
df30: 72 69 6e 74 66 28 22 20 20 63 6f 6e 73 74 72 61  rintf("  constra
df40: 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20  int[%d]: col=%d 
df50: 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64 20  termid=%d op=%d 
df60: 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20  usabled=%d\n",. 
df70: 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
df80: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
df90: 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ].iColumn,.     
dfa0: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
dfb0: 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 2c  [i].iTermOffset,
dfc0: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
dfd0: 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20  traint[i].op,.  
dfe0: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
dff0: 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b 0a  int[i].usable);.
e000: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
e010: 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69 2b  <p->nOrderBy; i+
e020: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
e030: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72  ebugPrintf("  or
e040: 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25  derby[%d]: col=%
e050: 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20 20  d desc=%d\n",.  
e060: 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70       i,.       p
e070: 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43  ->aOrderBy[i].iC
e080: 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d  olumn,.       p-
e090: 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73  >aOrderBy[i].des
e0a0: 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  c);.  }.}.static
e0b0: 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f   void TRACE_IDX_
e0c0: 4f 55 54 50 55 54 53 28 73 71 6c 69 74 65 33 5f  OUTPUTS(sqlite3_
e0d0: 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a  index_info *p){.
e0e0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21    int i;.  if( !
e0f0: 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
e100: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  e ) return;.  fo
e110: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e  r(i=0; i<p->nCon
e120: 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  straint; i++){. 
e130: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
e140: 72 69 6e 74 66 28 22 20 20 75 73 61 67 65 5b 25  rintf("  usage[%
e150: 64 5d 3a 20 61 72 67 76 49 64 78 3d 25 64 20 6f  d]: argvIdx=%d o
e160: 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  mit=%d\n",.     
e170: 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61    i,.       p->a
e180: 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
e190: 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20 20  i].argvIndex,.  
e1a0: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
e1b0: 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74  intUsage[i].omit
e1c0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
e1d0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 69  DebugPrintf("  i
e1e0: 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e  dxNum=%d\n", p->
e1f0: 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69 74  idxNum);.  sqlit
e200: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
e210: 20 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20 70   idxStr=%s\n", p
e220: 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c  ->idxStr);.  sql
e230: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
e240: 22 20 20 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  "  orderByConsum
e250: 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64  ed=%d\n", p->ord
e260: 65 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20  erByConsumed);. 
e270: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
e280: 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74 65 64  ntf("  estimated
e290: 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65  Cost=%g\n", p->e
e2a0: 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a 7d  stimatedCost);.}
e2b0: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 54  .#else.#define T
e2c0: 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28  RACE_IDX_INPUTS(
e2d0: 41 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  A).#define TRACE
e2e0: 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 41 29 0a  _IDX_OUTPUTS(A).
e2f0: 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 52  #endif../* .** R
e300: 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20  equired because 
e310: 62 65 73 74 49 6e 64 65 78 28 29 20 69 73 20 63  bestIndex() is c
e320: 61 6c 6c 65 64 20 62 79 20 62 65 73 74 4f 72 43  alled by bestOrC
e330: 6c 61 75 73 65 49 6e 64 65 78 28 29 20 0a 2a 2f  lauseIndex() .*/
e340: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65 73  .static void bes
e350: 74 49 6e 64 65 78 28 0a 20 20 20 20 50 61 72 73  tIndex(.    Pars
e360: 65 2a 2c 20 57 68 65 72 65 43 6c 61 75 73 65 2a  e*, WhereClause*
e370: 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74  , struct SrcList
e380: 5f 69 74 65 6d 2a 2c 20 42 69 74 6d 61 73 6b 2c  _item*, Bitmask,
e390: 20 45 78 70 72 4c 69 73 74 2a 2c 20 57 68 65 72   ExprList*, Wher
e3a0: 65 43 6f 73 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  eCost*);../*.** 
e3b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
e3c0: 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 61 6e  empts to find an
e3d0: 20 73 63 61 6e 6e 69 6e 67 20 73 74 72 61 74 65   scanning strate
e3e0: 67 79 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  gy that can be u
e3f0: 73 65 64 20 0a 2a 2a 20 74 6f 20 6f 70 74 69 6d  sed .** to optim
e400: 69 7a 65 20 61 6e 20 27 4f 52 27 20 65 78 70 72  ize an 'OR' expr
e410: 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 70  ession that is p
e420: 61 72 74 20 6f 66 20 61 20 57 48 45 52 45 20 63  art of a WHERE c
e430: 6c 61 75 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  lause. .**.** Th
e440: 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74  e table associat
e450: 65 64 20 77 69 74 68 20 46 52 4f 4d 20 63 6c 61  ed with FROM cla
e460: 75 73 65 20 74 65 72 6d 20 70 53 72 63 20 6d 61  use term pSrc ma
e470: 79 20 62 65 20 65 69 74 68 65 72 20 61 0a 2a 2a  y be either a.**
e480: 20 72 65 67 75 6c 61 72 20 42 2d 54 72 65 65 20   regular B-Tree 
e490: 74 61 62 6c 65 20 6f 72 20 61 20 76 69 72 74 75  table or a virtu
e4a0: 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  al table..*/.sta
e4b0: 74 69 63 20 76 6f 69 64 20 62 65 73 74 4f 72 43  tic void bestOrC
e4c0: 6c 61 75 73 65 49 6e 64 65 78 28 0a 20 20 50 61  lauseIndex(.  Pa
e4d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
e4e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
e4f0: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
e500: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
e510: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
e520: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
e530: 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
e540: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
e550: 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52  pSrc,  /* The FR
e560: 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  OM clause term t
e570: 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69  o search */.  Bi
e580: 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20  tmask notReady, 
e590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
e5a0: 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61  k of cursors tha
e5b0: 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61  t are not availa
e5c0: 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ble */.  ExprLis
e5d0: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
e5e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45       /* The ORDE
e5f0: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
e600: 20 57 68 65 72 65 43 6f 73 74 20 2a 70 43 6f 73   WhereCost *pCos
e610: 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
e620: 4c 6f 77 65 73 74 20 63 6f 73 74 20 71 75 65 72  Lowest cost quer
e630: 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 23 69 66  y plan */.){.#if
e640: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e650: 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
e660: 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43 75  .  const int iCu
e670: 72 20 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f  r = pSrc->iCurso
e680: 72 3b 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73  r;   /* The curs
e690: 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  or of the table 
e6a0: 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 20 2a  to be accessed *
e6b0: 2f 0a 20 20 63 6f 6e 73 74 20 42 69 74 6d 61 73  /.  const Bitmas
e6c0: 6b 20 6d 61 73 6b 53 72 63 20 3d 20 67 65 74 4d  k maskSrc = getM
e6d0: 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65  ask(pWC->pMaskSe
e6e0: 74 2c 20 69 43 75 72 29 3b 20 20 2f 2a 20 42 69  t, iCur);  /* Bi
e6f0: 74 6d 61 73 6b 20 66 6f 72 20 70 53 72 63 20 2a  tmask for pSrc *
e700: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20  /.  WhereTerm * 
e710: 63 6f 6e 73 74 20 70 57 43 45 6e 64 20 3d 20 26  const pWCEnd = &
e720: 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
e730: 6d 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e  m];        /* En
e740: 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f  d of pWC->a[] */
e750: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
e760: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
e770: 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
e780: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
e790: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20  RE clause */..  
e7a0: 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20 57 48  /* Search the WH
e7b0: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
e7c0: 20 66 6f 72 20 61 20 75 73 61 62 6c 65 20 57 4f   for a usable WO
e7d0: 5f 4f 52 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 66  _OR term. */.  f
e7e0: 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
e7f0: 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
e800: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
e810: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
e820: 72 3d 3d 57 4f 5f 4f 52 20 0a 20 20 20 20 20 26  r==WO_OR .     &
e830: 26 20 28 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  & ((pTerm->prere
e840: 71 41 6c 6c 20 26 20 7e 6d 61 73 6b 53 72 63 29  qAll & ~maskSrc)
e850: 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 0a   & notReady)==0.
e860: 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e       && (pTerm->
e870: 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78  u.pOrInfo->index
e880: 61 62 6c 65 20 26 20 6d 61 73 6b 53 72 63 29 21  able & maskSrc)!
e890: 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
e8a0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63   WhereClause * c
e8b0: 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54  onst pOrWC = &pT
e8c0: 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e  erm->u.pOrInfo->
e8d0: 77 63 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54  wc;.      WhereT
e8e0: 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57  erm * const pOrW
e8f0: 43 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61  CEnd = &pOrWC->a
e900: 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a  [pOrWC->nTerm];.
e910: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
e920: 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20  *pOrTerm;.      
e930: 69 6e 74 20 66 6c 61 67 73 20 3d 20 57 48 45 52  int flags = WHER
e940: 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20  E_MULTI_OR;.    
e950: 20 20 64 6f 75 62 6c 65 20 72 54 6f 74 61 6c 20    double rTotal 
e960: 3d 20 30 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c  = 0;.      doubl
e970: 65 20 6e 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20  e nRow = 0;.    
e980: 20 20 42 69 74 6d 61 73 6b 20 75 73 65 64 20 3d    Bitmask used =
e990: 20 30 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70   0;..      for(p
e9a0: 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b  OrTerm=pOrWC->a;
e9b0: 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e   pOrTerm<pOrWCEn
e9c0: 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  d; pOrTerm++){. 
e9d0: 20 20 20 20 20 20 20 57 68 65 72 65 43 6f 73 74         WhereCost
e9e0: 20 73 54 65 72 6d 43 6f 73 74 3b 0a 20 20 20 20   sTermCost;.    
e9f0: 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28      WHERETRACE((
ea00: 22 2e 2e 2e 20 4d 75 6c 74 69 2d 69 6e 64 65 78  "... Multi-index
ea10: 20 4f 52 20 74 65 73 74 69 6e 67 20 66 6f 72 20   OR testing for 
ea20: 74 65 72 6d 20 25 64 20 6f 66 20 25 64 2e 2e 2e  term %d of %d...
ea30: 2e 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  .\n", .         
ea40: 20 28 70 4f 72 54 65 72 6d 20 2d 20 70 4f 72 57   (pOrTerm - pOrW
ea50: 43 2d 3e 61 29 2c 20 28 70 54 65 72 6d 20 2d 20  C->a), (pTerm - 
ea60: 70 57 43 2d 3e 61 29 0a 20 20 20 20 20 20 20 20  pWC->a).        
ea70: 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
ea80: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
ea90: 6f 72 3d 3d 57 4f 5f 41 4e 44 20 29 7b 0a 20 20  or==WO_AND ){.  
eaa0: 20 20 20 20 20 20 20 20 57 68 65 72 65 43 6c 61          WhereCla
eab0: 75 73 65 20 2a 70 41 6e 64 57 43 20 3d 20 26 70  use *pAndWC = &p
eac0: 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e  OrTerm->u.pAndIn
ead0: 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20  fo->wc;.        
eae0: 20 20 62 65 73 74 49 6e 64 65 78 28 70 50 61 72    bestIndex(pPar
eaf0: 73 65 2c 20 70 41 6e 64 57 43 2c 20 70 53 72 63  se, pAndWC, pSrc
eb00: 2c 20 6e 6f 74 52 65 61 64 79 2c 20 30 2c 20 26  , notReady, 0, &
eb10: 73 54 65 72 6d 43 6f 73 74 29 3b 0a 20 20 20 20  sTermCost);.    
eb20: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
eb30: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
eb40: 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20  r==iCur ){.     
eb50: 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65       WhereClause
eb60: 20 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20 20   tempWC;.       
eb70: 20 20 20 74 65 6d 70 57 43 2e 70 50 61 72 73 65     tempWC.pParse
eb80: 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 3b 0a   = pWC->pParse;.
eb90: 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
eba0: 2e 70 4d 61 73 6b 53 65 74 20 3d 20 70 57 43 2d  .pMaskSet = pWC-
ebb0: 3e 70 4d 61 73 6b 53 65 74 3b 0a 20 20 20 20 20  >pMaskSet;.     
ebc0: 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d       tempWC.op =
ebd0: 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20   TK_AND;.       
ebe0: 20 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f     tempWC.a = pO
ebf0: 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20  rTerm;.         
ec00: 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20   tempWC.nTerm = 
ec10: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65 73  1;.          bes
ec20: 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26  tIndex(pParse, &
ec30: 74 65 6d 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f  tempWC, pSrc, no
ec40: 74 52 65 61 64 79 2c 20 30 2c 20 26 73 54 65 72  tReady, 0, &sTer
ec50: 6d 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20  mCost);.        
ec60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
ec70: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
ec80: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 54 6f     }.        rTo
ec90: 74 61 6c 20 2b 3d 20 73 54 65 72 6d 43 6f 73 74  tal += sTermCost
eca0: 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20  .rCost;.        
ecb0: 6e 52 6f 77 20 2b 3d 20 73 54 65 72 6d 43 6f 73  nRow += sTermCos
ecc0: 74 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20  t.nRow;.        
ecd0: 75 73 65 64 20 7c 3d 20 73 54 65 72 6d 43 6f 73  used |= sTermCos
ece0: 74 2e 75 73 65 64 3b 0a 20 20 20 20 20 20 20 20  t.used;.        
ecf0: 69 66 28 20 72 54 6f 74 61 6c 3e 3d 70 43 6f 73  if( rTotal>=pCos
ed00: 74 2d 3e 72 43 6f 73 74 20 29 20 62 72 65 61 6b  t->rCost ) break
ed10: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
ed20: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
ed30: 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
ed40: 73 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  se, increase the
ed50: 20 73 63 61 6e 20 63 6f 73 74 20 74 6f 20 61 63   scan cost to ac
ed60: 63 6f 75 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20  count .      ** 
ed70: 66 6f 72 20 74 68 65 20 63 6f 73 74 20 6f 66 20  for the cost of 
ed80: 74 68 65 20 73 6f 72 74 2e 20 2a 2f 0a 20 20 20  the sort. */.   
ed90: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 21     if( pOrderBy!
eda0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 54  =0 ){.        rT
edb0: 6f 74 61 6c 20 2b 3d 20 6e 52 6f 77 2a 65 73 74  otal += nRow*est
edc0: 4c 6f 67 28 6e 52 6f 77 29 3b 0a 20 20 20 20 20  Log(nRow);.     
edd0: 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22     WHERETRACE(("
ede0: 2e 2e 2e 20 73 6f 72 74 69 6e 67 20 69 6e 63 72  ... sorting incr
edf0: 65 61 73 65 73 20 4f 52 20 63 6f 73 74 20 74 6f  eases OR cost to
ee00: 20 25 2e 39 67 5c 6e 22 2c 20 72 54 6f 74 61 6c   %.9g\n", rTotal
ee10: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ));.      }..   
ee20: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 73     /* If the cos
ee30: 74 20 6f 66 20 73 63 61 6e 6e 69 6e 67 20 75 73  t of scanning us
ee40: 69 6e 67 20 74 68 69 73 20 4f 52 20 74 65 72 6d  ing this OR term
ee50: 20 66 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f   for optimizatio
ee60: 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c 65  n is.      ** le
ee70: 73 73 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  ss than the curr
ee80: 65 6e 74 20 63 6f 73 74 20 73 74 6f 72 65 64 20  ent cost stored 
ee90: 69 6e 20 70 43 6f 73 74 2c 20 72 65 70 6c 61 63  in pCost, replac
eea0: 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20  e the contents. 
eeb0: 20 20 20 20 20 2a 2a 20 6f 66 20 70 43 6f 73 74       ** of pCost
eec0: 2e 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45  . */.      WHERE
eed0: 54 52 41 43 45 28 28 22 2e 2e 2e 20 6d 75 6c 74  TRACE(("... mult
eee0: 69 2d 69 6e 64 65 78 20 4f 52 20 63 6f 73 74 3d  i-index OR cost=
eef0: 25 2e 39 67 20 6e 72 6f 77 3d 25 2e 39 67 5c 6e  %.9g nrow=%.9g\n
ef00: 22 2c 20 72 54 6f 74 61 6c 2c 20 6e 52 6f 77 29  ", rTotal, nRow)
ef10: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 54 6f  );.      if( rTo
ef20: 74 61 6c 3c 70 43 6f 73 74 2d 3e 72 43 6f 73 74  tal<pCost->rCost
ef30: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 73   ){.        pCos
ef40: 74 2d 3e 72 43 6f 73 74 20 3d 20 72 54 6f 74 61  t->rCost = rTota
ef50: 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74  l;.        pCost
ef60: 2d 3e 6e 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20  ->nRow = nRow;. 
ef70: 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 75 73         pCost->us
ef80: 65 64 20 3d 20 75 73 65 64 3b 0a 20 20 20 20 20  ed = used;.     
ef90: 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77     pCost->plan.w
efa0: 73 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  sFlags = flags;.
efb0: 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70          pCost->p
efc0: 6c 61 6e 2e 75 2e 70 54 65 72 6d 20 3d 20 70 54  lan.u.pTerm = pT
efd0: 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  erm;.      }.   
efe0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
eff0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f   SQLITE_OMIT_OR_
f000: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
f010: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
f020: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
f030: 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  BLE./*.** Alloca
f040: 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20  te and populate 
f050: 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  an sqlite3_index
f060: 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  _info structure.
f070: 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72   It is the .** r
f080: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
f090: 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
f0a0: 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73  ventually releas
f0b0: 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 0a  e the structure.
f0c0: 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20 74 68  ** by passing th
f0d0: 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
f0e0: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
f0f0: 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f 66  ion to sqlite3_f
f100: 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ree()..*/.static
f110: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
f120: 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64  nfo *allocateInd
f130: 65 78 49 6e 66 6f 28 0a 20 20 50 61 72 73 65 20  exInfo(.  Parse 
f140: 2a 70 50 61 72 73 65 2c 20 0a 20 20 57 68 65 72  *pParse, .  Wher
f150: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20 20  eClause *pWC,.  
f160: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
f170: 74 65 6d 20 2a 70 53 72 63 2c 0a 20 20 45 78 70  tem *pSrc,.  Exp
f180: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 0a  rList *pOrderBy.
f190: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
f1a0: 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74   int nTerm;.  st
f1b0: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
f1c0: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70  ex_constraint *p
f1d0: 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63  IdxCons;.  struc
f1e0: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
f1f0: 6f 72 64 65 72 62 79 20 2a 70 49 64 78 4f 72 64  orderby *pIdxOrd
f200: 65 72 42 79 3b 0a 20 20 73 74 72 75 63 74 20 73  erBy;.  struct s
f210: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
f220: 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70  straint_usage *p
f230: 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65  Usage;.  WhereTe
f240: 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74  rm *pTerm;.  int
f250: 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 73 71 6c   nOrderBy;.  sql
f260: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
f270: 2a 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 57 48  *pIdxInfo;..  WH
f280: 45 52 45 54 52 41 43 45 28 28 22 52 65 63 6f 6d  ERETRACE(("Recom
f290: 70 75 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 66  puting index inf
f2a0: 6f 20 66 6f 72 20 25 73 2e 2e 2e 5c 6e 22 2c 20  o for %s...\n", 
f2b0: 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  pSrc->pTab->zNam
f2c0: 65 29 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74  e));..  /* Count
f2d0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
f2e0: 6f 73 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c  ossible WHERE cl
f2f0: 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ause constraints
f300: 20 72 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20   referring.  ** 
f310: 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20  to this virtual 
f320: 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69  table */.  for(i
f330: 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d  =nTerm=0, pTerm=
f340: 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e  pWC->a; i<pWC->n
f350: 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d  Term; i++, pTerm
f360: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  ++){.    if( pTe
f370: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21  rm->leftCursor !
f380: 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  = pSrc->iCursor 
f390: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
f3a0: 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
f3b0: 65 4f 70 65 72 61 74 6f 72 26 28 70 54 65 72 6d  eOperator&(pTerm
f3c0: 2d 3e 65 4f 70 65 72 61 74 6f 72 2d 31 29 29 3d  ->eOperator-1))=
f3d0: 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =0 );.    testca
f3e0: 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
f3f0: 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20  ator==WO_IN );. 
f400: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
f410: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
f420: 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
f430: 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
f440: 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f  ator & (WO_IN|WO
f450: 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69  _ISNULL) ) conti
f460: 6e 75 65 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b  nue;.    nTerm++
f470: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
f480: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
f490: 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79  se contains only
f4a0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
f4b0: 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69  current .  ** vi
f4c0: 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 65 6e  rtual table then
f4d0: 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
f4e0: 66 6f 72 20 74 68 65 20 61 4f 72 64 65 72 42 79  for the aOrderBy
f4f0: 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68   part of.  ** th
f500: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
f510: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a  info structure..
f520: 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20    */.  nOrderBy 
f530: 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  = 0;.  if( pOrde
f540: 72 42 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  rBy ){.    for(i
f550: 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
f560: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
f570: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
f580: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
f590: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  pExpr;.      if(
f5a0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
f5b0: 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e  OLUMN || pExpr->
f5c0: 69 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43  iTable!=pSrc->iC
f5d0: 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20  ursor ) break;. 
f5e0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d     }.    if( i==
f5f0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
f600: 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65 72 42  ){.      nOrderB
f610: 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  y = pOrderBy->nE
f620: 78 70 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  xpr;.    }.  }..
f630: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    /* Allocate th
f640: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
f650: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20  info structure. 
f660: 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d   */.  pIdxInfo =
f670: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
f680: 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c  Zero(pParse->db,
f690: 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66   sizeof(*pIdxInf
f6a0: 6f 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o).             
f6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
f6c0: 28 73 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e  (sizeof(*pIdxCon
f6d0: 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73  s) + sizeof(*pUs
f6e0: 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20  age))*nTerm.    
f6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f700: 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28         + sizeof(
f710: 2a 70 49 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f  *pIdxOrderBy)*nO
f720: 72 64 65 72 42 79 20 29 3b 0a 20 20 69 66 28 20  rderBy );.  if( 
f730: 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  pIdxInfo==0 ){. 
f740: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
f750: 73 67 28 70 50 61 72 73 65 2c 20 22 6f 75 74 20  sg(pParse, "out 
f760: 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20  of memory");.   
f770: 20 2f 2a 20 28 64 6f 75 62 6c 65 29 30 20 49 6e   /* (double)0 In
f780: 20 63 61 73 65 20 6f 66 20 53 51 4c 49 54 45 5f   case of SQLITE_
f790: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
f7a0: 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20 72 65  INT... */.    re
f7b0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
f7c0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
f7d0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
f7e0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
f7f0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f  nfo structure co
f800: 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79  ntains.  ** many
f810: 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 72 65   fields that are
f820: 20 64 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74   declared "const
f830: 22 20 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65  " to prevent xBe
f840: 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a  stIndex from.  *
f850: 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e  * changing them.
f860: 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20    We have to do 
f870: 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69  some funky casti
f880: 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20  ng in order to. 
f890: 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   ** initialize t
f8a0: 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a  hose fields..  *
f8b0: 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28  /.  pIdxCons = (
f8c0: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
f8d0: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
f8e0: 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20  )&pIdxInfo[1];. 
f8f0: 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28   pIdxOrderBy = (
f900: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
f910: 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70  ndex_orderby*)&p
f920: 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a  IdxCons[nTerm];.
f930: 20 20 70 55 73 61 67 65 20 3d 20 28 73 74 72 75    pUsage = (stru
f940: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
f950: 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
f960: 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b  e*)&pIdxOrderBy[
f970: 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69  nOrderBy];.  *(i
f980: 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt*)&pIdxInfo->n
f990: 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54 65  Constraint = nTe
f9a0: 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49  rm;.  *(int*)&pI
f9b0: 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
f9c0: 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a   = nOrderBy;.  *
f9d0: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
f9e0: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
f9f0: 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
fa00: 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78  onstraint = pIdx
fa10: 43 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63 74  Cons;.  *(struct
fa20: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f   sqlite3_index_o
fa30: 72 64 65 72 62 79 2a 2a 29 26 70 49 64 78 49 6e  rderby**)&pIdxIn
fa40: 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20 70  fo->aOrderBy = p
fa50: 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28  IdxOrderBy;.  *(
fa60: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
fa70: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
fa80: 75 73 61 67 65 2a 2a 29 26 70 49 64 78 49 6e 66  usage**)&pIdxInf
fa90: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
faa0: 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20  age =.          
fab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fae0: 20 20 20 20 20 20 20 20 20 70 55 73 61 67 65 3b           pUsage;
faf0: 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70  ..  for(i=j=0, p
fb00: 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70  Term=pWC->a; i<p
fb10: 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20  WC->nTerm; i++, 
fb20: 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
fb30: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
fb40: 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75  sor != pSrc->iCu
fb50: 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  rsor ) continue;
fb60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54  .    assert( (pT
fb70: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28  erm->eOperator&(
fb80: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
fb90: 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 74  -1))==0 );.    t
fba0: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
fbb0: 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e  eOperator==WO_IN
fbc0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
fbd0: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
fbe0: 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  or==WO_ISNULL );
fbf0: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
fc00: 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
fc10: 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20  IN|WO_ISNULL) ) 
fc20: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 49  continue;.    pI
fc30: 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d  dxCons[j].iColum
fc40: 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  n = pTerm->u.lef
fc50: 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64  tColumn;.    pId
fc60: 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66  xCons[j].iTermOf
fc70: 66 73 65 74 20 3d 20 69 3b 0a 20 20 20 20 70 49  fset = i;.    pI
fc80: 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 28  dxCons[j].op = (
fc90: 75 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  u8)pTerm->eOpera
fca0: 74 6f 72 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  tor;.    /* The 
fcb0: 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e  direct assignmen
fcc0: 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  t in the previou
fcd0: 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62  s line is possib
fce0: 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a  le only because.
fcf0: 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61      ** the WO_ a
fd00: 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  nd SQLITE_INDEX_
fd10: 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65  CONSTRAINT_ code
fd20: 73 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e  s are identical.
fd30: 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c    The.    ** fol
fd40: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 76  lowing asserts v
fd50: 65 72 69 66 79 20 74 68 69 73 20 66 61 63 74 2e  erify this fact.
fd60: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
fd70: 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_EQ==SQLITE_IN
fd80: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45  DEX_CONSTRAINT_E
fd90: 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Q );.    assert(
fda0: 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49   WO_LT==SQLITE_I
fdb0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
fdc0: 4c 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  LT );.    assert
fdd0: 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f  ( WO_LE==SQLITE_
fde0: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
fdf0: 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _LE );.    asser
fe00: 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45  t( WO_GT==SQLITE
fe10: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
fe20: 54 5f 47 54 20 29 3b 0a 20 20 20 20 61 73 73 65  T_GT );.    asse
fe30: 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54  rt( WO_GE==SQLIT
fe40: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
fe50: 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 61 73 73  NT_GE );.    ass
fe60: 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53  ert( WO_MATCH==S
fe70: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
fe80: 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a  TRAINT_MATCH );.
fe90: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
fea0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
feb0: 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c  WO_EQ|WO_LT|WO_L
fec0: 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f  E|WO_GT|WO_GE|WO
fed0: 5f 4d 41 54 43 48 29 20 29 3b 0a 20 20 20 20 6a  _MATCH) );.    j
fee0: 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  ++;.  }.  for(i=
fef0: 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  0; i<nOrderBy; i
ff00: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
ff10: 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d  Expr = pOrderBy-
ff20: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
ff30: 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e   pIdxOrderBy[i].
ff40: 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d  iColumn = pExpr-
ff50: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49  >iColumn;.    pI
ff60: 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73  dxOrderBy[i].des
ff70: 63 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  c = pOrderBy->a[
ff80: 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
ff90: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78  }..  return pIdx
ffa0: 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Info;.}../*.** T
ffb0: 68 65 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20  he table object 
ffc0: 72 65 66 65 72 65 6e 63 65 20 70 61 73 73 65 64  reference passed
ffd0: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
ffe0: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
fff0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74  function.** must
10000 20 72 65 70 72 65 73 65 6e 74 20 61 20 76 69 72   represent a vir
10010 74 75 61 6c 20 74 61 62 6c 65 2e 20 54 68 69 73  tual table. This
10020 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65   function invoke
10030 73 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78  s the xBestIndex
10040 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20  ().** method of 
10050 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
10060 65 20 77 69 74 68 20 74 68 65 20 73 71 6c 69 74  e with the sqlit
10070 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 70 6f  e3_index_info po
10080 69 6e 74 65 72 20 70 61 73 73 65 64 0a 2a 2a 20  inter passed.** 
10090 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e  as the argument.
100a0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
100b0 6f 72 20 6f 63 63 75 72 73 2c 20 70 50 61 72 73  or occurs, pPars
100c0 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  e is populated w
100d0 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ith an error mes
100e0 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f  sage and a.** no
100f0 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20  n-zero value is 
10100 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
10110 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e  ise, 0 is return
10120 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75  ed and the outpu
10130 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65  t.** part of the
10140 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
10150 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
10160 20 6c 65 66 74 20 70 6f 70 75 6c 61 74 65 64 2e   left populated.
10170 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f  .**.** Whether o
10180 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69  r not an error i
10190 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69  s returned, it i
101a0 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
101b0 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63  lity of the.** c
101c0 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
101d0 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53  lly free p->idxS
101e0 74 72 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46  tr if p->needToF
101f0 72 65 65 49 64 78 53 74 72 20 69 6e 64 69 63 61  reeIdxStr indica
10200 74 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73  tes.** that this
10210 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f   is required..*/
10220 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74 61 62  .static int vtab
10230 42 65 73 74 49 6e 64 65 78 28 50 61 72 73 65 20  BestIndex(Parse 
10240 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
10250 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e  pTab, sqlite3_in
10260 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20  dex_info *p){.  
10270 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
10280 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74  tab = sqlite3Get
10290 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64  VTable(pParse->d
102a0 62 2c 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b  b, pTab)->pVtab;
102b0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
102c0 72 63 3b 0a 0a 20 20 57 48 45 52 45 54 52 41 43  rc;..  WHERETRAC
102d0 45 28 28 22 78 42 65 73 74 49 6e 64 65 78 20 66  E(("xBestIndex f
102e0 6f 72 20 25 73 5c 6e 22 2c 20 70 54 61 62 2d 3e  or %s\n", pTab->
102f0 7a 4e 61 6d 65 29 29 3b 0a 20 20 54 52 41 43 45  zName));.  TRACE
10300 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a  _IDX_INPUTS(p);.
10310 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d    rc = pVtab->pM
10320 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65  odule->xBestInde
10330 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20 20 54  x(pVtab, p);.  T
10340 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53  RACE_IDX_OUTPUTS
10350 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d  (p);..  if( rc!=
10360 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10370 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10380 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 70  NOMEM ){.      p
10390 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
103a0 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
103b0 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74 61   }else if( !pVta
103c0 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  b->zErrMsg ){.  
103d0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
103e0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22  Msg(pParse, "%s"
103f0 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
10400 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rc));.    }else{
10410 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
10420 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
10430 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72  %s", pVtab->zErr
10440 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Msg);.    }.  }.
10450 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
10460 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 56 74 61  pParse->db, pVta
10470 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  b->zErrMsg);.  p
10480 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  Vtab->zErrMsg = 
10490 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  0;..  for(i=0; i
104a0 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  <p->nConstraint;
104b0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21   i++){.    if( !
104c0 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
104d0 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e 61  ].usable && p->a
104e0 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
104f0 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29  i].argvIndex>0 )
10500 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
10510 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
10520 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c  .          "tabl
10530 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65 78  e %s: xBestIndex
10540 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e 76   returned an inv
10550 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61 62  alid plan", pTab
10560 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
10570 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 50    }..  return pP
10580 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 0a 0a  arse->nErr;.}...
10590 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
105a0 65 20 62 65 73 74 20 69 6e 64 65 78 20 66 6f 72  e best index for
105b0 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
105c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 65 73 74  ..**.** The best
105d0 20 69 6e 64 65 78 20 69 73 20 63 6f 6d 70 75 74   index is comput
105e0 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49  ed by the xBestI
105f0 6e 64 65 78 20 6d 65 74 68 6f 64 20 6f 66 20 74  ndex method of t
10600 68 65 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61  he virtual.** ta
10610 62 6c 65 20 6d 6f 64 75 6c 65 2e 20 20 54 68 69  ble module.  Thi
10620 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 61  s routine is rea
10630 6c 6c 79 20 6a 75 73 74 20 61 20 77 72 61 70 70  lly just a wrapp
10640 65 72 20 74 68 61 74 20 73 65 74 73 20 75 70 0a  er that sets up.
10650 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ** the sqlite3_i
10660 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
10670 75 72 65 20 74 68 61 74 20 69 73 20 75 73 65 64  ure that is used
10680 20 74 6f 20 63 6f 6d 6d 75 6e 69 63 61 74 65 20   to communicate 
10690 77 69 74 68 0a 2a 2a 20 78 42 65 73 74 49 6e 64  with.** xBestInd
106a0 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 20 6a  ex..**.** In a j
106b0 6f 69 6e 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  oin, this routin
106c0 65 20 6d 69 67 68 74 20 62 65 20 63 61 6c 6c 65  e might be calle
106d0 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  d multiple times
106e0 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 61 6d 65   for the.** same
106f0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
10700 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   The sqlite3_ind
10710 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
10720 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
10730 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  and initialized 
10740 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69 6e 76  on the first inv
10750 6f 63 61 74 69 6f 6e 20 61 6e 64 20 72 65 75 73  ocation and reus
10760 65 64 20 6f 6e 20 61 6c 6c 20 73 75 62 73 65 71  ed on all subseq
10770 75 65 6e 74 0a 2a 2a 20 69 6e 76 6f 63 61 74 69  uent.** invocati
10780 6f 6e 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ons.  The sqlite
10790 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
107a0 75 63 74 75 72 65 20 69 73 20 61 6c 73 6f 20 75  ucture is also u
107b0 73 65 64 20 77 68 65 6e 0a 2a 2a 20 63 6f 64 65  sed when.** code
107c0 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f   is generated to
107d0 20 61 63 63 65 73 73 20 74 68 65 20 76 69 72 74   access the virt
107e0 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 20  ual table.  The 
107f0 77 68 65 72 65 49 6e 66 6f 44 65 6c 65 74 65 28  whereInfoDelete(
10800 29 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 61  ) .** routine ta
10810 6b 65 73 20 63 61 72 65 20 6f 66 20 66 72 65 65  kes care of free
10820 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ing the sqlite3_
10830 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
10840 74 75 72 65 20 61 66 74 65 72 0a 2a 2a 20 65 76  ture after.** ev
10850 65 72 79 62 6f 64 79 20 68 61 73 20 66 69 6e 69  erybody has fini
10860 73 68 65 64 20 77 69 74 68 20 69 74 2e 0a 2a 2f  shed with it..*/
10870 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65 73  .static void bes
10880 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28 0a 20  tVirtualIndex(. 
10890 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
108a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108b0 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
108c0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
108d0 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
108e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
108f0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
10900 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
10910 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
10920 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
10930 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  M clause term to
10940 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74   search */.  Bit
10950 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20  mask notReady,  
10960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10970 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20  Mask of cursors 
10980 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61  that are not ava
10990 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72  ilable */.  Expr
109a0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
109b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
109c0 68 65 20 6f 72 64 65 72 20 62 79 20 63 6c 61 75  he order by clau
109d0 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73  se */.  WhereCos
109e0 74 20 2a 70 43 6f 73 74 2c 20 20 20 20 20 20 20  t *pCost,       
109f0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 65 73          /* Lowes
10a00 74 20 63 6f 73 74 20 71 75 65 72 79 20 70 6c 61  t cost query pla
10a10 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  n */.  sqlite3_i
10a20 6e 64 65 78 5f 69 6e 66 6f 20 2a 2a 70 70 49 64  ndex_info **ppId
10a30 78 49 6e 66 6f 20 20 2f 2a 20 49 6e 64 65 78 20  xInfo  /* Index 
10a40 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73  information pass
10a50 65 64 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78  ed to xBestIndex
10a60 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
10a70 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61  pTab = pSrc->pTa
10a80 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  b;.  sqlite3_ind
10a90 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
10aa0 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  o;.  struct sqli
10ab0 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
10ac0 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a  aint *pIdxCons;.
10ad0 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
10ae0 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
10af0 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b  t_usage *pUsage;
10b00 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
10b10 65 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  erm;.  int i, j;
10b20 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b  .  int nOrderBy;
10b30 0a 20 20 64 6f 75 62 6c 65 20 72 43 6f 73 74 3b  .  double rCost;
10b40 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
10b50 20 77 73 46 6c 61 67 73 20 69 73 20 69 6e 69 74   wsFlags is init
10b60 69 61 6c 69 7a 65 64 20 74 6f 20 73 6f 6d 65 20  ialized to some 
10b70 73 61 6e 65 20 76 61 6c 75 65 2e 20 4f 74 68 65  sane value. Othe
10b80 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 0a 20  rwise, if the . 
10b90 20 2a 2a 20 6d 61 6c 6c 6f 63 20 69 6e 20 61 6c   ** malloc in al
10ba0 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28  locateIndexInfo(
10bb0 29 20 66 61 69 6c 73 20 61 6e 64 20 74 68 69 73  ) fails and this
10bc0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
10bd0 73 20 6c 65 61 76 69 6e 67 0a 20 20 2a 2a 20 77  s leaving.  ** w
10be0 73 46 6c 61 67 73 20 69 6e 20 61 6e 20 75 6e 69  sFlags in an uni
10bf0 6e 69 74 69 61 6c 69 7a 65 64 20 73 74 61 74 65  nitialized state
10c00 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 61 79  , the caller may
10c10 20 62 65 68 61 76 65 20 75 6e 70 72 65 64 69 63   behave unpredic
10c20 74 61 62 6c 79 2e 0a 20 20 2a 2f 0a 20 20 6d 65  tably..  */.  me
10c30 6d 73 65 74 28 70 43 6f 73 74 2c 20 30 2c 20 73  mset(pCost, 0, s
10c40 69 7a 65 6f 66 28 2a 70 43 6f 73 74 29 29 3b 0a  izeof(*pCost));.
10c50 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73    pCost->plan.ws
10c60 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49  Flags = WHERE_VI
10c70 52 54 55 41 4c 54 41 42 4c 45 3b 0a 0a 20 20 2f  RTUALTABLE;..  /
10c80 2a 20 49 66 20 74 68 65 20 73 71 6c 69 74 65 33  * If the sqlite3
10c90 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
10ca0 63 74 75 72 65 20 68 61 73 20 6e 6f 74 20 62 65  cture has not be
10cb0 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20  en previously.  
10cc0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  ** allocated and
10cd0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 74 68   initialized, th
10ce0 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20  en allocate and 
10cf0 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 20 6e 6f  initialize it no
10d00 77 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e  w..  */.  pIdxIn
10d10 66 6f 20 3d 20 2a 70 70 49 64 78 49 6e 66 6f 3b  fo = *ppIdxInfo;
10d20 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d  .  if( pIdxInfo=
10d30 3d 30 20 29 7b 0a 20 20 20 20 2a 70 70 49 64 78  =0 ){.    *ppIdx
10d40 49 6e 66 6f 20 3d 20 70 49 64 78 49 6e 66 6f 20  Info = pIdxInfo 
10d50 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49  = allocateIndexI
10d60 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 57 43 2c  nfo(pParse, pWC,
10d70 20 70 53 72 63 2c 20 70 4f 72 64 65 72 42 79 29   pSrc, pOrderBy)
10d80 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78  ;.  }.  if( pIdx
10d90 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Info==0 ){.    r
10da0 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
10db0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
10dc0 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
10dd0 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
10de0 20 74 68 61 74 20 70 49 64 78 49 6e 66 6f 20 70   that pIdxInfo p
10df0 6f 69 6e 74 73 0a 20 20 2a 2a 20 74 6f 20 77 69  oints.  ** to wi
10e00 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 69 6e 69  ll have been ini
10e10 74 69 61 6c 69 7a 65 64 2c 20 65 69 74 68 65 72  tialized, either
10e20 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72   during the curr
10e30 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f  ent invocation o
10e40 72 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 73 6f  r.  ** during so
10e50 6d 65 20 70 72 69 6f 72 20 69 6e 76 6f 63 61 74  me prior invocat
10e60 69 6f 6e 2e 20 20 4e 6f 77 20 77 65 20 6a 75 73  ion.  Now we jus
10e70 74 20 68 61 76 65 20 74 6f 20 63 75 73 74 6f 6d  t have to custom
10e80 69 7a 65 20 74 68 65 0a 20 20 2a 2a 20 64 65 74  ize the.  ** det
10e90 61 69 6c 73 20 6f 66 20 70 49 64 78 49 6e 66 6f  ails of pIdxInfo
10ea0 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
10eb0 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20   invocation and 
10ec0 70 61 73 73 20 69 74 20 74 6f 0a 20 20 2a 2a 20  pass it to.  ** 
10ed0 78 42 65 73 74 49 6e 64 65 78 2e 0a 20 20 2a 2f  xBestIndex..  */
10ee0 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 6f 64 75 6c  ..  /* The modul
10ef0 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 64  e name must be d
10f00 65 66 69 6e 65 64 2e 20 41 6c 73 6f 2c 20 62 79  efined. Also, by
10f10 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72   this point ther
10f20 65 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 61  e must.  ** be a
10f30 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
10f40 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72 75  qlite3_vtab stru
10f50 63 74 75 72 65 2e 20 4f 74 68 65 72 77 69 73 65  cture. Otherwise
10f60 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 69 65  .  ** sqlite3Vie
10f70 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
10f80 29 20 77 6f 75 6c 64 20 68 61 76 65 20 70 69 63  ) would have pic
10f90 6b 65 64 20 75 70 20 74 68 65 20 65 72 72 6f 72  ked up the error
10fa0 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  . .  */.  assert
10fb0 28 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65  ( pTab->azModule
10fc0 41 72 67 20 26 26 20 70 54 61 62 2d 3e 61 7a 4d  Arg && pTab->azM
10fd0 6f 64 75 6c 65 41 72 67 5b 30 5d 20 29 3b 0a 20  oduleArg[0] );. 
10fe0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10ff0 47 65 74 56 54 61 62 6c 65 28 70 50 61 72 73 65  GetVTable(pParse
11000 2d 3e 64 62 2c 20 70 54 61 62 29 20 29 3b 0a 0a  ->db, pTab) );..
11010 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 43 6f    /* Set the aCo
11020 6e 73 74 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c  nstraint[].usabl
11030 65 20 66 69 65 6c 64 73 20 61 6e 64 20 69 6e 69  e fields and ini
11040 74 69 61 6c 69 7a 65 20 61 6c 6c 20 0a 20 20 2a  tialize all .  *
11050 2a 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  * output variabl
11060 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a  es to zero..  **
11070 0a 20 20 2a 2a 20 61 43 6f 6e 73 74 72 61 69 6e  .  ** aConstrain
11080 74 5b 5d 2e 75 73 61 62 6c 65 20 69 73 20 74 72  t[].usable is tr
11090 75 65 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e  ue for constrain
110a0 74 73 20 77 68 65 72 65 20 74 68 65 20 72 69 67  ts where the rig
110b0 68 74 2d 68 61 6e 64 0a 20 20 2a 2a 20 73 69 64  ht-hand.  ** sid
110c0 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20  e contains only 
110d0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61  references to ta
110e0 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74  bles to the left
110f0 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 0a   of the current.
11100 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 49 6e 20    ** table.  In 
11110 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
11120 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  the constraint i
11130 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20  s of the form:. 
11140 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
11150 20 20 20 63 6f 6c 75 6d 6e 20 3d 20 65 78 70 72     column = expr
11160 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 77  .  **.  ** and w
11170 65 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67  e are evaluating
11180 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68   a join, then th
11190 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  e constraint on 
111a0 63 6f 6c 75 6d 6e 20 69 73 20 0a 20 20 2a 2a 20  column is .  ** 
111b0 6f 6e 6c 79 20 76 61 6c 69 64 20 69 66 20 61 6c  only valid if al
111c0 6c 20 74 61 62 6c 65 73 20 72 65 66 65 72 65 6e  l tables referen
111d0 63 65 64 20 69 6e 20 65 78 70 72 20 6f 63 63 75  ced in expr occu
111e0 72 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20  r to the left.  
111f0 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
11200 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d  containing colum
11210 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  n..  **.  ** The
11220 20 61 43 6f 6e 73 74 72 61 69 6e 74 73 5b 5d 20   aConstraints[] 
11230 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 65  array contains e
11240 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63  ntries for all c
11250 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20  onstraints.  ** 
11260 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  on the current t
11270 61 62 6c 65 2e 20 20 54 68 61 74 20 77 61 79 20  able.  That way 
11280 77 65 20 6f 6e 6c 79 20 68 61 76 65 20 74 6f 20  we only have to 
11290 63 6f 6d 70 75 74 65 20 69 74 20 6f 6e 63 65 0a  compute it once.
112a0 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68    ** even though
112b0 20 77 65 20 6d 69 67 68 74 20 74 72 79 20 74 6f   we might try to
112c0 20 70 69 63 6b 20 74 68 65 20 62 65 73 74 20 69   pick the best i
112d0 6e 64 65 78 20 6d 75 6c 74 69 70 6c 65 20 74 69  ndex multiple ti
112e0 6d 65 73 2e 0a 20 20 2a 2a 20 46 6f 72 20 65 61  mes..  ** For ea
112f0 63 68 20 61 74 74 65 6d 70 74 20 61 74 20 70 69  ch attempt at pi
11300 63 6b 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20  cking an index, 
11310 74 68 65 20 6f 72 64 65 72 20 6f 66 20 74 61 62  the order of tab
11320 6c 65 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  les in the.  ** 
11330 6a 6f 69 6e 20 6d 69 67 68 74 20 62 65 20 64 69  join might be di
11340 66 66 65 72 65 6e 74 20 73 6f 20 77 65 20 68 61  fferent so we ha
11350 76 65 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20  ve to recompute 
11360 74 68 65 20 75 73 61 62 6c 65 20 66 6c 61 67 0a  the usable flag.
11370 20 20 2a 2a 20 65 61 63 68 20 74 69 6d 65 2e 0a    ** each time..
11380 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20    */.  pIdxCons 
11390 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74  = *(struct sqlit
113a0 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
113b0 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  int**)&pIdxInfo-
113c0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >aConstraint;.  
113d0 70 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66  pUsage = pIdxInf
113e0 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
113f0 61 67 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  age;.  for(i=0; 
11400 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  i<pIdxInfo->nCon
11410 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49  straint; i++, pI
11420 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 6a  dxCons++){.    j
11430 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65   = pIdxCons->iTe
11440 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 54  rmOffset;.    pT
11450 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d  erm = &pWC->a[j]
11460 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e  ;.    pIdxCons->
11470 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d  usable = (pTerm-
11480 3e 70 72 65 72 65 71 52 69 67 68 74 26 6e 6f 74  >prereqRight&not
11490 52 65 61 64 79 29 20 3f 20 30 20 3a 20 31 3b 0a  Ready) ? 0 : 1;.
114a0 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 55 73    }.  memset(pUs
114b0 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  age, 0, sizeof(p
114c0 55 73 61 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e  Usage[0])*pIdxIn
114d0 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29  fo->nConstraint)
114e0 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  ;.  if( pIdxInfo
114f0 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
11500 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  tr ){.    sqlite
11510 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d  3_free(pIdxInfo-
11520 3e 69 64 78 53 74 72 29 3b 0a 20 20 7d 0a 20 20  >idxStr);.  }.  
11530 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
11540 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f   = 0;.  pIdxInfo
11550 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20  ->idxNum = 0;.  
11560 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
11570 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a  FreeIdxStr = 0;.
11580 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65    pIdxInfo->orde
11590 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b  rByConsumed = 0;
115a0 0a 20 20 2f 2a 20 28 28 64 6f 75 62 6c 65 29 32  .  /* ((double)2
115b0 29 20 49 6e 20 63 61 73 65 20 6f 66 20 53 51 4c  ) In case of SQL
115c0 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
115d0 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20  G_POINT... */.  
115e0 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
115f0 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45  tedCost = SQLITE
11600 5f 42 49 47 5f 44 42 4c 20 2f 20 28 28 64 6f 75  _BIG_DBL / ((dou
11610 62 6c 65 29 32 29 3b 0a 20 20 6e 4f 72 64 65 72  ble)2);.  nOrder
11620 42 79 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e  By = pIdxInfo->n
11630 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20 21  OrderBy;.  if( !
11640 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
11650 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
11660 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 69  By = 0;.  }..  i
11670 66 28 20 76 74 61 62 42 65 73 74 49 6e 64 65 78  f( vtabBestIndex
11680 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
11690 49 64 78 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  IdxInfo) ){.    
116a0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 70  return;.  }..  p
116b0 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75  IdxCons = *(stru
116c0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
116d0 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70  _constraint**)&p
116e0 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
116f0 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  aint;.  for(i=0;
11700 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f   i<pIdxInfo->nCo
11710 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
11720 20 20 20 20 69 66 28 20 70 55 73 61 67 65 5b 69      if( pUsage[i
11730 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29 7b  ].argvIndex>0 ){
11740 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 75 73  .      pCost->us
11750 65 64 20 7c 3d 20 70 57 43 2d 3e 61 5b 70 49 64  ed |= pWC->a[pId
11760 78 43 6f 6e 73 5b 69 5d 2e 69 54 65 72 6d 4f 66  xCons[i].iTermOf
11770 66 73 65 74 5d 2e 70 72 65 72 65 71 52 69 67 68  fset].prereqRigh
11780 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
11790 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
117a0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
117b0 65 2c 20 61 6e 64 20 74 68 65 20 73 65 6c 65 63  e, and the selec
117c0 74 65 64 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ted virtual tabl
117d0 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 64 6f 65  e index.  ** doe
117e0 73 20 6e 6f 74 20 73 61 74 69 73 66 79 20 69 74  s not satisfy it
117f0 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 63  , increase the c
11800 6f 73 74 20 6f 66 20 74 68 65 20 73 63 61 6e 20  ost of the scan 
11810 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68 69  accordingly. Thi
11820 73 0a 20 20 2a 2a 20 6d 61 74 63 68 65 73 20 74  s.  ** matches t
11830 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  he processing fo
11840 72 20 6e 6f 6e 2d 76 69 72 74 75 61 6c 20 74 61  r non-virtual ta
11850 62 6c 65 73 20 69 6e 20 62 65 73 74 42 74 72 65  bles in bestBtre
11860 65 49 6e 64 65 78 28 29 2e 0a 20 20 2a 2f 0a 20  eIndex()..  */. 
11870 20 72 43 6f 73 74 20 3d 20 70 49 64 78 49 6e 66   rCost = pIdxInf
11880 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
11890 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
118a0 20 26 26 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72   && pIdxInfo->or
118b0 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 3d 30  derByConsumed==0
118c0 20 29 7b 0a 20 20 20 20 72 43 6f 73 74 20 2b 3d   ){.    rCost +=
118d0 20 65 73 74 4c 6f 67 28 72 43 6f 73 74 29 2a 72   estLog(rCost)*r
118e0 43 6f 73 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Cost;.  }..  /* 
118f0 54 68 65 20 63 6f 73 74 20 69 73 20 6e 6f 74 20  The cost is not 
11900 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 6c 61  allowed to be la
11910 72 67 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  rger than SQLITE
11920 5f 42 49 47 5f 44 42 4c 20 28 74 68 65 0a 20 20  _BIG_DBL (the.  
11930 2a 2a 20 69 6e 69 74 61 6c 20 76 61 6c 75 65 20  ** inital value 
11940 6f 66 20 6c 6f 77 65 73 74 43 6f 73 74 20 69 6e  of lowestCost in
11950 20 74 68 69 73 20 6c 6f 6f 70 2e 20 49 66 20 69   this loop. If i
11960 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20  t is, then the. 
11970 20 2a 2a 20 28 63 6f 73 74 3c 6c 6f 77 65 73 74   ** (cost<lowest
11980 43 6f 73 74 29 20 74 65 73 74 20 62 65 6c 6f 77  Cost) test below
11990 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 74   will never be t
119a0 72 75 65 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  rue..  ** .  ** 
119b0 55 73 65 20 22 28 64 6f 75 62 6c 65 29 32 22 20  Use "(double)2" 
119c0 69 6e 73 74 65 61 64 20 6f 66 20 22 32 2e 30 22  instead of "2.0"
119d0 20 69 6e 20 63 61 73 65 20 4f 4d 49 54 5f 46 4c   in case OMIT_FL
119e0 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 20 0a 20 20  OATING_POINT .  
119f0 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 20  ** is defined.. 
11a00 20 2a 2f 0a 20 20 69 66 28 20 28 53 51 4c 49 54   */.  if( (SQLIT
11a10 45 5f 42 49 47 5f 44 42 4c 2f 28 28 64 6f 75 62  E_BIG_DBL/((doub
11a20 6c 65 29 32 29 29 3c 72 43 6f 73 74 20 29 7b 0a  le)2))<rCost ){.
11a30 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74      pCost->rCost
11a40 20 3d 20 28 53 51 4c 49 54 45 5f 42 49 47 5f 44   = (SQLITE_BIG_D
11a50 42 4c 2f 28 28 64 6f 75 62 6c 65 29 32 29 29 3b  BL/((double)2));
11a60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43  .  }else{.    pC
11a70 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f  ost->rCost = rCo
11a80 73 74 3b 0a 20 20 7d 0a 20 20 70 43 6f 73 74 2d  st;.  }.  pCost-
11a90 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62 49 64 78  >plan.u.pVtabIdx
11aa0 20 3d 20 70 49 64 78 49 6e 66 6f 3b 0a 20 20 69   = pIdxInfo;.  i
11ab0 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64  f( pIdxInfo->ord
11ac0 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 29 7b 0a  erByConsumed ){.
11ad0 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e      pCost->plan.
11ae0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
11af0 5f 4f 52 44 45 52 42 59 3b 0a 20 20 7d 0a 20 20  _ORDERBY;.  }.  
11b00 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 45 71 20  pCost->plan.nEq 
11b10 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d  = 0;.  pIdxInfo-
11b20 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64  >nOrderBy = nOrd
11b30 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 54 72 79 20  erBy;..  /* Try 
11b40 74 6f 20 66 69 6e 64 20 61 20 6d 6f 72 65 20 65  to find a more e
11b50 66 66 69 63 69 65 6e 74 20 61 63 63 65 73 73 20  fficient access 
11b60 70 61 74 74 65 72 6e 20 62 79 20 75 73 69 6e 67  pattern by using
11b70 20 6d 75 6c 74 69 70 6c 65 20 69 6e 64 65 78 65   multiple indexe
11b80 73 0a 20 20 2a 2a 20 74 6f 20 6f 70 74 69 6d 69  s.  ** to optimi
11b90 7a 65 20 61 6e 20 4f 52 20 65 78 70 72 65 73 73  ze an OR express
11ba0 69 6f 6e 20 77 69 74 68 69 6e 20 74 68 65 20 57  ion within the W
11bb0 48 45 52 45 20 63 6c 61 75 73 65 2e 20 0a 20 20  HERE clause. .  
11bc0 2a 2f 0a 20 20 62 65 73 74 4f 72 43 6c 61 75 73  */.  bestOrClaus
11bd0 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  eIndex(pParse, p
11be0 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61  WC, pSrc, notRea
11bf0 64 79 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 43  dy, pOrderBy, pC
11c00 6f 73 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ost);.}.#endif /
11c10 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
11c20 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f  RTUALTABLE */../
11c30 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 49  *.** Argument pI
11c40 64 78 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  dx is a pointer 
11c50 74 6f 20 61 6e 20 69 6e 64 65 78 20 73 74 72 75  to an index stru
11c60 63 74 75 72 65 20 74 68 61 74 20 68 61 73 20 61  cture that has a
11c70 6e 20 61 72 72 61 79 20 6f 66 0a 2a 2a 20 53 51  n array of.** SQ
11c80 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c  LITE_INDEX_SAMPL
11c90 45 53 20 65 76 65 6e 6c 79 20 73 70 61 63 65 64  ES evenly spaced
11ca0 20 73 61 6d 70 6c 65 73 20 6f 66 20 74 68 65 20   samples of the 
11cb0 66 69 72 73 74 20 69 6e 64 65 78 65 64 20 63 6f  first indexed co
11cc0 6c 75 6d 6e 0a 2a 2a 20 73 74 6f 72 65 64 20 69  lumn.** stored i
11cd0 6e 20 49 6e 64 65 78 2e 61 53 61 6d 70 6c 65 2e  n Index.aSample.
11ce0 20 54 68 65 20 64 6f 6d 61 69 6e 20 6f 66 20 76   The domain of v
11cf0 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20  alues stored in 
11d00 73 61 69 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6d  said column.** m
11d10 61 79 20 62 65 20 74 68 6f 75 67 68 74 20 6f 66  ay be thought of
11d20 20 61 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f   as divided into
11d30 20 28 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53   (SQLITE_INDEX_S
11d40 41 4d 50 4c 45 53 2b 31 29 20 72 65 67 69 6f 6e  AMPLES+1) region
11d50 73 2e 0a 2a 2a 20 52 65 67 69 6f 6e 20 30 20 63  s..** Region 0 c
11d60 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 76 61 6c 75  ontains all valu
11d70 65 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  es smaller than 
11d80 74 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65  the first sample
11d90 20 76 61 6c 75 65 2e 20 52 65 67 69 6f 6e 0a 2a   value. Region.*
11da0 2a 20 31 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c  * 1 contains val
11db0 75 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ues larger than 
11dc0 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
11dd0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66 69 72  value of the fir
11de0 73 74 20 73 61 6d 70 6c 65 2c 0a 2a 2a 20 62 75  st sample,.** bu
11df0 74 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  t smaller than t
11e00 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
11e10 73 65 63 6f 6e 64 2e 20 41 6e 64 20 73 6f 20 6f  second. And so o
11e20 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  n..**.** If succ
11e30 65 73 73 66 75 6c 2c 20 74 68 69 73 20 66 75 6e  essful, this fun
11e40 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73  ction determines
11e50 20 77 68 69 63 68 20 6f 66 20 74 68 65 20 72 65   which of the re
11e60 67 69 6f 6e 73 20 76 61 6c 75 65 20 0a 2a 2a 20  gions value .** 
11e70 70 56 61 6c 20 6c 69 65 73 20 69 6e 2c 20 73 65  pVal lies in, se
11e80 74 73 20 2a 70 69 52 65 67 69 6f 6e 20 74 6f 20  ts *piRegion to 
11e90 74 68 65 20 72 65 67 69 6f 6e 20 69 6e 64 65 78  the region index
11ea0 20 28 61 20 76 61 6c 75 65 20 62 65 74 77 65 65   (a value betwee
11eb0 6e 20 30 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54  n 0.** and SQLIT
11ec0 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 2b  E_INDEX_SAMPLES+
11ed0 31 2c 20 69 6e 63 6c 75 73 69 76 65 29 20 61 6e  1, inclusive) an
11ee0 64 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  d returns SQLITE
11ef0 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 61  _OK..** Or, if a
11f00 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 20 77 68 69  n OOM occurs whi
11f10 6c 65 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 65  le converting te
11f20 78 74 20 76 61 6c 75 65 73 20 62 65 74 77 65 65  xt values betwee
11f30 6e 20 65 6e 63 6f 64 69 6e 67 73 2c 0a 2a 2a 20  n encodings,.** 
11f40 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
11f50 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 69  returned and *pi
11f60 52 65 67 69 6f 6e 20 69 73 20 75 6e 64 65 66 69  Region is undefi
11f70 6e 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ned..*/.#ifdef S
11f80 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
11f90 54 32 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  T2.static int wh
11fa0 65 72 65 52 61 6e 67 65 52 65 67 69 6f 6e 28 0a  ereRangeRegion(.
11fb0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
11fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11fd0 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
11fe0 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20  tion */.  Index 
11ff0 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20  *pIdx,          
12000 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
12010 6f 20 63 6f 6e 73 69 64 65 72 20 64 6f 6d 61 69  o consider domai
12020 6e 20 6f 66 20 2a 2f 0a 20 20 73 71 6c 69 74 65  n of */.  sqlite
12030 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 2c 20 20  3_value *pVal,  
12040 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
12050 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20  o consider */.  
12060 69 6e 74 20 2a 70 69 52 65 67 69 6f 6e 20 20 20  int *piRegion   
12070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
12080 55 54 3a 20 52 65 67 69 6f 6e 20 6f 66 20 64 6f  UT: Region of do
12090 6d 61 69 6e 20 69 6e 20 77 68 69 63 68 20 76 61  main in which va
120a0 6c 75 65 20 6c 69 65 73 20 2a 2f 0a 29 7b 0a 20  lue lies */.){. 
120b0 20 69 66 28 20 41 4c 57 41 59 53 28 70 56 61 6c   if( ALWAYS(pVal
120c0 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 53 61  ) ){.    IndexSa
120d0 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65 20 3d 20  mple *aSample = 
120e0 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20  pIdx->aSample;. 
120f0 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20     int i = 0;.  
12100 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 73 71    int eType = sq
12110 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
12120 28 70 56 61 6c 29 3b 0a 0a 20 20 20 20 69 66 28  (pVal);..    if(
12130 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49   eType==SQLITE_I
12140 4e 54 45 47 45 52 20 7c 7c 20 65 54 79 70 65 3d  NTEGER || eType=
12150 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b  =SQLITE_FLOAT ){
12160 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20  .      double r 
12170 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
12180 64 6f 75 62 6c 65 28 70 56 61 6c 29 3b 0a 20 20  double(pVal);.  
12190 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53      for(i=0; i<S
121a0 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50  QLITE_INDEX_SAMP
121b0 4c 45 53 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  LES; i++){.     
121c0 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69     if( aSample[i
121d0 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ].eType==SQLITE_
121e0 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  NULL ) continue;
121f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 53 61  .        if( aSa
12200 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3e 3d 53  mple[i].eType>=S
12210 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c 20 61 53  QLITE_TEXT || aS
12220 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3e 72 20 29  ample[i].u.r>r )
12230 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
12240 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20      }else{ .    
12250 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
12260 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20  pParse->db;.    
12270 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
12280 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38  ;.      const u8
12290 20 2a 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e   *z;.      int n
122a0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 70 56 61 6c  ;..      /* pVal
122b0 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73 71 6c 69   comes from sqli
122c0 74 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72  te3ValueFromExpr
122d0 28 29 20 73 6f 20 74 68 65 20 74 79 70 65 20 63  () so the type c
122e0 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  annot be NULL */
122f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
12300 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58  Type==SQLITE_TEX
12310 54 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  T || eType==SQLI
12320 54 45 5f 42 4c 4f 42 20 29 3b 0a 0a 20 20 20 20  TE_BLOB );..    
12330 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c    if( eType==SQL
12340 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20  ITE_BLOB ){.    
12350 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75      z = (const u
12360 38 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  8 *)sqlite3_valu
12370 65 5f 62 6c 6f 62 28 70 56 61 6c 29 3b 0a 20 20  e_blob(pVal);.  
12380 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62        pColl = db
12390 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
123a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f       assert( pCo
123b0 6c 6c 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  ll->enc==SQLITE_
123c0 55 54 46 38 20 29 3b 0a 20 20 20 20 20 20 7d 65  UTF8 );.      }e
123d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  lse{.        pCo
123e0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43  ll = sqlite3GetC
123f0 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54  ollSeq(db, SQLIT
12400 45 5f 55 54 46 38 2c 20 30 2c 20 2a 70 49 64 78  E_UTF8, 0, *pIdx
12410 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  ->azColl);.     
12420 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20     if( pColl==0 
12430 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
12440 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
12450 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f  rse, "no such co
12460 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
12470 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  : %s",.         
12480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12490 20 2a 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 29 3b   *pIdx->azColl);
124a0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
124b0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
124c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
124d0 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 38 20    z = (const u8 
124e0 2a 29 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65  *)sqlite3ValueTe
124f0 78 74 28 70 56 61 6c 2c 20 70 43 6f 6c 6c 2d 3e  xt(pVal, pColl->
12500 65 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  enc);.        if
12510 28 20 21 7a 20 29 7b 0a 20 20 20 20 20 20 20 20  ( !z ){.        
12520 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12530 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d  NOMEM;.        }
12540 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
12550 20 7a 20 26 26 20 70 43 6f 6c 6c 20 26 26 20 70   z && pColl && p
12560 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 20 20  Coll->xCmp );.  
12570 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 20 3d 20      }.      n = 
12580 73 71 6c 69 74 65 33 56 61 6c 75 65 42 79 74 65  sqlite3ValueByte
12590 73 28 70 56 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65  s(pVal, pColl->e
125a0 6e 63 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28  nc);..      for(
125b0 69 3d 30 3b 20 69 3c 53 51 4c 49 54 45 5f 49 4e  i=0; i<SQLITE_IN
125c0 44 45 58 5f 53 41 4d 50 4c 45 53 3b 20 69 2b 2b  DEX_SAMPLES; i++
125d0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
125e0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 53  ;.        int eS
125f0 61 6d 70 6c 65 74 79 70 65 20 3d 20 61 53 61 6d  ampletype = aSam
12600 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3b 0a 20 20  ple[i].eType;.  
12610 20 20 20 20 20 20 69 66 28 20 65 53 61 6d 70 6c        if( eSampl
12620 65 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55  etype==SQLITE_NU
12630 4c 4c 20 7c 7c 20 65 53 61 6d 70 6c 65 74 79 70  LL || eSampletyp
12640 65 3c 65 54 79 70 65 20 29 20 63 6f 6e 74 69 6e  e<eType ) contin
12650 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
12660 28 65 53 61 6d 70 6c 65 74 79 70 65 21 3d 65 54  (eSampletype!=eT
12670 79 70 65 29 20 29 20 62 72 65 61 6b 3b 0a 23 69  ype) ) break;.#i
12680 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12690 54 5f 55 54 46 31 36 0a 20 20 20 20 20 20 20 20  T_UTF16.        
126a0 69 66 28 20 70 43 6f 6c 6c 2d 3e 65 6e 63 21 3d  if( pColl->enc!=
126b0 53 51 4c 49 54 45 5f 55 54 46 38 20 29 7b 0a 20  SQLITE_UTF8 ){. 
126c0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 61           int nSa
126d0 6d 70 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20  mple;.          
126e0 63 68 61 72 20 2a 7a 53 61 6d 70 6c 65 20 3d 20  char *zSample = 
126f0 73 71 6c 69 74 65 33 55 74 66 38 74 6f 31 36 28  sqlite3Utf8to16(
12700 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
12710 62 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 2c 20 61  b, pColl->enc, a
12720 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 61  Sample[i].u.z, a
12730 53 61 6d 70 6c 65 5b 69 5d 2e 6e 42 79 74 65 2c  Sample[i].nByte,
12740 20 26 6e 53 61 6d 70 6c 65 0a 20 20 20 20 20 20   &nSample.      
12750 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
12760 20 69 66 28 20 21 7a 53 61 6d 70 6c 65 20 29 7b   if( !zSample ){
12770 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
12780 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
12790 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
127a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
127b0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
127c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
127d0 72 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28  r = pColl->xCmp(
127e0 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e 53  pColl->pUser, nS
127f0 61 6d 70 6c 65 2c 20 7a 53 61 6d 70 6c 65 2c 20  ample, zSample, 
12800 6e 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20  n, z);.         
12810 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
12820 62 2c 20 7a 53 61 6d 70 6c 65 29 3b 0a 20 20 20  b, zSample);.   
12830 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
12840 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  f.        {.    
12850 20 20 20 20 20 20 72 20 3d 20 70 43 6f 6c 6c 2d        r = pColl-
12860 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73  >xCmp(pColl->pUs
12870 65 72 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e  er, aSample[i].n
12880 42 79 74 65 2c 20 61 53 61 6d 70 6c 65 5b 69 5d  Byte, aSample[i]
12890 2e 75 2e 7a 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20  .u.z, n, z);.   
128a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
128b0 66 28 20 72 3e 30 20 29 20 62 72 65 61 6b 3b 0a  f( r>0 ) break;.
128c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
128d0 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20     assert( i>=0 
128e0 26 26 20 69 3c 3d 53 51 4c 49 54 45 5f 49 4e 44  && i<=SQLITE_IND
128f0 45 58 5f 53 41 4d 50 4c 45 53 20 29 3b 0a 20 20  EX_SAMPLES );.  
12900 20 20 2a 70 69 52 65 67 69 6f 6e 20 3d 20 69 3b    *piRegion = i;
12910 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
12920 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
12930 66 20 20 20 2f 2a 20 23 69 66 64 65 66 20 53 51  f   /* #ifdef SQ
12940 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
12950 32 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65  2 */../*.** If e
12960 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
12970 72 65 70 72 65 73 65 6e 74 73 20 61 20 6c 69 74  represents a lit
12980 65 72 61 6c 20 76 61 6c 75 65 2c 20 73 65 74 20  eral value, set 
12990 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a  *pp to point to.
129a0 2a 2a 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61  ** an sqlite3_va
129b0 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  lue structure co
129c0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 61 6d  ntaining the sam
129d0 65 20 76 61 6c 75 65 2c 20 77 69 74 68 20 61 66  e value, with af
129e0 66 69 6e 69 74 79 0a 2a 2a 20 61 66 66 20 61 70  finity.** aff ap
129f0 70 6c 69 65 64 20 74 6f 20 69 74 2c 20 62 65 66  plied to it, bef
12a00 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 49  ore returning. I
12a10 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
12a20 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 0a  ibility of the .
12a30 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  ** caller to eve
12a40 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20  ntually release 
12a50 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 62  this structure b
12a60 79 20 70 61 73 73 69 6e 67 20 69 74 20 74 6f 20  y passing it to 
12a70 0a 2a 2a 20 73 71 6c 69 74 65 33 56 61 6c 75 65  .** sqlite3Value
12a80 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  Free()..**.** If
12a90 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 72   the current par
12aa0 73 65 20 69 73 20 61 20 72 65 63 6f 6d 70 69 6c  se is a recompil
12ab0 65 20 28 73 71 6c 69 74 65 33 52 65 70 72 65 70  e (sqlite3Reprep
12ac0 61 72 65 28 29 29 20 61 6e 64 20 70 45 78 70 72  are()) and pExpr
12ad0 0a 2a 2a 20 69 73 20 61 6e 20 53 51 4c 20 76 61  .** is an SQL va
12ae0 72 69 61 62 6c 65 20 74 68 61 74 20 63 75 72 72  riable that curr
12af0 65 6e 74 6c 79 20 68 61 73 20 61 20 6e 6f 6e 2d  ently has a non-
12b00 4e 55 4c 4c 20 76 61 6c 75 65 20 62 6f 75 6e 64  NULL value bound
12b10 20 74 6f 20 69 74 2c 0a 2a 2a 20 63 72 65 61 74   to it,.** creat
12b20 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c  e an sqlite3_val
12b30 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ue structure con
12b40 74 61 69 6e 69 6e 67 20 74 68 69 73 20 76 61 6c  taining this val
12b50 75 65 2c 20 61 67 61 69 6e 20 77 69 74 68 0a 2a  ue, again with.*
12b60 2a 20 61 66 66 69 6e 69 74 79 20 61 66 66 20 61  * affinity aff a
12b70 70 70 6c 69 65 64 20 74 6f 20 69 74 2c 20 69 6e  pplied to it, in
12b80 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  stead..**.** If 
12b90 6e 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 61  neither of the a
12ba0 62 6f 76 65 20 61 70 70 6c 79 2c 20 73 65 74 20  bove apply, set 
12bb0 2a 70 70 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  *pp to NULL..**.
12bc0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
12bd0 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e  ccurs, return an
12be0 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68   error code. Oth
12bf0 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
12c00 4b 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  K..*/.#ifdef SQL
12c10 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32  ITE_ENABLE_STAT2
12c20 0a 73 74 61 74 69 63 20 69 6e 74 20 76 61 6c 75  .static int valu
12c30 65 46 72 6f 6d 45 78 70 72 28 0a 20 20 50 61 72  eFromExpr(.  Par
12c40 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45  se *pParse, .  E
12c50 78 70 72 20 2a 70 45 78 70 72 2c 20 0a 20 20 75  xpr *pExpr, .  u
12c60 38 20 61 66 66 2c 20 0a 20 20 73 71 6c 69 74 65  8 aff, .  sqlite
12c70 33 5f 76 61 6c 75 65 20 2a 2a 70 70 0a 29 7b 0a  3_value **pp.){.
12c80 20 20 2f 2a 20 54 68 65 20 65 76 61 6c 43 6f 6e    /* The evalCon
12c90 73 74 45 78 70 72 28 29 20 66 75 6e 63 74 69 6f  stExpr() functio
12ca0 6e 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65  n will have alre
12cb0 61 64 79 20 63 6f 6e 76 65 72 74 65 64 20 61 6e  ady converted an
12cc0 79 20 54 4b 5f 56 41 52 49 41 42 4c 45 0a 20 20  y TK_VARIABLE.  
12cd0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ** expression in
12ce0 76 6f 6c 76 65 64 20 69 6e 20 61 6e 20 63 6f 6d  volved in an com
12cf0 70 61 72 69 73 6f 6e 20 69 6e 74 6f 20 61 20 54  parison into a T
12d00 4b 5f 52 45 47 49 53 54 45 52 2e 20 2a 2f 0a 20  K_REGISTER. */. 
12d10 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
12d20 6f 70 21 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20  op!=TK_VARIABLE 
12d30 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  );.  if( pExpr->
12d40 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
12d50 26 26 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54  && pExpr->op2==T
12d60 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20  K_VARIABLE ){.  
12d70 20 20 69 6e 74 20 69 56 61 72 20 3d 20 70 45 78    int iVar = pEx
12d80 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
12d90 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56   sqlite3VdbeSetV
12da0 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70  armask(pParse->p
12db0 56 64 62 65 2c 20 69 56 61 72 29 3b 0a 20 20 20  Vdbe, iVar);.   
12dc0 20 2a 70 70 20 3d 20 73 71 6c 69 74 65 33 56 64   *pp = sqlite3Vd
12dd0 62 65 47 65 74 56 61 6c 75 65 28 70 50 61 72 73  beGetValue(pPars
12de0 65 2d 3e 70 52 65 70 72 65 70 61 72 65 2c 20 69  e->pReprepare, i
12df0 56 61 72 2c 20 61 66 66 29 3b 0a 20 20 20 20 72  Var, aff);.    r
12e00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12e10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71  .  }.  return sq
12e20 6c 69 74 65 33 56 61 6c 75 65 46 72 6f 6d 45 78  lite3ValueFromEx
12e30 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  pr(pParse->db, p
12e40 45 78 70 72 2c 20 53 51 4c 49 54 45 5f 55 54 46  Expr, SQLITE_UTF
12e50 38 2c 20 61 66 66 2c 20 70 70 29 3b 0a 7d 0a 23  8, aff, pp);.}.#
12e60 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
12e70 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
12e80 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74  ed to estimate t
12e90 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
12ea0 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 76  s that will be v
12eb0 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 73 63 61  isited.** by sca
12ec0 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 66  nning an index f
12ed0 6f 72 20 61 20 72 61 6e 67 65 20 6f 66 20 76 61  or a range of va
12ee0 6c 75 65 73 2e 20 54 68 65 20 72 61 6e 67 65 20  lues. The range 
12ef0 6d 61 79 20 68 61 76 65 20 61 6e 20 75 70 70 65  may have an uppe
12f00 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f  r.** bound, a lo
12f10 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f  wer bound, or bo
12f20 74 68 2e 20 54 68 65 20 57 48 45 52 45 20 63 6c  th. The WHERE cl
12f30 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 74 20  ause terms that 
12f40 73 65 74 20 74 68 65 20 75 70 70 65 72 0a 2a 2a  set the upper.**
12f50 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64   and lower bound
12f60 73 20 61 72 65 20 72 65 70 72 65 73 65 6e 74 65  s are represente
12f70 64 20 62 79 20 70 4c 6f 77 65 72 20 61 6e 64 20  d by pLower and 
12f80 70 55 70 70 65 72 20 72 65 73 70 65 63 74 69 76  pUpper respectiv
12f90 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d  ely. For.** exam
12fa0 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  ple, assuming th
12fb0 61 74 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e  at index p is on
12fc0 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20   t1(a):.**.**   
12fd0 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ... FROM t1 WHER
12fe0 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20  E a > ? AND a < 
12ff0 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ? ....**        
13000 20 20 20 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f              |___
13010 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a  __|   |_____|.**
13020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13030 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
13040 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
13050 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72            pLower
13060 20 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a      pUpper.**.**
13070 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68   If either of th
13080 65 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72  e upper or lower
13090 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70 72   bound is not pr
130a0 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c  esent, then NULL
130b0 20 69 73 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a   is passed in.**
130c0 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 63 6f   place of the co
130d0 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72  rresponding Wher
130e0 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  eTerm..**.** The
130f0 20 6e 45 71 20 70 61 72 61 6d 65 74 65 72 20 69   nEq parameter i
13100 73 20 70 61 73 73 65 64 20 74 68 65 20 69 6e 64  s passed the ind
13110 65 78 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ex of the index 
13120 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20 74  column subject t
13130 6f 20 74 68 65 0a 2a 2a 20 72 61 6e 67 65 20 63  o the.** range c
13140 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65  onstraint. Or, e
13150 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65  quivalently, the
13160 20 6e 75 6d 62 65 72 20 6f 66 20 65 71 75 61 6c   number of equal
13170 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  ity constraints.
13180 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20  ** optimized by 
13190 74 68 65 20 70 72 6f 70 6f 73 65 64 20 69 6e 64  the proposed ind
131a0 65 78 20 73 63 61 6e 2e 20 46 6f 72 20 65 78 61  ex scan. For exa
131b0 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 69  mple, assuming i
131c0 6e 64 65 78 20 70 20 69 73 0a 2a 2a 20 6f 6e 20  ndex p is.** on 
131d0 74 31 28 61 2c 20 62 29 2c 20 61 6e 64 20 74 68  t1(a, b), and th
131e0 65 20 53 51 4c 20 71 75 65 72 79 20 69 73 3a 0a  e SQL query is:.
131f0 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
13200 20 74 31 20 57 48 45 52 45 20 61 20 3d 20 3f 20   t1 WHERE a = ? 
13210 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20 62 20  AND b > ? AND b 
13220 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68  < ? ....**.** th
13230 65 6e 20 6e 45 71 20 73 68 6f 75 6c 64 20 62 65  en nEq should be
13240 20 70 61 73 73 65 64 20 74 68 65 20 76 61 6c 75   passed the valu
13250 65 20 31 20 28 61 73 20 74 68 65 20 72 61 6e 67  e 1 (as the rang
13260 65 20 72 65 73 74 72 69 63 74 65 64 20 63 6f 6c  e restricted col
13270 75 6d 6e 2c 0a 2a 2a 20 62 2c 20 69 73 20 74 68  umn,.** b, is th
13280 65 20 73 65 63 6f 6e 64 20 6c 65 66 74 2d 6d 6f  e second left-mo
13290 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
132a0 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66 20   index). Or, if 
132b0 74 68 65 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a  the query is:.**
132c0 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
132d0 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e  1 WHERE a > ? AN
132e0 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a  D a < ? ....**.*
132f0 2a 20 74 68 65 6e 20 6e 45 71 20 73 68 6f 75 6c  * then nEq shoul
13300 64 20 62 65 20 70 61 73 73 65 64 20 30 2e 0a 2a  d be passed 0..*
13310 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
13320 64 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e  d value is an in
13330 74 65 67 65 72 20 62 65 74 77 65 65 6e 20 31 20  teger between 1 
13340 61 6e 64 20 31 30 30 2c 20 69 6e 63 6c 75 73 69  and 100, inclusi
13350 76 65 2e 20 41 20 72 65 74 75 72 6e 0a 2a 2a 20  ve. A return.** 
13360 76 61 6c 75 65 20 6f 66 20 31 20 69 6e 64 69 63  value of 1 indic
13370 61 74 65 73 20 74 68 61 74 20 74 68 65 20 70 72  ates that the pr
13380 6f 70 6f 73 65 64 20 72 61 6e 67 65 20 73 63 61  oposed range sca
13390 6e 20 69 73 20 65 78 70 65 63 74 65 64 20 74 6f  n is expected to
133a0 20 76 69 73 69 74 0a 2a 2a 20 61 70 70 72 6f 78   visit.** approx
133b0 69 6d 61 74 65 6c 79 20 31 2f 31 30 30 74 68 20  imately 1/100th 
133c0 28 31 25 29 20 6f 66 20 74 68 65 20 72 6f 77 73  (1%) of the rows
133d0 20 73 65 6c 65 63 74 65 64 20 62 79 20 74 68 65   selected by the
133e0 20 6e 45 71 20 65 71 75 61 6c 69 74 79 0a 2a 2a   nEq equality.**
133f0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 69 66   constraints (if
13400 20 61 6e 79 29 2e 20 41 20 72 65 74 75 72 6e 20   any). A return 
13410 76 61 6c 75 65 20 6f 66 20 31 30 30 20 69 6e 64  value of 100 ind
13420 69 63 61 74 65 73 20 74 68 61 74 20 69 74 20 69  icates that it i
13430 73 20 65 78 70 65 63 74 65 64 0a 2a 2a 20 74 68  s expected.** th
13440 61 74 20 74 68 65 20 72 61 6e 67 65 20 73 63 61  at the range sca
13450 6e 20 77 69 6c 6c 20 76 69 73 69 74 20 65 76 65  n will visit eve
13460 72 79 20 72 6f 77 20 28 31 30 30 25 29 20 73 65  ry row (100%) se
13470 6c 65 63 74 65 64 20 62 79 20 74 68 65 20 65 71  lected by the eq
13480 75 61 6c 69 74 79 0a 2a 2a 20 63 6f 6e 73 74 72  uality.** constr
13490 61 69 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  aints..**.** In 
134a0 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73  the absence of s
134b0 71 6c 69 74 65 5f 73 74 61 74 32 20 41 4e 41 4c  qlite_stat2 ANAL
134c0 59 5a 45 20 64 61 74 61 2c 20 65 61 63 68 20 72  YZE data, each r
134d0 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74 79 0a  ange inequality.
134e0 2a 2a 20 72 65 64 75 63 65 73 20 74 68 65 20 73  ** reduces the s
134f0 65 61 72 63 68 20 73 70 61 63 65 20 62 79 20 32  earch space by 2
13500 2f 33 72 64 73 2e 20 20 48 65 6e 63 65 20 61 20  /3rds.  Hence a 
13510 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e  single constrain
13520 74 20 28 78 3e 3f 29 0a 2a 2a 20 72 65 73 75 6c  t (x>?).** resul
13530 74 73 20 69 6e 20 61 20 72 65 74 75 72 6e 20 6f  ts in a return o
13540 66 20 33 33 20 61 6e 64 20 61 20 72 61 6e 67 65  f 33 and a range
13550 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 78 3e 3f   constraint (x>?
13560 20 41 4e 44 20 78 3c 3f 29 20 72 65 73 75 6c 74   AND x<?) result
13570 73 0a 2a 2a 20 69 6e 20 61 20 72 65 74 75 72 6e  s.** in a return
13580 20 6f 66 20 31 31 2e 0a 2a 2f 0a 73 74 61 74 69   of 11..*/.stati
13590 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65  c int whereRange
135a0 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
135b0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
135c0 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
135d0 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
135e0 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20  text */.  Index 
135f0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
13600 2a 20 54 68 65 20 69 6e 64 65 78 20 63 6f 6e 74  * The index cont
13610 61 69 6e 69 6e 67 20 74 68 65 20 72 61 6e 67 65  aining the range
13620 2d 63 6f 6d 70 61 72 65 64 20 63 6f 6c 75 6d 6e  -compared column
13630 3b 20 22 78 22 20 2a 2f 0a 20 20 69 6e 74 20 6e  ; "x" */.  int n
13640 45 71 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq,             
13650 2f 2a 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 2d  /* index into p-
13660 3e 61 43 6f 6c 5b 5d 20 6f 66 20 74 68 65 20 72  >aCol[] of the r
13670 61 6e 67 65 2d 63 6f 6d 70 61 72 65 64 20 63 6f  ange-compared co
13680 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54  lumn */.  WhereT
13690 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f  erm *pLower,   /
136a0 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e  * Lower bound on
136b0 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20   the range. ex: 
136c0 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65  "x>123" Might be
136d0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65   NULL */.  Where
136e0 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20  Term *pUpper,   
136f0 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f  /* Upper bound o
13700 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a  n the range. ex:
13710 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62   "x<455" Might b
13720 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
13730 2a 70 69 45 73 74 20 20 20 20 20 20 20 20 20 20  *piEst          
13740 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20   /* OUT: Return 
13750 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  value */.){.  in
13760 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13770 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
13780 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a 0a 20  _ENABLE_STAT2.. 
13790 20 69 66 28 20 6e 45 71 3d 3d 30 20 26 26 20 70   if( nEq==0 && p
137a0 2d 3e 61 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20  ->aSample ){.   
137b0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
137c0 70 4c 6f 77 65 72 56 61 6c 20 3d 20 30 3b 0a 20  pLowerVal = 0;. 
137d0 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
137e0 20 2a 70 55 70 70 65 72 56 61 6c 20 3d 20 30 3b   *pUpperVal = 0;
137f0 0a 20 20 20 20 69 6e 74 20 69 45 73 74 3b 0a 20  .    int iEst;. 
13800 20 20 20 69 6e 74 20 69 4c 6f 77 65 72 20 3d 20     int iLower = 
13810 30 3b 0a 20 20 20 20 69 6e 74 20 69 55 70 70 65  0;.    int iUppe
13820 72 20 3d 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  r = SQLITE_INDEX
13830 5f 53 41 4d 50 4c 45 53 3b 0a 20 20 20 20 75 38  _SAMPLES;.    u8
13840 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65   aff = p->pTable
13850 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75  ->aCol[p->aiColu
13860 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e 69 74 79 3b  mn[0]].affinity;
13870 0a 0a 20 20 20 20 69 66 28 20 70 4c 6f 77 65 72  ..    if( pLower
13880 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
13890 70 45 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e  pExpr = pLower->
138a0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
138b0 20 20 20 20 20 72 63 20 3d 20 76 61 6c 75 65 46       rc = valueF
138c0 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20  romExpr(pParse, 
138d0 70 45 78 70 72 2c 20 61 66 66 2c 20 26 70 4c 6f  pExpr, aff, &pLo
138e0 77 65 72 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20  werVal);.    }. 
138f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13900 45 5f 4f 4b 20 26 26 20 70 55 70 70 65 72 20 29  E_OK && pUpper )
13910 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
13920 78 70 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45  xpr = pUpper->pE
13930 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
13940 20 20 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f     rc = valueFro
13950 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45  mExpr(pParse, pE
13960 78 70 72 2c 20 61 66 66 2c 20 26 70 55 70 70 65  xpr, aff, &pUppe
13970 72 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  rVal);.    }..  
13980 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13990 5f 4f 4b 20 7c 7c 20 28 70 4c 6f 77 65 72 56 61  _OK || (pLowerVa
139a0 6c 3d 3d 30 20 26 26 20 70 55 70 70 65 72 56 61  l==0 && pUpperVa
139b0 6c 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73  l==0) ){.      s
139c0 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
139d0 70 4c 6f 77 65 72 56 61 6c 29 3b 0a 20 20 20 20  pLowerVal);.    
139e0 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
139f0 65 65 28 70 55 70 70 65 72 56 61 6c 29 3b 0a 20  ee(pUpperVal);. 
13a00 20 20 20 20 20 67 6f 74 6f 20 72 61 6e 67 65 5f       goto range_
13a10 65 73 74 5f 66 61 6c 6c 62 61 63 6b 3b 0a 20 20  est_fallback;.  
13a20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f 77    }else if( pLow
13a30 65 72 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  erVal==0 ){.    
13a40 20 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e 67    rc = whereRang
13a50 65 52 65 67 69 6f 6e 28 70 50 61 72 73 65 2c 20  eRegion(pParse, 
13a60 70 2c 20 70 55 70 70 65 72 56 61 6c 2c 20 26 69  p, pUpperVal, &i
13a70 55 70 70 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Upper);.      if
13a80 28 20 70 4c 6f 77 65 72 20 29 20 69 4c 6f 77 65  ( pLower ) iLowe
13a90 72 20 3d 20 69 55 70 70 65 72 2f 32 3b 0a 20 20  r = iUpper/2;.  
13aa0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 55 70 70    }else if( pUpp
13ab0 65 72 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  erVal==0 ){.    
13ac0 20 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e 67    rc = whereRang
13ad0 65 52 65 67 69 6f 6e 28 70 50 61 72 73 65 2c 20  eRegion(pParse, 
13ae0 70 2c 20 70 4c 6f 77 65 72 56 61 6c 2c 20 26 69  p, pLowerVal, &i
13af0 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Lower);.      if
13b00 28 20 70 55 70 70 65 72 20 29 20 69 55 70 70 65  ( pUpper ) iUppe
13b10 72 20 3d 20 28 69 4c 6f 77 65 72 20 2b 20 53 51  r = (iLower + SQ
13b20 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c  LITE_INDEX_SAMPL
13b30 45 53 20 2b 20 31 29 2f 32 3b 0a 20 20 20 20 7d  ES + 1)/2;.    }
13b40 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
13b50 20 77 68 65 72 65 52 61 6e 67 65 52 65 67 69 6f   whereRangeRegio
13b60 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70 55 70  n(pParse, p, pUp
13b70 70 65 72 56 61 6c 2c 20 26 69 55 70 70 65 72 29  perVal, &iUpper)
13b80 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
13b90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13ba0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 52       rc = whereR
13bb0 61 6e 67 65 52 65 67 69 6f 6e 28 70 50 61 72 73  angeRegion(pPars
13bc0 65 2c 20 70 2c 20 70 4c 6f 77 65 72 56 61 6c 2c  e, p, pLowerVal,
13bd0 20 26 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20   &iLower);.     
13be0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 45   }.    }..    iE
13bf0 73 74 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c  st = iUpper - iL
13c00 6f 77 65 72 3b 0a 20 20 20 20 74 65 73 74 63 61  ower;.    testca
13c10 73 65 28 20 69 45 73 74 3d 3d 53 51 4c 49 54 45  se( iEst==SQLITE
13c20 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 20 29  _INDEX_SAMPLES )
13c30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 45  ;.    assert( iE
13c40 73 74 3c 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  st<=SQLITE_INDEX
13c50 5f 53 41 4d 50 4c 45 53 20 29 3b 0a 20 20 20 20  _SAMPLES );.    
13c60 69 66 28 20 69 45 73 74 3c 31 20 29 7b 0a 20 20  if( iEst<1 ){.  
13c70 20 20 20 20 69 45 73 74 20 3d 20 31 3b 0a 20 20      iEst = 1;.  
13c80 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
13c90 56 61 6c 75 65 46 72 65 65 28 70 4c 6f 77 65 72  ValueFree(pLower
13ca0 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Val);.    sqlite
13cb0 33 56 61 6c 75 65 46 72 65 65 28 70 55 70 70 65  3ValueFree(pUppe
13cc0 72 56 61 6c 29 3b 0a 20 20 20 20 2a 70 69 45 73  rVal);.    *piEs
13cd0 74 20 3d 20 28 69 45 73 74 20 2a 20 31 30 30 29  t = (iEst * 100)
13ce0 2f 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41  /SQLITE_INDEX_SA
13cf0 4d 50 4c 45 53 3b 0a 20 20 20 20 72 65 74 75 72  MPLES;.    retur
13d00 6e 20 72 63 3b 0a 20 20 7d 0a 72 61 6e 67 65 5f  n rc;.  }.range_
13d10 65 73 74 5f 66 61 6c 6c 62 61 63 6b 3a 0a 23 65  est_fallback:.#e
13d20 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
13d30 41 4d 45 54 45 52 28 70 50 61 72 73 65 29 3b 0a  AMETER(pParse);.
13d40 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
13d50 45 52 28 70 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ER(p);.  UNUSED_
13d60 50 41 52 41 4d 45 54 45 52 28 6e 45 71 29 3b 0a  PARAMETER(nEq);.
13d70 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
13d80 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65   pLower || pUppe
13d90 72 20 29 3b 0a 20 20 69 66 28 20 70 4c 6f 77 65  r );.  if( pLowe
13da0 72 20 26 26 20 70 55 70 70 65 72 20 29 7b 0a 20  r && pUpper ){. 
13db0 20 20 20 2a 70 69 45 73 74 20 3d 20 31 31 3b 0a     *piEst = 11;.
13dc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69    }else{.    *pi
13dd0 45 73 74 20 3d 20 33 33 3b 0a 20 20 7d 0a 20 20  Est = 33;.  }.  
13de0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
13df0 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 71 75  *.** Find the qu
13e00 65 72 79 20 70 6c 61 6e 20 66 6f 72 20 61 63 63  ery plan for acc
13e10 65 73 73 69 6e 67 20 61 20 70 61 72 74 69 63 75  essing a particu
13e20 6c 61 72 20 74 61 62 6c 65 2e 20 20 57 72 69 74  lar table.  Writ
13e30 65 20 74 68 65 0a 2a 2a 20 62 65 73 74 20 71 75  e the.** best qu
13e40 65 72 79 20 70 6c 61 6e 20 61 6e 64 20 69 74 73  ery plan and its
13e50 20 63 6f 73 74 20 69 6e 74 6f 20 74 68 65 20 57   cost into the W
13e60 68 65 72 65 43 6f 73 74 20 6f 62 6a 65 63 74 20  hereCost object 
13e70 73 75 70 70 6c 69 65 64 20 61 73 20 74 68 65 0a  supplied as the.
13e80 2a 2a 20 6c 61 73 74 20 70 61 72 61 6d 65 74 65  ** last paramete
13e90 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 6f 77  r..**.** The low
13ea0 65 73 74 20 63 6f 73 74 20 70 6c 61 6e 20 77 69  est cost plan wi
13eb0 6e 73 2e 20 20 54 68 65 20 63 6f 73 74 20 69 73  ns.  The cost is
13ec0 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20   an estimate of 
13ed0 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 0a 2a 2a  the amount of.**
13ee0 20 43 50 55 20 61 6e 64 20 64 69 73 6b 20 49 2f   CPU and disk I/
13ef0 4f 20 6e 65 65 64 20 74 6f 20 70 72 6f 63 65 73  O need to proces
13f00 73 20 74 68 65 20 72 65 71 75 65 73 74 20 75 73  s the request us
13f10 69 6e 67 20 74 68 65 20 73 65 6c 65 63 74 65 64  ing the selected
13f20 20 70 6c 61 6e 2e 0a 2a 2a 20 46 61 63 74 6f 72   plan..** Factor
13f30 73 20 74 68 61 74 20 69 6e 66 6c 75 65 6e 63 65  s that influence
13f40 20 63 6f 73 74 20 69 6e 63 6c 75 64 65 3a 0a 2a   cost include:.*
13f50 2a 0a 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 65  *.**    *  The e
13f60 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20  stimated number 
13f70 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
13f80 6c 20 62 65 20 72 65 74 72 69 65 76 65 64 2e 20  l be retrieved. 
13f90 20 28 54 68 65 0a 2a 2a 20 20 20 20 20 20 20 66   (The.**       f
13fa0 65 77 65 72 20 74 68 65 20 62 65 74 74 65 72 2e  ewer the better.
13fb0 29 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68  ).**.**    *  Wh
13fc0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 73 6f 72  ether or not sor
13fd0 74 69 6e 67 20 6d 75 73 74 20 6f 63 63 75 72 2e  ting must occur.
13fe0 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65  .**.**    *  Whe
13ff0 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 72  ther or not ther
14000 65 20 6d 75 73 74 20 62 65 20 73 65 70 61 72 61  e must be separa
14010 74 65 20 6c 6f 6f 6b 75 70 73 20 69 6e 20 74 68  te lookups in th
14020 65 0a 2a 2a 20 20 20 20 20 20 20 69 6e 64 65 78  e.**       index
14030 20 61 6e 64 20 69 6e 20 74 68 65 20 6d 61 69 6e   and in the main
14040 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
14050 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e   there was an IN
14060 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20  DEXED BY clause 
14070 28 70 53 72 63 2d 3e 70 49 6e 64 65 78 29 20 61  (pSrc->pIndex) a
14080 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74  ttached to the t
14090 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 53  able in.** the S
140a0 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  QL statement, th
140b0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
140c0 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 73 20   only considers 
140d0 70 6c 61 6e 73 20 75 73 69 6e 67 20 74 68 65 20  plans using the 
140e0 0a 2a 2a 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e  .** named index.
140f0 20 49 66 20 6e 6f 20 73 75 63 68 20 70 6c 61 6e   If no such plan
14100 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20   is found, then 
14110 74 68 65 20 72 65 74 75 72 6e 65 64 20 63 6f 73  the returned cos
14120 74 20 69 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  t is.** SQLITE_B
14130 49 47 5f 44 42 4c 2e 20 49 66 20 61 20 70 6c 61  IG_DBL. If a pla
14140 6e 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74 20  n is found that 
14150 75 73 65 73 20 74 68 65 20 6e 61 6d 65 64 20 69  uses the named i
14160 6e 64 65 78 2c 20 0a 2a 2a 20 74 68 65 6e 20 74  ndex, .** then t
14170 68 65 20 63 6f 73 74 20 69 73 20 63 61 6c 63 75  he cost is calcu
14180 6c 61 74 65 64 20 69 6e 20 74 68 65 20 75 73 75  lated in the usu
14190 61 6c 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  al way..**.** If
141a0 20 61 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63   a NOT INDEXED c
141b0 6c 61 75 73 65 20 28 70 53 72 63 2d 3e 6e 6f 74  lause (pSrc->not
141c0 49 6e 64 65 78 65 64 21 3d 30 29 20 77 61 73 20  Indexed!=0) was 
141d0 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
141e0 74 61 62 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65  table .** in the
141f0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
14200 74 2c 20 74 68 65 6e 20 6e 6f 20 69 6e 64 65 78  t, then no index
14210 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  es are considere
14220 64 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20  d. However, the 
14230 0a 2a 2a 20 73 65 6c 65 63 74 65 64 20 70 6c 61  .** selected pla
14240 6e 20 6d 61 79 20 73 74 69 6c 6c 20 74 61 6b 65  n may still take
14250 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68   advantage of th
14260 65 20 74 61 62 6c 65 73 20 62 75 69 6c 74 2d 69  e tables built-i
14270 6e 20 72 6f 77 69 64 0a 2a 2a 20 69 6e 64 65 78  n rowid.** index
14280 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
14290 20 62 65 73 74 42 74 72 65 65 49 6e 64 65 78 28   bestBtreeIndex(
142a0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
142b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
142c0 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
142d0 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
142e0 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
142f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
14300 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
14310 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
14320 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54  tem *pSrc,  /* T
14330 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
14340 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  erm to search */
14350 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
14360 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ady,           /
14370 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72  * Mask of cursor
14380 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61  s that are not a
14390 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 45 78  vailable */.  Ex
143a0 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
143b0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
143c0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
143d0 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20   */.  WhereCost 
143e0 2a 70 43 6f 73 74 20 20 20 20 20 20 20 20 20 20  *pCost          
143f0 20 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74    /* Lowest cost
14400 20 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 29   query plan */.)
14410 7b 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70  {.  int iCur = p
14420 53 72 63 2d 3e 69 43 75 72 73 6f 72 3b 20 20 20  Src->iCursor;   
14430 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66  /* The cursor of
14440 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
14450 20 61 63 63 65 73 73 65 64 20 2a 2f 0a 20 20 49   accessed */.  I
14460 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20  ndex *pProbe;   
14470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
14480 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 65 76   index we are ev
14490 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e  aluating */.  In
144a0 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
144b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70            /* Cop
144c0 79 20 6f 66 20 70 50 72 6f 62 65 2c 20 6f 72 20  y of pProbe, or 
144d0 7a 65 72 6f 20 66 6f 72 20 49 50 4b 20 69 6e 64  zero for IPK ind
144e0 65 78 20 2a 2f 0a 20 20 69 6e 74 20 65 71 54 65  ex */.  int eqTe
144f0 72 6d 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  rmMask;         
14500 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6d      /* Current m
14510 61 73 6b 20 6f 66 20 76 61 6c 69 64 20 65 71 75  ask of valid equ
14520 61 6c 69 74 79 20 6f 70 65 72 61 74 6f 72 73 20  ality operators 
14530 2a 2f 0a 20 20 69 6e 74 20 69 64 78 45 71 54 65  */.  int idxEqTe
14540 72 6d 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  rmMask;         
14550 20 2f 2a 20 49 6e 64 65 78 20 6d 61 73 6b 20 6f   /* Index mask o
14560 66 20 76 61 6c 69 64 20 65 71 75 61 6c 69 74 79  f valid equality
14570 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20   operators */.  
14580 49 6e 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20  Index sPk;      
14590 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
145a0 20 66 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65   fake index obje
145b0 63 74 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61  ct for the prima
145c0 72 79 20 6b 65 79 20 2a 2f 0a 20 20 75 6e 73 69  ry key */.  unsi
145d0 67 6e 65 64 20 69 6e 74 20 61 69 52 6f 77 45 73  gned int aiRowEs
145e0 74 50 6b 5b 32 5d 3b 20 2f 2a 20 54 68 65 20 61  tPk[2]; /* The a
145f0 69 52 6f 77 45 73 74 5b 5d 20 76 61 6c 75 65 20  iRowEst[] value 
14600 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65  for the sPk inde
14610 78 20 2a 2f 0a 20 20 69 6e 74 20 61 69 43 6f 6c  x */.  int aiCol
14620 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20  umnPk = -1;     
14630 20 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d     /* The aColum
14640 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68  n[] value for th
14650 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20  e sPk index */. 
14660 20 69 6e 74 20 77 73 46 6c 61 67 4d 61 73 6b 3b   int wsFlagMask;
14670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14680 41 6c 6c 6f 77 65 64 20 66 6c 61 67 73 20 69 6e  Allowed flags in
14690 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46   pCost->plan.wsF
146a0 6c 61 67 20 2a 2f 0a 0a 20 20 2f 2a 20 49 6e 69  lag */..  /* Ini
146b0 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 73 74  tialize the cost
146c0 20 74 6f 20 61 20 77 6f 72 73 74 2d 63 61 73 65   to a worst-case
146d0 20 76 61 6c 75 65 20 2a 2f 0a 20 20 6d 65 6d 73   value */.  mems
146e0 65 74 28 70 43 6f 73 74 2c 20 30 2c 20 73 69 7a  et(pCost, 0, siz
146f0 65 6f 66 28 2a 70 43 6f 73 74 29 29 3b 0a 20 20  eof(*pCost));.  
14700 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20 53  pCost->rCost = S
14710 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 0a  QLITE_BIG_DBL;..
14720 20 20 2f 2a 20 49 66 20 74 68 65 20 70 53 72 63    /* If the pSrc
14730 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 72 69   table is the ri
14740 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c  ght table of a L
14750 45 46 54 20 4a 4f 49 4e 20 74 68 65 6e 20 77 65  EFT JOIN then we
14760 20 6d 61 79 20 6e 6f 74 0a 20 20 2a 2a 20 75 73   may not.  ** us
14770 65 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 73 61  e an index to sa
14780 74 69 73 66 79 20 49 53 20 4e 55 4c 4c 20 63 6f  tisfy IS NULL co
14790 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 74 68 61  nstraints on tha
147a0 74 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69  t table.  This i
147b0 73 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 63  s.  ** because c
147c0 6f 6c 75 6d 6e 73 20 6d 69 67 68 74 20 65 6e 64  olumns might end
147d0 20 75 70 20 62 65 69 6e 67 20 4e 55 4c 4c 20 69   up being NULL i
147e0 66 20 74 68 65 20 74 61 62 6c 65 20 64 6f 65 73  f the table does
147f0 20 6e 6f 74 20 6d 61 74 63 68 20 2d 0a 20 20 2a   not match -.  *
14800 2a 20 61 20 63 69 72 63 75 6d 73 74 61 6e 63 65  * a circumstance
14810 20 77 68 69 63 68 20 74 68 65 20 69 6e 64 65 78   which the index
14820 20 63 61 6e 6e 6f 74 20 68 65 6c 70 20 75 73 20   cannot help us 
14830 64 69 73 63 6f 76 65 72 2e 20 20 54 69 63 6b 65  discover.  Ticke
14840 74 20 23 32 31 37 37 2e 0a 20 20 2a 2f 0a 20 20  t #2177..  */.  
14850 69 66 28 20 70 53 72 63 2d 3e 6a 6f 69 6e 74 79  if( pSrc->jointy
14860 70 65 20 26 20 4a 54 5f 4c 45 46 54 20 29 7b 0a  pe & JT_LEFT ){.
14870 20 20 20 20 69 64 78 45 71 54 65 72 6d 4d 61 73      idxEqTermMas
14880 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b  k = WO_EQ|WO_IN;
14890 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64  .  }else{.    id
148a0 78 45 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f  xEqTermMask = WO
148b0 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e  _EQ|WO_IN|WO_ISN
148c0 55 4c 4c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ULL;.  }..  if( 
148d0 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 7b 0a  pSrc->pIndex ){.
148e0 20 20 20 20 2f 2a 20 41 6e 20 49 4e 44 45 58 45      /* An INDEXE
148f0 44 20 42 59 20 63 6c 61 75 73 65 20 73 70 65 63  D BY clause spec
14900 69 66 69 65 73 20 61 20 70 61 72 74 69 63 75 6c  ifies a particul
14910 61 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  ar index to use 
14920 2a 2f 0a 20 20 20 20 70 49 64 78 20 3d 20 70 50  */.    pIdx = pP
14930 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e  robe = pSrc->pIn
14940 64 65 78 3b 0a 20 20 20 20 77 73 46 6c 61 67 4d  dex;.    wsFlagM
14950 61 73 6b 20 3d 20 7e 28 57 48 45 52 45 5f 52 4f  ask = ~(WHERE_RO
14960 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57  WID_EQ|WHERE_ROW
14970 49 44 5f 52 41 4e 47 45 29 3b 0a 20 20 20 20 65  ID_RANGE);.    e
14980 71 54 65 72 6d 4d 61 73 6b 20 3d 20 69 64 78 45  qTermMask = idxE
14990 71 54 65 72 6d 4d 61 73 6b 3b 0a 20 20 7d 65 6c  qTermMask;.  }el
149a0 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65  se{.    /* There
149b0 20 69 73 20 6e 6f 20 49 4e 44 45 58 45 44 20 42   is no INDEXED B
149c0 59 20 63 6c 61 75 73 65 2e 20 20 43 72 65 61 74  Y clause.  Creat
149d0 65 20 61 20 66 61 6b 65 20 49 6e 64 65 78 20 6f  e a fake Index o
149e0 62 6a 65 63 74 20 74 6f 0a 20 20 20 20 2a 2a 20  bject to.    ** 
149f0 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 70 72  represent the pr
14a00 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 20  imary key */.   
14a10 20 49 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20   Index *pFirst; 
14a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14a30 2a 20 41 6e 79 20 6f 74 68 65 72 20 69 6e 64 65  * Any other inde
14a40 78 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  x on the table *
14a50 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50  /.    memset(&sP
14a60 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64  k, 0, sizeof(Ind
14a70 65 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 43  ex));.    sPk.nC
14a80 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 73  olumn = 1;.    s
14a90 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d 20 26 61  Pk.aiColumn = &a
14aa0 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20 73  iColumnPk;.    s
14ab0 50 6b 2e 61 69 52 6f 77 45 73 74 20 3d 20 61 69  Pk.aiRowEst = ai
14ac0 52 6f 77 45 73 74 50 6b 3b 0a 20 20 20 20 61 69  RowEstPk;.    ai
14ad0 52 6f 77 45 73 74 50 6b 5b 31 5d 20 3d 20 31 3b  RowEstPk[1] = 1;
14ae0 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72  .    sPk.onError
14af0 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20   = OE_Replace;. 
14b00 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20     sPk.pTable = 
14b10 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 20 20  pSrc->pTab;.    
14b20 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70  pFirst = pSrc->p
14b30 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
14b40 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e   if( pSrc->notIn
14b50 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  dexed==0 ){.    
14b60 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46    sPk.pNext = pF
14b70 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  irst;.    }.    
14b80 2f 2a 20 54 68 65 20 61 69 52 6f 77 45 73 74 50  /* The aiRowEstP
14b90 6b 5b 30 5d 20 69 73 20 61 6e 20 65 73 74 69 6d  k[0] is an estim
14ba0 61 74 65 20 6f 66 20 74 68 65 20 74 6f 74 61 6c  ate of the total
14bb0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
14bc0 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 61  in the.    ** ta
14bd0 62 6c 65 2e 20 20 47 65 74 20 74 68 69 73 20 69  ble.  Get this i
14be0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
14bf0 74 68 65 20 41 4e 41 4c 59 5a 45 20 69 6e 66 6f  the ANALYZE info
14c00 72 6d 61 74 69 6f 6e 20 69 66 20 69 74 20 69 73  rmation if it is
14c10 0a 20 20 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c  .    ** availabl
14c20 65 2e 20 20 49 66 20 6e 6f 74 20 61 76 61 69 6c  e.  If not avail
14c30 61 62 6c 65 2c 20 61 73 73 75 6d 65 20 74 68 65  able, assume the
14c40 20 74 61 62 6c 65 20 31 20 6d 69 6c 6c 69 6f 6e   table 1 million
14c50 20 72 6f 77 73 20 69 6e 20 73 69 7a 65 2e 0a 20   rows in size.. 
14c60 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46     */.    if( pF
14c70 69 72 73 74 20 29 7b 0a 20 20 20 20 20 20 61 73  irst ){.      as
14c80 73 65 72 74 28 20 70 46 69 72 73 74 2d 3e 61 69  sert( pFirst->ai
14c90 52 6f 77 45 73 74 21 3d 30 20 29 3b 20 2f 2a 20  RowEst!=0 ); /* 
14ca0 41 6c 6c 6f 63 61 74 65 64 20 74 6f 67 65 74 68  Allocated togeth
14cb0 65 72 20 77 69 74 68 20 70 46 69 72 73 74 20 2a  er with pFirst *
14cc0 2f 0a 20 20 20 20 20 20 61 69 52 6f 77 45 73 74  /.      aiRowEst
14cd0 50 6b 5b 30 5d 20 3d 20 70 46 69 72 73 74 2d 3e  Pk[0] = pFirst->
14ce0 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20  aiRowEst[0];.   
14cf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 69   }else{.      ai
14d00 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 31 30  RowEstPk[0] = 10
14d10 30 30 30 30 30 3b 0a 20 20 20 20 7d 0a 20 20 20  00000;.    }.   
14d20 20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a   pProbe = &sPk;.
14d30 20 20 20 20 77 73 46 6c 61 67 4d 61 73 6b 20 3d      wsFlagMask =
14d40 20 7e 28 0a 20 20 20 20 20 20 20 20 57 48 45 52   ~(.        WHER
14d50 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52  E_COLUMN_IN|WHER
14d60 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52  E_COLUMN_EQ|WHER
14d70 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 7c 57 48  E_COLUMN_NULL|WH
14d80 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
14d90 0a 20 20 20 20 29 3b 0a 20 20 20 20 65 71 54 65  .    );.    eqTe
14da0 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57  rmMask = WO_EQ|W
14db0 4f 5f 49 4e 3b 0a 20 20 20 20 70 49 64 78 20 3d  O_IN;.    pIdx =
14dc0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f   0;.  }..  /* Lo
14dd0 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69  op over all indi
14de0 63 65 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ces looking for 
14df0 74 68 65 20 62 65 73 74 20 6f 6e 65 20 74 6f 20  the best one to 
14e00 75 73 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b  use.  */.  for(;
14e10 20 70 50 72 6f 62 65 3b 20 70 49 64 78 3d 70 50   pProbe; pIdx=pP
14e20 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65  robe=pProbe->pNe
14e30 78 74 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75  xt){.    const u
14e40 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 20 63 6f  nsigned int * co
14e50 6e 73 74 20 61 69 52 6f 77 45 73 74 20 3d 20 70  nst aiRowEst = p
14e60 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 3b  Probe->aiRowEst;
14e70 0a 20 20 20 20 64 6f 75 62 6c 65 20 63 6f 73 74  .    double cost
14e80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14e90 20 2f 2a 20 43 6f 73 74 20 6f 66 20 75 73 69 6e   /* Cost of usin
14ea0 67 20 70 50 72 6f 62 65 20 2a 2f 0a 20 20 20 20  g pProbe */.    
14eb0 64 6f 75 62 6c 65 20 6e 52 6f 77 3b 20 20 20 20  double nRow;    
14ec0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
14ed0 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20  stimated number 
14ee0 6f 66 20 72 6f 77 73 20 69 6e 20 72 65 73 75 6c  of rows in resul
14ef0 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74  t set */.    int
14f00 20 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20   rev;           
14f10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
14f20 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76 65   to scan in reve
14f30 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20  rse order */.   
14f40 20 69 6e 74 20 77 73 46 6c 61 67 73 20 3d 20 30   int wsFlags = 0
14f50 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 75 73  ;.    Bitmask us
14f60 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  ed = 0;..    /* 
14f70 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  The following va
14f80 72 69 61 62 6c 65 73 20 61 72 65 20 70 6f 70 75  riables are popu
14f90 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74  lated based on t
14fa0 68 65 20 70 72 6f 70 65 72 74 69 65 73 20 6f 66  he properties of
14fb0 0a 20 20 20 20 2a 2a 20 73 63 61 6e 20 62 65 69  .    ** scan bei
14fc0 6e 67 20 65 76 61 6c 75 61 74 65 64 2e 20 54 68  ng evaluated. Th
14fd0 65 79 20 61 72 65 20 74 68 65 6e 20 75 73 65 64  ey are then used
14fe0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
14ff0 65 20 65 78 70 65 63 74 65 64 0a 20 20 20 20 2a  e expected.    *
15000 2a 20 63 6f 73 74 20 61 6e 64 20 6e 75 6d 62 65  * cost and numbe
15010 72 20 6f 66 20 72 6f 77 73 20 72 65 74 75 72 6e  r of rows return
15020 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
15030 2a 20 20 6e 45 71 3a 20 0a 20 20 20 20 2a 2a 20  *  nEq: .    ** 
15040 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 65 71 75     Number of equ
15050 61 6c 69 74 79 20 74 65 72 6d 73 20 74 68 61 74  ality terms that
15060 20 63 61 6e 20 62 65 20 69 6d 70 6c 65 6d 65 6e   can be implemen
15070 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 69 6e  ted using the in
15080 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  dex..    **.    
15090 2a 2a 20 20 6e 49 6e 4d 75 6c 3a 20 20 0a 20 20  **  nInMul:  .  
150a0 20 20 2a 2a 20 20 20 20 54 68 65 20 22 69 6e 2d    **    The "in-
150b0 6d 75 6c 74 69 70 6c 69 65 72 22 2e 20 54 68 69  multiplier". Thi
150c0 73 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65  s is an estimate
150d0 20 6f 66 20 68 6f 77 20 6d 61 6e 79 20 73 65 65   of how many see
150e0 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20 0a 20 20  k operations .  
150f0 20 20 2a 2a 20 20 20 20 53 51 4c 69 74 65 20 6d    **    SQLite m
15100 75 73 74 20 70 65 72 66 6f 72 6d 20 6f 6e 20 74  ust perform on t
15110 68 65 20 69 6e 64 65 78 20 69 6e 20 71 75 65 73  he index in ques
15120 74 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c  tion. For exampl
15130 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20 2a  e, if the .    *
15140 2a 20 20 20 20 57 48 45 52 45 20 63 6c 61 75 73  *    WHERE claus
15150 65 20 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  e is:.    **.   
15160 20 2a 2a 20 20 20 20 20 20 57 48 45 52 45 20 61   **      WHERE a
15170 20 49 4e 20 28 31 2c 20 32 2c 20 33 29 20 41 4e   IN (1, 2, 3) AN
15180 44 20 62 20 49 4e 20 28 34 2c 20 35 2c 20 36 29  D b IN (4, 5, 6)
15190 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
151a0 20 20 53 51 4c 69 74 65 20 6d 75 73 74 20 70 65    SQLite must pe
151b0 72 66 6f 72 6d 20 39 20 6c 6f 6f 6b 75 70 73 20  rform 9 lookups 
151c0 6f 6e 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28  on an index on (
151d0 61 2c 20 62 29 2c 20 73 6f 20 6e 49 6e 4d 75 6c  a, b), so nInMul
151e0 20 69 73 20 0a 20 20 20 20 2a 2a 20 20 20 20 73   is .    **    s
151f0 65 74 20 74 6f 20 39 2e 20 47 69 76 65 6e 20 74  et to 9. Given t
15200 68 65 20 73 61 6d 65 20 73 63 68 65 6d 61 20 61  he same schema a
15210 6e 64 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  nd either of the
15220 20 66 6f 6c 6c 6f 77 69 6e 67 20 57 48 45 52 45   following WHERE
15230 20 0a 20 20 20 20 2a 2a 20 20 20 20 63 6c 61 75   .    **    clau
15240 73 65 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ses:.    **.    
15250 2a 2a 20 20 20 20 20 20 57 48 45 52 45 20 61 20  **      WHERE a 
15260 3d 20 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20  =  1.    **     
15270 20 57 48 45 52 45 20 61 20 3e 3d 20 32 0a 20 20   WHERE a >= 2.  
15280 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 6e    **.    **    n
15290 49 6e 4d 75 6c 20 69 73 20 73 65 74 20 74 6f 20  InMul is set to 
152a0 31 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  1..    **.    **
152b0 20 20 20 20 49 66 20 74 68 65 72 65 20 65 78 69      If there exi
152c0 73 74 73 20 61 20 57 48 45 52 45 20 74 65 72 6d  sts a WHERE term
152d0 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20   of the form "x 
152e0 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
152f0 2c 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 20  , then .    **  
15300 20 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74    the sub-select
15310 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 72   is assumed to r
15320 65 74 75 72 6e 20 32 35 20 72 6f 77 73 20 66 6f  eturn 25 rows fo
15330 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
15340 66 20 0a 20 20 20 20 2a 2a 20 20 20 20 64 65 74  f .    **    det
15350 65 72 6d 69 6e 69 6e 67 20 6e 49 6e 4d 75 6c 2e  ermining nInMul.
15360 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
15370 62 49 6e 45 73 74 3a 20 20 0a 20 20 20 20 2a 2a  bInEst:  .    **
15380 20 20 20 20 53 65 74 20 74 6f 20 74 72 75 65 20      Set to true 
15390 69 66 20 74 68 65 72 65 20 77 61 73 20 61 74 20  if there was at 
153a0 6c 65 61 73 74 20 6f 6e 65 20 22 78 20 49 4e 20  least one "x IN 
153b0 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 74 65  (SELECT ...)" te
153c0 72 6d 20 75 73 65 64 20 0a 20 20 20 20 2a 2a 20  rm used .    ** 
153d0 20 20 20 69 6e 20 64 65 74 65 72 6d 69 6e 69 6e     in determinin
153e0 67 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  g the value of n
153f0 49 6e 4d 75 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20  InMul..    **.  
15400 20 20 2a 2a 20 20 6e 42 6f 75 6e 64 3a 0a 20 20    **  nBound:.  
15410 20 20 2a 2a 20 20 20 20 41 6e 20 65 73 74 69 6d    **    An estim
15420 61 74 65 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e  ate on the amoun
15430 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  t of the table t
15440 68 61 74 20 6d 75 73 74 20 62 65 20 73 65 61 72  hat must be sear
15450 63 68 65 64 2e 20 20 41 0a 20 20 20 20 2a 2a 20  ched.  A.    ** 
15460 20 20 20 76 61 6c 75 65 20 6f 66 20 31 30 30 20     value of 100 
15470 6d 65 61 6e 73 20 74 68 65 20 65 6e 74 69 72 65  means the entire
15480 20 74 61 62 6c 65 20 69 73 20 73 65 61 72 63 68   table is search
15490 65 64 2e 20 20 52 61 6e 67 65 20 63 6f 6e 73 74  ed.  Range const
154a0 72 61 69 6e 74 73 0a 20 20 20 20 2a 2a 20 20 20  raints.    **   
154b0 20 6d 69 67 68 74 20 72 65 64 75 63 65 20 74 68   might reduce th
154c0 69 73 20 74 6f 20 61 20 76 61 6c 75 65 20 6c 65  is to a value le
154d0 73 73 20 74 68 61 6e 20 31 30 30 20 74 6f 20 69  ss than 100 to i
154e0 6e 64 69 63 61 74 65 20 74 68 61 74 20 6f 6e 6c  ndicate that onl
154f0 79 0a 20 20 20 20 2a 2a 20 20 20 20 61 20 66 72  y.    **    a fr
15500 61 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61  action of the ta
15510 62 6c 65 20 6e 65 65 64 73 20 73 65 61 72 63 68  ble needs search
15520 69 6e 67 2e 20 20 49 6e 20 74 68 65 20 61 62 73  ing.  In the abs
15530 65 6e 63 65 20 6f 66 0a 20 20 20 20 2a 2a 20 20  ence of.    **  
15540 20 20 73 71 6c 69 74 65 5f 73 74 61 74 32 20 41    sqlite_stat2 A
15550 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20 61 20 73  NALYZE data, a s
15560 69 6e 67 6c 65 20 69 6e 65 71 75 61 6c 69 74 79  ingle inequality
15570 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61   reduces the sea
15580 72 63 68 0a 20 20 20 20 2a 2a 20 20 20 20 73 70  rch.    **    sp
15590 61 63 65 20 74 6f 20 31 2f 33 72 64 20 69 74 73  ace to 1/3rd its
155a0 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 20   original size. 
155b0 20 53 6f 20 61 6e 20 78 3e 3f 20 63 6f 6e 73 74   So an x>? const
155c0 72 61 69 6e 74 20 72 65 64 75 63 65 73 0a 20 20  raint reduces.  
155d0 20 20 2a 2a 20 20 20 20 6e 42 6f 75 6e 64 20 74    **    nBound t
155e0 6f 20 33 33 2e 20 20 54 77 6f 20 63 6f 6e 73 74  o 33.  Two const
155f0 72 61 69 6e 74 73 20 28 78 3e 3f 20 41 4e 44 20  raints (x>? AND 
15600 78 3c 3f 29 20 72 65 64 75 63 65 20 6e 42 6f 75  x<?) reduce nBou
15610 6e 64 20 74 6f 20 31 31 2e 0a 20 20 20 20 2a 2a  nd to 11..    **
15620 0a 20 20 20 20 2a 2a 20 20 62 53 6f 72 74 3a 20  .    **  bSort: 
15630 20 20 0a 20 20 20 20 2a 2a 20 20 20 20 42 6f 6f    .    **    Boo
15640 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 74 68  lean. True if th
15650 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
15660 42 59 20 63 6c 61 75 73 65 20 74 68 61 74 20 77  BY clause that w
15670 69 6c 6c 20 72 65 71 75 69 72 65 20 61 6e 20 0a  ill require an .
15680 20 20 20 20 2a 2a 20 20 20 20 65 78 74 65 72 6e      **    extern
15690 61 6c 20 73 6f 72 74 20 28 69 2e 65 2e 20 73 63  al sort (i.e. sc
156a0 61 6e 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78  anning the index
156b0 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64   being evaluated
156c0 20 77 69 6c 6c 20 6e 6f 74 20 0a 20 20 20 20 2a   will not .    *
156d0 2a 20 20 20 20 63 6f 72 72 65 63 74 6c 79 20 6f  *    correctly o
156e0 72 64 65 72 20 72 65 63 6f 72 64 73 29 2e 0a 20  rder records).. 
156f0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 62 4c     **.    **  bL
15700 6f 6f 6b 75 70 3a 20 0a 20 20 20 20 2a 2a 20 20  ookup: .    **  
15710 20 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20    Boolean. True 
15720 69 66 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65  if for each inde
15730 78 20 65 6e 74 72 79 20 76 69 73 69 74 65 64 20  x entry visited 
15740 61 20 6c 6f 6f 6b 75 70 20 6f 6e 20 74 68 65 20  a lookup on the 
15750 0a 20 20 20 20 2a 2a 20 20 20 20 63 6f 72 72 65  .    **    corre
15760 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20 62  sponding table b
15770 2d 74 72 65 65 20 69 73 20 72 65 71 75 69 72 65  -tree is require
15780 64 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61 79  d. This is alway
15790 73 20 66 61 6c 73 65 20 0a 20 20 20 20 2a 2a 20  s false .    ** 
157a0 20 20 20 66 6f 72 20 74 68 65 20 72 6f 77 69 64     for the rowid
157b0 20 69 6e 64 65 78 2e 20 46 6f 72 20 6f 74 68 65   index. For othe
157c0 72 20 69 6e 64 65 78 65 73 2c 20 69 74 20 69 73  r indexes, it is
157d0 20 74 72 75 65 20 75 6e 6c 65 73 73 20 61 6c 6c   true unless all
157e0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20   the .    **    
157f0 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74  columns of the t
15800 61 62 6c 65 20 75 73 65 64 20 62 79 20 74 68 65  able used by the
15810 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
15820 74 20 61 72 65 20 70 72 65 73 65 6e 74 20 69 6e  t are present in
15830 20 0a 20 20 20 20 2a 2a 20 20 20 20 74 68 65 20   .    **    the 
15840 69 6e 64 65 78 20 28 73 75 63 68 20 61 6e 20 69  index (such an i
15850 6e 64 65 78 20 69 73 20 73 6f 6d 65 74 69 6d 65  ndex is sometime
15860 73 20 64 65 73 63 72 69 62 65 64 20 61 73 20 61  s described as a
15870 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 29   covering index)
15880 2e 0a 20 20 20 20 2a 2a 20 20 20 20 46 6f 72 20  ..    **    For 
15890 65 78 61 6d 70 6c 65 2c 20 67 69 76 65 6e 20 74  example, given t
158a0 68 65 20 69 6e 64 65 78 20 6f 6e 20 28 61 2c 20  he index on (a, 
158b0 62 29 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 6f  b), the second o
158c0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
158d0 0a 20 20 20 20 2a 2a 20 20 20 20 74 77 6f 20 71  .    **    two q
158e0 75 65 72 69 65 73 20 72 65 71 75 69 72 65 73 20  ueries requires 
158f0 74 61 62 6c 65 20 62 2d 74 72 65 65 20 6c 6f 6f  table b-tree loo
15900 6b 75 70 73 2c 20 62 75 74 20 74 68 65 20 66 69  kups, but the fi
15910 72 73 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20  rst does not..  
15920 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
15930 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61          SELECT a
15940 2c 20 62 20 20 20 20 46 52 4f 4d 20 74 62 6c 20  , b    FROM tbl 
15950 57 48 45 52 45 20 61 20 3d 20 31 3b 0a 20 20 20  WHERE a = 1;.   
15960 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
15970 53 45 4c 45 43 54 20 61 2c 20 62 2c 20 63 20 46  SELECT a, b, c F
15980 52 4f 4d 20 74 62 6c 20 57 48 45 52 45 20 61 20  ROM tbl WHERE a 
15990 3d 20 31 3b 0a 20 20 20 20 2a 2f 0a 20 20 20 20  = 1;.    */.    
159a0 69 6e 74 20 6e 45 71 3b 0a 20 20 20 20 69 6e 74  int nEq;.    int
159b0 20 62 49 6e 45 73 74 20 3d 20 30 3b 0a 20 20 20   bInEst = 0;.   
159c0 20 69 6e 74 20 6e 49 6e 4d 75 6c 20 3d 20 31 3b   int nInMul = 1;
159d0 0a 20 20 20 20 69 6e 74 20 6e 42 6f 75 6e 64 20  .    int nBound 
159e0 3d 20 31 30 30 3b 0a 20 20 20 20 69 6e 74 20 62  = 100;.    int b
159f0 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Sort = 0;.    in
15a00 74 20 62 4c 6f 6f 6b 75 70 20 3d 20 30 3b 0a 0a  t bLookup = 0;..
15a10 20 20 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65      /* Determine
15a20 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 6e   the values of n
15a30 45 71 20 61 6e 64 20 6e 49 6e 4d 75 6c 20 2a 2f  Eq and nInMul */
15a40 0a 20 20 20 20 66 6f 72 28 6e 45 71 3d 30 3b 20  .    for(nEq=0; 
15a50 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  nEq<pProbe->nCol
15a60 75 6d 6e 3b 20 6e 45 71 2b 2b 29 7b 0a 20 20 20  umn; nEq++){.   
15a70 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
15a80 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  erm;           /
15a90 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  * A single term 
15aa0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
15ab0 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  use */.      int
15ac0 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43   j = pProbe->aiC
15ad0 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 20 20  olumn[nEq];.    
15ae0 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
15af0 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c  rm(pWC, iCur, j,
15b00 20 6e 6f 74 52 65 61 64 79 2c 20 65 71 54 65 72   notReady, eqTer
15b10 6d 4d 61 73 6b 2c 20 70 49 64 78 29 3b 0a 20 20  mMask, pIdx);.  
15b20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30      if( pTerm==0
15b30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
15b40 77 73 46 6c 61 67 73 20 7c 3d 20 28 57 48 45 52  wsFlags |= (WHER
15b50 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52  E_COLUMN_EQ|WHER
15b60 45 5f 52 4f 57 49 44 5f 45 51 29 3b 0a 20 20 20  E_ROWID_EQ);.   
15b70 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
15b80 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
15b90 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
15ba0 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
15bb0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 77  pExpr;.        w
15bc0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
15bd0 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20  COLUMN_IN;.     
15be0 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
15bf0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
15c00 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
15c10 20 20 20 20 20 20 20 20 20 6e 49 6e 4d 75 6c 20           nInMul 
15c20 2a 3d 20 32 35 3b 0a 20 20 20 20 20 20 20 20 20  *= 25;.         
15c30 20 62 49 6e 45 73 74 20 3d 20 31 3b 0a 20 20 20   bInEst = 1;.   
15c40 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
15c50 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 7b  Expr->x.pList ){
15c60 0a 20 20 20 20 20 20 20 20 20 20 6e 49 6e 4d 75  .          nInMu
15c70 6c 20 2a 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  l *= pExpr->x.pL
15c80 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 31 3b 0a  ist->nExpr + 1;.
15c90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15ca0 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d  }else if( pTerm-
15cb0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
15cc0 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  ISNULL ){.      
15cd0 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45    wsFlags |= WHE
15ce0 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a  RE_COLUMN_NULL;.
15cf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 73        }.      us
15d00 65 64 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65  ed |= pTerm->pre
15d10 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 7d 0a  reqRight;.    }.
15d20 0a 20 20 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e  .    /* Determin
15d30 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  e the value of n
15d40 42 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 69 66  Bound. */.    if
15d50 28 20 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43  ( nEq<pProbe->nC
15d60 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69  olumn ){.      i
15d70 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61  nt j = pProbe->a
15d80 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20  iColumn[nEq];.  
15d90 20 20 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d      if( findTerm
15da0 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e  (pWC, iCur, j, n
15db0 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57  otReady, WO_LT|W
15dc0 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  O_LE|WO_GT|WO_GE
15dd0 2c 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20  , pIdx) ){.     
15de0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
15df0 6f 70 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  op = findTerm(pW
15e00 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52  C, iCur, j, notR
15e10 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c  eady, WO_LT|WO_L
15e20 45 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  E, pIdx);.      
15e30 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 42 74    WhereTerm *pBt
15e40 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  m = findTerm(pWC
15e50 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65  , iCur, j, notRe
15e60 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45  ady, WO_GT|WO_GE
15e70 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
15e80 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45   whereRangeScanE
15e90 73 74 28 70 50 61 72 73 65 2c 20 70 50 72 6f 62  st(pParse, pProb
15ea0 65 2c 20 6e 45 71 2c 20 70 42 74 6d 2c 20 70 54  e, nEq, pBtm, pT
15eb0 6f 70 2c 20 26 6e 42 6f 75 6e 64 29 3b 0a 20 20  op, &nBound);.  
15ec0 20 20 20 20 20 20 69 66 28 20 70 54 6f 70 20 29        if( pTop )
15ed0 7b 0a 20 20 20 20 20 20 20 20 20 20 77 73 46 6c  {.          wsFl
15ee0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50  ags |= WHERE_TOP
15ef0 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20  _LIMIT;.        
15f00 20 20 75 73 65 64 20 7c 3d 20 70 54 6f 70 2d 3e    used |= pTop->
15f10 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20  prereqRight;.   
15f20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
15f30 66 28 20 70 42 74 6d 20 29 7b 0a 20 20 20 20 20  f( pBtm ){.     
15f40 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20       wsFlags |= 
15f50 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b  WHERE_BTM_LIMIT;
15f60 0a 20 20 20 20 20 20 20 20 20 20 75 73 65 64 20  .          used 
15f70 7c 3d 20 70 42 74 6d 2d 3e 70 72 65 72 65 71 52  |= pBtm->prereqR
15f80 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ight;.        }.
15f90 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20          wsFlags 
15fa0 7c 3d 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  |= (WHERE_COLUMN
15fb0 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 52 4f 57  _RANGE|WHERE_ROW
15fc0 49 44 5f 52 41 4e 47 45 29 3b 0a 20 20 20 20 20  ID_RANGE);.     
15fd0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
15fe0 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72   pProbe->onError
15ff0 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20  !=OE_None ){.   
16000 20 20 20 74 65 73 74 63 61 73 65 28 20 77 73 46     testcase( wsF
16010 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
16020 55 4d 4e 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20  UMN_IN );.      
16030 74 65 73 74 63 61 73 65 28 20 77 73 46 6c 61 67  testcase( wsFlag
16040 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
16050 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 69  _NULL );.      i
16060 66 28 20 28 77 73 46 6c 61 67 73 20 26 20 28 57  f( (wsFlags & (W
16070 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57  HERE_COLUMN_IN|W
16080 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c  HERE_COLUMN_NULL
16090 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))==0 ){.       
160a0 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52   wsFlags |= WHER
160b0 45 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 20 20  E_UNIQUE;.      
160c0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
160d0 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
160e0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
160f0 6e 64 20 74 68 65 20 69 6e 64 65 78 20 62 65 69  nd the index bei
16100 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 77 69  ng considered wi
16110 6c 6c 0a 20 20 20 20 2a 2a 20 6e 61 74 75 72 61  ll.    ** natura
16120 6c 6c 79 20 73 63 61 6e 20 72 6f 77 73 20 69 6e  lly scan rows in
16130 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6f 72   the required or
16140 64 65 72 2c 20 73 65 74 20 74 68 65 20 61 70 70  der, set the app
16150 72 6f 70 72 69 61 74 65 20 66 6c 61 67 73 0a 20  ropriate flags. 
16160 20 20 20 2a 2a 20 69 6e 20 77 73 46 6c 61 67 73     ** in wsFlags
16170 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
16180 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
16190 52 20 42 59 20 63 6c 61 75 73 65 20 62 75 74 20  R BY clause but 
161a0 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a  the index.    **
161b0 20 77 69 6c 6c 20 73 63 61 6e 20 72 6f 77 73 20   will scan rows 
161c0 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f  in a different o
161d0 72 64 65 72 2c 20 73 65 74 20 74 68 65 20 62 53  rder, set the bS
161e0 6f 72 74 20 76 61 72 69 61 62 6c 65 2e 20 20 2a  ort variable.  *
161f0 2f 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  /.    if( pOrder
16200 42 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  By ){.      if( 
16210 28 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  (wsFlags & (WHER
16220 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52  E_COLUMN_IN|WHER
16230 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 29 3d  E_COLUMN_NULL))=
16240 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 69 73  =0.        && is
16250 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 70 50 61  SortingIndex(pPa
16260 72 73 65 2c 70 57 43 2d 3e 70 4d 61 73 6b 53 65  rse,pWC->pMaskSe
16270 74 2c 70 50 72 6f 62 65 2c 69 43 75 72 2c 70 4f  t,pProbe,iCur,pO
16280 72 64 65 72 42 79 2c 6e 45 71 2c 26 72 65 76 29  rderBy,nEq,&rev)
16290 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
162a0 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45    wsFlags |= WHE
162b0 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 7c 57  RE_ROWID_RANGE|W
162c0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
162d0 45 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59 3b  E|WHERE_ORDERBY;
162e0 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73  .        wsFlags
162f0 20 7c 3d 20 28 72 65 76 20 3f 20 57 48 45 52 45   |= (rev ? WHERE
16300 5f 52 45 56 45 52 53 45 20 3a 20 30 29 3b 0a 20  _REVERSE : 0);. 
16310 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16320 20 20 20 20 62 53 6f 72 74 20 3d 20 31 3b 0a 20      bSort = 1;. 
16330 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
16340 20 20 2f 2a 20 49 66 20 63 75 72 72 65 6e 74 6c    /* If currentl
16350 79 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 74 68  y calculating th
16360 65 20 63 6f 73 74 20 6f 66 20 75 73 69 6e 67 20  e cost of using 
16370 61 6e 20 69 6e 64 65 78 20 28 6e 6f 74 20 74 68  an index (not th
16380 65 20 49 50 4b 0a 20 20 20 20 2a 2a 20 69 6e 64  e IPK.    ** ind
16390 65 78 29 2c 20 64 65 74 65 72 6d 69 6e 65 20 69  ex), determine i
163a0 66 20 61 6c 6c 20 72 65 71 75 69 72 65 64 20 63  f all required c
163b0 6f 6c 75 6d 6e 20 64 61 74 61 20 6d 61 79 20 62  olumn data may b
163c0 65 20 6f 62 74 61 69 6e 65 64 20 77 69 74 68 6f  e obtained witho
163d0 75 74 20 0a 20 20 20 20 2a 2a 20 73 65 65 6b 69  ut .    ** seeki
163e0 6e 67 20 74 6f 20 65 6e 74 72 69 65 73 20 69 6e  ng to entries in
163f0 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 20   the main table 
16400 28 69 2e 65 2e 20 69 66 20 74 68 65 20 69 6e 64  (i.e. if the ind
16410 65 78 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67  ex is a covering
16420 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 66 6f  .    ** index fo
16430 72 20 74 68 69 73 20 71 75 65 72 79 29 2e 20 49  r this query). I
16440 66 20 69 74 20 69 73 2c 20 73 65 74 20 74 68 65  f it is, set the
16450 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
16460 66 6c 61 67 20 69 6e 0a 20 20 20 20 2a 2a 20 77  flag in.    ** w
16470 73 46 6c 61 67 73 2e 20 4f 74 68 65 72 77 69 73  sFlags. Otherwis
16480 65 2c 20 73 65 74 20 74 68 65 20 62 4c 6f 6f 6b  e, set the bLook
16490 75 70 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  up variable to t
164a0 72 75 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  rue.  */.    if(
164b0 20 70 49 64 78 20 26 26 20 77 73 46 6c 61 67 73   pIdx && wsFlags
164c0 20 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73   ){.      Bitmas
164d0 6b 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55  k m = pSrc->colU
164e0 73 65 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  sed;.      int j
164f0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
16500 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   j<pIdx->nColumn
16510 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
16520 69 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e 61 69  int x = pIdx->ai
16530 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20  Column[j];.     
16540 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29     if( x<BMS-1 )
16550 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 20 26 3d  {.          m &=
16560 20 7e 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c   ~(((Bitmask)1)<
16570 3c 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  <x);.        }. 
16580 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
16590 20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   m==0 ){.       
165a0 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52   wsFlags |= WHER
165b0 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20  E_IDX_ONLY;.    
165c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
165d0 20 62 4c 6f 6f 6b 75 70 20 3d 20 31 3b 0a 20 20   bLookup = 1;.  
165e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
165f0 20 2f 2a 2a 2a 2a 20 42 65 67 69 6e 20 61 64 64   /**** Begin add
16600 69 6e 67 20 75 70 20 74 68 65 20 63 6f 73 74 20  ing up the cost 
16610 6f 66 20 75 73 69 6e 67 20 74 68 69 73 20 69 6e  of using this in
16620 64 65 78 20 28 4e 65 65 64 73 20 69 6d 70 72 6f  dex (Needs impro
16630 76 65 6d 65 6e 74 73 29 0a 20 20 20 20 2a 2a 0a  vements).    **.
16640 20 20 20 20 2a 2a 20 45 73 74 69 6d 61 74 65 20      ** Estimate 
16650 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
16660 77 73 20 6f 66 20 6f 75 74 70 75 74 2e 20 20 46  ws of output.  F
16670 6f 72 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  or an IN operato
16680 72 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74  r,.    ** do not
16690 20 6c 65 74 20 74 68 65 20 65 73 74 69 6d 61 74   let the estimat
166a0 65 20 65 78 63 65 65 64 20 68 61 6c 66 20 74 68  e exceed half th
166b0 65 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  e rows in the ta
166c0 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
166d0 6e 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29 28  nRow = (double)(
166e0 61 69 52 6f 77 45 73 74 5b 6e 45 71 5d 20 2a 20  aiRowEst[nEq] * 
166f0 6e 49 6e 4d 75 6c 29 3b 0a 20 20 20 20 69 66 28  nInMul);.    if(
16700 20 62 49 6e 45 73 74 20 26 26 20 6e 52 6f 77 2a   bInEst && nRow*
16710 32 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20 29 7b  2>aiRowEst[0] ){
16720 0a 20 20 20 20 20 20 6e 52 6f 77 20 3d 20 61 69  .      nRow = ai
16730 52 6f 77 45 73 74 5b 30 5d 2f 32 3b 0a 20 20 20  RowEst[0]/2;.   
16740 20 20 20 6e 49 6e 4d 75 6c 20 3d 20 28 69 6e 74     nInMul = (int
16750 29 28 6e 52 6f 77 20 2f 20 61 69 52 6f 77 45 73  )(nRow / aiRowEs
16760 74 5b 6e 45 71 5d 29 3b 0a 20 20 20 20 7d 0a 0a  t[nEq]);.    }..
16770 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 20 63 6f      /* Assume co
16780 6e 73 74 61 6e 74 20 63 6f 73 74 20 74 6f 20 61  nstant cost to a
16790 63 63 65 73 73 20 61 20 72 6f 77 20 61 6e 64 20  ccess a row and 
167a0 6c 6f 67 61 72 69 74 68 6d 69 63 20 63 6f 73 74  logarithmic cost
167b0 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 61 20   to.    ** do a 
167c0 62 69 6e 61 72 79 20 73 65 61 72 63 68 2e 20 20  binary search.  
167d0 48 65 6e 63 65 2c 20 74 68 65 20 69 6e 69 74 69  Hence, the initi
167e0 61 6c 20 63 6f 73 74 20 69 73 20 74 68 65 20 6e  al cost is the n
167f0 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 0a  umber of output.
16800 20 20 20 20 2a 2a 20 72 6f 77 73 20 70 6c 75 73      ** rows plus
16810 20 6c 6f 67 32 28 74 61 62 6c 65 2d 73 69 7a 65   log2(table-size
16820 29 20 74 69 6d 65 73 20 74 68 65 20 6e 75 6d 62  ) times the numb
16830 65 72 20 6f 66 20 62 69 6e 61 72 79 20 73 65 61  er of binary sea
16840 72 63 68 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  rches..    */.  
16850 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2b 20    cost = nRow + 
16860 6e 49 6e 4d 75 6c 2a 65 73 74 4c 6f 67 28 61 69  nInMul*estLog(ai
16870 52 6f 77 45 73 74 5b 30 5d 29 3b 0a 0a 20 20 20  RowEst[0]);..   
16880 20 2f 2a 20 41 64 6a 75 73 74 20 74 68 65 20 6e   /* Adjust the n
16890 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 61 6e  umber of rows an
168a0 64 20 74 68 65 20 63 6f 73 74 20 64 6f 77 6e 77  d the cost downw
168b0 61 72 64 20 74 6f 20 72 65 66 6c 65 63 74 20 72  ard to reflect r
168c0 6f 77 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ows.    ** that 
168d0 61 72 65 20 65 78 63 6c 75 64 65 64 20 62 79 20  are excluded by 
168e0 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
168f0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 52  s..    */.    nR
16900 6f 77 20 3d 20 28 6e 52 6f 77 20 2a 20 28 64 6f  ow = (nRow * (do
16910 75 62 6c 65 29 6e 42 6f 75 6e 64 29 20 2f 20 28  uble)nBound) / (
16920 64 6f 75 62 6c 65 29 31 30 30 3b 0a 20 20 20 20  double)100;.    
16930 63 6f 73 74 20 3d 20 28 63 6f 73 74 20 2a 20 28  cost = (cost * (
16940 64 6f 75 62 6c 65 29 6e 42 6f 75 6e 64 29 20 2f  double)nBound) /
16950 20 28 64 6f 75 62 6c 65 29 31 30 30 3b 0a 0a 20   (double)100;.. 
16960 20 20 20 2f 2a 20 41 64 64 20 69 6e 20 74 68 65     /* Add in the
16970 20 65 73 74 69 6d 61 74 65 64 20 63 6f 73 74 20   estimated cost 
16980 6f 66 20 73 6f 72 74 69 6e 67 20 74 68 65 20 72  of sorting the r
16990 65 73 75 6c 74 0a 20 20 20 20 2a 2f 0a 20 20 20  esult.    */.   
169a0 20 69 66 28 20 62 53 6f 72 74 20 29 7b 0a 20 20   if( bSort ){.  
169b0 20 20 20 20 63 6f 73 74 20 2b 3d 20 63 6f 73 74      cost += cost
169c0 2a 65 73 74 4c 6f 67 28 63 6f 73 74 29 3b 0a 20  *estLog(cost);. 
169d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
169e0 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
169f0 63 61 6e 20 62 65 20 74 61 6b 65 6e 20 64 69 72  can be taken dir
16a00 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 69  ectly from the i
16a10 6e 64 65 78 2c 20 77 65 20 61 76 6f 69 64 0a 20  ndex, we avoid. 
16a20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 61 62 6c     ** doing tabl
16a30 65 20 6c 6f 6f 6b 75 70 73 2e 20 20 54 68 69 73  e lookups.  This
16a40 20 72 65 64 75 63 65 73 20 74 68 65 20 63 6f 73   reduces the cos
16a50 74 20 62 79 20 68 61 6c 66 2e 20 20 28 4e 6f 74  t by half.  (Not
16a60 20 72 65 61 6c 6c 79 20 2d 0a 20 20 20 20 2a 2a   really -.    **
16a70 20 74 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62   this needs to b
16a80 65 20 66 69 78 65 64 2e 29 0a 20 20 20 20 2a 2f  e fixed.).    */
16a90 0a 20 20 20 20 69 66 28 20 70 49 64 78 20 26 26  .    if( pIdx &&
16aa0 20 62 4c 6f 6f 6b 75 70 3d 3d 30 20 29 7b 0a 20   bLookup==0 ){. 
16ab0 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 28 64 6f       cost /= (do
16ac0 75 62 6c 65 29 32 3b 0a 20 20 20 20 7d 0a 20 20  uble)2;.    }.  
16ad0 20 20 2f 2a 2a 2a 2a 20 43 6f 73 74 20 6f 66 20    /**** Cost of 
16ae0 75 73 69 6e 67 20 74 68 69 73 20 69 6e 64 65 78  using this index
16af0 20 68 61 73 20 6e 6f 77 20 62 65 65 6e 20 63 6f   has now been co
16b00 6d 70 75 74 65 64 20 2a 2a 2a 2a 2f 0a 0a 20 20  mputed ****/..  
16b10 20 20 57 48 45 52 45 54 52 41 43 45 28 28 0a 20    WHERETRACE((. 
16b20 20 20 20 20 20 22 74 62 6c 3d 25 73 20 69 64 78       "tbl=%s idx
16b30 3d 25 73 20 6e 45 71 3d 25 64 20 6e 49 6e 4d 75  =%s nEq=%d nInMu
16b40 6c 3d 25 64 20 6e 42 6f 75 6e 64 3d 25 64 20 62  l=%d nBound=%d b
16b50 53 6f 72 74 3d 25 64 20 62 4c 6f 6f 6b 75 70 3d  Sort=%d bLookup=
16b60 25 64 22 0a 20 20 20 20 20 20 22 20 77 73 46 6c  %d".      " wsFl
16b70 61 67 73 3d 25 64 20 20 20 28 6e 52 6f 77 3d 25  ags=%d   (nRow=%
16b80 2e 32 66 20 63 6f 73 74 3d 25 2e 32 66 29 5c 6e  .2f cost=%.2f)\n
16b90 22 2c 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 70  ",.      pSrc->p
16ba0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 28 70 49 64  Tab->zName, (pId
16bb0 78 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20  x ? pIdx->zName 
16bc0 3a 20 22 69 70 6b 22 29 2c 20 0a 20 20 20 20 20  : "ipk"), .     
16bd0 20 6e 45 71 2c 20 6e 49 6e 4d 75 6c 2c 20 6e 42   nEq, nInMul, nB
16be0 6f 75 6e 64 2c 20 62 53 6f 72 74 2c 20 62 4c 6f  ound, bSort, bLo
16bf0 6f 6b 75 70 2c 20 77 73 46 6c 61 67 73 2c 20 6e  okup, wsFlags, n
16c00 52 6f 77 2c 20 63 6f 73 74 0a 20 20 20 20 29 29  Row, cost.    ))
16c10 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
16c20 73 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 62  s index is the b
16c30 65 73 74 20 77 65 20 68 61 76 65 20 73 65 65 6e  est we have seen
16c40 20 73 6f 20 66 61 72 2c 20 74 68 65 6e 20 72 65   so far, then re
16c50 63 6f 72 64 20 74 68 69 73 0a 20 20 20 20 2a 2a  cord this.    **
16c60 20 69 6e 64 65 78 20 61 6e 64 20 69 74 73 20 63   index and its c
16c70 6f 73 74 20 69 6e 20 74 68 65 20 70 43 6f 73 74  ost in the pCost
16c80 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 20 20   structure..    
16c90 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70 49 64  */.    if( (!pId
16ca0 78 20 7c 7c 20 77 73 46 6c 61 67 73 29 20 26 26  x || wsFlags) &&
16cb0 20 63 6f 73 74 3c 70 43 6f 73 74 2d 3e 72 43 6f   cost<pCost->rCo
16cc0 73 74 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 73  st ){.      pCos
16cd0 74 2d 3e 72 43 6f 73 74 20 3d 20 63 6f 73 74 3b  t->rCost = cost;
16ce0 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 6e 52  .      pCost->nR
16cf0 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 20  ow = nRow;.     
16d00 20 70 43 6f 73 74 2d 3e 75 73 65 64 20 3d 20 75   pCost->used = u
16d10 73 65 64 3b 0a 20 20 20 20 20 20 70 43 6f 73 74  sed;.      pCost
16d20 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d  ->plan.wsFlags =
16d30 20 28 77 73 46 6c 61 67 73 26 77 73 46 6c 61 67   (wsFlags&wsFlag
16d40 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 70 43 6f  Mask);.      pCo
16d50 73 74 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20 6e  st->plan.nEq = n
16d60 45 71 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d  Eq;.      pCost-
16d70 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 20 3d 20 70  >plan.u.pIdx = p
16d80 49 64 78 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  Idx;.    }..    
16d90 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  /* If there was 
16da0 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  an INDEXED BY cl
16db0 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  ause, then only 
16dc0 74 68 61 74 20 6f 6e 65 20 69 6e 64 65 78 20 69  that one index i
16dd0 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65  s.    ** conside
16de0 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  red. */.    if( 
16df0 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 20 62  pSrc->pIndex ) b
16e00 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  reak;..    /* Re
16e10 73 65 74 20 6d 61 73 6b 73 20 66 6f 72 20 74 68  set masks for th
16e20 65 20 6e 65 78 74 20 69 6e 64 65 78 20 69 6e 20  e next index in 
16e30 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  the loop */.    
16e40 77 73 46 6c 61 67 4d 61 73 6b 20 3d 20 7e 28 57  wsFlagMask = ~(W
16e50 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48  HERE_ROWID_EQ|WH
16e60 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29  ERE_ROWID_RANGE)
16e70 3b 0a 20 20 20 20 65 71 54 65 72 6d 4d 61 73 6b  ;.    eqTermMask
16e80 20 3d 20 69 64 78 45 71 54 65 72 6d 4d 61 73 6b   = idxEqTermMask
16e90 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
16ea0 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52  here is no ORDER
16eb0 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74   BY clause and t
16ec0 68 65 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73  he SQLITE_Revers
16ed0 65 4f 72 64 65 72 20 66 6c 61 67 0a 20 20 2a 2a  eOrder flag.  **
16ee0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 72 65   is set, then re
16ef0 76 65 72 73 65 20 74 68 65 20 6f 72 64 65 72 20  verse the order 
16f00 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 77  that the index w
16f10 69 6c 6c 20 62 65 20 73 63 61 6e 6e 65 64 0a 20  ill be scanned. 
16f20 20 2a 2a 20 69 6e 2e 20 54 68 69 73 20 69 73 20   ** in. This is 
16f30 75 73 65 64 20 66 6f 72 20 61 70 70 6c 69 63 61  used for applica
16f40 74 69 6f 6e 20 74 65 73 74 69 6e 67 2c 20 74 6f  tion testing, to
16f50 20 68 65 6c 70 20 66 69 6e 64 20 63 61 73 65 73   help find cases
16f60 0a 20 20 2a 2a 20 77 68 65 72 65 20 61 70 70 6c  .  ** where appl
16f70 69 63 61 74 69 6f 6e 20 62 65 68 61 76 69 6f 75  ication behaviou
16f80 72 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  r depends on the
16f90 20 28 75 6e 64 65 66 69 6e 65 64 29 20 6f 72 64   (undefined) ord
16fa0 65 72 20 74 68 61 74 0a 20 20 2a 2a 20 53 51 4c  er that.  ** SQL
16fb0 69 74 65 20 6f 75 74 70 75 74 73 20 72 6f 77 73  ite outputs rows
16fc0 20 69 6e 20 69 6e 20 74 68 65 20 61 62 73 65 6e   in in the absen
16fd0 63 65 20 6f 66 20 61 6e 20 4f 52 44 45 52 20 42  ce of an ORDER B
16fe0 59 20 63 6c 61 75 73 65 2e 20 20 2a 2f 0a 20 20  Y clause.  */.  
16ff0 69 66 28 20 21 70 4f 72 64 65 72 42 79 20 26 26  if( !pOrderBy &&
17000 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
17010 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 76 65  gs & SQLITE_Reve
17020 72 73 65 4f 72 64 65 72 20 29 7b 0a 20 20 20 20  rseOrder ){.    
17030 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c  pCost->plan.wsFl
17040 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 56  ags |= WHERE_REV
17050 45 52 53 45 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  ERSE;.  }..  ass
17060 65 72 74 28 20 70 4f 72 64 65 72 42 79 20 7c 7c  ert( pOrderBy ||
17070 20 28 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73   (pCost->plan.ws
17080 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45  Flags&WHERE_ORDE
17090 52 42 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  RBY)==0 );.  ass
170a0 65 72 74 28 20 70 43 6f 73 74 2d 3e 70 6c 61 6e  ert( pCost->plan
170b0 2e 75 2e 70 49 64 78 3d 3d 30 20 7c 7c 20 28 70  .u.pIdx==0 || (p
170c0 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  Cost->plan.wsFla
170d0 67 73 26 57 48 45 52 45 5f 52 4f 57 49 44 5f 45  gs&WHERE_ROWID_E
170e0 51 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Q)==0 );.  asser
170f0 74 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3d  t( pSrc->pIndex=
17100 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 43  =0 .       || pC
17110 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  ost->plan.u.pIdx
17120 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  ==0 .       || p
17130 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64  Cost->plan.u.pId
17140 78 3d 3d 70 53 72 63 2d 3e 70 49 6e 64 65 78 20  x==pSrc->pIndex 
17150 0a 20 20 29 3b 0a 0a 20 20 57 48 45 52 45 54 52  .  );..  WHERETR
17160 41 43 45 28 28 22 62 65 73 74 20 69 6e 64 65 78  ACE(("best index
17170 20 69 73 3a 20 25 73 5c 6e 22 2c 20 0a 20 20 20   is: %s\n", .   
17180 20 28 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e   (pCost->plan.u.
17190 70 49 64 78 20 3f 20 70 43 6f 73 74 2d 3e 70 6c  pIdx ? pCost->pl
171a0 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65  an.u.pIdx->zName
171b0 20 3a 20 22 69 70 6b 22 29 0a 20 20 29 29 3b 0a   : "ipk").  ));.
171c0 20 20 0a 20 20 62 65 73 74 4f 72 43 6c 61 75 73    .  bestOrClaus
171d0 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  eIndex(pParse, p
171e0 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61  WC, pSrc, notRea
171f0 64 79 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 43  dy, pOrderBy, pC
17200 6f 73 74 29 3b 0a 20 20 70 43 6f 73 74 2d 3e 70  ost);.  pCost->p
17210 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 65  lan.wsFlags |= e
17220 71 54 65 72 6d 4d 61 73 6b 3b 0a 7d 0a 0a 2f 2a  qTermMask;.}../*
17230 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 71 75 65  .** Find the que
17240 72 79 20 70 6c 61 6e 20 66 6f 72 20 61 63 63 65  ry plan for acce
17250 73 73 69 6e 67 20 74 61 62 6c 65 20 70 53 72 63  ssing table pSrc
17260 2d 3e 70 54 61 62 2e 20 57 72 69 74 65 20 74 68  ->pTab. Write th
17270 65 0a 2a 2a 20 62 65 73 74 20 71 75 65 72 79 20  e.** best query 
17280 70 6c 61 6e 20 61 6e 64 20 69 74 73 20 63 6f 73  plan and its cos
17290 74 20 69 6e 74 6f 20 74 68 65 20 57 68 65 72 65  t into the Where
172a0 43 6f 73 74 20 6f 62 6a 65 63 74 20 73 75 70 70  Cost object supp
172b0 6c 69 65 64 20 0a 2a 2a 20 61 73 20 74 68 65 20  lied .** as the 
172c0 6c 61 73 74 20 70 61 72 61 6d 65 74 65 72 2e 20  last parameter. 
172d0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
172e0 79 20 63 61 6c 63 75 6c 61 74 65 20 74 68 65 20  y calculate the 
172f0 63 6f 73 74 20 6f 66 0a 2a 2a 20 62 6f 74 68 20  cost of.** both 
17300 72 65 61 6c 20 61 6e 64 20 76 69 72 74 75 61 6c  real and virtual
17310 20 74 61 62 6c 65 20 73 63 61 6e 73 2e 0a 2a 2f   table scans..*/
17320 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65 73  .static void bes
17330 74 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  tIndex(.  Parse 
17340 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
17350 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
17360 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
17370 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
17380 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  WC,           /*
17390 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
173a0 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
173b0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
173c0 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63  ,  /* The FROM c
173d0 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65  lause term to se
173e0 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73  arch */.  Bitmas
173f0 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20  k notReady,     
17400 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
17410 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   cursors that ar
17420 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  e not available 
17430 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
17440 4f 72 64 65 72 42 79 2c 20 20 20 20 20 20 20 20  OrderBy,        
17450 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
17460 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
17470 72 65 43 6f 73 74 20 2a 70 43 6f 73 74 20 20 20  reCost *pCost   
17480 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 65           /* Lowe
17490 73 74 20 63 6f 73 74 20 71 75 65 72 79 20 70 6c  st cost query pl
174a0 61 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  an */.){.#ifndef
174b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
174c0 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20  TUALTABLE.  if( 
174d0 49 73 56 69 72 74 75 61 6c 28 70 53 72 63 2d 3e  IsVirtual(pSrc->
174e0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  pTab) ){.    sql
174f0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
17500 2a 70 20 3d 20 30 3b 0a 20 20 20 20 62 65 73 74  *p = 0;.    best
17510 56 69 72 74 75 61 6c 49 6e 64 65 78 28 70 50 61  VirtualIndex(pPa
17520 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20  rse, pWC, pSrc, 
17530 6e 6f 74 52 65 61 64 79 2c 20 70 4f 72 64 65 72  notReady, pOrder
17540 42 79 2c 20 70 43 6f 73 74 2c 20 26 70 29 3b 0a  By, pCost, &p);.
17550 20 20 20 20 69 66 28 20 70 2d 3e 6e 65 65 64 54      if( p->needT
17560 6f 46 72 65 65 49 64 78 53 74 72 20 29 7b 0a 20  oFreeIdxStr ){. 
17570 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
17580 65 28 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  e(p->idxStr);.  
17590 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
175a0 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
175b0 2c 20 70 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  , p);.  }else.#e
175c0 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 62 65 73  ndif.  {.    bes
175d0 74 42 74 72 65 65 49 6e 64 65 78 28 70 50 61 72  tBtreeIndex(pPar
175e0 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 6e  se, pWC, pSrc, n
175f0 6f 74 52 65 61 64 79 2c 20 70 4f 72 64 65 72 42  otReady, pOrderB
17600 79 2c 20 70 43 6f 73 74 29 3b 0a 20 20 7d 0a 7d  y, pCost);.  }.}
17610 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20  ../*.** Disable 
17620 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  a term in the WH
17630 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45 78 63  ERE clause.  Exc
17640 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61  ept, do not disa
17650 62 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20  ble the term.** 
17660 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61  if it controls a
17670 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
17680 20 61 6e 64 20 69 74 20 64 69 64 20 6e 6f 74 20   and it did not 
17690 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65  originate in the
176a0 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20   ON.** or USING 
176b0 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20 6a  clause of that j
176c0 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69  oin..**.** Consi
176d0 64 65 72 20 74 68 65 20 74 65 72 6d 20 74 32 2e  der the term t2.
176e0 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f  z='ok' in the fo
176f0 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69 65 73 3a  llowing queries:
17700 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53 45  .**.**   (1)  SE
17710 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
17720 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74  EFT JOIN t2 ON t
17730 31 2e 61 3d 74 32 2e 78 20 57 48 45 52 45 20 74  1.a=t2.x WHERE t
17740 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32  2.z='ok'.**   (2
17750 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  )  SELECT * FROM
17760 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32   t1 LEFT JOIN t2
17770 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e   ON t1.a=t2.x AN
17780 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20  D t2.z='ok'.**  
17790 20 28 33 29 20 20 53 45 4c 45 43 54 20 2a 20 46   (3)  SELECT * F
177a0 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45  ROM t1, t2 WHERE
177b0 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74   t1.a=t2.x AND t
177c0 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54  2.z='ok'.**.** T
177d0 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20  he t2.z='ok' is 
177e0 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68 65 20  disabled in the 
177f0 69 6e 20 28 32 29 20 62 65 63 61 75 73 65 20 69  in (2) because i
17800 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20  t originates.** 
17810 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  in the ON clause
17820 2e 20 20 54 68 65 20 74 65 72 6d 20 69 73 20 64  .  The term is d
17830 69 73 61 62 6c 65 64 20 69 6e 20 28 33 29 20 62  isabled in (3) b
17840 65 63 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74  ecause it is not
17850 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45   part.** of a LE
17860 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20  FT OUTER JOIN.  
17870 49 6e 20 28 31 29 2c 20 74 68 65 20 74 65 72 6d  In (1), the term
17880 20 69 73 20 6e 6f 74 20 64 69 73 61 62 6c 65 64   is not disabled
17890 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e  ..**.** Disablin
178a0 67 20 61 20 74 65 72 6d 20 63 61 75 73 65 73 20  g a term causes 
178b0 74 68 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74  that term to not
178c0 20 62 65 20 74 65 73 74 65 64 20 69 6e 20 74 68   be tested in th
178d0 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20  e inner loop.** 
178e0 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69  of the join.  Di
178f0 73 61 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70  sabling is an op
17900 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65  timization.  Whe
17910 6e 20 74 65 72 6d 73 20 61 72 65 20 73 61 74 69  n terms are sati
17920 73 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69  sfied.** by indi
17930 63 65 73 2c 20 77 65 20 64 69 73 61 62 6c 65 20  ces, we disable 
17940 74 68 65 6d 20 74 6f 20 70 72 65 76 65 6e 74 20  them to prevent 
17950 72 65 64 75 6e 64 61 6e 74 20 74 65 73 74 73 20  redundant tests 
17960 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20  in the inner.** 
17970 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64 20  loop.  We would 
17980 67 65 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  get the correct 
17990 72 65 73 75 6c 74 73 20 69 66 20 6e 6f 74 68 69  results if nothi
179a0 6e 67 20 77 65 72 65 20 65 76 65 72 20 64 69 73  ng were ever dis
179b0 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f  abled,.** but jo
179c0 69 6e 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20  ins might run a 
179d0 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20  little slower.  
179e0 54 68 65 20 74 72 69 63 6b 20 69 73 20 74 6f 20  The trick is to 
179f0 64 69 73 61 62 6c 65 20 61 73 20 6d 75 63 68 0a  disable as much.
17a00 2a 2a 20 61 73 20 77 65 20 63 61 6e 20 77 69 74  ** as we can wit
17a10 68 6f 75 74 20 64 69 73 61 62 6c 69 6e 67 20 74  hout disabling t
17a20 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20 77 65 20  oo much.  If we 
17a30 64 69 73 61 62 6c 65 64 20 69 6e 20 28 31 29 2c  disabled in (1),
17a40 20 77 65 27 64 20 67 65 74 0a 2a 2a 20 74 68 65   we'd get.** the
17a50 20 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20   wrong answer.  
17a60 53 65 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e  See ticket #813.
17a70 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
17a80 64 69 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72  disableTerm(Wher
17a90 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
17aa0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
17ab0 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 0a 20  ){.  if( pTerm. 
17ac0 20 20 20 20 20 26 26 20 41 4c 57 41 59 53 28 28       && ALWAYS((
17ad0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
17ae0 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 29   TERM_CODED)==0)
17af0 0a 20 20 20 20 20 20 26 26 20 28 70 4c 65 76 65  .      && (pLeve
17b00 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20  l->iLeftJoin==0 
17b10 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  || ExprHasProper
17b20 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
17b30 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20   EP_FromJoin)). 
17b40 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77   ){.    pTerm->w
17b50 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
17b60 4f 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54  ODED;.    if( pT
17b70 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20  erm->iParent>=0 
17b80 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
17b90 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54  rm *pOther = &pT
17ba0 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72  erm->pWC->a[pTer
17bb0 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20  m->iParent];.   
17bc0 20 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72     if( (--pOther
17bd0 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a  ->nChild)==0 ){.
17be0 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
17bf0 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68  erm(pLevel, pOth
17c00 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
17c10 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
17c20 43 6f 64 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e  Code an OP_Affin
17c30 69 74 79 20 6f 70 63 6f 64 65 20 74 6f 20 61 70  ity opcode to ap
17c40 70 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61  ply the column a
17c50 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 7a  ffinity string z
17c60 41 66 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20  Aff.** to the n 
17c70 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
17c80 6e 67 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a  ng at base. .**.
17c90 2a 2a 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ** As an optimiz
17ca0 61 74 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46  ation, SQLITE_AF
17cb0 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 28  F_NONE entries (
17cc0 77 68 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73  which are no-ops
17cd0 29 20 61 74 20 74 68 65 0a 2a 2a 20 62 65 67 69  ) at the.** begi
17ce0 6e 6e 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66  nning and end of
17cf0 20 7a 41 66 66 20 61 72 65 20 69 67 6e 6f 72 65   zAff are ignore
17d00 64 2e 20 20 49 66 20 61 6c 6c 20 65 6e 74 72 69  d.  If all entri
17d10 65 73 20 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a  es in zAff are.*
17d20 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
17d30 45 2c 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20  E, then no code 
17d40 67 65 74 73 20 67 65 6e 65 72 61 74 65 64 2e 0a  gets generated..
17d50 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
17d60 6e 65 20 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e  ne makes its own
17d70 20 63 6f 70 79 20 6f 66 20 7a 41 66 66 20 73 6f   copy of zAff so
17d80 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
17d90 20 69 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d   is free.** to m
17da0 6f 64 69 66 79 20 7a 41 66 66 20 61 66 74 65 72  odify zAff after
17db0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
17dc0 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  turns..*/.static
17dd0 20 76 6f 69 64 20 63 6f 64 65 41 70 70 6c 79 41   void codeApplyA
17de0 66 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70  ffinity(Parse *p
17df0 50 61 72 73 65 2c 20 69 6e 74 20 62 61 73 65 2c  Parse, int base,
17e00 20 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41   int n, char *zA
17e10 66 66 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ff){.  Vdbe *v =
17e20 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
17e30 20 20 69 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b    if( zAff==0 ){
17e40 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
17e50 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
17e60 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74  ailed );.    ret
17e70 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
17e80 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  t( v!=0 );..  /*
17e90 20 41 64 6a 75 73 74 20 62 61 73 65 20 61 6e 64   Adjust base and
17ea0 20 6e 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20   n to skip over 
17eb0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
17ec0 65 6e 74 72 69 65 73 20 61 74 20 74 68 65 20 62  entries at the b
17ed0 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e  eginning.  ** an
17ee0 64 20 65 6e 64 20 6f 66 20 74 68 65 20 61 66 66  d end of the aff
17ef0 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 20 20  inity string..  
17f00 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  */.  while( n>0 
17f10 26 26 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49  && zAff[0]==SQLI
17f20 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20  TE_AFF_NONE ){. 
17f30 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65     n--;.    base
17f40 2b 2b 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a  ++;.    zAff++;.
17f50 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31    }.  while( n>1
17f60 20 26 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53   && zAff[n-1]==S
17f70 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29  QLITE_AFF_NONE )
17f80 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a  {.    n--;.  }..
17f90 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f 50    /* Code the OP
17fa0 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65  _Affinity opcode
17fb0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   if there is any
17fc0 74 68 69 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f  thing left to do
17fd0 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29  . */.  if( n>0 )
17fe0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
17ff0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66  eAddOp2(v, OP_Af
18000 66 69 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e 29  finity, base, n)
18010 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
18020 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
18030 20 7a 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73   zAff, n);.    s
18040 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
18050 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
18060 61 72 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a  arse, base, n);.
18070 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65    }.}.../*.** Ge
18080 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
18090 61 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74  a single equalit
180a0 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  y term of the WH
180b0 45 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20  ERE clause.  An 
180c0 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d  equality.** term
180d0 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 58   can be either X
180e0 3d 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e  =expr or X IN (.
180f0 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20  ..).   pTerm is 
18100 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a  the term to be .
18110 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  ** coded..**.** 
18120 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  The current valu
18130 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72  e for the constr
18140 61 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e 20  aint is left in 
18150 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 0a 2a  register iReg..*
18160 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74  *.** For a const
18170 72 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72  raint of the for
18180 6d 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78  m X=expr, the ex
18190 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c  pression is eval
181a0 75 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a  uated and its.**
181b0 20 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20   result is left 
181c0 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46  on the stack.  F
181d0 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  or constraints o
181e0 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20  f the form X IN 
181f0 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f  (...).** this ro
18200 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20  utine sets up a 
18210 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69  loop that will i
18220 74 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20  terate over all 
18230 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a  values of X..*/.
18240 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 45  static int codeE
18250 71 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50  qualityTerm(.  P
18260 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
18270 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
18280 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
18290 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
182a0 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f     /* The term o
182b0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
182c0 73 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  se to be coded *
182d0 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
182e0 70 4c 65 76 65 6c 2c 20 2f 2a 20 57 68 65 6e 20  pLevel, /* When 
182f0 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 46 52 4f  level of the FRO
18300 4d 20 63 6c 61 75 73 65 20 77 65 20 61 72 65 20  M clause we are 
18310 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20  working on */.  
18320 69 6e 74 20 69 54 61 72 67 65 74 20 20 20 20 20  int iTarget     
18330 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74      /* Attempt t
18340 6f 20 6c 65 61 76 65 20 72 65 73 75 6c 74 73 20  o leave results 
18350 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
18360 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
18370 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
18380 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
18390 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
183a0 6e 74 20 69 52 65 67 3b 20 20 20 20 20 20 20 20  nt iReg;        
183b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
183c0 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 65  ister holding re
183d0 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 61 73 73 65  sults */..  asse
183e0 72 74 28 20 69 54 61 72 67 65 74 3e 30 20 29 3b  rt( iTarget>0 );
183f0 0a 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54  .  if( pX->op==T
18400 4b 5f 45 51 20 29 7b 0a 20 20 20 20 69 52 65 67  K_EQ ){.    iReg
18410 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
18420 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
18430 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 69 54 61   pX->pRight, iTa
18440 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69  rget);.  }else i
18450 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  f( pX->op==TK_IS
18460 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 52 65 67  NULL ){.    iReg
18470 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20   = iTarget;.    
18480 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18490 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
184a0 20 69 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20   iReg);.#ifndef 
184b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
184c0 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  UERY.  }else{.  
184d0 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 20 20 20    int eType;.   
184e0 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 20 20 73   int iTab;.    s
184f0 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49  truct InLoop *pI
18500 6e 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  n;..    assert( 
18510 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b  pX->op==TK_IN );
18520 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72  .    iReg = iTar
18530 67 65 74 3b 0a 20 20 20 20 65 54 79 70 65 20 3d  get;.    eType =
18540 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
18550 64 65 78 28 70 50 61 72 73 65 2c 20 70 58 2c 20  dex(pParse, pX, 
18560 30 29 3b 0a 20 20 20 20 69 54 61 62 20 3d 20 70  0);.    iTab = p
18570 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 73  X->iTable;.    s
18580 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18590 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
185a0 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  Tab, 0);.    ass
185b0 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  ert( pLevel->pla
185c0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
185d0 45 5f 49 4e 5f 41 42 4c 45 20 29 3b 0a 20 20 20  E_IN_ABLE );.   
185e0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 75 2e 69   if( pLevel->u.i
185f0 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  n.nIn==0 ){.    
18600 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78    pLevel->addrNx
18610 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
18620 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
18630 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75   }.    pLevel->u
18640 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70  .in.nIn++;.    p
18650 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
18660 6f 6f 70 20 3d 0a 20 20 20 20 20 20 20 73 71 6c  oop =.       sql
18670 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
18680 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
18690 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
186a0 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  Loop,.          
186b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186c0 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76 65      sizeof(pLeve
186d0 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b  l->u.in.aInLoop[
186e0 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  0])*pLevel->u.in
186f0 2e 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e 20 3d  .nIn);.    pIn =
18700 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49   pLevel->u.in.aI
18710 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 70  nLoop;.    if( p
18720 49 6e 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 20  In ){.      pIn 
18730 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  += pLevel->u.in.
18740 6e 49 6e 20 2d 20 31 3b 0a 20 20 20 20 20 20 70  nIn - 1;.      p
18750 49 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61 62 3b  In->iCur = iTab;
18760 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
18770 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  ==IN_INDEX_ROWID
18780 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d   ){.        pIn-
18790 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c  >addrInTop = sql
187a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
187b0 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62  , OP_Rowid, iTab
187c0 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  , iReg);.      }
187d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49  else{.        pI
187e0 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73  n->addrInTop = s
187f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
18800 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
18810 54 61 62 2c 20 30 2c 20 69 52 65 67 29 3b 0a 20  Tab, 0, iReg);. 
18820 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
18830 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
18840 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69 52 65  , OP_IsNull, iRe
18850 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g);.    }else{. 
18860 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69       pLevel->u.i
18870 6e 2e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  n.nIn = 0;.    }
18880 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69  .#endif.  }.  di
18890 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
188a0 2c 20 70 54 65 72 6d 29 3b 0a 20 20 72 65 74 75  , pTerm);.  retu
188b0 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn iReg;.}../*.*
188c0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
188d0 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61  that will evalua
188e0 74 65 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e  te all == and IN
188f0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72   constraints for
18900 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2a   an.** index..**
18910 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
18920 20 63 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20   consider table 
18930 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20  t1(a,b,c,d,e,f) 
18940 77 69 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c  with index i1(a,
18950 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65  b,c)..** Suppose
18960 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
18970 65 20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35  e is this:  a==5
18980 20 41 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33   AND b IN (1,2,3
18990 29 20 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c  ) AND c>5 AND c<
189a0 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20  10.** The index 
189b0 68 61 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74  has as many as t
189c0 68 72 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f  hree equality co
189d0 6e 73 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69  nstraints, but i
189e0 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c  n this.** exampl
189f0 65 2c 20 74 68 65 20 74 68 69 72 64 20 22 63 22  e, the third "c"
18a00 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65   value is an ine
18a10 71 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c  quality.  So onl
18a20 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72  y two .** constr
18a30 61 69 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e  aints are coded.
18a40 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
18a50 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64  ill generate cod
18a60 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a  e to evaluate.**
18a70 20 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28   a==5 and b IN (
18a80 31 2c 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72  1,2,3).  The cur
18a90 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20  rent values for 
18aa0 61 20 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20  a and b will be 
18ab0 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e  stored.** in con
18ac0 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65  secutive registe
18ad0 72 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  rs and the index
18ae0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 65   of the first re
18af0 67 69 73 74 65 72 20 69 73 20 72 65 74 75 72 6e  gister is return
18b00 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  ed..**.** In the
18b10 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e   example above n
18b20 45 71 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73  Eq==2.  But this
18b30 20 73 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b   subroutine work
18b40 73 20 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a  s for any value.
18b50 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64  ** of nEq includ
18b60 69 6e 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d  ing 0.  If nEq==
18b70 30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  0, this routine 
18b80 69 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f  is nearly a no-o
18b90 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74  p..** The only t
18ba0 68 69 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20  hing it does is 
18bb0 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65  allocate the pLe
18bc0 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79  vel->iMem memory
18bd0 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d   cell and.** com
18be0 70 75 74 65 20 74 68 65 20 61 66 66 69 6e 69 74  pute the affinit
18bf0 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  y string..**.** 
18c00 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 77  This routine alw
18c10 61 79 73 20 61 6c 6c 6f 63 61 74 65 73 20 61 74  ays allocates at
18c20 20 6c 65 61 73 74 20 6f 6e 65 20 6d 65 6d 6f 72   least one memor
18c30 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 74 75 72  y cell and retur
18c40 6e 73 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  ns.** the index 
18c50 6f 66 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63  of that memory c
18c60 65 6c 6c 2e 20 54 68 65 20 63 6f 64 65 20 74 68  ell. The code th
18c70 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73  at.** calls this
18c80 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75 73   routine will us
18c90 65 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65  e that memory ce
18ca0 6c 6c 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ll to store the 
18cb0 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6b  termination.** k
18cc0 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ey value of the 
18cd0 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65 20 6f 72  loop.  If one or
18ce0 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72 61 74 6f   more IN operato
18cf0 72 73 20 61 70 70 65 61 72 2c 20 74 68 65 6e 0a  rs appear, then.
18d00 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
18d10 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20 61 64 64  allocates an add
18d20 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f  itional nEq memo
18d30 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 69 6e 74  ry cells for int
18d40 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2a  ernal.** use..**
18d50 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72  .** Before retur
18d60 6e 69 6e 67 2c 20 2a 70 7a 41 66 66 20 69 73 20  ning, *pzAff is 
18d70 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
18d80 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
18d90 69 6e 67 20 61 0a 2a 2a 20 63 6f 70 79 20 6f 66  ing a.** copy of
18da0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69   the column affi
18db0 6e 69 74 79 20 73 74 72 69 6e 67 20 6f 66 20 74  nity string of t
18dc0 68 65 20 69 6e 64 65 78 20 61 6c 6c 6f 63 61 74  he index allocat
18dd0 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69  ed using.** sqli
18de0 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 45  te3DbMalloc(). E
18df0 78 63 65 70 74 2c 20 65 6e 74 72 69 65 73 20 69  xcept, entries i
18e00 6e 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68  n the copy of th
18e10 65 20 73 74 72 69 6e 67 20 61 73 73 6f 63 69 61  e string associa
18e20 74 65 64 0a 2a 2a 20 77 69 74 68 20 65 71 75 61  ted.** with equa
18e30 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
18e40 20 74 68 61 74 20 75 73 65 20 4e 4f 4e 45 20 61   that use NONE a
18e50 66 66 69 6e 69 74 79 20 61 72 65 20 73 65 74 20  ffinity are set 
18e60 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46  to.** SQLITE_AFF
18e70 5f 4e 4f 4e 45 2e 20 54 68 69 73 20 69 73 20 74  _NONE. This is t
18e80 6f 20 64 65 61 6c 20 77 69 74 68 20 53 51 4c 20  o deal with SQL 
18e90 73 75 63 68 20 61 73 20 74 68 65 20 66 6f 6c 6c  such as the foll
18ea0 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43  owing:.**.**   C
18eb0 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
18ec0 20 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45   TEXT PRIMARY KE
18ed0 59 2c 20 62 29 3b 0a 2a 2a 20 20 20 53 45 4c 45  Y, b);.**   SELE
18ee0 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 41  CT ... FROM t1 A
18ef0 53 20 74 32 2c 20 74 31 20 57 48 45 52 45 20 74  S t2, t1 WHERE t
18f00 31 2e 61 20 3d 20 74 32 2e 62 3b 0a 2a 2a 0a 2a  1.a = t2.b;.**.*
18f10 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65  * In the example
18f20 20 61 62 6f 76 65 2c 20 74 68 65 20 69 6e 64 65   above, the inde
18f30 78 20 6f 6e 20 74 31 28 61 29 20 68 61 73 20 54  x on t1(a) has T
18f40 45 58 54 20 61 66 66 69 6e 69 74 79 2e 20 42 75  EXT affinity. Bu
18f50 74 20 73 69 6e 63 65 0a 2a 2a 20 74 68 65 20 72  t since.** the r
18f60 69 67 68 74 20 68 61 6e 64 20 73 69 64 65 20 6f  ight hand side o
18f70 66 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 63  f the equality c
18f80 6f 6e 73 74 72 61 69 6e 74 20 28 74 32 2e 62 29  onstraint (t2.b)
18f90 20 68 61 73 20 4e 4f 4e 45 20 61 66 66 69 6e 69   has NONE affini
18fa0 74 79 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e 76 65 72  ty,.** no conver
18fb0 73 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 61  sion should be a
18fc0 74 74 65 6d 70 74 65 64 20 62 65 66 6f 72 65 20  ttempted before 
18fd0 75 73 69 6e 67 20 61 20 74 32 2e 62 20 76 61 6c  using a t2.b val
18fe0 75 65 20 61 73 20 70 61 72 74 20 6f 66 0a 2a 2a  ue as part of.**
18ff0 20 61 20 6b 65 79 20 74 6f 20 73 65 61 72 63 68   a key to search
19000 20 74 68 65 20 69 6e 64 65 78 2e 20 48 65 6e 63   the index. Henc
19010 65 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  e the first byte
19020 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64   in the returned
19030 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 73 74 72   affinity.** str
19040 69 6e 67 20 69 6e 20 74 68 69 73 20 65 78 61 6d  ing in this exam
19050 70 6c 65 20 77 6f 75 6c 64 20 62 65 20 73 65 74  ple would be set
19060 20 74 6f 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e   to SQLITE_AFF_N
19070 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ONE..*/.static i
19080 6e 74 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69  nt codeAllEquali
19090 74 79 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65  tyTerms(.  Parse
190a0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
190b0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
190c0 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  ext */.  WhereLe
190d0 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 2f  vel *pLevel,   /
190e0 2a 20 57 68 69 63 68 20 6e 65 73 74 65 64 20 6c  * Which nested l
190f0 6f 6f 70 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  oop of the FROM 
19100 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20 2a 2f  we are coding */
19110 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
19120 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  pWC,     /* The 
19130 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
19140 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
19150 64 79 2c 20 20 20 20 20 2f 2a 20 57 68 69 63 68  dy,     /* Which
19160 20 70 61 72 74 73 20 6f 66 20 46 52 4f 4d 20 68   parts of FROM h
19170 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  ave not yet been
19180 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
19190 6e 45 78 74 72 61 52 65 67 2c 20 20 20 20 20 20  nExtraReg,      
191a0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
191b0 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20 74  xtra registers t
191c0 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
191d0 63 68 61 72 20 2a 2a 70 7a 41 66 66 20 20 20 20  char **pzAff    
191e0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65        /* OUT: Se
191f0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 66  t to point to af
19200 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f  finity string */
19210 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20  .){.  int nEq = 
19220 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71  pLevel->plan.nEq
19230 3b 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65  ;   /* The numbe
19240 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f  r of == or IN co
19250 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 63 6f 64  nstraints to cod
19260 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  e */.  Vdbe *v =
19270 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
19280 20 20 20 20 20 2f 2a 20 54 68 65 20 76 6d 20 75       /* The vm u
19290 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
192a0 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  n */.  Index *pI
192b0 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
192c0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
192d0 78 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72  x being used for
192e0 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20   this loop */.  
192f0 69 6e 74 20 69 43 75 72 20 3d 20 70 4c 65 76 65  int iCur = pLeve
19300 6c 2d 3e 69 54 61 62 43 75 72 3b 20 20 20 2f 2a  l->iTabCur;   /*
19310 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74   The cursor of t
19320 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68  he table */.  Wh
19330 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
19340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
19350 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69   single constrai
19360 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74  nt term */.  int
19370 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
19380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
19390 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
193a0 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20  int regBase;    
193b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
193c0 20 42 61 73 65 20 72 65 67 69 73 74 65 72 20 2a   Base register *
193d0 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b 20 20 20  /.  int nReg;   
193e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193f0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
19400 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f  egisters to allo
19410 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  cate */.  char *
19420 7a 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  zAff;           
19430 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e          /* Affin
19440 69 74 79 20 73 74 72 69 6e 67 20 74 6f 20 72 65  ity string to re
19450 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  turn */..  /* Th
19460 69 73 20 6d 6f 64 75 6c 65 20 69 73 20 6f 6e 6c  is module is onl
19470 79 20 63 61 6c 6c 65 64 20 6f 6e 20 71 75 65 72  y called on quer
19480 79 20 70 6c 61 6e 73 20 74 68 61 74 20 75 73 65  y plans that use
19490 20 61 6e 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20   an index. */.  
194a0 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
194b0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
194c0 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 3b 0a  HERE_INDEXED );.
194d0 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d    pIdx = pLevel-
194e0 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 0a 20  >plan.u.pIdx;.. 
194f0 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
19500 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20 63  ow many memory c
19510 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65 65  ells we will nee
19520 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20  d then allocate 
19530 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 72 65 67  them..  */.  reg
19540 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Base = pParse->n
19550 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e 52 65 67 20  Mem + 1;.  nReg 
19560 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e  = pLevel->plan.n
19570 45 71 20 2b 20 6e 45 78 74 72 61 52 65 67 3b 0a  Eq + nExtraReg;.
19580 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
19590 3d 20 6e 52 65 67 3b 0a 0a 20 20 7a 41 66 66 20  = nReg;..  zAff 
195a0 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
195b0 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 71  p(pParse->db, sq
195c0 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
195d0 74 79 53 74 72 28 76 2c 20 70 49 64 78 29 29 3b  tyStr(v, pIdx));
195e0 0a 20 20 69 66 28 20 21 7a 41 66 66 20 29 7b 0a  .  if( !zAff ){.
195f0 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
19600 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
19610 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 76 61 6c  ;.  }..  /* Eval
19620 75 61 74 65 20 74 68 65 20 65 71 75 61 6c 69 74  uate the equalit
19630 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  y constraints.  
19640 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  */.  assert( pId
19650 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6e 45 71 20  x->nColumn>=nEq 
19660 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  );.  for(j=0; j<
19670 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  nEq; j++){.    i
19680 6e 74 20 72 31 3b 0a 20 20 20 20 69 6e 74 20 6b  nt r1;.    int k
19690 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
196a0 6e 5b 6a 5d 3b 0a 20 20 20 20 70 54 65 72 6d 20  n[j];.    pTerm 
196b0 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
196c0 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64  iCur, k, notRead
196d0 79 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  y, pLevel->plan.
196e0 77 73 46 6c 61 67 73 2c 20 70 49 64 78 29 3b 0a  wsFlags, pIdx);.
196f0 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 54      if( NEVER(pT
19700 65 72 6d 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b  erm==0) ) break;
19710 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54  .    assert( (pT
19720 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
19730 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29 3b  ERM_CODED)==0 );
19740 0a 20 20 20 20 72 31 20 3d 20 63 6f 64 65 45 71  .    r1 = codeEq
19750 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73  ualityTerm(pPars
19760 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c  e, pTerm, pLevel
19770 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20  , regBase+j);.  
19780 20 20 69 66 28 20 72 31 21 3d 72 65 67 42 61 73    if( r1!=regBas
19790 65 2b 6a 20 29 7b 0a 20 20 20 20 20 20 69 66 28  e+j ){.      if(
197a0 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20   nReg==1 ){.    
197b0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
197c0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
197d0 2c 20 72 65 67 42 61 73 65 29 3b 0a 20 20 20 20  , regBase);.    
197e0 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 72 31      regBase = r1
197f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
19800 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
19810 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
19820 43 6f 70 79 2c 20 72 31 2c 20 72 65 67 42 61 73  Copy, r1, regBas
19830 65 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  e+j);.      }.  
19840 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65    }.    testcase
19850 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
19860 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  or & WO_ISNULL )
19870 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
19880 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
19890 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20   & WO_IN );.    
198a0 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
198b0 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55  rator & (WO_ISNU
198c0 4c 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b  LL|WO_IN))==0 ){
198d0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
198e0 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  ght = pTerm->pEx
198f0 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
19900 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
19910 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70  eIsNullJump(v, p
19920 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6a  Right, regBase+j
19930 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  , pLevel->addrBr
19940 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41  k);.      if( zA
19950 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ff ){.        if
19960 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  ( sqlite3Compare
19970 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c  Affinity(pRight,
19980 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54   zAff[j])==SQLIT
19990 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20  E_AFF_NONE ){.  
199a0 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20          zAff[j] 
199b0 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
199c0 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
199d0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
199e0 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e  ExprNeedsNoAffin
199f0 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74  ityChange(pRight
19a00 2c 20 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a 20 20  , zAff[j]) ){.  
19a10 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20          zAff[j] 
19a20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
19a30 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
19a40 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
19a50 20 2a 70 7a 41 66 66 20 3d 20 7a 41 66 66 3b 0a   *pzAff = zAff;.
19a60 20 20 72 65 74 75 72 6e 20 72 65 67 42 61 73 65    return regBase
19a70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
19a80 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
19a90 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 69 4c   start of the iL
19aa0 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e 20  evel-th loop in 
19ab0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
19ac0 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
19ad0 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62 79 20  on described by 
19ae0 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69  pWInfo..*/.stati
19af0 63 20 42 69 74 6d 61 73 6b 20 63 6f 64 65 4f 6e  c Bitmask codeOn
19b00 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20 20 57 68  eLoopStart(.  Wh
19b10 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
19b20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 69     /* Complete i
19b30 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
19b40 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
19b50 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65  e */.  int iLeve
19b60 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  l,          /* W
19b70 68 69 63 68 20 6c 65 76 65 6c 20 6f 66 20 70 57  hich level of pW
19b80 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64  Info->a[] should
19b90 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 75   be coded */.  u
19ba0 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20  16 wctrlFlags,  
19bb0 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
19bc0 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20  e WHERE_* flags 
19bd0 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74  defined in sqlit
19be0 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 42 69 74 6d  eInt.h */.  Bitm
19bf0 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20  ask notReady    
19c00 20 2f 2a 20 57 68 69 63 68 20 74 61 62 6c 65 73   /* Which tables
19c10 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 61   are currently a
19c20 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  vailable */.){. 
19c30 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20 20 20 20   int j, k;      
19c40 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
19c50 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
19c60 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20  iCur;           
19c70 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72   /* The VDBE cur
19c80 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  sor for the tabl
19c90 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e  e */.  int addrN
19ca0 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57  xt;         /* W
19cb0 68 65 72 65 20 74 6f 20 6a 75 6d 70 20 74 6f 20  here to jump to 
19cc0 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68  continue with th
19cd0 65 20 6e 65 78 74 20 49 4e 20 63 61 73 65 20 2a  e next IN case *
19ce0 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c  /.  int omitTabl
19cf0 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  e;       /* True
19d00 20 69 66 20 77 65 20 75 73 65 20 74 68 65 20 69   if we use the i
19d10 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69  ndex only */.  i
19d20 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20 20 20  nt bRev;        
19d30 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77      /* True if w
19d40 65 20 6e 65 65 64 20 74 6f 20 73 63 61 6e 20 69  e need to scan i
19d50 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
19d60 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
19d70 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a 20 54 68 65  *pLevel;  /* The
19d80 20 77 68 65 72 65 20 6c 65 76 65 6c 20 74 6f 20   where level to 
19d90 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68  be coded */.  Wh
19da0 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
19db0 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74     /* Decomposit
19dc0 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72  ion of the entir
19dd0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
19de0 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
19df0 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
19e00 20 20 20 20 2f 2a 20 41 20 57 48 45 52 45 20 63      /* A WHERE c
19e10 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20  lause term */.  
19e20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
19e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e40 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
19e50 78 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  xt */.  Vdbe *v;
19e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
19e80 72 65 70 61 72 65 64 20 73 74 6d 74 20 75 6e 64  repared stmt und
19e90 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 73  er constructions
19ea0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
19eb0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
19ec0 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  tem;  /* FROM cl
19ed0 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20  ause term being 
19ee0 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61  coded */.  int a
19ef0 64 64 72 42 72 6b 3b 20 20 20 20 20 20 20 20 20  ddrBrk;         
19f00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
19f10 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b  mp here to break
19f20 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
19f30 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f   */.  int addrCo
19f40 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
19f50 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
19f60 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
19f70 69 74 68 20 6e 65 78 74 20 63 79 63 6c 65 20 2a  ith next cycle *
19f80 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 52 65  /.  int iRowidRe
19f90 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  g = 0;        /*
19fa0 20 52 6f 77 69 64 20 69 73 20 73 74 6f 72 65 64   Rowid is stored
19fb0 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
19fc0 72 2c 20 69 66 20 6e 6f 74 20 7a 65 72 6f 20 2a  r, if not zero *
19fd0 2f 0a 20 20 69 6e 74 20 69 52 65 6c 65 61 73 65  /.  int iRelease
19fe0 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  Reg = 0;      /*
19ff0 20 54 65 6d 70 20 72 65 67 69 73 74 65 72 20 74   Temp register t
1a000 6f 20 66 72 65 65 20 62 65 66 6f 72 65 20 72 65  o free before re
1a010 74 75 72 6e 69 6e 67 20 2a 2f 0a 0a 20 20 70 50  turning */..  pP
1a020 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
1a030 50 61 72 73 65 3b 0a 20 20 76 20 3d 20 70 50 61  Parse;.  v = pPa
1a040 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57  rse->pVdbe;.  pW
1a050 43 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 57 43 3b  C = pWInfo->pWC;
1a060 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49  .  pLevel = &pWI
1a070 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b 0a  nfo->a[iLevel];.
1a080 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 57    pTabItem = &pW
1a090 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
1a0a0 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
1a0b0 3b 0a 20 20 69 43 75 72 20 3d 20 70 54 61 62 49  ;.  iCur = pTabI
1a0c0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
1a0d0 62 52 65 76 20 3d 20 28 70 4c 65 76 65 6c 2d 3e  bRev = (pLevel->
1a0e0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
1a0f0 48 45 52 45 5f 52 45 56 45 52 53 45 29 21 3d 30  HERE_REVERSE)!=0
1a100 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20  ;.  omitTable = 
1a110 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
1a120 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
1a130 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20 20 20 20  X_ONLY)!=0 .    
1a140 20 20 20 20 20 20 20 26 26 20 28 77 63 74 72 6c         && (wctrl
1a150 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f  Flags & WHERE_FO
1a160 52 43 45 5f 54 41 42 4c 45 29 3d 3d 30 3b 0a 0a  RCE_TABLE)==0;..
1a170 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65    /* Create labe
1a180 6c 73 20 66 6f 72 20 74 68 65 20 22 62 72 65 61  ls for the "brea
1a190 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65  k" and "continue
1a1a0 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20  " instructions. 
1a1b0 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72   ** for the curr
1a1c0 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20  ent loop.  Jump 
1a1d0 74 6f 20 61 64 64 72 42 72 6b 20 74 6f 20 62 72  to addrBrk to br
1a1e0 65 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f  eak out of a loo
1a1f0 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20  p..  ** Jump to 
1a200 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64  cont to go immed
1a210 69 61 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65  iately to the ne
1a220 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  xt iteration of 
1a230 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20  the.  ** loop.. 
1a240 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68   **.  ** When th
1a250 65 72 65 20 69 73 20 61 6e 20 49 4e 20 6f 70 65  ere is an IN ope
1a260 72 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68  rator, we also h
1a270 61 76 65 20 61 20 22 61 64 64 72 4e 78 74 22 20  ave a "addrNxt" 
1a280 6c 61 62 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20  label that.  ** 
1a290 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75  means to continu
1a2a0 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  e with the next 
1a2b0 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61  IN value combina
1a2c0 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a  tion.  When.  **
1a2d0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 49 4e   there are no IN
1a2e0 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20 74 68   operators in th
1a2f0 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74  e constraints, t
1a300 68 65 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62  he "addrNxt" lab
1a310 65 6c 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 73  el.  ** is the s
1a320 61 6d 65 20 61 73 20 22 61 64 64 72 42 72 6b 22  ame as "addrBrk"
1a330 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b  ..  */.  addrBrk
1a340 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42   = pLevel->addrB
1a350 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  rk = pLevel->add
1a360 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  rNxt = sqlite3Vd
1a370 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1a380 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65    addrCont = pLe
1a390 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20  vel->addrCont = 
1a3a0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1a3b0 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49  abel(v);..  /* I
1a3c0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72 69  f this is the ri
1a3d0 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c  ght table of a L
1a3e0 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20  EFT OUTER JOIN, 
1a3f0 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a  allocate and.  *
1a400 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d  * initialize a m
1a410 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20  emory cell that 
1a420 72 65 63 6f 72 64 73 20 69 66 20 74 68 69 73 20  records if this 
1a430 74 61 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e  table matches an
1a440 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68  y.  ** row of th
1a450 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20  e left table of 
1a460 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20  the join..  */. 
1a470 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72   if( pLevel->iFr
1a480 6f 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74 65  om>0 && (pTabIte
1a490 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20  m[0].jointype & 
1a4a0 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20  JT_LEFT)!=0 ){. 
1a4b0 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74     pLevel->iLeft
1a4c0 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Join = ++pParse-
1a4d0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
1a4e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a4f0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
1a500 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
1a510 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
1a520 6e 74 28 28 76 2c 20 22 69 6e 69 74 20 4c 45 46  nt((v, "init LEF
1a530 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20  T JOIN no-match 
1a540 66 6c 61 67 22 29 29 3b 0a 20 20 7d 0a 0a 23 69  flag"));.  }..#i
1a550 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1a560 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
1a570 20 69 66 28 20 20 28 70 4c 65 76 65 6c 2d 3e 70   if(  (pLevel->p
1a580 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
1a590 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
1a5a0 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43  )!=0 ){.    /* C
1a5b0 61 73 65 20 30 3a 20 20 54 68 65 20 74 61 62 6c  ase 0:  The tabl
1a5c0 65 20 69 73 20 61 20 76 69 72 74 75 61 6c 2d 74  e is a virtual-t
1a5d0 61 62 6c 65 2e 20 20 55 73 65 20 74 68 65 20 56  able.  Use the V
1a5e0 46 69 6c 74 65 72 20 61 6e 64 20 56 4e 65 78 74  Filter and VNext
1a5f0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1a600 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
1a610 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
1a620 69 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a 20 50  int iReg;   /* P
1a630 33 20 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56  3 Value for OP_V
1a640 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20 73 71  Filter */.    sq
1a650 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
1a660 20 2a 70 56 74 61 62 49 64 78 20 3d 20 70 4c 65   *pVtabIdx = pLe
1a670 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61  vel->plan.u.pVta
1a680 62 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 6e 43  bIdx;.    int nC
1a690 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 56 74 61  onstraint = pVta
1a6a0 62 49 64 78 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  bIdx->nConstrain
1a6b0 74 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 71  t;.    struct sq
1a6c0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
1a6d0 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 61 55  traint_usage *aU
1a6e0 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20  sage =.         
1a6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a710 20 20 20 20 20 20 20 70 56 74 61 62 49 64 78 2d         pVtabIdx-
1a720 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
1a730 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 74 72  e;.    const str
1a740 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
1a750 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 61 43  x_constraint *aC
1a760 6f 6e 73 74 72 61 69 6e 74 20 3d 0a 20 20 20 20  onstraint =.    
1a770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a790 20 20 20 20 20 20 20 20 20 20 20 20 70 56 74 61              pVta
1a7a0 62 49 64 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  bIdx->aConstrain
1a7b0 74 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t;..    sqlite3E
1a7c0 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
1a7d0 72 73 65 29 3b 0a 20 20 20 20 69 52 65 67 20 3d  rse);.    iReg =
1a7e0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
1a7f0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f  ange(pParse, nCo
1a800 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20  nstraint+2);.   
1a810 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 6e 43 6f   for(j=1; j<=nCo
1a820 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a  nstraint; j++){.
1a830 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
1a840 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6b 2b  <nConstraint; k+
1a850 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1a860 61 55 73 61 67 65 5b 6b 5d 2e 61 72 67 76 49 6e  aUsage[k].argvIn
1a870 64 65 78 3d 3d 6a 20 29 7b 0a 20 20 20 20 20 20  dex==j ){.      
1a880 20 20 20 20 69 6e 74 20 69 54 65 72 6d 20 3d 20      int iTerm = 
1a890 61 43 6f 6e 73 74 72 61 69 6e 74 5b 6b 5d 2e 69  aConstraint[k].i
1a8a0 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20  TermOffset;.    
1a8b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a8c0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 57  rCode(pParse, pW
1a8d0 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70  C->a[iTerm].pExp
1a8e0 72 2d 3e 70 52 69 67 68 74 2c 20 69 52 65 67 2b  r->pRight, iReg+
1a8f0 6a 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  j+1);.          
1a900 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1a910 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1a920 66 28 20 6b 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e  f( k==nConstrain
1a930 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  t ) break;.    }
1a940 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1a950 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
1a960 65 67 65 72 2c 20 70 56 74 61 62 49 64 78 2d 3e  eger, pVtabIdx->
1a970 69 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20  idxNum, iReg);. 
1a980 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a990 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1a9a0 65 72 2c 20 6a 2d 31 2c 20 69 52 65 67 2b 31 29  er, j-1, iReg+1)
1a9b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1a9c0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 46  eAddOp4(v, OP_VF
1a9d0 69 6c 74 65 72 2c 20 69 43 75 72 2c 20 61 64 64  ilter, iCur, add
1a9e0 72 42 72 6b 2c 20 69 52 65 67 2c 20 70 56 74 61  rBrk, iReg, pVta
1a9f0 62 49 64 78 2d 3e 69 64 78 53 74 72 2c 0a 20 20  bIdx->idxStr,.  
1aa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa10 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e 6e 65      pVtabIdx->ne
1aa20 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3f  edToFreeIdxStr ?
1aa30 20 50 34 5f 4d 50 52 49 4e 54 46 20 3a 20 50 34   P4_MPRINTF : P4
1aa40 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 70 56  _STATIC);.    pV
1aa50 74 61 62 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72  tabIdx->needToFr
1aa60 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  eeIdxStr = 0;.  
1aa70 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f    for(j=0; j<nCo
1aa80 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a  nstraint; j++){.
1aa90 20 20 20 20 20 20 69 66 28 20 61 55 73 61 67 65        if( aUsage
1aaa0 5b 6a 5d 2e 6f 6d 69 74 20 29 7b 0a 20 20 20 20  [j].omit ){.    
1aab0 20 20 20 20 69 6e 74 20 69 54 65 72 6d 20 3d 20      int iTerm = 
1aac0 61 43 6f 6e 73 74 72 61 69 6e 74 5b 6a 5d 2e 69  aConstraint[j].i
1aad0 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20  TermOffset;.    
1aae0 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
1aaf0 70 4c 65 76 65 6c 2c 20 26 70 57 43 2d 3e 61 5b  pLevel, &pWC->a[
1ab00 69 54 65 72 6d 5d 29 3b 0a 20 20 20 20 20 20 7d  iTerm]);.      }
1ab10 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65  .    }.    pLeve
1ab20 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74  l->op = OP_VNext
1ab30 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  ;.    pLevel->p1
1ab40 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65   = iCur;.    pLe
1ab50 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65  vel->p2 = sqlite
1ab60 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1ab70 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
1ab80 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
1ab90 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e  (pParse, iReg, n
1aba0 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20  Constraint+2);. 
1abb0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1abc0 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31  chePop(pParse, 1
1abd0 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
1abe0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1abf0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
1ac00 0a 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  ..  if( pLevel->
1ac10 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
1ac20 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 7b  HERE_ROWID_EQ ){
1ac30 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20  .    /* Case 1: 
1ac40 20 57 65 20 63 61 6e 20 64 69 72 65 63 74 6c 79   We can directly
1ac50 20 72 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e   reference a sin
1ac60 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20 61 6e  gle row using an
1ac70 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1ac80 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72   equality compar
1ac90 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65  ison against the
1aca0 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 20 20 4f   ROWID field.  O
1acb0 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  r.    **        
1acc0 20 20 77 65 20 72 65 66 65 72 65 6e 63 65 20 6d    we reference m
1acd0 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 75 73 69  ultiple rows usi
1ace0 6e 67 20 61 20 22 72 6f 77 69 64 20 49 4e 20 28  ng a "rowid IN (
1acf0 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 20 20 20  ...)".    **    
1ad00 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 2e        construct.
1ad10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 52 65 6c  .    */.    iRel
1ad20 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65  easeReg = sqlite
1ad30 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
1ad40 73 65 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  se);.    pTerm =
1ad50 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
1ad60 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64  Cur, -1, notRead
1ad70 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20  y, WO_EQ|WO_IN, 
1ad80 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
1ad90 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20  pTerm!=0 );.    
1ada0 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70  assert( pTerm->p
1adb0 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 61  Expr!=0 );.    a
1adc0 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 6c 65  ssert( pTerm->le
1add0 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29  ftCursor==iCur )
1ade0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d  ;.    assert( om
1adf0 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  itTable==0 );.  
1ae00 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 63 6f    iRowidReg = co
1ae10 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70  deEqualityTerm(p
1ae20 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c  Parse, pTerm, pL
1ae30 65 76 65 6c 2c 20 69 52 65 6c 65 61 73 65 52 65  evel, iReleaseRe
1ae40 67 29 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20  g);.    addrNxt 
1ae50 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  = pLevel->addrNx
1ae60 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  t;.    sqlite3Vd
1ae70 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d  beAddOp2(v, OP_M
1ae80 75 73 74 42 65 49 6e 74 2c 20 69 52 6f 77 69 64  ustBeInt, iRowid
1ae90 52 65 67 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20  Reg, addrNxt);. 
1aea0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1aeb0 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78  dOp3(v, OP_NotEx
1aec0 69 73 74 73 2c 20 69 43 75 72 2c 20 61 64 64 72  ists, iCur, addr
1aed0 4e 78 74 2c 20 69 52 6f 77 69 64 52 65 67 29 3b  Nxt, iRowidReg);
1aee0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1aef0 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73  CacheStore(pPars
1af00 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f  e, iCur, -1, iRo
1af10 77 69 64 52 65 67 29 3b 0a 20 20 20 20 56 64 62  widReg);.    Vdb
1af20 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b  eComment((v, "pk
1af30 22 29 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  "));.    pLevel-
1af40 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  >op = OP_Noop;. 
1af50 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65   }else if( pLeve
1af60 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
1af70 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  & WHERE_ROWID_RA
1af80 4e 47 45 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  NGE ){.    /* Ca
1af90 73 65 20 32 3a 20 20 57 65 20 68 61 76 65 20 61  se 2:  We have a
1afa0 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d  n inequality com
1afb0 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20  parison against 
1afc0 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e  the ROWID field.
1afd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
1afe0 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70  testOp = OP_Noop
1aff0 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b  ;.    int start;
1b000 0a 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e 64 56  .    int memEndV
1b010 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 57 68  alue = 0;.    Wh
1b020 65 72 65 54 65 72 6d 20 2a 70 53 74 61 72 74 2c  ereTerm *pStart,
1b030 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 61 73 73   *pEnd;..    ass
1b040 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d  ert( omitTable==
1b050 30 20 29 3b 0a 20 20 20 20 70 53 74 61 72 74 20  0 );.    pStart 
1b060 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
1b070 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61  iCur, -1, notRea
1b080 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c  dy, WO_GT|WO_GE,
1b090 20 30 29 3b 0a 20 20 20 20 70 45 6e 64 20 3d 20   0);.    pEnd = 
1b0a0 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
1b0b0 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79  ur, -1, notReady
1b0c0 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30  , WO_LT|WO_LE, 0
1b0d0 29 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 20  );.    if( bRev 
1b0e0 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  ){.      pTerm =
1b0f0 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20 70   pStart;.      p
1b100 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20  Start = pEnd;.  
1b110 20 20 20 20 70 45 6e 64 20 3d 20 70 54 65 72 6d      pEnd = pTerm
1b120 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1b130 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  pStart ){.      
1b140 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20  Expr *pX;       
1b150 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
1b160 72 65 73 73 69 6f 6e 20 74 68 61 74 20 64 65 66  ression that def
1b170 69 6e 65 73 20 74 68 65 20 73 74 61 72 74 20 62  ines the start b
1b180 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ound */.      in
1b190 74 20 72 31 2c 20 72 54 65 6d 70 3b 20 20 20 20  t r1, rTemp;    
1b1a0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73      /* Registers
1b1b0 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74 68 65   for holding the
1b1c0 20 73 74 61 72 74 20 62 6f 75 6e 64 61 72 79 20   start boundary 
1b1d0 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  */..      /* The
1b1e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74   following const
1b1f0 61 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78 20 63  ant maps TK_xx c
1b200 6f 64 65 73 20 69 6e 74 6f 20 63 6f 72 72 65 73  odes into corres
1b210 70 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20 20 2a  ponding .      *
1b220 2a 20 73 65 65 6b 20 6f 70 63 6f 64 65 73 2e 20  * seek opcodes. 
1b230 20 49 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 61   It depends on a
1b240 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65   particular orde
1b250 72 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a 20 20  ring of TK_xx.  
1b260 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e      */.      con
1b270 73 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b 5d 20  st u8 aMoveOp[] 
1b280 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 2f  = {.           /
1b290 2a 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f 53  * TK_GT */  OP_S
1b2a0 65 65 6b 47 74 2c 0a 20 20 20 20 20 20 20 20 20  eekGt,.         
1b2b0 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f    /* TK_LE */  O
1b2c0 50 5f 53 65 65 6b 4c 65 2c 0a 20 20 20 20 20 20  P_SeekLe,.      
1b2d0 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f       /* TK_LT */
1b2e0 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 0a 20 20 20    OP_SeekLt,.   
1b2f0 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 45          /* TK_GE
1b300 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 65 0a 20   */  OP_SeekGe. 
1b310 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 61 73       };.      as
1b320 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f  sert( TK_LE==TK_
1b330 47 54 2b 31 20 29 3b 20 20 20 20 20 20 2f 2a 20  GT+1 );      /* 
1b340 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72  Make sure the or
1b350 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20  dering.. */.    
1b360 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d    assert( TK_LT=
1b370 3d 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20 20 20  =TK_GT+2 );     
1b380 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68 65 20   /*  ... of the 
1b390 54 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e 2e 20  TK_xx values... 
1b3a0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
1b3b0 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33 20   TK_GE==TK_GT+3 
1b3c0 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20  );      /*  ... 
1b3d0 69 73 20 63 6f 72 72 65 63 63 74 2e 20 2a 2f 0a  is correcct. */.
1b3e0 0a 20 20 20 20 20 20 70 58 20 3d 20 70 53 74 61  .      pX = pSta
1b3f0 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rt->pExpr;.     
1b400 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29   assert( pX!=0 )
1b410 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1b420 70 53 74 61 72 74 2d 3e 6c 65 66 74 43 75 72 73  pStart->leftCurs
1b430 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20  or==iCur );.    
1b440 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1b450 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1b460 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 26  e, pX->pRight, &
1b470 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71  rTemp);.      sq
1b480 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1b490 76 2c 20 61 4d 6f 76 65 4f 70 5b 70 58 2d 3e 6f  v, aMoveOp[pX->o
1b4a0 70 2d 54 4b 5f 47 54 5d 2c 20 69 43 75 72 2c 20  p-TK_GT], iCur, 
1b4b0 61 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20 20  addrBrk, r1);.  
1b4c0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1b4d0 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20  (v, "pk"));.    
1b4e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1b4f0 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
1b500 28 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29 3b  (pParse, r1, 1);
1b510 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
1b520 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1b530 72 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20 20  rse, rTemp);.   
1b540 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
1b550 4c 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b 0a  Level, pStart);.
1b560 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b570 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b580 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f  p2(v, bRev ? OP_
1b590 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64  Last : OP_Rewind
1b5a0 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29  , iCur, addrBrk)
1b5b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1b5c0 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78  pEnd ){.      Ex
1b5d0 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 70 58  pr *pX;.      pX
1b5e0 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a   = pEnd->pExpr;.
1b5f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58        assert( pX
1b600 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
1b610 65 72 74 28 20 70 45 6e 64 2d 3e 6c 65 66 74 43  ert( pEnd->leftC
1b620 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20  ursor==iCur );. 
1b630 20 20 20 20 20 6d 65 6d 45 6e 64 56 61 6c 75 65       memEndValue
1b640 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1b650 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
1b660 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1b670 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 6d 65 6d   pX->pRight, mem
1b680 45 6e 64 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  EndValue);.     
1b690 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   if( pX->op==TK_
1b6a0 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b  LT || pX->op==TK
1b6b0 5f 47 54 20 29 7b 0a 20 20 20 20 20 20 20 20 74  _GT ){.        t
1b6c0 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f  estOp = bRev ? O
1b6d0 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20  P_Le : OP_Ge;.  
1b6e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b6f0 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76     testOp = bRev
1b700 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74   ? OP_Lt : OP_Gt
1b710 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b720 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
1b730 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20 7d  el, pEnd);.    }
1b740 0a 20 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c  .    start = sql
1b750 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1b760 64 64 72 28 76 29 3b 0a 20 20 20 20 70 4c 65 76  ddr(v);.    pLev
1b770 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20  el->op = bRev ? 
1b780 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78  OP_Prev : OP_Nex
1b790 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  t;.    pLevel->p
1b7a0 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c  1 = iCur;.    pL
1b7b0 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74  evel->p2 = start
1b7c0 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74  ;.    if( pStart
1b7d0 3d 3d 30 20 26 26 20 70 45 6e 64 3d 3d 30 20 29  ==0 && pEnd==0 )
1b7e0 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
1b7f0 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54  p5 = SQLITE_STMT
1b800 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f  STATUS_FULLSCAN_
1b810 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  STEP;.    }else{
1b820 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1b830 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a  Level->p5==0 );.
1b840 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74 65      }.    if( te
1b850 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  stOp!=OP_Noop ){
1b860 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67  .      iRowidReg
1b870 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d   = iReleaseReg =
1b880 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
1b890 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
1b8a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b8b0 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
1b8c0 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67   iCur, iRowidReg
1b8d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1b8e0 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70  ExprCacheStore(p
1b8f0 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c  Parse, iCur, -1,
1b900 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
1b910 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b920 64 4f 70 33 28 76 2c 20 74 65 73 74 4f 70 2c 20  dOp3(v, testOp, 
1b930 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20 61 64 64  memEndValue, add
1b940 72 42 72 6b 2c 20 69 52 6f 77 69 64 52 65 67 29  rBrk, iRowidReg)
1b950 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1b960 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
1b970 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
1b980 43 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  C | SQLITE_JUMPI
1b990 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  FNULL);.    }.  
1b9a0 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c  }else if( pLevel
1b9b0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
1b9c0 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52   (WHERE_COLUMN_R
1b9d0 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  ANGE|WHERE_COLUM
1b9e0 4e 5f 45 51 29 20 29 7b 0a 20 20 20 20 2f 2a 20  N_EQ) ){.    /* 
1b9f0 43 61 73 65 20 33 3a 20 41 20 73 63 61 6e 20 75  Case 3: A scan u
1ba00 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2e 0a 20  sing an index.. 
1ba10 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1ba20 20 20 20 20 20 54 68 65 20 57 48 45 52 45 20 63       The WHERE c
1ba30 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e 74 61 69  lause may contai
1ba40 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 65  n zero or more e
1ba50 71 75 61 6c 69 74 79 20 0a 20 20 20 20 2a 2a 20  quality .    ** 
1ba60 20 20 20 20 20 20 20 20 74 65 72 6d 73 20 28 22          terms ("
1ba70 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70 65 72  ==" or "IN" oper
1ba80 61 74 6f 72 73 29 20 74 68 61 74 20 72 65 66 65  ators) that refe
1ba90 72 20 74 6f 20 74 68 65 20 4e 0a 20 20 20 20 2a  r to the N.    *
1baa0 2a 20 20 20 20 20 20 20 20 20 6c 65 66 74 2d 6d  *         left-m
1bab0 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  ost columns of t
1bac0 68 65 20 69 6e 64 65 78 2e 20 49 74 20 6d 61 79  he index. It may
1bad0 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a 20 20   also contain.  
1bae0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 65    **         ine
1baf0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1bb00 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72  nts (>, <, >= or
1bb10 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69 6e 64 65   <=) on the inde
1bb20 78 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  xed.    **      
1bb30 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69     column that i
1bb40 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
1bb50 77 73 20 74 68 65 20 4e 20 65 71 75 61 6c 69 74  ws the N equalit
1bb60 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20 20 20 2a  ies. Only .    *
1bb70 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69  *         the ri
1bb80 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  ght-most column 
1bb90 63 61 6e 20 62 65 20 61 6e 20 69 6e 65 71 75 61  can be an inequa
1bba0 6c 69 74 79 20 2d 20 74 68 65 20 72 65 73 74 20  lity - the rest 
1bbb0 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20 20 20 20  must.    **     
1bbc0 20 20 20 20 75 73 65 20 74 68 65 20 22 3d 3d 22      use the "=="
1bbd0 20 61 6e 64 20 22 49 4e 22 20 6f 70 65 72 61 74   and "IN" operat
1bbe0 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ors. For example
1bbf0 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20 2a 2a  , if the .    **
1bc00 20 20 20 20 20 20 20 20 20 69 6e 64 65 78 20 69           index i
1bc10 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20 74 68  s on (x,y,z), th
1bc20 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  en the following
1bc30 20 63 6c 61 75 73 65 73 20 61 72 65 20 61 6c 6c   clauses are all
1bc40 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20   .    **        
1bc50 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20 20 20 20   optimized:.    
1bc60 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1bc70 20 20 20 20 20 78 3d 35 0a 20 20 20 20 2a 2a 20       x=5.    ** 
1bc80 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
1bc90 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a 2a 20 20  ND y=10.    **  
1bca0 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
1bcb0 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20  D y<10.    **   
1bcc0 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44           x=5 AND
1bcd0 20 79 3e 35 20 41 4e 44 20 79 3c 31 30 0a 20 20   y>5 AND y<10.  
1bce0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1bcf0 78 3d 35 20 41 4e 44 20 79 3d 35 20 41 4e 44 20  x=5 AND y=5 AND 
1bd00 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20  z<=10.    **.   
1bd10 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65 20   **         The 
1bd20 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20 74 68 65  z<10 term of the
1bd30 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f   following canno
1bd40 74 20 62 65 20 75 73 65 64 2c 20 6f 6e 6c 79 0a  t be used, only.
1bd50 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74      **         t
1bd60 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a 20 20 20  he x=5 term:.   
1bd70 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1bd80 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 7a 3c        x=5 AND z<
1bd90 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  10.    **.    **
1bda0 20 20 20 20 20 20 20 20 20 4e 20 6d 61 79 20 62           N may b
1bdb0 65 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20  e zero if there 
1bdc0 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63  are inequality c
1bdd0 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20  onstraints..    
1bde0 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 74 68  **         If th
1bdf0 65 72 65 20 61 72 65 20 6e 6f 20 69 6e 65 71 75  ere are no inequ
1be00 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1be10 73 2c 20 74 68 65 6e 20 4e 20 69 73 20 61 74 0a  s, then N is at.
1be20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c      **         l
1be30 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a  east one..    **
1be40 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1be50 54 68 69 73 20 63 61 73 65 20 69 73 20 61 6c 73  This case is als
1be60 6f 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 72  o used when ther
1be70 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63  e are no WHERE c
1be80 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 20 20 20  lause.    **    
1be90 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 73       constraints
1bea0 20 62 75 74 20 61 6e 20 69 6e 64 65 78 20 69 73   but an index is
1beb0 20 73 65 6c 65 63 74 65 64 20 61 6e 79 77 61 79   selected anyway
1bec0 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a  , in order.    *
1bed0 2a 20 20 20 20 20 20 20 20 20 74 6f 20 66 6f 72  *         to for
1bee0 63 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 72  ce the output or
1bef0 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74  der to conform t
1bf00 6f 20 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20  o an ORDER BY.. 
1bf10 20 20 20 2a 2f 20 20 0a 20 20 20 20 69 6e 74 20     */  .    int 
1bf20 61 53 74 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20  aStartOp[] = {. 
1bf30 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 30 2c       0,.      0,
1bf40 0a 20 20 20 20 20 20 4f 50 5f 52 65 77 69 6e 64  .      OP_Rewind
1bf50 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32  ,           /* 2
1bf60 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72  : (!start_constr
1bf70 61 69 6e 74 73 20 26 26 20 73 74 61 72 74 45 71  aints && startEq
1bf80 20 26 26 20 20 21 62 52 65 76 29 20 2a 2f 0a 20   &&  !bRev) */. 
1bf90 20 20 20 20 20 4f 50 5f 4c 61 73 74 2c 20 20 20       OP_Last,   
1bfa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20            /* 3: 
1bfb0 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69  (!start_constrai
1bfc0 6e 74 73 20 26 26 20 73 74 61 72 74 45 71 20 26  nts && startEq &
1bfd0 26 20 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20  &   bRev) */.   
1bfe0 20 20 20 4f 50 5f 53 65 65 6b 47 74 2c 20 20 20     OP_SeekGt,   
1bff0 20 20 20 20 20 20 20 20 2f 2a 20 34 3a 20 28 73          /* 4: (s
1c000 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
1c010 20 20 26 26 20 21 73 74 61 72 74 45 71 20 26 26    && !startEq &&
1c020 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20   !bRev) */.     
1c030 20 4f 50 5f 53 65 65 6b 4c 74 2c 20 20 20 20 20   OP_SeekLt,     
1c040 20 20 20 20 20 20 2f 2a 20 35 3a 20 28 73 74 61        /* 5: (sta
1c050 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
1c060 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20 20  && !startEq &&  
1c070 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f  bRev) */.      O
1c080 50 5f 53 65 65 6b 47 65 2c 20 20 20 20 20 20 20  P_SeekGe,       
1c090 20 20 20 20 2f 2a 20 36 3a 20 28 73 74 61 72 74      /* 6: (start
1c0a0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26  _constraints  &&
1c0b0 20 20 73 74 61 72 74 45 71 20 26 26 20 21 62 52    startEq && !bR
1c0c0 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
1c0d0 53 65 65 6b 4c 65 20 20 20 20 20 20 20 20 20 20  SeekLe          
1c0e0 20 20 2f 2a 20 37 3a 20 28 73 74 61 72 74 5f 63    /* 7: (start_c
1c0f0 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 20  onstraints  &&  
1c100 73 74 61 72 74 45 71 20 26 26 20 20 62 52 65 76  startEq &&  bRev
1c110 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20  ) */.    };.    
1c120 69 6e 74 20 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b  int aEndOp[] = {
1c130 0a 20 20 20 20 20 20 4f 50 5f 4e 6f 6f 70 2c 20  .      OP_Noop, 
1c140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
1c150 3a 20 28 21 65 6e 64 5f 63 6f 6e 73 74 72 61 69  : (!end_constrai
1c160 6e 74 73 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  nts) */.      OP
1c170 5f 49 64 78 47 45 2c 20 20 20 20 20 20 20 20 20  _IdxGE,         
1c180 20 20 20 2f 2a 20 31 3a 20 28 65 6e 64 5f 63 6f     /* 1: (end_co
1c190 6e 73 74 72 61 69 6e 74 73 20 26 26 20 21 62 52  nstraints && !bR
1c1a0 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
1c1b0 49 64 78 4c 54 20 20 20 20 20 20 20 20 20 20 20  IdxLT           
1c1c0 20 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e    /* 2: (end_con
1c1d0 73 74 72 61 69 6e 74 73 20 26 26 20 62 52 65 76  straints && bRev
1c1e0 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20  ) */.    };.    
1c1f0 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c  int nEq = pLevel
1c200 2d 3e 70 6c 61 6e 2e 6e 45 71 3b 0a 20 20 20 20  ->plan.nEq;.    
1c210 69 6e 74 20 69 73 4d 69 6e 51 75 65 72 79 20 3d  int isMinQuery =
1c220 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
1c230 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 6f 70  If this is an op
1c240 74 69 6d 69 7a 65 64 20 53 45 4c 45 43 54 20 6d  timized SELECT m
1c250 69 6e 28 78 29 2e 2e 20 2a 2f 0a 20 20 20 20 69  in(x).. */.    i
1c260 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20  nt regBase;     
1c270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
1c280 61 73 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c  ase register hol
1c290 64 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 20  ding constraint 
1c2a0 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 69 6e  values */.    in
1c2b0 74 20 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  t r1;           
1c2c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
1c2d0 6d 70 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  mp register */. 
1c2e0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52     WhereTerm *pR
1c2f0 61 6e 67 65 53 74 61 72 74 20 3d 20 30 3b 20 20  angeStart = 0;  
1c300 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f  /* Inequality co
1c310 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67  nstraint at rang
1c320 65 20 73 74 61 72 74 20 2a 2f 0a 20 20 20 20 57  e start */.    W
1c330 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65  hereTerm *pRange
1c340 45 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49  End = 0;    /* I
1c350 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
1c360 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20 65 6e  aint at range en
1c370 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61  d */.    int sta
1c380 72 74 45 71 3b 20 20 20 20 20 20 20 20 20 20 20  rtEq;           
1c390 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1c3a0 20 72 61 6e 67 65 20 73 74 61 72 74 20 75 73 65   range start use
1c3b0 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a  s ==, >= or <= *
1c3c0 2f 0a 20 20 20 20 69 6e 74 20 65 6e 64 45 71 3b  /.    int endEq;
1c3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3e0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61     /* True if ra
1c3f0 6e 67 65 20 65 6e 64 20 75 73 65 73 20 3d 3d 2c  nge end uses ==,
1c400 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20   >= or <= */.   
1c410 20 69 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73 74   int start_const
1c420 72 61 69 6e 74 73 3b 20 20 20 20 20 20 20 2f 2a  raints;       /*
1c430 20 53 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20   Start of range 
1c440 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 2a  is constrained *
1c450 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74  /.    int nConst
1c460 72 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20  raint;          
1c470 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1c480 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73  constraint terms
1c490 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
1c4a0 49 64 78 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Idx;         /* 
1c4b0 54 68 65 20 69 6e 64 65 78 20 77 65 20 77 69 6c  The index we wil
1c4c0 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20  l be using */.  
1c4d0 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20    int iIdxCur;  
1c4e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
1c4f0 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  BE cursor for th
1c500 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69  e index */.    i
1c510 6e 74 20 6e 45 78 74 72 61 52 65 67 20 3d 20 30  nt nExtraReg = 0
1c520 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
1c530 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73   extra registers
1c540 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 20 20 69   needed */.    i
1c550 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
1c560 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69      /* Instructi
1c570 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  on opcode */.   
1c580 20 63 68 61 72 20 2a 7a 41 66 66 3b 0a 0a 20 20   char *zAff;..  
1c590 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d    pIdx = pLevel-
1c5a0 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20  >plan.u.pIdx;.  
1c5b0 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76    iIdxCur = pLev
1c5c0 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
1c5d0 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c   k = pIdx->aiCol
1c5e0 75 6d 6e 5b 6e 45 71 5d 3b 20 20 20 20 20 2f 2a  umn[nEq];     /*
1c5f0 20 43 6f 6c 75 6d 6e 20 66 6f 72 20 69 6e 65 71   Column for ineq
1c600 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1c610 74 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66  ts */..    /* If
1c620 20 74 68 69 73 20 6c 6f 6f 70 20 73 61 74 69 73   this loop satis
1c630 66 69 65 73 20 61 20 73 6f 72 74 20 6f 72 64 65  fies a sort orde
1c640 72 20 28 70 4f 72 64 65 72 42 79 29 20 72 65 71  r (pOrderBy) req
1c650 75 65 73 74 20 74 68 61 74 20 0a 20 20 20 20 2a  uest that .    *
1c660 2a 20 77 61 73 20 70 61 73 73 65 64 20 74 6f 20  * was passed to 
1c670 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f  this function to
1c680 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 22 53 45   implement a "SE
1c690 4c 45 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e 22  LECT min(x) ..."
1c6a0 20 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2c 20   .    ** query, 
1c6b0 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20  then the caller 
1c6c0 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20  will only allow 
1c6d0 74 68 65 20 6c 6f 6f 70 20 74 6f 20 72 75 6e 20  the loop to run 
1c6e0 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20 73 69 6e  for.    ** a sin
1c6f0 67 6c 65 20 69 74 65 72 61 74 69 6f 6e 2e 20 54  gle iteration. T
1c700 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  his means that t
1c710 68 65 20 66 69 72 73 74 20 72 6f 77 20 72 65 74  he first row ret
1c720 75 72 6e 65 64 0a 20 20 20 20 2a 2a 20 73 68 6f  urned.    ** sho
1c730 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 61 20 4e  uld not have a N
1c740 55 4c 4c 20 76 61 6c 75 65 20 73 74 6f 72 65 64  ULL value stored
1c750 20 69 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c 75   in 'x'. If colu
1c760 6d 6e 20 27 78 27 20 69 73 0a 20 20 20 20 2a 2a  mn 'x' is.    **
1c770 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 20 61   the first one a
1c780 66 74 65 72 20 74 68 65 20 6e 45 71 20 65 71 75  fter the nEq equ
1c790 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1c7a0 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 0a  s in the index,.
1c7b0 20 20 20 20 2a 2a 20 74 68 69 73 20 72 65 71 75      ** this requ
1c7c0 69 72 65 73 20 73 6f 6d 65 20 73 70 65 63 69 61  ires some specia
1c7d0 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20  l handling..    
1c7e0 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 63 74 72  */.    if( (wctr
1c7f0 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44  lFlags&WHERE_ORD
1c800 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20 20  ERBY_MIN)!=0.   
1c810 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70 6c    && (pLevel->pl
1c820 61 6e 2e 77 73 46 6c 61 67 73 26 57 48 45 52 45  an.wsFlags&WHERE
1c830 5f 4f 52 44 45 52 42 59 29 0a 20 20 20 20 20 26  _ORDERBY).     &
1c840 26 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  & (pIdx->nColumn
1c850 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20  >nEq).    ){.   
1c860 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 4f     /* assert( pO
1c870 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31  rderBy->nExpr==1
1c880 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20   ); */.      /* 
1c890 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
1c8a0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43  ->a[0].pExpr->iC
1c8b0 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43  olumn==pIdx->aiC
1c8c0 6f 6c 75 6d 6e 5b 6e 45 71 5d 20 29 3b 20 2a 2f  olumn[nEq] ); */
1c8d0 0a 20 20 20 20 20 20 69 73 4d 69 6e 51 75 65 72  .      isMinQuer
1c8e0 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45 78  y = 1;.      nEx
1c8f0 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20  traReg = 1;.    
1c900 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 61  }..    /* Find a
1c910 6e 79 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  ny inequality co
1c920 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 66  nstraint terms f
1c930 6f 72 20 74 68 65 20 73 74 61 72 74 20 61 6e 64  or the start and
1c940 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20   end .    ** of 
1c950 74 68 65 20 72 61 6e 67 65 2e 20 0a 20 20 20 20  the range. .    
1c960 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  */.    if( pLeve
1c970 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
1c980 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
1c990 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67  T ){.      pRang
1c9a0 65 45 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d 28  eEnd = findTerm(
1c9b0 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f  pWC, iCur, k, no
1c9c0 74 52 65 61 64 79 2c 20 28 57 4f 5f 4c 54 7c 57  tReady, (WO_LT|W
1c9d0 4f 5f 4c 45 29 2c 20 70 49 64 78 29 3b 0a 20 20  O_LE), pIdx);.  
1c9e0 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20      nExtraReg = 
1c9f0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
1ca00 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
1ca10 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54  Flags & WHERE_BT
1ca20 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20  M_LIMIT ){.     
1ca30 20 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 66   pRangeStart = f
1ca40 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
1ca50 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20  r, k, notReady, 
1ca60 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 2c 20 70  (WO_GT|WO_GE), p
1ca70 49 64 78 29 3b 0a 20 20 20 20 20 20 6e 45 78 74  Idx);.      nExt
1ca80 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d  raReg = 1;.    }
1ca90 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  ..    /* Generat
1caa0 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61  e code to evalua
1cab0 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e  te all constrain
1cac0 74 20 74 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d  t terms using ==
1cad0 20 6f 72 20 49 4e 0a 20 20 20 20 2a 2a 20 61 6e   or IN.    ** an
1cae0 64 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75  d store the valu
1caf0 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d  es of those term
1cb00 73 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  s in an array of
1cb10 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a   registers.    *
1cb20 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 72 65  * starting at re
1cb30 67 42 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  gBase..    */.  
1cb40 20 20 72 65 67 42 61 73 65 20 3d 20 63 6f 64 65    regBase = code
1cb50 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73  AllEqualityTerms
1cb60 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  (.        pParse
1cb70 2c 20 70 4c 65 76 65 6c 2c 20 70 57 43 2c 20 6e  , pLevel, pWC, n
1cb80 6f 74 52 65 61 64 79 2c 20 6e 45 78 74 72 61 52  otReady, nExtraR
1cb90 65 67 2c 20 26 7a 41 66 66 0a 20 20 20 20 29 3b  eg, &zAff.    );
1cba0 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70  .    addrNxt = p
1cbb0 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a  Level->addrNxt;.
1cbc0 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
1cbd0 65 20 64 6f 69 6e 67 20 61 20 72 65 76 65 72 73  e doing a revers
1cbe0 65 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20  e order scan on 
1cbf0 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64  an ascending ind
1cc00 65 78 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20  ex, or.    ** a 
1cc10 66 6f 72 77 61 72 64 20 6f 72 64 65 72 20 73 63  forward order sc
1cc20 61 6e 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69  an on a descendi
1cc30 6e 67 20 69 6e 64 65 78 2c 20 69 6e 74 65 72 63  ng index, interc
1cc40 68 61 6e 67 65 20 74 68 65 20 0a 20 20 20 20 2a  hange the .    *
1cc50 2a 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20  * start and end 
1cc60 74 65 72 6d 73 20 28 70 52 61 6e 67 65 53 74 61  terms (pRangeSta
1cc70 72 74 20 61 6e 64 20 70 52 61 6e 67 65 45 6e 64  rt and pRangeEnd
1cc80 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
1cc90 28 20 62 52 65 76 3d 3d 28 70 49 64 78 2d 3e 61  ( bRev==(pIdx->a
1cca0 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d  SortOrder[nEq]==
1ccb0 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29 20 29  SQLITE_SO_ASC) )
1ccc0 7b 0a 20 20 20 20 20 20 53 57 41 50 28 57 68 65  {.      SWAP(Whe
1ccd0 72 65 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65  reTerm *, pRange
1cce0 45 6e 64 2c 20 70 52 61 6e 67 65 53 74 61 72 74  End, pRangeStart
1ccf0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 65  );.    }..    te
1cd00 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74  stcase( pRangeSt
1cd10 61 72 74 20 26 26 20 70 52 61 6e 67 65 53 74 61  art && pRangeSta
1cd20 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rt->eOperator & 
1cd30 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 74 65 73  WO_LE );.    tes
1cd40 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61  tcase( pRangeSta
1cd50 72 74 20 26 26 20 70 52 61 6e 67 65 53 74 61 72  rt && pRangeStar
1cd60 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  t->eOperator & W
1cd70 4f 5f 47 45 20 29 3b 0a 20 20 20 20 74 65 73 74  O_GE );.    test
1cd80 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20  case( pRangeEnd 
1cd90 26 26 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f  && pRangeEnd->eO
1cda0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20  perator & WO_LE 
1cdb0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1cdc0 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20 70 52   pRangeEnd && pR
1cdd0 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74  angeEnd->eOperat
1cde0 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20  or & WO_GE );.  
1cdf0 20 20 73 74 61 72 74 45 71 20 3d 20 21 70 52 61    startEq = !pRa
1ce00 6e 67 65 53 74 61 72 74 20 7c 7c 20 70 52 61 6e  ngeStart || pRan
1ce10 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74  geStart->eOperat
1ce20 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47  or & (WO_LE|WO_G
1ce30 45 29 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d 20  E);.    endEq = 
1ce40 20 20 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20    !pRangeEnd || 
1ce50 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72  pRangeEnd->eOper
1ce60 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f  ator & (WO_LE|WO
1ce70 5f 47 45 29 3b 0a 20 20 20 20 73 74 61 72 74 5f  _GE);.    start_
1ce80 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 70 52  constraints = pR
1ce90 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e 45 71  angeStart || nEq
1cea0 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b  >0;..    /* Seek
1ceb0 20 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f   the index curso
1cec0 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
1ced0 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a  f the range. */.
1cee0 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20      nConstraint 
1cef0 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70  = nEq;.    if( p
1cf00 52 61 6e 67 65 53 74 61 72 74 20 29 7b 0a 20 20  RangeStart ){.  
1cf10 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
1cf20 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e   = pRangeStart->
1cf30 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
1cf40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1cf50 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69  Code(pParse, pRi
1cf60 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  ght, regBase+nEq
1cf70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1cf80 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75  ExprCodeIsNullJu
1cf90 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65  mp(v, pRight, re
1cfa0 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e  gBase+nEq, addrN
1cfb0 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  xt);.      if( z
1cfc0 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Aff ){.        i
1cfd0 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  f( sqlite3Compar
1cfe0 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74  eAffinity(pRight
1cff0 2c 20 7a 41 66 66 5b 6e 43 6f 6e 73 74 72 61 69  , zAff[nConstrai
1d000 6e 74 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nt])==SQLITE_AFF
1d010 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20 20  _NONE){.        
1d020 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63    /* Since the c
1d030 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20  omparison is to 
1d040 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74  be performed wit
1d050 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73  h no conversions
1d060 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70  .          ** ap
1d070 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65  plied to the ope
1d080 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61  rands, set the a
1d090 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79  ffinity to apply
1d0a0 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20   to pRight to . 
1d0b0 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49           ** SQLI
1d0c0 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f  TE_AFF_NONE.  */
1d0d0 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b  .          zAff[
1d0e0 6e 43 6f 6e 73 74 72 61 69 6e 74 5d 20 3d 20 53  nConstraint] = S
1d0f0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
1d100 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d110 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
1d120 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79  rNeedsNoAffinity
1d130 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a  Change(pRight, z
1d140 41 66 66 5b 6e 43 6f 6e 73 74 72 61 69 6e 74 5d  Aff[nConstraint]
1d150 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ) ){.          z
1d160 41 66 66 5b 6e 43 6f 6e 73 74 72 61 69 6e 74 5d  Aff[nConstraint]
1d170 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
1d180 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
1d190 20 20 20 20 7d 20 20 0a 20 20 20 20 20 20 6e 43      }  .      nC
1d1a0 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20  onstraint++;.   
1d1b0 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4d 69 6e   }else if( isMin
1d1c0 51 75 65 72 79 20 29 7b 0a 20 20 20 20 20 20 73  Query ){.      s
1d1d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1d1e0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
1d1f0 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20  regBase+nEq);.  
1d200 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b      nConstraint+
1d210 2b 3b 0a 20 20 20 20 20 20 73 74 61 72 74 45 71  +;.      startEq
1d220 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 61 72   = 0;.      star
1d230 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20  t_constraints = 
1d240 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 64  1;.    }.    cod
1d250 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70  eApplyAffinity(p
1d260 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20  Parse, regBase, 
1d270 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 7a 41 66  nConstraint, zAf
1d280 66 29 3b 0a 20 20 20 20 6f 70 20 3d 20 61 53 74  f);.    op = aSt
1d290 61 72 74 4f 70 5b 28 73 74 61 72 74 5f 63 6f 6e  artOp[(start_con
1d2a0 73 74 72 61 69 6e 74 73 3c 3c 32 29 20 2b 20 28  straints<<2) + (
1d2b0 73 74 61 72 74 45 71 3c 3c 31 29 20 2b 20 62 52  startEq<<1) + bR
1d2c0 65 76 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ev];.    assert(
1d2d0 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20 20 74 65   op!=0 );.    te
1d2e0 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 52  stcase( op==OP_R
1d2f0 65 77 69 6e 64 20 29 3b 0a 20 20 20 20 74 65 73  ewind );.    tes
1d300 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4c 61  tcase( op==OP_La
1d310 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  st );.    testca
1d320 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47  se( op==OP_SeekG
1d330 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  t );.    testcas
1d340 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 65  e( op==OP_SeekGe
1d350 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
1d360 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 65 20  ( op==OP_SeekLe 
1d370 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1d380 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 74 20 29   op==OP_SeekLt )
1d390 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1d3a0 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70  eAddOp4Int(v, op
1d3b0 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e  , iIdxCur, addrN
1d3c0 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  xt, regBase, nCo
1d3d0 6e 73 74 72 61 69 6e 74 29 3b 0a 0a 20 20 20 20  nstraint);..    
1d3e0 2f 2a 20 4c 6f 61 64 20 74 68 65 20 76 61 6c 75  /* Load the valu
1d3f0 65 20 66 6f 72 20 74 68 65 20 69 6e 65 71 75 61  e for the inequa
1d400 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
1d410 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
1d420 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 28  e.    ** range (
1d430 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a  if any)..    */.
1d440 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20      nConstraint 
1d450 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70  = nEq;.    if( p
1d460 52 61 6e 67 65 45 6e 64 20 29 7b 0a 20 20 20 20  RangeEnd ){.    
1d470 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
1d480 20 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45 78 70   pRangeEnd->pExp
1d490 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
1d4a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1d4b0 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20  eRemove(pParse, 
1d4c0 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 31 29 3b  regBase+nEq, 1);
1d4d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1d4e0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1d4f0 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e  Right, regBase+n
1d500 45 71 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Eq);.      sqlit
1d510 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c  e3ExprCodeIsNull
1d520 4a 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20  Jump(v, pRight, 
1d530 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64  regBase+nEq, add
1d540 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28  rNxt);.      if(
1d550 20 7a 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20   zAff ){.       
1d560 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70   if( sqlite3Comp
1d570 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67  areAffinity(pRig
1d580 68 74 2c 20 7a 41 66 66 5b 6e 43 6f 6e 73 74 72  ht, zAff[nConstr
1d590 61 69 6e 74 5d 29 3d 3d 53 51 4c 49 54 45 5f 41  aint])==SQLITE_A
1d5a0 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20  FF_NONE){.      
1d5b0 20 20 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65      /* Since the
1d5c0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74   comparison is t
1d5d0 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77  o be performed w
1d5e0 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f  ith no conversio
1d5f0 6e 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ns.          ** 
1d600 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f  applied to the o
1d610 70 65 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65  perands, set the
1d620 20 61 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70   affinity to app
1d630 6c 79 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20  ly to pRight to 
1d640 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51  .          ** SQ
1d650 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20  LITE_AFF_NONE.  
1d660 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66  */.          zAf
1d670 66 5b 6e 43 6f 6e 73 74 72 61 69 6e 74 5d 20 3d  f[nConstraint] =
1d680 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
1d690 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1d6a0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
1d6b0 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69  xprNeedsNoAffini
1d6c0 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c  tyChange(pRight,
1d6d0 20 7a 41 66 66 5b 6e 43 6f 6e 73 74 72 61 69 6e   zAff[nConstrain
1d6e0 74 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  t]) ){.         
1d6f0 20 7a 41 66 66 5b 6e 43 6f 6e 73 74 72 61 69 6e   zAff[nConstrain
1d700 74 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  t] = SQLITE_AFF_
1d710 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
1d720 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20 20 20        }  .      
1d730 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74  codeApplyAffinit
1d740 79 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  y(pParse, regBas
1d750 65 2c 20 6e 45 71 2b 31 2c 20 7a 41 66 66 29 3b  e, nEq+1, zAff);
1d760 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  .      nConstrai
1d770 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nt++;.    }.    
1d780 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
1d790 61 72 73 65 2d 3e 64 62 2c 20 7a 41 66 66 29 3b  arse->db, zAff);
1d7a0 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20  ..    /* Top of 
1d7b0 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f  the loop body */
1d7c0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
1d7d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1d7e0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20  rentAddr(v);..  
1d7f0 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
1d800 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 69  e index cursor i
1d810 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  s past the end o
1d820 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a  f the range. */.
1d830 20 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f 70 5b      op = aEndOp[
1d840 28 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 6e 45  (pRangeEnd || nE
1d850 71 29 20 2a 20 28 31 20 2b 20 62 52 65 76 29 5d  q) * (1 + bRev)]
1d860 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1d870 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 3b 0a 20  op==OP_Noop );. 
1d880 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1d890 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20 20 20  =OP_IdxGE );.   
1d8a0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
1d8b0 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20 20 69  P_IdxLT );.    i
1d8c0 66 28 20 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  f( op!=OP_Noop )
1d8d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1d8e0 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
1d8f0 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64  op, iIdxCur, add
1d900 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e  rNxt, regBase, n
1d910 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20  Constraint);.   
1d920 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
1d930 61 6e 67 65 50 35 28 76 2c 20 65 6e 64 45 71 21  angeP5(v, endEq!
1d940 3d 62 52 65 76 20 3f 31 3a 30 29 3b 0a 20 20 20  =bRev ?1:0);.   
1d950 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1d960 65 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69  ere are inequali
1d970 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  ty constraints, 
1d980 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76  check that the v
1d990 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74  alue.    ** of t
1d9a0 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20  he table column 
1d9b0 74 68 61 74 20 74 68 65 20 69 6e 65 71 75 61 6c  that the inequal
1d9c0 69 74 79 20 63 6f 6e 74 72 61 69 6e 73 20 69 73  ity contrains is
1d9d0 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a   not NULL..    *
1d9e0 2a 20 49 66 20 69 74 20 69 73 2c 20 6a 75 6d 70  * If it is, jump
1d9f0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65   to the next ite
1da00 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f  ration of the lo
1da10 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  op..    */.    r
1da20 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
1da30 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
1da40 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c 65     testcase( pLe
1da50 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
1da60 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49  s & WHERE_BTM_LI
1da70 4d 49 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63  MIT );.    testc
1da80 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  ase( pLevel->pla
1da90 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
1daa0 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 3b 0a 20  E_TOP_LIMIT );. 
1dab0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70     if( pLevel->p
1dac0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 28 57  lan.wsFlags & (W
1dad0 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57  HERE_BTM_LIMIT|W
1dae0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 20  HERE_TOP_LIMIT) 
1daf0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1db00 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1db10 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72  _Column, iIdxCur
1db20 2c 20 6e 45 71 2c 20 72 31 29 3b 0a 20 20 20 20  , nEq, r1);.    
1db30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1db40 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
1db50 2c 20 72 31 2c 20 61 64 64 72 43 6f 6e 74 29 3b  , r1, addrCont);
1db60 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1db70 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1db80 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 0a 20  (pParse, r1);.. 
1db90 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 74     /* Seek the t
1dba0 61 62 6c 65 20 63 75 72 73 6f 72 2c 20 69 66 20  able cursor, if 
1dbb0 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20  required */.    
1dbc0 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
1dbd0 65 6c 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29  el, pRangeStart)
1dbe0 3b 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65 72  ;.    disableTer
1dbf0 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65  m(pLevel, pRange
1dc00 45 6e 64 29 3b 0a 20 20 20 20 69 66 28 20 21 6f  End);.    if( !o
1dc10 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  mitTable ){.    
1dc20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 69 52    iRowidReg = iR
1dc30 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69  eleaseReg = sqli
1dc40 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
1dc50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
1dc60 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1dc70 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69  , OP_IdxRowid, i
1dc80 49 64 78 43 75 72 2c 20 69 52 6f 77 69 64 52 65  IdxCur, iRowidRe
1dc90 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
1dca0 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28  3ExprCacheStore(
1dcb0 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31  pParse, iCur, -1
1dcc0 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
1dcd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1dce0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 65 6b  ddOp2(v, OP_Seek
1dcf0 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65  , iCur, iRowidRe
1dd00 67 29 3b 20 20 2f 2a 20 44 65 66 65 72 72 65 64  g);  /* Deferred
1dd10 20 73 65 65 6b 20 2a 2f 0a 20 20 20 20 7d 0a 0a   seek */.    }..
1dd20 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68      /* Record th
1dd30 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 75 73  e instruction us
1dd40 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  ed to terminate 
1dd50 74 68 65 20 6c 6f 6f 70 2e 20 44 69 73 61 62 6c  the loop. Disabl
1dd60 65 20 0a 20 20 20 20 2a 2a 20 57 48 45 52 45 20  e .    ** WHERE 
1dd70 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61 64  clause terms mad
1dd80 65 20 72 65 64 75 6e 64 61 6e 74 20 62 79 20 74  e redundant by t
1dd90 68 65 20 69 6e 64 65 78 20 72 61 6e 67 65 20 73  he index range s
1dda0 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  can..    */.    
1ddb0 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65  pLevel->op = bRe
1ddc0 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50  v ? OP_Prev : OP
1ddd0 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65  _Next;.    pLeve
1dde0 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b  l->p1 = iIdxCur;
1ddf0 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65  .  }else..#ifnde
1de00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52  f SQLITE_OMIT_OR
1de10 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
1de20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
1de30 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
1de40 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20  _MULTI_OR ){.   
1de50 20 2f 2a 20 43 61 73 65 20 34 3a 20 20 54 77 6f   /* Case 4:  Two
1de60 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74   or more separat
1de70 65 6c 79 20 69 6e 64 65 78 65 64 20 74 65 72 6d  ely indexed term
1de80 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f  s connected by O
1de90 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  R.    **.    ** 
1dea0 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a  Example:.    **.
1deb0 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
1dec0 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64  TABLE t1(a,b,c,d
1ded0 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41  );.    **   CREA
1dee0 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
1def0 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43  1(a);.    **   C
1df00 52 45 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f  REATE INDEX i2 O
1df10 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 2a 2a 20  N t1(b);.    ** 
1df20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
1df30 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20 20 20  3 ON t1(c);.    
1df40 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45  **.    **   SELE
1df50 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
1df60 52 45 20 61 3d 35 20 4f 52 20 62 3d 37 20 4f 52  RE a=5 OR b=7 OR
1df70 20 28 63 3d 31 31 20 41 4e 44 20 64 3d 31 33 29   (c=11 AND d=13)
1df80 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
1df90 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 2c 20 74  n the example, t
1dfa0 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 69  here are three i
1dfb0 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e  ndexed terms con
1dfc0 6e 65 63 74 65 64 20 62 79 20 4f 52 2e 0a 20 20  nected by OR..  
1dfd0 20 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f 66 20    ** The top of 
1dfe0 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c  the loop looks l
1dff0 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a  ike this:.    **
1e000 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1e010 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20   Null       1   
1e020 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 5a               # Z
1e030 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69  ero the rowset i
1e040 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 0a 20  n reg 1.    **. 
1e050 20 20 20 2a 2a 20 54 68 65 6e 2c 20 66 6f 72 20     ** Then, for 
1e060 65 61 63 68 20 69 6e 64 65 78 65 64 20 74 65 72  each indexed ter
1e070 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  m, the following
1e080 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20  . The arguments 
1e090 74 6f 0a 20 20 20 20 2a 2a 20 52 6f 77 53 65 74  to.    ** RowSet
1e0a0 54 65 73 74 20 61 72 65 20 73 75 63 68 20 74 68  Test are such th
1e0b0 61 74 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20  at the rowid of 
1e0c0 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
1e0d0 69 73 20 69 6e 73 65 72 74 65 64 0a 20 20 20 20  is inserted.    
1e0e0 2a 2a 20 69 6e 74 6f 20 74 68 65 20 52 6f 77 53  ** into the RowS
1e0f0 65 74 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72  et. If it is alr
1e100 65 61 64 79 20 70 72 65 73 65 6e 74 2c 20 63 6f  eady present, co
1e110 6e 74 72 6f 6c 20 73 6b 69 70 73 20 74 68 65 0a  ntrol skips the.
1e120 20 20 20 20 2a 2a 20 47 6f 73 75 62 20 6f 70 63      ** Gosub opc
1e130 6f 64 65 20 61 6e 64 20 6a 75 6d 70 73 20 73 74  ode and jumps st
1e140 72 61 69 67 68 74 20 74 6f 20 74 68 65 20 63 6f  raight to the co
1e150 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  de generated by 
1e160 57 68 65 72 65 45 6e 64 28 29 2e 0a 20 20 20 20  WhereEnd()..    
1e170 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1e180 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
1e190 69 6e 28 3c 74 65 72 6d 3e 29 0a 20 20 20 20 2a  in(<term>).    *
1e1a0 2a 20 20 20 20 20 20 20 20 20 20 52 6f 77 53 65  *          RowSe
1e1b0 74 54 65 73 74 20 20 20 20 20 20 20 20 20 20 20  tTest           
1e1c0 20 20 20 20 20 20 20 23 20 49 6e 73 65 72 74 20         # Insert 
1e1d0 72 6f 77 69 64 20 69 6e 74 6f 20 72 6f 77 73 65  rowid into rowse
1e1e0 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  t.    **        
1e1f0 20 20 47 6f 73 75 62 20 20 20 20 20 20 32 20 41    Gosub      2 A
1e200 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73  .    **        s
1e210 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
1e220 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
1e230 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 61 62 6f  ollowing the abo
1e240 76 65 2c 20 63 6f 64 65 20 74 6f 20 74 65 72 6d  ve, code to term
1e250 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20  inate the loop. 
1e260 4c 61 62 65 6c 20 41 2c 20 74 68 65 20 74 61 72  Label A, the tar
1e270 67 65 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  get.    ** of th
1e280 65 20 47 6f 73 75 62 20 61 62 6f 76 65 2c 20 6a  e Gosub above, j
1e290 75 6d 70 73 20 74 6f 20 74 68 65 20 69 6e 73 74  umps to the inst
1e2a0 72 75 63 74 69 6f 6e 20 72 69 67 68 74 20 61 66  ruction right af
1e2b0 74 65 72 20 74 68 65 20 47 6f 74 6f 2e 0a 20 20  ter the Goto..  
1e2c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1e2d0 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20       Null       
1e2e0 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
1e2f0 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73   # Zero the rows
1e300 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20  et in reg 1.    
1e310 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f 74 6f  **          Goto
1e320 20 20 20 20 20 20 20 42 20 20 20 20 20 20 20 20         B        
1e330 20 20 20 20 20 20 20 20 23 20 54 68 65 20 6c 6f          # The lo
1e340 6f 70 20 69 73 20 66 69 6e 69 73 68 65 64 2e 0a  op is finished..
1e350 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1e360 20 20 20 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64      A: <loop bod
1e370 79 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y>              
1e380 20 20 20 23 20 52 65 74 75 72 6e 20 64 61 74 61     # Return data
1e390 2c 20 77 68 61 74 65 76 65 72 2e 0a 20 20 20 20  , whatever..    
1e3a0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1e3b0 20 20 20 52 65 74 75 72 6e 20 20 20 20 20 32 20     Return     2 
1e3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
1e3d0 20 4a 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68   Jump back to th
1e3e0 65 20 47 6f 73 75 62 0a 20 20 20 20 2a 2a 0a 20  e Gosub.    **. 
1e3f0 20 20 20 2a 2a 20 20 20 20 20 20 20 42 3a 20 3c     **       B: <
1e400 61 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 3e 0a  after the loop>.
1e410 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20      **.    */.  
1e420 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
1e430 4f 72 57 63 3b 20 20 20 20 2f 2a 20 54 68 65 20  OrWc;    /* The 
1e440 4f 52 2d 63 6c 61 75 73 65 20 62 72 6f 6b 65 6e  OR-clause broken
1e450 20 6f 75 74 20 69 6e 74 6f 20 73 75 62 74 65 72   out into subter
1e460 6d 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54  ms */.    WhereT
1e470 65 72 6d 20 2a 70 46 69 6e 61 6c 3b 20 20 20 20  erm *pFinal;    
1e480 20 2f 2a 20 46 69 6e 61 6c 20 73 75 62 74 65 72   /* Final subter
1e490 6d 20 77 69 74 68 69 6e 20 74 68 65 20 4f 52 2d  m within the OR-
1e4a0 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20 53  clause. */.    S
1e4b0 72 63 4c 69 73 74 20 2a 70 4f 72 54 61 62 3b 20  rcList *pOrTab; 
1e4c0 20 20 20 20 20 20 2f 2a 20 53 68 6f 72 74 65 6e        /* Shorten
1e4d0 65 64 20 74 61 62 6c 65 20 6c 69 73 74 20 6f 72  ed table list or
1e4e0 20 4f 52 2d 63 6c 61 75 73 65 20 67 65 6e 65 72   OR-clause gener
1e4f0 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 69 6e  ation */..    in
1e500 74 20 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  t regReturn = ++
1e510 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20  pParse->nMem;   
1e520 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
1e530 74 65 72 20 75 73 65 64 20 77 69 74 68 20 4f 50  ter used with OP
1e540 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69 6e  _Gosub */.    in
1e550 74 20 72 65 67 52 6f 77 73 65 74 20 3d 20 30 3b  t regRowset = 0;
1e560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e570 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
1e580 74 65 72 20 66 6f 72 20 52 6f 77 53 65 74 20 6f  ter for RowSet o
1e590 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74  bject */.    int
1e5a0 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 20 20   regRowid = 0;  
1e5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5c0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
1e5d0 65 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64  er holding rowid
1e5e0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f 6f   */.    int iLoo
1e5f0 70 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56  pBody = sqlite3V
1e600 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1e610 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c 6f    /* Start of lo
1e620 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 69  op body */.    i
1e630 6e 74 20 69 52 65 74 49 6e 69 74 3b 20 20 20 20  nt iRetInit;    
1e640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e650 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
1e660 65 73 73 20 6f 66 20 72 65 67 52 65 74 75 72 6e  ess of regReturn
1e670 20 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e 74   init */.    int
1e680 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d   untestedTerms =
1e690 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1e6a0 2f 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e 6f  /* Some terms no
1e6b0 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65 73  t completely tes
1e6c0 74 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ted */.    int i
1e6d0 69 3b 0a 20 20 20 0a 20 20 20 20 70 54 65 72 6d  i;.   .    pTerm
1e6e0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
1e6f0 75 2e 70 54 65 72 6d 3b 0a 20 20 20 20 61 73 73  u.pTerm;.    ass
1e700 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b  ert( pTerm!=0 );
1e710 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
1e720 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
1e730 4f 5f 4f 52 20 29 3b 0a 20 20 20 20 61 73 73 65  O_OR );.    asse
1e740 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c  rt( (pTerm->wtFl
1e750 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46  ags & TERM_ORINF
1e760 4f 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72  O)!=0 );.    pOr
1e770 57 63 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70  Wc = &pTerm->u.p
1e780 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20  OrInfo->wc;.    
1e790 70 46 69 6e 61 6c 20 3d 20 26 70 4f 72 57 63 2d  pFinal = &pOrWc-
1e7a0 3e 61 5b 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d  >a[pOrWc->nTerm-
1e7b0 31 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  1];.    pLevel->
1e7c0 6f 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e 3b 0a  op = OP_Return;.
1e7d0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
1e7e0 20 72 65 67 52 65 74 75 72 6e 3b 0a 0a 20 20 20   regReturn;..   
1e7f0 20 2f 2a 20 53 65 74 20 75 70 20 61 20 6e 65 77   /* Set up a new
1e800 20 53 72 63 4c 69 73 74 20 6e 69 20 70 4f 72 54   SrcList ni pOrT
1e810 61 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ab containing th
1e820 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 73 63  e table being sc
1e830 61 6e 6e 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  anned.    ** by 
1e840 74 68 69 73 20 6c 6f 6f 70 20 69 6e 20 74 68 65  this loop in the
1e850 20 61 5b 30 5d 20 73 6c 6f 74 20 61 6e 64 20 61   a[0] slot and a
1e860 6c 6c 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c  ll notReady tabl
1e870 65 73 20 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f  es in a[1..] slo
1e880 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20  ts..    ** This 
1e890 62 65 63 6f 6d 65 73 20 74 68 65 20 53 72 63 4c  becomes the SrcL
1e8a0 69 73 74 20 69 6e 20 74 68 65 20 72 65 63 75 72  ist in the recur
1e8b0 73 69 76 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c  sive call to sql
1e8c0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
1e8d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1e8e0 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e   pWInfo->nLevel>
1e8f0 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  1 ){.      int n
1e900 4e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20  NotReady;       
1e910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1e920 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74 52 65   number of notRe
1e930 61 64 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ady tables */.  
1e940 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
1e950 73 74 5f 69 74 65 6d 20 2a 6f 72 69 67 53 72 63  st_item *origSrc
1e960 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
1e970 6c 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  l list of tables
1e980 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 52 65   */.      nNotRe
1e990 61 64 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c  ady = pWInfo->nL
1e9a0 65 76 65 6c 20 2d 20 69 4c 65 76 65 6c 20 2d 20  evel - iLevel - 
1e9b0 31 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20  1;.      pOrTab 
1e9c0 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c  = sqlite3StackAl
1e9d0 6c 6f 63 52 61 77 28 70 50 61 72 73 65 2d 3e 64  locRaw(pParse->d
1e9e0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
1e9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1ea00 69 7a 65 6f 66 28 2a 70 4f 72 54 61 62 29 2b 20  izeof(*pOrTab)+ 
1ea10 6e 4e 6f 74 52 65 61 64 79 2a 73 69 7a 65 6f 66  nNotReady*sizeof
1ea20 28 70 4f 72 54 61 62 2d 3e 61 5b 30 5d 29 29 3b  (pOrTab->a[0]));
1ea30 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 61  .      if( pOrTa
1ea40 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 6e 6f  b==0 ) return no
1ea50 74 52 65 61 64 79 3b 0a 20 20 20 20 20 20 70 4f  tReady;.      pO
1ea60 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28  rTab->nAlloc = (
1ea70 69 31 36 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b  i16)(nNotReady +
1ea80 20 31 29 3b 0a 20 20 20 20 20 20 70 4f 72 54 61   1);.      pOrTa
1ea90 62 2d 3e 6e 53 72 63 20 3d 20 70 4f 72 54 61 62  b->nSrc = pOrTab
1eaa0 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20  ->nAlloc;.      
1eab0 6d 65 6d 63 70 79 28 70 4f 72 54 61 62 2d 3e 61  memcpy(pOrTab->a
1eac0 2c 20 70 54 61 62 49 74 65 6d 2c 20 73 69 7a 65  , pTabItem, size
1ead0 6f 66 28 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a  of(*pTabItem));.
1eae0 20 20 20 20 20 20 6f 72 69 67 53 72 63 20 3d 20        origSrc = 
1eaf0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
1eb00 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  ->a;.      for(k
1eb10 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79  =1; k<=nNotReady
1eb20 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
1eb30 6d 65 6d 63 70 79 28 26 70 4f 72 54 61 62 2d 3e  memcpy(&pOrTab->
1eb40 61 5b 6b 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70  a[k], &origSrc[p
1eb50 4c 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c  Level[k].iFrom],
1eb60 20 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e   sizeof(pOrTab->
1eb70 61 5b 6b 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a  a[k]));.      }.
1eb80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1eb90 20 70 4f 72 54 61 62 20 3d 20 70 57 49 6e 66 6f   pOrTab = pWInfo
1eba0 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20  ->pTabList;.    
1ebb0 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  }..    /* Initia
1ebc0 6c 69 7a 65 20 74 68 65 20 72 6f 77 73 65 74 20  lize the rowset 
1ebd0 72 65 67 69 73 74 65 72 20 74 6f 20 63 6f 6e 74  register to cont
1ebe0 61 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c  ain NULL. An SQL
1ebf0 20 4e 55 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a   NULL is .    **
1ec00 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 61   equivalent to a
1ec10 6e 20 65 6d 70 74 79 20 72 6f 77 73 65 74 2e 0a  n empty rowset..
1ec20 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c      **.    ** Al
1ec30 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 72 65  so initialize re
1ec40 67 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e 74 61  gReturn to conta
1ec50 69 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  in the address o
1ec60 66 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  f the instructio
1ec70 6e 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69  n .    ** immedi
1ec80 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
1ec90 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 20 61 74  the OP_Return at
1eca0 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74   the bottom of t
1ecb0 68 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a 20 20  he loop. This.  
1ecc0 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
1ecd0 20 69 6e 20 61 20 66 65 77 20 6f 62 73 63 75 72   in a few obscur
1ece0 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 73 65  e LEFT JOIN case
1ecf0 73 20 77 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20  s where control 
1ed00 6a 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f 76 65  jumps.    ** ove
1ed10 72 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  r the top of the
1ed20 20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 62   loop into the b
1ed30 6f 64 79 20 6f 66 20 69 74 2e 20 49 6e 20 74 68  ody of it. In th
1ed40 69 73 20 63 61 73 65 20 74 68 65 20 0a 20 20 20  is case the .   
1ed50 20 2a 2a 20 63 6f 72 72 65 63 74 20 72 65 73 70   ** correct resp
1ed60 6f 6e 73 65 20 66 6f 72 20 74 68 65 20 65 6e 64  onse for the end
1ed70 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20 28 74  -of-loop code (t
1ed80 68 65 20 4f 50 5f 52 65 74 75 72 6e 29 20 69 73  he OP_Return) is
1ed90 20 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61 6c 6c   to .    ** fall
1eda0 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
1edb0 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
1edc0 2c 20 6a 75 73 74 20 61 73 20 61 6e 20 4f 50 5f  , just as an OP_
1edd0 4e 65 78 74 20 64 6f 65 73 20 69 66 0a 20 20 20  Next does if.   
1ede0 20 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e   ** called on an
1edf0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 63   uninitialized c
1ee00 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  ursor..    */.  
1ee10 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
1ee20 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43  s & WHERE_DUPLIC
1ee30 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20  ATES_OK)==0 ){. 
1ee40 20 20 20 20 20 72 65 67 52 6f 77 73 65 74 20 3d       regRowset =
1ee50 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1ee60 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69 64 20  .      regRowid 
1ee70 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1ee80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1ee90 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1eea0 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77 73  Null, 0, regRows
1eeb0 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  et);.    }.    i
1eec0 52 65 74 49 6e 69 74 20 3d 20 73 71 6c 69 74 65  RetInit = sqlite
1eed0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1eee0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
1eef0 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20 66  gReturn);..    f
1ef00 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72 57  or(ii=0; ii<pOrW
1ef10 63 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b  c->nTerm; ii++){
1ef20 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
1ef30 20 2a 70 4f 72 54 65 72 6d 20 3d 20 26 70 4f 72   *pOrTerm = &pOr
1ef40 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20  Wc->a[ii];.     
1ef50 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
1ef60 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 7c  ftCursor==iCur |
1ef70 7c 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72  | pOrTerm->eOper
1ef80 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 29 7b 0a  ator==WO_AND ){.
1ef90 20 20 20 20 20 20 20 20 57 68 65 72 65 49 6e 66          WhereInf
1efa0 6f 20 2a 70 53 75 62 57 49 6e 66 6f 3b 20 20 20  o *pSubWInfo;   
1efb0 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 66         /* Info f
1efc0 6f 72 20 73 69 6e 67 6c 65 20 4f 52 2d 74 65 72  or single OR-ter
1efd0 6d 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20  m scan */.      
1efe0 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
1eff0 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20  h table entries 
1f000 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20  that match term 
1f010 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  pOrTerm. */.    
1f020 20 20 20 20 70 53 75 62 57 49 6e 66 6f 20 3d 20      pSubWInfo = 
1f030 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
1f040 6e 28 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62  n(pParse, pOrTab
1f050 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  , pOrTerm->pExpr
1f060 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
1f070 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
1f080 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 20 7c 20 57  RE_OMIT_OPEN | W
1f090 48 45 52 45 5f 4f 4d 49 54 5f 43 4c 4f 53 45 20  HERE_OMIT_CLOSE 
1f0a0 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
1f0b0 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f            WHERE_
1f0c0 46 4f 52 43 45 5f 54 41 42 4c 45 20 7c 20 57 48  FORCE_TABLE | WH
1f0d0 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
1f0e0 59 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  Y);.        if( 
1f0f0 70 53 75 62 57 49 6e 66 6f 20 29 7b 0a 20 20 20  pSubWInfo ){.   
1f100 20 20 20 20 20 20 20 69 66 28 20 28 77 63 74 72         if( (wctr
1f110 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44  lFlags & WHERE_D
1f120 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30  UPLICATES_OK)==0
1f130 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f140 69 6e 74 20 69 53 65 74 20 3d 20 28 28 69 69 3d  int iSet = ((ii=
1f150 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 29  =pOrWc->nTerm-1)
1f160 3f 2d 31 3a 69 69 29 3b 0a 20 20 20 20 20 20 20  ?-1:ii);.       
1f170 20 20 20 20 20 69 6e 74 20 72 3b 0a 20 20 20 20       int r;.    
1f180 20 20 20 20 20 20 20 20 72 20 3d 20 73 71 6c 69          r = sqli
1f190 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
1f1a0 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61  lumn(pParse, pTa
1f1b0 62 49 74 65 6d 2d 3e 70 54 61 62 2c 20 2d 31 2c  bItem->pTab, -1,
1f1c0 20 69 43 75 72 2c 20 0a 20 20 20 20 20 20 20 20   iCur, .        
1f1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1f0 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
1f200 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1f210 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
1f220 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 2c 20 72  OP_RowSetTest, r
1f230 65 67 52 6f 77 73 65 74 2c 0a 20 20 20 20 20 20  egRowset,.      
1f240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f250 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1f260 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
1f270 72 28 76 29 2b 32 2c 20 72 2c 20 69 53 65 74 29  r(v)+2, r, iSet)
1f280 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1f290 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1f2a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1f2b0 47 6f 73 75 62 2c 20 72 65 67 52 65 74 75 72 6e  Gosub, regReturn
1f2c0 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20  , iLoopBody);.. 
1f2d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1f2e0 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  pSubWInfo->untes
1f2f0 74 65 64 54 65 72 6d 73 20 66 6c 61 67 20 6d 65  tedTerms flag me
1f300 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 4f 52  ans that this OR
1f310 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20   term.          
1f320 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 6f 6e 65  ** contained one
1f330 20 6f 72 20 6d 6f 72 65 20 41 4e 44 20 74 65 72   or more AND ter
1f340 6d 20 66 72 6f 6d 20 61 20 6e 6f 74 52 65 61 64  m from a notRead
1f350 79 20 74 61 62 6c 65 2e 20 20 54 68 65 0a 20 20  y table.  The.  
1f360 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73          ** terms
1f370 20 66 72 6f 6d 20 74 68 65 20 6e 6f 74 52 65 61   from the notRea
1f380 64 79 20 74 61 62 6c 65 20 63 6f 75 6c 64 20 6e  dy table could n
1f390 6f 74 20 62 65 20 74 65 73 74 65 64 20 61 6e 64  ot be tested and
1f3a0 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20   will.          
1f3b0 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 74 65  ** need to be te
1f3c0 73 74 65 64 20 6c 61 74 65 72 2e 0a 20 20 20 20  sted later..    
1f3d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1f3e0 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f     if( pSubWInfo
1f3f0 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ->untestedTerms 
1f400 29 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ) untestedTerms 
1f410 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  = 1;..          
1f420 2f 2a 20 46 69 6e 69 73 68 20 74 68 65 20 6c 6f  /* Finish the lo
1f430 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65  op through table
1f440 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61   entries that ma
1f450 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d  tch term pOrTerm
1f460 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73  . */.          s
1f470 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
1f480 53 75 62 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  SubWInfo);.     
1f490 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1f4a0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
1f4b0 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 69 52  beChangeP1(v, iR
1f4c0 65 74 49 6e 69 74 2c 20 73 71 6c 69 74 65 33 56  etInit, sqlite3V
1f4d0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1f4e0 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
1f4f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1f500 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d  Goto, 0, pLevel-
1f510 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 73  >addrBrk);.    s
1f520 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1f530 65 4c 61 62 65 6c 28 76 2c 20 69 4c 6f 6f 70 42  eLabel(v, iLoopB
1f540 6f 64 79 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  ody);..    if( p
1f550 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20  WInfo->nLevel>1 
1f560 29 20 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72  ) sqlite3StackFr
1f570 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ee(pParse->db, p
1f580 4f 72 54 61 62 29 3b 0a 20 20 20 20 69 66 28 20  OrTab);.    if( 
1f590 21 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29  !untestedTerms )
1f5a0 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
1f5b0 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 7d  vel, pTerm);.  }
1f5c0 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  else.#endif /* S
1f5d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
1f5e0 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20  TIMIZATION */.. 
1f5f0 20 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 35   {.    /* Case 5
1f600 3a 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 75  :  There is no u
1f610 73 61 62 6c 65 20 69 6e 64 65 78 2e 20 20 57 65  sable index.  We
1f620 20 6d 75 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c   must do a compl
1f630 65 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ete.    **      
1f640 20 20 20 20 73 63 61 6e 20 6f 66 20 74 68 65 20      scan of the 
1f650 65 6e 74 69 72 65 20 74 61 62 6c 65 2e 0a 20 20  entire table..  
1f660 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20    */.    static 
1f670 63 6f 6e 73 74 20 75 38 20 61 53 74 65 70 5b 5d  const u8 aStep[]
1f680 20 3d 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 4f 50   = { OP_Next, OP
1f690 5f 50 72 65 76 20 7d 3b 0a 20 20 20 20 73 74 61  _Prev };.    sta
1f6a0 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74  tic const u8 aSt
1f6b0 61 72 74 5b 5d 20 3d 20 7b 20 4f 50 5f 52 65 77  art[] = { OP_Rew
1f6c0 69 6e 64 2c 20 4f 50 5f 4c 61 73 74 20 7d 3b 0a  ind, OP_Last };.
1f6d0 20 20 20 20 61 73 73 65 72 74 28 20 62 52 65 76      assert( bRev
1f6e0 3d 3d 30 20 7c 7c 20 62 52 65 76 3d 3d 31 20 29  ==0 || bRev==1 )
1f6f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d  ;.    assert( om
1f700 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  itTable==0 );.  
1f710 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 61    pLevel->op = a
1f720 53 74 65 70 5b 62 52 65 76 5d 3b 0a 20 20 20 20  Step[bRev];.    
1f730 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75  pLevel->p1 = iCu
1f740 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  r;.    pLevel->p
1f750 32 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56  2 = 1 + sqlite3V
1f760 64 62 65 41 64 64 4f 70 32 28 76 2c 20 61 53 74  dbeAddOp2(v, aSt
1f770 61 72 74 5b 62 52 65 76 5d 2c 20 69 43 75 72 2c  art[bRev], iCur,
1f780 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 70   addrBrk);.    p
1f790 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49  Level->p5 = SQLI
1f7a0 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55  TE_STMTSTATUS_FU
1f7b0 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 7d  LLSCAN_STEP;.  }
1f7c0 0a 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e  .  notReady &= ~
1f7d0 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61  getMask(pWC->pMa
1f7e0 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 0a 20  skSet, iCur);.. 
1f7f0 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20   /* Insert code 
1f800 74 6f 20 74 65 73 74 20 65 76 65 72 79 20 73 75  to test every su
1f810 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74  bexpression that
1f820 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65   can be complete
1f830 6c 79 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64  ly.  ** computed
1f840 20 75 73 69 6e 67 20 74 68 65 20 63 75 72 72 65   using the curre
1f850 6e 74 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73  nt set of tables
1f860 2e 0a 20 20 2a 2f 0a 20 20 6b 20 3d 20 30 3b 0a  ..  */.  k = 0;.
1f870 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
1f880 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d  >a, j=pWC->nTerm
1f890 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72  ; j>0; j--, pTer
1f8a0 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
1f8b0 70 45 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  pE;.    testcase
1f8c0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
1f8d0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
1f8e0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1f8f0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
1f900 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a  & TERM_CODED );.
1f910 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
1f920 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56  tFlags & (TERM_V
1f930 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45  IRTUAL|TERM_CODE
1f940 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  D) ) continue;. 
1f950 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
1f960 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65  rereqAll & notRe
1f970 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ady)!=0 ){.     
1f980 20 74 65 73 74 63 61 73 65 28 20 70 57 49 6e 66   testcase( pWInf
1f990 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73  o->untestedTerms
1f9a0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
1f9b0 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
1f9c0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
1f9d0 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29  E_ONETABLE_ONLY)
1f9e0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 57 49  !=0 );.      pWI
1f9f0 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72  nfo->untestedTer
1fa00 6d 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f  ms = 1;.      co
1fa10 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
1fa20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45    pE = pTerm->pE
1fa30 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
1fa40 20 70 45 21 3d 30 20 29 3b 0a 20 20 20 20 69 66   pE!=0 );.    if
1fa50 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  ( pLevel->iLeftJ
1fa60 6f 69 6e 20 26 26 20 21 45 78 70 72 48 61 73 50  oin && !ExprHasP
1fa70 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46  roperty(pE, EP_F
1fa80 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20  romJoin) ){.    
1fa90 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1faa0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
1fab0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
1fac0 20 70 45 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53   pE, addrCont, S
1fad0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
1fae0 29 3b 0a 20 20 20 20 6b 20 3d 20 31 3b 0a 20 20  );.    k = 1;.  
1faf0 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
1fb00 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a   |= TERM_CODED;.
1fb10 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20    }..  /* For a 
1fb20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c  LEFT OUTER JOIN,
1fb30 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   generate code t
1fb40 68 61 74 20 77 69 6c 6c 20 72 65 63 6f 72 64 20  hat will record 
1fb50 74 68 65 20 66 61 63 74 20 74 68 61 74 0a 20 20  the fact that.  
1fb60 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ** at least one 
1fb70 72 6f 77 20 6f 66 20 74 68 65 20 72 69 67 68 74  row of the right
1fb80 20 74 61 62 6c 65 20 68 61 73 20 6d 61 74 63 68   table has match
1fb90 65 64 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  ed the left tabl
1fba0 65 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  e.  .  */.  if( 
1fbb0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
1fbc0 6e 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  n ){.    pLevel-
1fbd0 3e 61 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c  >addrFirst = sql
1fbe0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1fbf0 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  ddr(v);.    sqli
1fc00 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1fc10 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
1fc20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
1fc30 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  n);.    VdbeComm
1fc40 65 6e 74 28 28 76 2c 20 22 72 65 63 6f 72 64 20  ent((v, "record 
1fc50 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74 22 29 29  LEFT JOIN hit"))
1fc60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1fc70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
1fc80 73 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 54 65  se);.    for(pTe
1fc90 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20  rm=pWC->a, j=0; 
1fca0 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b  j<pWC->nTerm; j+
1fcb0 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
1fcc0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
1fcd0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
1fce0 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
1fcf0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
1fd00 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
1fd10 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20  ERM_CODED );.   
1fd20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
1fd30 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49  Flags & (TERM_VI
1fd40 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44  RTUAL|TERM_CODED
1fd50 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
1fd60 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
1fd70 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52  prereqAll & notR
1fd80 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20 20  eady)!=0 ){.    
1fd90 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49 6e      assert( pWIn
1fda0 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d  fo->untestedTerm
1fdb0 73 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  s );.        con
1fdc0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
1fdd0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
1fde0 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20  rm->pExpr );.   
1fdf0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1fe00 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54  False(pParse, pT
1fe10 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 64 64 72  erm->pExpr, addr
1fe20 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  Cont, SQLITE_JUM
1fe30 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
1fe40 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
1fe50 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20  = TERM_CODED;.  
1fe60 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1fe70 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1fe80 70 50 61 72 73 65 2c 20 69 52 65 6c 65 61 73 65  pParse, iRelease
1fe90 52 65 67 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Reg);..  return 
1fea0 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a 0a 23 69 66  notReady;.}..#if
1feb0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1fec0 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20  TEST)./*.** The 
1fed0 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
1fee0 6c 65 20 68 6f 6c 64 73 20 61 20 74 65 78 74 20  le holds a text 
1fef0 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 71  description of q
1ff00 75 65 72 79 20 70 6c 61 6e 20 67 65 6e 65 72 61  uery plan genera
1ff10 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6d 6f  ted.** by the mo
1ff20 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c 20 74  st recent call t
1ff30 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
1ff40 67 69 6e 28 29 2e 20 20 45 61 63 68 20 63 61 6c  gin().  Each cal
1ff50 6c 20 74 6f 20 57 68 65 72 65 42 65 67 69 6e 0a  l to WhereBegin.
1ff60 2a 2a 20 6f 76 65 72 77 72 69 74 65 73 20 74 68  ** overwrites th
1ff70 65 20 70 72 65 76 69 6f 75 73 2e 20 20 54 68 69  e previous.  Thi
1ff80 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
1ff90 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
1ffa0 67 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 73 69  g and.** analysi
1ffb0 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63 68 61 72 20  s only..*/.char 
1ffc0 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
1ffd0 61 6e 5b 42 4d 53 2a 32 2a 34 30 5d 3b 20 20 2f  an[BMS*2*40];  /
1ffe0 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 6a 6f  * Text of the jo
1fff0 69 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  in */.static int
20000 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 20 20 20 20   nQPlan = 0;    
20010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
20020 74 20 66 72 65 65 20 73 6c 6f 77 20 69 6e 20 5f  t free slow in _
20030 71 75 65 72 79 5f 70 6c 61 6e 5b 5d 20 2a 2f 0a  query_plan[] */.
20040 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
20050 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  E_TEST */.../*.*
20060 2a 20 46 72 65 65 20 61 20 57 68 65 72 65 49 6e  * Free a WhereIn
20070 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a  fo structure.*/.
20080 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
20090 65 49 6e 66 6f 46 72 65 65 28 73 71 6c 69 74 65  eInfoFree(sqlite
200a0 33 20 2a 64 62 2c 20 57 68 65 72 65 49 6e 66 6f  3 *db, WhereInfo
200b0 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28   *pWInfo){.  if(
200c0 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 69   pWInfo ){.    i
200d0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
200e0 30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65  0; i<pWInfo->nLe
200f0 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  vel; i++){.     
20100 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
20110 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 57 49  nfo *pInfo = pWI
20120 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 49 64 78 49 6e  nfo->a[i].pIdxIn
20130 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  fo;.      if( pI
20140 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  nfo ){.        /
20150 2a 20 61 73 73 65 72 74 28 20 70 49 6e 66 6f 2d  * assert( pInfo-
20160 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
20170 72 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  r==0 || db->mall
20180 6f 63 46 61 69 6c 65 64 20 29 3b 20 2a 2f 0a 20  ocFailed ); */. 
20190 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f         if( pInfo
201a0 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
201b0 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  tr ){.          
201c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e  sqlite3_free(pIn
201d0 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20  fo->idxStr);.   
201e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
201f0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
20200 20 70 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d   pInfo);.      }
20210 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 65 72 65  .    }.    where
20220 43 6c 61 75 73 65 43 6c 65 61 72 28 70 57 49 6e  ClauseClear(pWIn
20230 66 6f 2d 3e 70 57 43 29 3b 0a 20 20 20 20 73 71  fo->pWC);.    sq
20240 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
20250 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWInfo);.  }.}..
20260 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
20270 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
20280 20 74 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66   the loop used f
20290 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  or WHERE clause 
202a0 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54  processing..** T
202b0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
202c0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
202d0 61 6e 20 6f 70 61 71 75 65 20 73 74 72 75 63 74  an opaque struct
202e0 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ure that contain
202f0 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  s.** information
20300 20 6e 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69   needed to termi
20310 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20  nate the loop.  
20320 4c 61 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69  Later, the calli
20330 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68  ng routine.** sh
20340 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69  ould invoke sqli
20350 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 77 69  te3WhereEnd() wi
20360 74 68 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  th the return va
20370 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  lue of this func
20380 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72  tion.** in order
20390 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65   to complete the
203a0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
203b0 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  ocessing..**.** 
203c0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
203d0 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  rs, this routine
203e0 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a   returns NULL..*
203f0 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69  *.** The basic i
20400 64 65 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e  dea is to do a n
20410 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20  ested loop, one 
20420 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61  loop for each ta
20430 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52  ble in.** the FR
20440 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73  OM clause of a s
20450 65 6c 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20  elect.  (INSERT 
20460 61 6e 64 20 55 50 44 41 54 45 20 73 74 61 74 65  and UPDATE state
20470 6d 65 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a  ments are the.**
20480 20 73 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43   same as a SELEC
20490 54 20 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69  T with only a si
204a0 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68  ngle table in th
204b0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20  e FROM clause.) 
204c0 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c   For.** example,
204d0 20 69 66 20 74 68 65 20 53 51 4c 20 69 73 20 74   if the SQL is t
204e0 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
204f0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
20500 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45 20  1, t2, t3 WHERE 
20510 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ...;.**.** Then 
20520 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
20530 65 64 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c  ed is conceptual
20540 6c 79 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c  ly like the foll
20550 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
20560 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69    foreach row1 i
20570 6e 20 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20  n t1 do       \ 
20580 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65     Code generate
20590 64 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65  d.**        fore
205a0 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64  ach row2 in t2 d
205b0 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71  o      |-- by sq
205c0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
205d0 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f  ).**          fo
205e0 72 65 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33  reach row3 in t3
205f0 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20   do   /.**      
20600 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20        ....**    
20610 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20        end       
20620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 20                \ 
20630 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65     Code generate
20640 64 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20  d.**        end 
20650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20660 20 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71         |-- by sq
20670 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a  lite3WhereEnd().
20680 2a 2a 20 20 20 20 20 20 65 6e 64 20 20 20 20 20  **      end     
20690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206a0 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65      /.**.** Note
206b0 20 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20   that the loops 
206c0 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73  might not be nes
206d0 74 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72  ted in the order
206e0 20 69 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a   in which they.*
206f0 2a 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  * appear in the 
20700 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61  FROM clause if a
20710 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72   different order
20720 20 69 73 20 62 65 74 74 65 72 20 61 62 6c 65 20   is better able 
20730 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f  to make.** use o
20740 66 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65  f indices.  Note
20750 20 61 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20   also that when 
20760 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
20770 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68  appears in.** th
20780 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20  e WHERE clause, 
20790 69 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20  it might result 
207a0 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65  in additional ne
207b0 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a  sted loops for.*
207c0 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75  * scanning throu
207d0 67 68 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e  gh all values on
207e0 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
207f0 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a  side of the IN..
20800 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20  **.** There are 
20810 42 74 72 65 65 20 63 75 72 73 6f 72 73 20 61 73  Btree cursors as
20820 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61  sociated with ea
20830 63 68 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73  ch table.  t1 us
20840 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d  es cursor.** num
20850 62 65 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ber pTabList->a[
20860 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20  0].iCursor.  t2 
20870 75 73 65 73 20 74 68 65 20 63 75 72 73 6f 72 20  uses the cursor 
20880 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69  pTabList->a[1].i
20890 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73  Cursor..** And s
208a0 6f 20 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72  o forth.  This r
208b0 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
208c0 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68   code to open th
208d0 6f 73 65 20 56 44 42 45 20 63 75 72 73 6f 72 73  ose VDBE cursors
208e0 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57  .** and sqlite3W
208f0 68 65 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61  hereEnd() genera
20900 74 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20  tes the code to 
20910 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a  close them..**.*
20920 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 20  * The code that 
20930 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
20940 6e 28 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65  n() generates le
20950 61 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 73  aves the cursors
20960 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61   named.** in pTa
20970 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61  bList pointing a
20980 74 20 74 68 65 69 72 20 61 70 70 72 6f 70 72 69  t their appropri
20990 61 74 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68  ate entries.  Th
209a0 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20  e [...] code.** 
209b0 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d  can use OP_Colum
209c0 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f  n and OP_Rowid o
209d0 70 63 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20  pcodes on these 
209e0 63 75 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61  cursors to extra
209f0 63 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20  ct.** data from 
20a00 74 68 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c  the various tabl
20a10 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a  es of the loop..
20a20 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45  **.** If the WHE
20a30 52 45 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70  RE clause is emp
20a40 74 79 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20  ty, the foreach 
20a50 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20  loops must each 
20a60 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e  scan their.** en
20a70 74 69 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68  tire tables.  Th
20a80 75 73 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a  us a three-way j
20a90 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29  oin is an O(N^3)
20aa0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74   operation.  But
20ab0 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   if.** the table
20ac0 73 20 68 61 76 65 20 69 6e 64 69 63 65 73 20 61  s have indices a
20ad0 6e 64 20 74 68 65 72 65 20 61 72 65 20 74 65 72  nd there are ter
20ae0 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ms in the WHERE 
20af0 63 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72  clause that.** r
20b00 65 66 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e  efer to those in
20b10 64 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74  dices, a complet
20b20 65 20 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e  e table scan can
20b30 20 62 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20   be avoided and 
20b40 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c  the.** code will
20b50 20 72 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72   run much faster
20b60 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77  .  Most of the w
20b70 6f 72 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ork of this rout
20b80 69 6e 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a  ine is checking.
20b90 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ** to see if the
20ba0 72 65 20 61 72 65 20 69 6e 64 69 63 65 73 20 74  re are indices t
20bb0 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20  hat can be used 
20bc0 74 6f 20 73 70 65 65 64 20 75 70 20 74 68 65 20  to speed up the 
20bd0 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d  loop..**.** Term
20be0 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
20bf0 6c 61 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75  lause are also u
20c00 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69  sed to limit whi
20c10 63 68 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79  ch rows actually
20c20 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74  .** make it to t
20c30 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20  he "..." in the 
20c40 6d 69 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f  middle of the lo
20c50 6f 70 2e 20 20 41 66 74 65 72 20 65 61 63 68 20  op.  After each 
20c60 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65  "foreach",.** te
20c70 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
20c80 20 63 6c 61 75 73 65 20 74 68 61 74 20 75 73 65   clause that use
20c90 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74   only terms in t
20ca0 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74  hat loop and out
20cb0 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20  er.** loops are 
20cc0 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66  evaluated and if
20cd0 20 66 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73   false a jump is
20ce0 20 6d 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c   made around all
20cf0 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69   subsequent.** i
20d00 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61  nner loops (or a
20d10 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20  round the "..." 
20d20 69 66 20 74 68 65 20 74 65 73 74 20 6f 63 63 75  if the test occu
20d30 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e  rs within the in
20d40 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f  ner-.** most loo
20d50 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a  p).**.** OUTER J
20d60 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75  OINS.**.** An ou
20d70 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c  ter join of tabl
20d80 65 73 20 74 31 20 61 6e 64 20 74 32 20 69 73 20  es t1 and t2 is 
20d90 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65  conceptally code
20da0 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
20db0 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72  .**    foreach r
20dc0 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20  ow1 in t1 do.** 
20dd0 20 20 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a       flag = 0.**
20de0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
20df0 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20  w2 in t2 do.**  
20e00 20 20 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20        start:.** 
20e10 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20           ....** 
20e20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20           flag = 
20e30 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a  1.**      end.**
20e40 20 20 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30        if flag==0
20e50 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20   then.**        
20e60 6d 6f 76 65 20 74 68 65 20 72 6f 77 32 20 63 75  move the row2 cu
20e70 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72  rsor to a null r
20e80 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74  ow.**        got
20e90 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20  o start.**      
20ea0 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a  fi.**    end.**.
20eb0 2a 2a 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55  ** ORDER BY CLAU
20ec0 53 45 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a  SE PROCESSING.**
20ed0 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79 20 69  .** *ppOrderBy i
20ee0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
20ef0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
20f00 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  se of a SELECT s
20f10 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 69 66 20  tatement,.** if 
20f20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49  there is one.  I
20f30 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52  f there is no OR
20f40 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72  DER BY clause or
20f50 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
20f60 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72  .** is called fr
20f70 6f 6d 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20  om an UPDATE or 
20f80 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
20f90 2c 20 74 68 65 6e 20 70 70 4f 72 64 65 72 42 79  , then ppOrderBy
20fa0 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   is NULL..**.** 
20fb0 49 66 20 61 6e 20 69 6e 64 65 78 20 63 61 6e 20  If an index can 
20fc0 62 65 20 75 73 65 64 20 73 6f 20 74 68 61 74 20  be used so that 
20fd0 74 68 65 20 6e 61 74 75 72 61 6c 20 6f 75 74 70  the natural outp
20fe0 75 74 20 6f 72 64 65 72 20 6f 66 20 74 68 65 20  ut order of the 
20ff0 74 61 62 6c 65 0a 2a 2a 20 73 63 61 6e 20 69 73  table.** scan is
21000 20 63 6f 72 72 65 63 74 20 66 6f 72 20 74 68 65   correct for the
21010 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
21020 2c 20 74 68 65 6e 20 74 68 61 74 20 69 6e 64 65  , then that inde
21030 78 20 69 73 20 75 73 65 64 20 61 6e 64 0a 2a 2a  x is used and.**
21040 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20 73   *ppOrderBy is s
21050 65 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69  et to NULL.  Thi
21060 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  s is an optimiza
21070 74 69 6f 6e 20 74 68 61 74 20 70 72 65 76 65 6e  tion that preven
21080 74 73 20 61 6e 0a 2a 2a 20 75 6e 6e 65 63 65 73  ts an.** unneces
21090 73 61 72 79 20 73 6f 72 74 20 6f 66 20 74 68 65  sary sort of the
210a0 20 72 65 73 75 6c 74 20 73 65 74 20 69 66 20 61   result set if a
210b0 6e 20 69 6e 64 65 78 20 61 70 70 72 6f 70 72 69  n index appropri
210c0 61 74 65 20 66 6f 72 20 74 68 65 0a 2a 2a 20 4f  ate for the.** O
210d0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
210e0 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 0a 2a  lready exists..*
210f0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 68 65 72  *.** If the wher
21100 65 20 63 6c 61 75 73 65 20 6c 6f 6f 70 73 20 63  e clause loops c
21110 61 6e 6e 6f 74 20 62 65 20 61 72 72 61 6e 67 65  annot be arrange
21120 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65  d to provide the
21130 20 63 6f 72 72 65 63 74 0a 2a 2a 20 6f 75 74 70   correct.** outp
21140 75 74 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 74  ut order, then t
21150 68 65 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73  he *ppOrderBy is
21160 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 57   unchanged..*/.W
21170 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65  hereInfo *sqlite
21180 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50  3WhereBegin(.  P
21190 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
211a0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
211b0 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
211c0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
211d0 74 2c 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20  t,    /* A list 
211e0 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f  of all tables to
211f0 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20   be scanned */. 
21200 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20   Expr *pWhere,  
21210 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
21220 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
21230 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 4f 72 64  ExprList **ppOrd
21240 65 72 42 79 2c 20 2f 2a 20 41 6e 20 4f 52 44 45  erBy, /* An ORDE
21250 52 20 42 59 20 63 6c 61 75 73 65 2c 20 6f 72 20  R BY clause, or 
21260 4e 55 4c 4c 20 2a 2f 0a 20 20 75 31 36 20 77 63  NULL */.  u16 wc
21270 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20  trlFlags        
21280 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
21290 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69  ERE_* flags defi
212a0 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74  ned in sqliteInt
212b0 2e 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  .h */.){.  int i
212c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
212d0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
212e0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  unter */.  int n
212f0 42 79 74 65 57 49 6e 66 6f 3b 20 20 20 20 20 20  ByteWInfo;      
21300 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79        /* Num. by
21310 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  tes allocated fo
21320 72 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75  r WhereInfo stru
21330 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62  ct */.  int nTab
21340 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
21350 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
21360 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54 61 62  elements in pTab
21370 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 49  List */.  WhereI
21380 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
21390 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63       /* Will bec
213a0 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20 76  ome the return v
213b0 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e  alue of this fun
213c0 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20  ction */.  Vdbe 
213d0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
213e0 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72  be;   /* The vir
213f0 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e  tual database en
21400 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73  gine */.  Bitmas
21410 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20  k notReady;     
21420 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20       /* Cursors 
21430 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74  that are not yet
21440 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20   positioned */. 
21450 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70   WhereMaskSet *p
21460 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54  MaskSet;    /* T
21470 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61  he expression ma
21480 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72  sk set */.  Wher
21490 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
214a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
214b0 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20  ecomposition of 
214c0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
214d0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
214e0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
214f0 74 65 6d 3b 20 20 2f 2a 20 41 20 73 69 6e 67 6c  tem;  /* A singl
21500 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 70 54 61  e entry from pTa
21510 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65  bList */.  Where
21520 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20  Level *pLevel;  
21530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
21540 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20  single level in 
21550 74 68 65 20 70 57 49 6e 66 6f 20 6c 69 73 74 20  the pWInfo list 
21560 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 3b 20  */.  int iFrom; 
21570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21580 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e       /* First un
21590 75 73 65 64 20 46 52 4f 4d 20 63 6c 61 75 73 65  used FROM clause
215a0 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e   element */.  in
215b0 74 20 61 6e 64 46 6c 61 67 73 3b 20 20 20 20 20  t andFlags;     
215c0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 4e 44 2d           /* AND-
215d0 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  ed combination o
215e0 66 20 61 6c 6c 20 70 57 43 2d 3e 61 5b 5d 2e 77  f all pWC->a[].w
215f0 74 46 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69  tFlags */.  sqli
21600 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
21610 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
21620 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
21630 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65  ..  /* The numbe
21640 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74  r of tables in t
21650 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
21660 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65  s limited by the
21670 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20   number of.  ** 
21680 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73  bits in a Bitmas
21690 6b 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  k .  */.  if( pT
216a0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53  abList->nSrc>BMS
216b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
216c0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
216d0 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c  "at most %d tabl
216e0 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42  es in a join", B
216f0 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  MS);.    return 
21700 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69  0;.  }..  /* Thi
21710 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61  s function norma
21720 6c 6c 79 20 67 65 6e 65 72 61 74 65 73 20 61 20  lly generates a 
21730 6e 65 73 74 65 64 20 6c 6f 6f 70 20 66 6f 72 20  nested loop for 
21740 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 0a 20  all tables in . 
21750 20 2a 2a 20 70 54 61 62 4c 69 73 74 2e 20 20 42   ** pTabList.  B
21760 75 74 20 69 66 20 74 68 65 20 57 48 45 52 45 5f  ut if the WHERE_
21770 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c  ONETABLE_ONLY fl
21780 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
21790 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f  we should.  ** o
217a0 6e 6c 79 20 67 65 6e 65 72 61 74 65 20 63 6f 64  nly generate cod
217b0 65 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  e for the first 
217c0 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73  table in pTabLis
217d0 74 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68 61  t and assume tha
217e0 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75 72 73 6f  t.  ** any curso
217f0 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
21800 74 68 20 73 75 62 73 65 71 75 65 6e 74 20 74 61  th subsequent ta
21810 62 6c 65 73 20 61 72 65 20 75 6e 69 6e 69 74 69  bles are uniniti
21820 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e  alized..  */.  n
21830 54 61 62 4c 69 73 74 20 3d 20 28 77 63 74 72 6c  TabList = (wctrl
21840 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
21850 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f 20 31  ETABLE_ONLY) ? 1
21860 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   : pTabList->nSr
21870 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  c;..  /* Allocat
21880 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
21890 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73   the WhereInfo s
218a0 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69  tructure that wi
218b0 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a 20 20  ll become the.  
218c0 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e  ** return value.
218d0 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61   A single alloca
218e0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
218f0 73 74 6f 72 65 20 74 68 65 20 57 68 65 72 65 49  store the WhereI
21900 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75 63 74 2c  nfo.  ** struct,
21910 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
21920 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20   WhereInfo.a[], 
21930 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  the WhereClause 
21940 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 61  structure.  ** a
21950 6e 64 20 74 68 65 20 57 68 65 72 65 4d 61 73 6b  nd the WhereMask
21960 53 65 74 20 73 74 72 75 63 74 75 72 65 2e 20 53  Set structure. S
21970 69 6e 63 65 20 57 68 65 72 65 43 6c 61 75 73 65  ince WhereClause
21980 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 38 2d 62   contains an 8-b
21990 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20 28  yte.  ** field (
219a0 74 79 70 65 20 42 69 74 6d 61 73 6b 29 20 69 74  type Bitmask) it
219b0 20 6d 75 73 74 20 62 65 20 61 6c 69 67 6e 65 64   must be aligned
219c0 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65 20 62 6f   on an 8-byte bo
219d0 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a 2a 20 73  undary on.  ** s
219e0 6f 6d 65 20 61 72 63 68 69 74 65 63 74 75 72 65  ome architecture
219f0 73 2e 20 48 65 6e 63 65 20 74 68 65 20 52 4f 55  s. Hence the ROU
21a00 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a 20 20 2a  ND8() below..  *
21a10 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
21a20 3e 64 62 3b 0a 20 20 6e 42 79 74 65 57 49 6e 66  >db;.  nByteWInf
21a30 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  o = ROUND8(sizeo
21a40 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e 54  f(WhereInfo)+(nT
21a50 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f 66  abList-1)*sizeof
21a60 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20  (WhereLevel));. 
21a70 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
21a80 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
21a90 2c 20 0a 20 20 20 20 20 20 6e 42 79 74 65 57 49  , .      nByteWI
21aa0 6e 66 6f 20 2b 20 0a 20 20 20 20 20 20 73 69 7a  nfo + .      siz
21ab0 65 6f 66 28 57 68 65 72 65 43 6c 61 75 73 65 29  eof(WhereClause)
21ac0 20 2b 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28   +.      sizeof(
21ad0 57 68 65 72 65 4d 61 73 6b 53 65 74 29 0a 20 20  WhereMaskSet).  
21ae0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
21af0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
21b00 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
21b10 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49  Error;.  }.  pWI
21b20 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54  nfo->nLevel = nT
21b30 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f  abList;.  pWInfo
21b40 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  ->pParse = pPars
21b50 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61  e;.  pWInfo->pTa
21b60 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  bList = pTabList
21b70 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  ;.  pWInfo->iBre
21b80 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
21b90 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
21ba0 70 57 49 6e 66 6f 2d 3e 70 57 43 20 3d 20 70 57  pWInfo->pWC = pW
21bb0 43 20 3d 20 28 57 68 65 72 65 43 6c 61 75 73 65  C = (WhereClause
21bc0 20 2a 29 26 28 28 75 38 20 2a 29 70 57 49 6e 66   *)&((u8 *)pWInf
21bd0 6f 29 5b 6e 42 79 74 65 57 49 6e 66 6f 5d 3b 0a  o)[nByteWInfo];.
21be0 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46    pWInfo->wctrlF
21bf0 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67  lags = wctrlFlag
21c00 73 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20  s;.  pMaskSet = 
21c10 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 29 26  (WhereMaskSet*)&
21c20 70 57 43 5b 31 5d 3b 0a 0a 20 20 2f 2a 20 53 70  pWC[1];..  /* Sp
21c30 6c 69 74 20 74 68 65 20 57 48 45 52 45 20 63 6c  lit the WHERE cl
21c40 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61  ause into separa
21c50 74 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  te subexpression
21c60 73 20 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a  s where each.  *
21c70 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  * subexpression 
21c80 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20  is separated by 
21c90 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e  an AND operator.
21ca0 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b  .  */.  initMask
21cb0 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20  Set(pMaskSet);. 
21cc0 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
21cd0 28 70 57 43 2c 20 70 50 61 72 73 65 2c 20 70 4d  (pWC, pParse, pM
21ce0 61 73 6b 53 65 74 29 3b 0a 20 20 73 71 6c 69 74  askSet);.  sqlit
21cf0 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73 74 61  e3ExprCodeConsta
21d00 6e 74 73 28 70 50 61 72 73 65 2c 20 70 57 68 65  nts(pParse, pWhe
21d10 72 65 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69  re);.  whereSpli
21d20 74 28 70 57 43 2c 20 70 57 68 65 72 65 2c 20 54  t(pWC, pWhere, T
21d30 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 0a 20 20 2f  K_AND);.    .  /
21d40 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20  * Special case: 
21d50 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  a WHERE clause t
21d60 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e  hat is constant.
21d70 20 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20    Evaluate the. 
21d80 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61   ** expression a
21d90 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f  nd either jump o
21da0 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63  ver all of the c
21db0 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75  ode or fall thru
21dc0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 68  ..  */.  if( pWh
21dd0 65 72 65 20 26 26 20 28 6e 54 61 62 4c 69 73 74  ere && (nTabList
21de0 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78  ==0 || sqlite3Ex
21df0 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a  prIsConstantNotJ
21e00 6f 69 6e 28 70 57 68 65 72 65 29 29 20 29 7b 0a  oin(pWhere)) ){.
21e10 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
21e20 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
21e30 57 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69  Where, pWInfo->i
21e40 42 72 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a 55  Break, SQLITE_JU
21e50 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70  MPIFNULL);.    p
21e60 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Where = 0;.  }..
21e70 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 62 69    /* Assign a bi
21e80 74 20 66 72 6f 6d 20 74 68 65 20 62 69 74 6d 61  t from the bitma
21e90 73 6b 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d  sk to every term
21ea0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
21eb0 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  use..  **.  ** W
21ec0 68 65 6e 20 61 73 73 69 67 6e 69 6e 67 20 62 69  hen assigning bi
21ed0 74 6d 61 73 6b 20 76 61 6c 75 65 73 20 74 6f 20  tmask values to 
21ee0 46 52 4f 4d 20 63 6c 61 75 73 65 20 63 75 72 73  FROM clause curs
21ef0 6f 72 73 2c 20 69 74 20 6d 75 73 74 20 62 65 0a  ors, it must be.
21f00 20 20 2a 2a 20 74 68 65 20 63 61 73 65 20 74 68    ** the case th
21f10 61 74 20 69 66 20 58 20 69 73 20 74 68 65 20 62  at if X is the b
21f20 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 4e  itmask for the N
21f30 2d 74 68 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  -th FROM clause 
21f40 74 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20 74  term then.  ** t
21f50 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61  he bitmask for a
21f60 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  ll FROM clause t
21f70 65 72 6d 73 20 74 6f 20 74 68 65 20 6c 65 66 74  erms to the left
21f80 20 6f 66 20 74 68 65 20 4e 2d 74 68 20 74 65 72   of the N-th ter
21f90 6d 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31 29 2e  m.  ** is (X-1).
21fa0 20 20 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e     An expression
21fb0 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61   from the ON cla
21fc0 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  use of a LEFT JO
21fd0 49 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20  IN can use.  ** 
21fe0 69 74 73 20 45 78 70 72 2e 69 52 69 67 68 74 4a  its Expr.iRightJ
21ff0 6f 69 6e 54 61 62 6c 65 20 76 61 6c 75 65 20 74  oinTable value t
22000 6f 20 66 69 6e 64 20 74 68 65 20 62 69 74 6d 61  o find the bitma
22010 73 6b 20 6f 66 20 74 68 65 20 72 69 67 68 74 20  sk of the right 
22020 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74 68  table.  ** of th
22030 65 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61 63  e join.  Subtrac
22040 74 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74 68  ting one from th
22050 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 62 69  e right table bi
22060 74 6d 61 73 6b 20 67 69 76 65 73 20 61 0a 20 20  tmask gives a.  
22070 2a 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61  ** bitmask for a
22080 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  ll tables to the
22090 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69   left of the joi
220a0 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20  n.  Knowing the 
220b0 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f 72  bitmask.  ** for
220c0 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74   all tables to t
220d0 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66  he left of a lef
220e0 74 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72 74  t join is import
220f0 61 6e 74 2e 20 20 54 69 63 6b 65 74 20 23 33 30  ant.  Ticket #30
22100 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f  15..  **.  ** Co
22110 6e 66 69 67 75 72 65 20 74 68 65 20 57 68 65 72  nfigure the Wher
22120 65 43 6c 61 75 73 65 2e 76 6d 61 73 6b 20 76 61  eClause.vmask va
22130 72 69 61 62 6c 65 20 73 6f 20 74 68 61 74 20 62  riable so that b
22140 69 74 73 20 74 68 61 74 20 63 6f 72 72 65 73 70  its that corresp
22150 6f 6e 64 0a 20 20 2a 2a 20 74 6f 20 76 69 72 74  ond.  ** to virt
22160 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72  ual table cursor
22170 73 20 61 72 65 20 73 65 74 2e 20 54 68 69 73 20  s are set. This 
22180 69 73 20 75 73 65 64 20 74 6f 20 73 65 6c 65 63  is used to selec
22190 74 69 76 65 6c 79 20 64 69 73 61 62 6c 65 20 0a  tively disable .
221a0 20 20 2a 2a 20 74 68 65 20 4f 52 2d 74 6f 2d 49    ** the OR-to-I
221b0 4e 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  N transformation
221c0 20 69 6e 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f   in exprAnalyzeO
221d0 72 54 65 72 6d 28 29 2e 20 49 74 20 69 73 20 6e  rTerm(). It is n
221e0 6f 74 20 68 65 6c 70 66 75 6c 20 0a 20 20 2a 2a  ot helpful .  **
221f0 20 77 69 74 68 20 76 69 72 74 75 61 6c 20 74 61   with virtual ta
22200 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  bles..  **.  ** 
22210 4e 6f 74 65 20 74 68 61 74 20 62 69 74 6d 61 73  Note that bitmas
22220 6b 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66  ks are created f
22230 6f 72 20 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d  or all pTabList-
22240 3e 6e 53 72 63 20 74 61 62 6c 65 73 20 69 6e 0a  >nSrc tables in.
22250 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e    ** pTabList, n
22260 6f 74 20 6a 75 73 74 20 74 68 65 20 66 69 72 73  ot just the firs
22270 74 20 6e 54 61 62 4c 69 73 74 20 74 61 62 6c 65  t nTabList table
22280 73 2e 20 20 6e 54 61 62 4c 69 73 74 20 69 73 20  s.  nTabList is 
22290 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71  normally.  ** eq
222a0 75 61 6c 20 74 6f 20 70 54 61 62 4c 69 73 74 2d  ual to pTabList-
222b0 3e 6e 53 72 63 20 62 75 74 20 6d 69 67 68 74 20  >nSrc but might 
222c0 62 65 20 73 68 6f 72 74 65 6e 65 64 20 74 6f 20  be shortened to 
222d0 31 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 57 48  1 if the.  ** WH
222e0 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
222f0 59 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 20  Y flag is set.. 
22300 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 57   */.  assert( pW
22310 43 2d 3e 76 6d 61 73 6b 3d 3d 30 20 26 26 20 70  C->vmask==0 && p
22320 4d 61 73 6b 53 65 74 2d 3e 6e 3d 3d 30 20 29 3b  MaskSet->n==0 );
22330 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
22340 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
22350 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d 61  +){.    createMa
22360 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61  sk(pMaskSet, pTa
22370 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  bList->a[i].iCur
22380 73 6f 72 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  sor);.#ifndef SQ
22390 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
223a0 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 41  LTABLE.    if( A
223b0 4c 57 41 59 53 28 70 54 61 62 4c 69 73 74 2d 3e  LWAYS(pTabList->
223c0 61 5b 69 5d 2e 70 54 61 62 29 20 26 26 20 49 73  a[i].pTab) && Is
223d0 56 69 72 74 75 61 6c 28 70 54 61 62 4c 69 73 74  Virtual(pTabList
223e0 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 20 29 7b 0a  ->a[i].pTab) ){.
223f0 20 20 20 20 20 20 70 57 43 2d 3e 76 6d 61 73 6b        pWC->vmask
22400 20 7c 3d 20 28 28 42 69 74 6d 61 73 6b 29 31 20   |= ((Bitmask)1 
22410 3c 3c 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  << i);.    }.#en
22420 64 69 66 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  dif.  }.#ifndef 
22430 4e 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 42  NDEBUG.  {.    B
22440 69 74 6d 61 73 6b 20 74 6f 54 68 65 4c 65 66 74  itmask toTheLeft
22450 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
22460 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  0; i<pTabList->n
22470 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
22480 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 67 65 74   Bitmask m = get
22490 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
224a0 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43  TabList->a[i].iC
224b0 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 61 73  ursor);.      as
224c0 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d 74 6f 54  sert( (m-1)==toT
224d0 68 65 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20  heLeft );.      
224e0 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a  toTheLeft |= m;.
224f0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
22500 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61  ..  /* Analyze a
22510 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65 78 70  ll of the subexp
22520 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20  ressions.  Note 
22530 74 68 61 74 20 65 78 70 72 41 6e 61 6c 79 7a 65  that exprAnalyze
22540 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64  () might.  ** ad
22550 64 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65  d new virtual te
22560 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  rms onto the end
22570 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
22580 61 75 73 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74  ause.  We do not
22590 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e  .  ** want to an
225a0 61 6c 79 7a 65 20 74 68 65 73 65 20 76 69 72 74  alyze these virt
225b0 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f 20 73 74  ual terms, so st
225c0 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74  art analyzing at
225d0 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e   the end.  ** an
225e0 64 20 77 6f 72 6b 20 66 6f 72 77 61 72 64 20 73  d work forward s
225f0 6f 20 74 68 61 74 20 74 68 65 20 61 64 64 65 64  o that the added
22600 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 61   virtual terms a
22610 72 65 20 6e 65 76 65 72 20 70 72 6f 63 65 73 73  re never process
22620 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 78 70 72 41  ed..  */.  exprA
22630 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61 62 4c 69  nalyzeAll(pTabLi
22640 73 74 2c 20 70 57 43 29 3b 0a 20 20 69 66 28 20  st, pWC);.  if( 
22650 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
22660 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65   ){.    goto whe
22670 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
22680 7d 0a 0a 20 20 2f 2a 20 43 68 6f 73 65 20 74 68  }..  /* Chose th
22690 65 20 62 65 73 74 20 69 6e 64 65 78 20 74 6f 20  e best index to 
226a0 75 73 65 20 66 6f 72 20 65 61 63 68 20 74 61 62  use for each tab
226b0 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
226c0 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lause..  **.  **
226d0 20 54 68 69 73 20 6c 6f 6f 70 20 66 69 6c 6c 73   This loop fills
226e0 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
226f0 67 20 66 69 65 6c 64 73 3a 0a 20 20 2a 2a 0a 20  g fields:.  **. 
22700 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b   **   pWInfo->a[
22710 5d 2e 70 49 64 78 20 20 20 20 20 20 54 68 65 20  ].pIdx      The 
22720 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72  index to use for
22730 20 74 68 69 73 20 6c 65 76 65 6c 20 6f 66 20 74   this level of t
22740 68 65 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 20 20  he loop..  **   
22750 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 77 73 46 6c  pWInfo->a[].wsFl
22760 61 67 73 20 20 20 57 48 45 52 45 5f 78 78 78 20  ags   WHERE_xxx 
22770 66 6c 61 67 73 20 61 73 73 6f 63 69 61 74 65 64  flags associated
22780 20 77 69 74 68 20 70 49 64 78 0a 20 20 2a 2a 20   with pIdx.  ** 
22790 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 6e 45    pWInfo->a[].nE
227a0 71 20 20 20 20 20 20 20 54 68 65 20 6e 75 6d 62  q       The numb
227b0 65 72 20 6f 66 20 3d 3d 20 61 6e 64 20 49 4e 20  er of == and IN 
227c0 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a  constraints.  **
227d0 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69     pWInfo->a[].i
227e0 46 72 6f 6d 20 20 20 20 20 57 68 69 63 68 20 74  From     Which t
227f0 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  erm of the FROM 
22800 63 6c 61 75 73 65 20 69 73 20 62 65 69 6e 67 20  clause is being 
22810 63 6f 64 65 64 0a 20 20 2a 2a 20 20 20 70 57 49  coded.  **   pWI
22820 6e 66 6f 2d 3e 61 5b 5d 2e 69 54 61 62 43 75 72  nfo->a[].iTabCur
22830 20 20 20 54 68 65 20 56 44 42 45 20 63 75 72 73     The VDBE curs
22840 6f 72 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  or for the datab
22850 61 73 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 20  ase table.  **  
22860 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 49 64   pWInfo->a[].iId
22870 78 43 75 72 20 20 20 54 68 65 20 56 44 42 45 20  xCur   The VDBE 
22880 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69  cursor for the i
22890 6e 64 65 78 0a 20 20 2a 2a 20 20 20 70 57 49 6e  ndex.  **   pWIn
228a0 66 6f 2d 3e 61 5b 5d 2e 70 54 65 72 6d 20 20 20  fo->a[].pTerm   
228b0 20 20 57 68 65 6e 20 77 73 46 6c 61 67 73 3d 3d    When wsFlags==
228c0 57 4f 5f 4f 52 2c 20 74 68 65 20 4f 52 2d 63 6c  WO_OR, the OR-cl
228d0 61 75 73 65 20 74 65 72 6d 0a 20 20 2a 2a 0a 20  ause term.  **. 
228e0 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c   ** This loop al
228f0 73 6f 20 66 69 67 75 72 65 73 20 6f 75 74 20 74  so figures out t
22900 68 65 20 6e 65 73 74 69 6e 67 20 6f 72 64 65 72  he nesting order
22910 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
22920 65 20 46 52 4f 4d 0a 20 20 2a 2a 20 63 6c 61 75  e FROM.  ** clau
22930 73 65 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65  se..  */.  notRe
22940 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29  ady = ~(Bitmask)
22950 30 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20  0;.  pTabItem = 
22960 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70  pTabList->a;.  p
22970 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e  Level = pWInfo->
22980 61 3b 0a 20 20 61 6e 64 46 6c 61 67 73 20 3d 20  a;.  andFlags = 
22990 7e 30 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45  ~0;.  WHERETRACE
229a0 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  (("*** Optimizer
229b0 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b   Start ***\n"));
229c0 0a 20 20 66 6f 72 28 69 3d 69 46 72 6f 6d 3d 30  .  for(i=iFrom=0
229d0 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d  , pLevel=pWInfo-
229e0 3e 61 3b 20 69 3c 6e 54 61 62 4c 69 73 74 3b 20  >a; i<nTabList; 
229f0 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
22a00 20 20 20 20 57 68 65 72 65 43 6f 73 74 20 62 65      WhereCost be
22a10 73 74 50 6c 61 6e 3b 20 20 20 20 20 20 20 20 20  stPlan;         
22a20 2f 2a 20 4d 6f 73 74 20 65 66 66 69 63 69 65 6e  /* Most efficien
22a30 74 20 70 6c 61 6e 20 73 65 65 6e 20 73 6f 20 66  t plan seen so f
22a40 61 72 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20  ar */.    Index 
22a50 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
22a60 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 66        /* Index f
22a70 6f 72 20 46 52 4f 4d 20 74 61 62 6c 65 20 61 74  or FROM table at
22a80 20 70 54 61 62 49 74 65 6d 20 2a 2f 0a 20 20 20   pTabItem */.   
22a90 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
22aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22ab0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
22ac0 20 46 52 4f 4d 20 74 61 62 6c 65 73 20 2a 2f 0a   FROM tables */.
22ad0 20 20 20 20 69 6e 74 20 62 65 73 74 4a 20 3d 20      int bestJ = 
22ae0 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  -1;             
22af0 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  /* The value of 
22b00 6a 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b  j */.    Bitmask
22b10 20 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   m;             
22b20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20       /* Bitmask 
22b30 76 61 6c 75 65 20 66 6f 72 20 6a 20 6f 72 20 62  value for j or b
22b40 65 73 74 4a 20 2a 2f 0a 20 20 20 20 69 6e 74 20  estJ */.    int 
22b50 69 73 4f 70 74 69 6d 61 6c 3b 20 20 20 20 20 20  isOptimal;      
22b60 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
22b70 74 6f 72 20 66 6f 72 20 6f 70 74 69 6d 61 6c 2f  tor for optimal/
22b80 6e 6f 6e 2d 6f 70 74 69 6d 61 6c 20 73 65 61 72  non-optimal sear
22b90 63 68 20 2a 2f 0a 0a 20 20 20 20 6d 65 6d 73 65  ch */..    memse
22ba0 74 28 26 62 65 73 74 50 6c 61 6e 2c 20 30 2c 20  t(&bestPlan, 0, 
22bb0 73 69 7a 65 6f 66 28 62 65 73 74 50 6c 61 6e 29  sizeof(bestPlan)
22bc0 29 3b 0a 20 20 20 20 62 65 73 74 50 6c 61 6e 2e  );.    bestPlan.
22bd0 72 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42  rCost = SQLITE_B
22be0 49 47 5f 44 42 4c 3b 0a 0a 20 20 20 20 2f 2a 20  IG_DBL;..    /* 
22bf0 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65  Loop through the
22c00 20 72 65 6d 61 69 6e 69 6e 67 20 65 6e 74 72 69   remaining entri
22c10 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
22c20 6c 61 75 73 65 20 74 6f 20 66 69 6e 64 20 74 68  lause to find th
22c30 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20 6e 65  e.    ** next ne
22c40 73 74 65 64 20 6c 6f 6f 70 2e 20 54 68 65 20 46  sted loop. The F
22c50 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 69  ROM clause entri
22c60 65 73 20 6d 61 79 20 62 65 20 69 74 65 72 61 74  es may be iterat
22c70 65 64 20 74 68 72 6f 75 67 68 0a 20 20 20 20 2a  ed through.    *
22c80 2a 20 65 69 74 68 65 72 20 6f 6e 63 65 20 6f 72  * either once or
22c90 20 74 77 69 63 65 2e 20 0a 20 20 20 20 2a 2a 0a   twice. .    **.
22ca0 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74      ** The first
22cb0 20 69 74 65 72 61 74 69 6f 6e 2c 20 77 68 69 63   iteration, whic
22cc0 68 20 69 73 20 61 6c 77 61 79 73 20 70 65 72 66  h is always perf
22cd0 6f 72 6d 65 64 2c 20 73 65 61 72 63 68 65 73 20  ormed, searches 
22ce0 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 46  for the.    ** F
22cf0 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79  ROM clause entry
22d00 20 74 68 61 74 20 70 65 72 6d 69 74 73 20 74 68   that permits th
22d10 65 20 6c 6f 77 65 73 74 2d 63 6f 73 74 2c 20 22  e lowest-cost, "
22d20 6f 70 74 69 6d 61 6c 22 20 73 63 61 6e 2e 20 49  optimal" scan. I
22d30 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f  n.    ** this co
22d40 6e 74 65 78 74 20 61 6e 20 6f 70 74 69 6d 61 6c  ntext an optimal
22d50 20 73 63 61 6e 20 69 73 20 6f 6e 65 20 74 68 61   scan is one tha
22d60 74 20 75 73 65 73 20 74 68 65 20 73 61 6d 65 20  t uses the same 
22d70 73 74 72 61 74 65 67 79 0a 20 20 20 20 2a 2a 20  strategy.    ** 
22d80 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 46 52  for the given FR
22d90 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20  OM clause entry 
22da0 61 73 20 77 6f 75 6c 64 20 62 65 20 73 65 6c 65  as would be sele
22db0 63 74 65 64 20 69 66 20 74 68 65 20 65 6e 74 72  cted if the entr
22dc0 79 0a 20 20 20 20 2a 2a 20 77 65 72 65 20 75 73  y.    ** were us
22dd0 65 64 20 61 73 20 74 68 65 20 69 6e 6e 65 72 6d  ed as the innerm
22de0 6f 73 74 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2e  ost nested loop.
22df0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
22e00 2c 20 61 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  , a table.    **
22e10 20 69 73 20 63 68 6f 73 65 6e 20 73 75 63 68 20   is chosen such 
22e20 74 68 61 74 20 74 68 65 20 63 6f 73 74 20 6f 66  that the cost of
22e30 20 72 75 6e 6e 69 6e 67 20 74 68 61 74 20 74 61   running that ta
22e40 62 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 65  ble cannot be re
22e50 64 75 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  duced.    ** by 
22e60 77 61 69 74 69 6e 67 20 66 6f 72 20 6f 74 68 65  waiting for othe
22e70 72 20 74 61 62 6c 65 73 20 74 6f 20 72 75 6e 20  r tables to run 
22e80 66 69 72 73 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  first..    **.  
22e90 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20    ** The second 
22ea0 69 74 65 72 61 74 69 6f 6e 20 69 73 20 6f 6e 6c  iteration is onl
22eb0 79 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 6e  y performed if n
22ec0 6f 20 6f 70 74 69 6d 61 6c 20 73 63 61 6e 20 73  o optimal scan s
22ed0 74 72 61 74 65 67 69 65 73 0a 20 20 20 20 2a 2a  trategies.    **
22ee0 20 77 65 72 65 20 66 6f 75 6e 64 20 62 79 20 74   were found by t
22ef0 68 65 20 66 69 72 73 74 2e 20 54 68 69 73 20 69  he first. This i
22f00 74 65 72 61 74 69 6f 6e 20 69 73 20 75 73 65 64  teration is used
22f10 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74   to search for t
22f20 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 77 65 73 74  he.    ** lowest
22f30 20 63 6f 73 74 20 73 63 61 6e 20 6f 76 65 72 61   cost scan overa
22f40 6c 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ll..    **.    *
22f50 2a 20 50 72 65 76 69 6f 75 73 20 76 65 72 73 69  * Previous versi
22f60 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 65  ons of SQLite pe
22f70 72 66 6f 72 6d 65 64 20 6f 6e 6c 79 20 74 68 65  rformed only the
22f80 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f   second iteratio
22f90 6e 20 2d 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e  n -.    ** the n
22fa0 65 78 74 20 6f 75 74 65 72 6d 6f 73 74 20 6c 6f  ext outermost lo
22fb0 6f 70 20 77 61 73 20 61 6c 77 61 79 73 20 74 68  op was always th
22fc0 61 74 20 77 69 74 68 20 74 68 65 20 6c 6f 77 65  at with the lowe
22fd0 73 74 20 6f 76 65 72 61 6c 6c 0a 20 20 20 20 2a  st overall.    *
22fe0 2a 20 63 6f 73 74 2e 20 48 6f 77 65 76 65 72 2c  * cost. However,
22ff0 20 74 68 69 73 20 6d 65 61 6e 74 20 74 68 61 74   this meant that
23000 20 53 51 4c 69 74 65 20 63 6f 75 6c 64 20 73 65   SQLite could se
23010 6c 65 63 74 20 74 68 65 20 77 72 6f 6e 67 20 70  lect the wrong p
23020 6c 61 6e 0a 20 20 20 20 2a 2a 20 66 6f 72 20 73  lan.    ** for s
23030 63 72 69 70 74 73 20 73 75 63 68 20 61 73 20 74  cripts such as t
23040 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  he following:.  
23050 20 20 2a 2a 20 20 20 0a 20 20 20 20 2a 2a 20 20    **   .    **  
23060 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
23070 28 61 2c 20 62 29 3b 20 0a 20 20 20 20 2a 2a 20  (a, b); .    ** 
23080 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
23090 32 28 63 2c 20 64 29 3b 0a 20 20 20 20 2a 2a 20  2(c, d);.    ** 
230a0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
230b0 74 32 2c 20 74 31 20 57 48 45 52 45 20 74 32 2e  t2, t1 WHERE t2.
230c0 72 6f 77 69 64 20 3d 20 74 31 2e 61 3b 0a 20 20  rowid = t1.a;.  
230d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
230e0 62 65 73 74 20 73 74 72 61 74 65 67 79 20 69 73  best strategy is
230f0 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
23100 75 67 68 20 74 61 62 6c 65 20 74 31 20 66 69 72  ugh table t1 fir
23110 73 74 2e 20 48 6f 77 65 76 65 72 20 69 74 0a 20  st. However it. 
23120 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73     ** is not pos
23130 73 69 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69  sible to determi
23140 6e 65 20 74 68 69 73 20 77 69 74 68 20 61 20 73  ne this with a s
23150 69 6d 70 6c 65 20 67 72 65 65 64 79 20 61 6c 67  imple greedy alg
23160 6f 72 69 74 68 6d 2e 0a 20 20 20 20 2a 2a 20 48  orithm..    ** H
23170 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 74 68  owever, since th
23180 65 20 63 6f 73 74 20 6f 66 20 61 20 6c 69 6e 65  e cost of a line
23190 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20  ar scan through 
231a0 74 61 62 6c 65 20 74 32 20 69 73 20 74 68 65 20  table t2 is the 
231b0 73 61 6d 65 20 0a 20 20 20 20 2a 2a 20 61 73 20  same .    ** as 
231c0 74 68 65 20 63 6f 73 74 20 6f 66 20 61 20 6c 69  the cost of a li
231d0 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67  near scan throug
231e0 68 20 74 61 62 6c 65 20 74 31 2c 20 61 20 73 69  h table t1, a si
231f0 6d 70 6c 65 20 67 72 65 65 64 79 20 0a 20 20 20  mple greedy .   
23200 20 2a 2a 20 61 6c 67 6f 72 69 74 68 6d 20 6d 61   ** algorithm ma
23210 79 20 63 68 6f 6f 73 65 20 74 6f 20 75 73 65 20  y choose to use 
23220 74 32 20 66 6f 72 20 74 68 65 20 6f 75 74 65 72  t2 for the outer
23230 20 6c 6f 6f 70 2c 20 77 68 69 63 68 20 69 73 20   loop, which is 
23240 61 20 6d 75 63 68 0a 20 20 20 20 2a 2a 20 63 6f  a much.    ** co
23250 73 74 6c 69 65 72 20 61 70 70 72 6f 61 63 68 2e  stlier approach.
23260 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
23270 69 73 4f 70 74 69 6d 61 6c 3d 31 3b 20 69 73 4f  isOptimal=1; isO
23280 70 74 69 6d 61 6c 3e 3d 30 20 26 26 20 62 65 73  ptimal>=0 && bes
23290 74 4a 3c 30 3b 20 69 73 4f 70 74 69 6d 61 6c 2d  tJ<0; isOptimal-
232a0 2d 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  -){.      Bitmas
232b0 6b 20 6d 61 73 6b 20 3d 20 28 69 73 4f 70 74 69  k mask = (isOpti
232c0 6d 61 6c 20 3f 20 30 20 3a 20 6e 6f 74 52 65 61  mal ? 0 : notRea
232d0 64 79 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  dy);.      asser
232e0 74 28 20 28 6e 54 61 62 4c 69 73 74 2d 69 46 72  t( (nTabList-iFr
232f0 6f 6d 29 3e 31 20 7c 7c 20 69 73 4f 70 74 69 6d  om)>1 || isOptim
23300 61 6c 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  al );.      for(
23310 6a 3d 69 46 72 6f 6d 2c 20 70 54 61 62 49 74 65  j=iFrom, pTabIte
23320 6d 3d 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a  m=&pTabList->a[j
23330 5d 3b 20 6a 3c 6e 54 61 62 4c 69 73 74 3b 20 6a  ]; j<nTabList; j
23340 2b 2b 2c 20 70 54 61 62 49 74 65 6d 2b 2b 29 7b  ++, pTabItem++){
23350 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64 6f 4e  .        int doN
23360 6f 74 52 65 6f 72 64 65 72 3b 20 20 20 20 2f 2a  otReorder;    /*
23370 20 54 72 75 65 20 69 66 20 74 68 69 73 20 74 61   True if this ta
23380 62 6c 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  ble should not b
23390 65 20 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a 20  e reordered */. 
233a0 20 20 20 20 20 20 20 57 68 65 72 65 43 6f 73 74         WhereCost
233b0 20 73 43 6f 73 74 3b 20 20 20 20 20 2f 2a 20 43   sCost;     /* C
233c0 6f 73 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ost information 
233d0 66 72 6f 6d 20 62 65 73 74 5b 56 69 72 74 75 61  from best[Virtua
233e0 6c 5d 49 6e 64 65 78 28 29 20 2a 2f 0a 20 20 20  l]Index() */.   
233f0 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
23400 4f 72 64 65 72 42 79 3b 20 20 2f 2a 20 4f 52 44  OrderBy;  /* ORD
23410 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 6f 72  ER BY clause for
23420 20 69 6e 64 65 78 20 74 6f 20 6f 70 74 69 6d 69   index to optimi
23430 7a 65 20 2a 2f 0a 20 20 0a 20 20 20 20 20 20 20  ze */.  .       
23440 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 3d 20   doNotReorder = 
23450 20 28 70 54 61 62 49 74 65 6d 2d 3e 6a 6f 69 6e   (pTabItem->join
23460 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c  type & (JT_LEFT|
23470 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 3b 0a 20  JT_CROSS))!=0;. 
23480 20 20 20 20 20 20 20 69 66 28 20 6a 21 3d 69 46         if( j!=iF
23490 72 6f 6d 20 26 26 20 64 6f 4e 6f 74 52 65 6f 72  rom && doNotReor
234a0 64 65 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  der ) break;.   
234b0 20 20 20 20 20 6d 20 3d 20 67 65 74 4d 61 73 6b       m = getMask
234c0 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 49  (pMaskSet, pTabI
234d0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
234e0 20 20 20 20 20 20 20 69 66 28 20 28 6d 20 26 20         if( (m & 
234f0 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a  notReady)==0 ){.
23500 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d            if( j=
23510 3d 69 46 72 6f 6d 20 29 20 69 46 72 6f 6d 2b 2b  =iFrom ) iFrom++
23520 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
23530 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
23540 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
23550 20 3d 20 28 28 69 3d 3d 30 20 26 26 20 70 70 4f   = ((i==0 && ppO
23560 72 64 65 72 42 79 20 29 3f 2a 70 70 4f 72 64 65  rderBy )?*ppOrde
23570 72 42 79 3a 30 29 3b 0a 20 20 0a 20 20 20 20 20  rBy:0);.  .     
23580 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 49     assert( pTabI
23590 74 65 6d 2d 3e 70 54 61 62 20 29 3b 0a 23 69 66  tem->pTab );.#if
235a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
235b0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
235c0 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72 74        if( IsVirt
235d0 75 61 6c 28 70 54 61 62 49 74 65 6d 2d 3e 70 54  ual(pTabItem->pT
235e0 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ab) ){.         
235f0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
23600 6e 66 6f 20 2a 2a 70 70 20 3d 20 26 70 57 49 6e  nfo **pp = &pWIn
23610 66 6f 2d 3e 61 5b 6a 5d 2e 70 49 64 78 49 6e 66  fo->a[j].pIdxInf
23620 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65 73  o;.          bes
23630 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28 70 50  tVirtualIndex(pP
23640 61 72 73 65 2c 20 70 57 43 2c 20 70 54 61 62 49  arse, pWC, pTabI
23650 74 65 6d 2c 20 6d 61 73 6b 2c 20 70 4f 72 64 65  tem, mask, pOrde
23660 72 42 79 2c 20 26 73 43 6f 73 74 2c 20 70 70 29  rBy, &sCost, pp)
23670 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
23680 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
23690 7b 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74  {.          best
236a0 42 74 72 65 65 49 6e 64 65 78 28 70 50 61 72 73  BtreeIndex(pPars
236b0 65 2c 20 70 57 43 2c 20 70 54 61 62 49 74 65 6d  e, pWC, pTabItem
236c0 2c 20 6d 61 73 6b 2c 20 70 4f 72 64 65 72 42 79  , mask, pOrderBy
236d0 2c 20 26 73 43 6f 73 74 29 3b 0a 20 20 20 20 20  , &sCost);.     
236e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
236f0 65 72 74 28 20 69 73 4f 70 74 69 6d 61 6c 20 7c  ert( isOptimal |
23700 7c 20 28 73 43 6f 73 74 2e 75 73 65 64 26 6e 6f  | (sCost.used&no
23710 74 52 65 61 64 79 29 3d 3d 30 20 29 3b 0a 0a 20  tReady)==0 );.. 
23720 20 20 20 20 20 20 20 69 66 28 20 28 73 43 6f 73         if( (sCos
23730 74 2e 75 73 65 64 26 6e 6f 74 52 65 61 64 79 29  t.used&notReady)
23740 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
23750 28 6a 3d 3d 69 46 72 6f 6d 20 7c 7c 20 73 43 6f  (j==iFrom || sCo
23760 73 74 2e 72 43 6f 73 74 3c 62 65 73 74 50 6c 61  st.rCost<bestPla
23770 6e 2e 72 43 6f 73 74 29 20 0a 20 20 20 20 20 20  n.rCost) .      
23780 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62    ){.          b
23790 65 73 74 50 6c 61 6e 20 3d 20 73 43 6f 73 74 3b  estPlan = sCost;
237a0 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74 4a  .          bestJ
237b0 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = j;.        }.
237c0 20 20 20 20 20 20 20 20 69 66 28 20 64 6f 4e 6f          if( doNo
237d0 74 52 65 6f 72 64 65 72 20 29 20 62 72 65 61 6b  tReorder ) break
237e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
237f0 20 20 20 20 61 73 73 65 72 74 28 20 62 65 73 74      assert( best
23800 4a 3e 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  J>=0 );.    asse
23810 72 74 28 20 6e 6f 74 52 65 61 64 79 20 26 20 67  rt( notReady & g
23820 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
23830 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73   pTabList->a[bes
23840 74 4a 5d 2e 69 43 75 72 73 6f 72 29 20 29 3b 0a  tJ].iCursor) );.
23850 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28      WHERETRACE((
23860 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 73  "*** Optimizer s
23870 65 6c 65 63 74 73 20 74 61 62 6c 65 20 25 64 20  elects table %d 
23880 66 6f 72 20 6c 6f 6f 70 20 25 64 5c 6e 22 2c 20  for loop %d\n", 
23890 62 65 73 74 4a 2c 0a 20 20 20 20 20 20 20 20 20  bestJ,.         
238a0 20 20 70 4c 65 76 65 6c 2d 70 57 49 6e 66 6f 2d    pLevel-pWInfo-
238b0 3e 61 29 29 3b 0a 20 20 20 20 69 66 28 20 28 62  >a));.    if( (b
238c0 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46  estPlan.plan.wsF
238d0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44  lags & WHERE_ORD
238e0 45 52 42 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  ERBY)!=0 ){.    
238f0 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d 20 30    *ppOrderBy = 0
23900 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 6e 64 46  ;.    }.    andF
23910 6c 61 67 73 20 26 3d 20 62 65 73 74 50 6c 61 6e  lags &= bestPlan
23920 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20  .plan.wsFlags;. 
23930 20 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 20     pLevel->plan 
23940 3d 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 3b  = bestPlan.plan;
23950 0a 20 20 20 20 69 66 28 20 62 65 73 74 50 6c 61  .    if( bestPla
23960 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  n.plan.wsFlags &
23970 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29   WHERE_INDEXED )
23980 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
23990 69 49 64 78 43 75 72 20 3d 20 70 50 61 72 73 65  iIdxCur = pParse
239a0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d 65  ->nTab++;.    }e
239b0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  lse{.      pLeve
239c0 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 2d 31 3b  l->iIdxCur = -1;
239d0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 6f 74 52 65  .    }.    notRe
239e0 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28  ady &= ~getMask(
239f0 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69  pMaskSet, pTabLi
23a00 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69 43 75  st->a[bestJ].iCu
23a10 72 73 6f 72 29 3b 0a 20 20 20 20 70 4c 65 76 65  rsor);.    pLeve
23a20 6c 2d 3e 69 46 72 6f 6d 20 3d 20 28 75 38 29 62  l->iFrom = (u8)b
23a30 65 73 74 4a 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  estJ;..    /* Ch
23a40 65 63 6b 20 74 68 61 74 20 69 66 20 74 68 65 20  eck that if the 
23a50 74 61 62 6c 65 20 73 63 61 6e 6e 65 64 20 62 79  table scanned by
23a60 20 74 68 69 73 20 6c 6f 6f 70 20 69 74 65 72 61   this loop itera
23a70 74 69 6f 6e 20 68 61 64 20 61 6e 0a 20 20 20 20  tion had an.    
23a80 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  ** INDEXED BY cl
23a90 61 75 73 65 20 61 74 74 61 63 68 65 64 20 74 6f  ause attached to
23aa0 20 69 74 2c 20 74 68 61 74 20 74 68 65 20 6e 61   it, that the na
23ab0 6d 65 64 20 69 6e 64 65 78 20 69 73 20 62 65 69  med index is bei
23ac0 6e 67 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 66  ng.    ** used f
23ad0 6f 72 20 74 68 65 20 73 63 61 6e 2e 20 49 66 20  or the scan. If 
23ae0 6e 6f 74 2c 20 74 68 65 6e 20 71 75 65 72 79 20  not, then query 
23af0 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 68 61 73 20  compilation has 
23b00 66 61 69 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 52  failed..    ** R
23b10 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a  eturn an error..
23b20 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 64 78 20      */.    pIdx 
23b30 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65  = pTabList->a[be
23b40 73 74 4a 5d 2e 70 49 6e 64 65 78 3b 0a 20 20 20  stJ].pIndex;.   
23b50 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20   if( pIdx ){.   
23b60 20 20 20 69 66 28 20 28 62 65 73 74 50 6c 61 6e     if( (bestPlan
23b70 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
23b80 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d  WHERE_INDEXED)==
23b90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
23ba0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
23bb0 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 75 73 65  rse, "cannot use
23bc0 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 70 49 64   index: %s", pId
23bd0 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  x->zName);.     
23be0 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
23bf0 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d  inError;.      }
23c00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
23c10 20 49 66 20 61 6e 20 49 4e 44 45 58 45 44 20 42   If an INDEXED B
23c20 59 20 63 6c 61 75 73 65 20 69 73 20 75 73 65 64  Y clause is used
23c30 2c 20 74 68 65 20 62 65 73 74 49 6e 64 65 78 28  , the bestIndex(
23c40 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20  ) function is.  
23c50 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74        ** guarant
23c60 65 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20  eed to find the 
23c70 69 6e 64 65 78 20 73 70 65 63 69 66 69 65 64 20  index specified 
23c80 69 6e 20 74 68 65 20 49 4e 44 45 58 45 44 20 42  in the INDEXED B
23c90 59 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20  Y clause.       
23ca0 20 2a 2a 20 69 66 20 69 74 20 66 69 6e 64 20 61   ** if it find a
23cb0 6e 20 69 6e 64 65 78 20 61 74 20 61 6c 6c 2e 20  n index at all. 
23cc0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
23cd0 74 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e  t( bestPlan.plan
23ce0 2e 75 2e 70 49 64 78 3d 3d 70 49 64 78 20 29 3b  .u.pIdx==pIdx );
23cf0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
23d00 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45 28   }.  WHERETRACE(
23d10 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20  ("*** Optimizer 
23d20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29  Finished ***\n")
23d30 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
23d40 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
23d50 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
23d60 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
23d70 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Error;.  }..  /*
23d80 20 49 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75   If the total qu
23d90 65 72 79 20 6f 6e 6c 79 20 73 65 6c 65 63 74 73  ery only selects
23da0 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2c 20 74   a single row, t
23db0 68 65 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59  hen the ORDER BY
23dc0 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20  .  ** clause is 
23dd0 69 72 72 65 6c 65 76 61 6e 74 2e 0a 20 20 2a 2f  irrelevant..  */
23de0 0a 20 20 69 66 28 20 28 61 6e 64 46 6c 61 67 73  .  if( (andFlags
23df0 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45 29   & WHERE_UNIQUE)
23e00 21 3d 30 20 26 26 20 70 70 4f 72 64 65 72 42 79  !=0 && ppOrderBy
23e10 20 29 7b 0a 20 20 20 20 2a 70 70 4f 72 64 65 72   ){.    *ppOrder
23e20 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  By = 0;.  }..  /
23e30 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  * If the caller 
23e40 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20  is an UPDATE or 
23e50 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
23e60 20 74 68 61 74 20 69 73 20 72 65 71 75 65 73 74   that is request
23e70 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20  ing.  ** to use 
23e80 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72  a one-pass algor
23e90 69 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20  ithm, determine 
23ea0 69 66 20 74 68 69 73 20 69 73 20 61 70 70 72 6f  if this is appro
23eb0 70 72 69 61 74 65 2e 0a 20 20 2a 2a 20 54 68 65  priate..  ** The
23ec0 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69   one-pass algori
23ed0 74 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69  thm only works i
23ee0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
23ef0 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  se constraints. 
23f00 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
23f10 74 20 74 6f 20 75 70 64 61 74 65 20 61 20 73 69  t to update a si
23f20 6e 67 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20  ngle row..  */. 
23f30 20 61 73 73 65 72 74 28 20 28 77 63 74 72 6c 46   assert( (wctrlF
23f40 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
23f50 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30  PASS_DESIRED)==0
23f60 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76   || pWInfo->nLev
23f70 65 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 28  el==1 );.  if( (
23f80 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
23f90 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
23fa0 45 44 29 21 3d 30 20 26 26 20 28 61 6e 64 46 6c  ED)!=0 && (andFl
23fb0 61 67 73 20 26 20 57 48 45 52 45 5f 55 4e 49 51  ags & WHERE_UNIQ
23fc0 55 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 57  UE)!=0 ){.    pW
23fd0 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20  Info->okOnePass 
23fe0 3d 20 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  = 1;.    pWInfo-
23ff0 3e 61 5b 30 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61  >a[0].plan.wsFla
24000 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 49 44 58  gs &= ~WHERE_IDX
24010 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _ONLY;.  }..  /*
24020 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73   Open all tables
24030 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74   in the pTabList
24040 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73   and any indices
24050 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20   selected for.  
24060 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f  ** searching tho
24070 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  se tables..  */.
24080 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
24090 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
240a0 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74  , -1); /* Insert
240b0 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69   the cookie veri
240c0 66 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 66  fier Goto */.  f
240d0 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70  or(i=0, pLevel=p
240e0 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 6e 54 61 62  WInfo->a; i<nTab
240f0 4c 69 73 74 3b 20 69 2b 2b 2c 20 70 4c 65 76 65  List; i++, pLeve
24100 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  l++){.    Table 
24110 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61  *pTab;     /* Ta
24120 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
24130 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20     int iDb;     
24140 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
24150 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
24160 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65 78 20  ing table/index 
24170 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
24180 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
24190 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
241a0 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20  explain==2 ){.  
241b0 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a      char *zMsg;.
241c0 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
241d0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
241e0 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
241f0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
24200 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
24210 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
24220 22 54 41 42 4c 45 20 25 73 22 2c 20 70 49 74 65  "TABLE %s", pIte
24230 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  m->zName);.     
24240 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69   if( pItem->zAli
24250 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d  as ){.        zM
24260 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
24270 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
24280 25 73 20 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c  %s AS %s", zMsg,
24290 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b   pItem->zAlias);
242a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
242b0 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  f( (pLevel->plan
242c0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
242d0 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 7b 0a  _INDEXED)!=0 ){.
242e0 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73          zMsg = s
242f0 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
24300 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 57 49 54  b, zMsg, "%s WIT
24310 48 20 49 4e 44 45 58 20 25 73 22 2c 0a 20 20 20  H INDEX %s",.   
24320 20 20 20 20 20 20 20 20 7a 4d 73 67 2c 20 70 4c          zMsg, pL
24330 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64  evel->plan.u.pId
24340 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  x->zName);.     
24350 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65   }else if( pLeve
24360 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
24370 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  & WHERE_MULTI_OR
24380 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67   ){.        zMsg
24390 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
243a0 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
243b0 20 56 49 41 20 4d 55 4c 54 49 2d 49 4e 44 45 58   VIA MULTI-INDEX
243c0 20 55 4e 49 4f 4e 22 2c 20 7a 4d 73 67 29 3b 0a   UNION", zMsg);.
243d0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
243e0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
243f0 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 52 4f  lags & (WHERE_RO
24400 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57  WID_EQ|WHERE_ROW
24410 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20 20  ID_RANGE) ){.   
24420 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
24430 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
24440 7a 4d 73 67 2c 20 22 25 73 20 55 53 49 4e 47 20  zMsg, "%s USING 
24450 50 52 49 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d  PRIMARY KEY", zM
24460 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  sg);.      }.#if
24470 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
24480 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
24490 20 20 20 20 65 6c 73 65 20 69 66 28 20 28 70 4c      else if( (pL
244a0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
244b0 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
244c0 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20  ALTABLE)!=0 ){. 
244d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69         sqlite3_i
244e0 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 56 74 61 62  ndex_info *pVtab
244f0 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c  Idx = pLevel->pl
24500 61 6e 2e 75 2e 70 56 74 61 62 49 64 78 3b 0a 20  an.u.pVtabIdx;. 
24510 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
24520 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
24530 2c 20 7a 4d 73 67 2c 20 22 25 73 20 56 49 52 54  , zMsg, "%s VIRT
24540 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20  UAL TABLE INDEX 
24550 25 64 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a 20 20  %d:%s", zMsg,.  
24560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24570 20 20 70 56 74 61 62 49 64 78 2d 3e 69 64 78 4e    pVtabIdx->idxN
24580 75 6d 2c 20 70 56 74 61 62 49 64 78 2d 3e 69 64  um, pVtabIdx->id
24590 78 53 74 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23  xStr);.      }.#
245a0 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
245b0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
245c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44  lags & WHERE_ORD
245d0 45 52 42 59 20 29 7b 0a 20 20 20 20 20 20 20 20  ERBY ){.        
245e0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
245f0 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
24600 20 22 25 73 20 4f 52 44 45 52 20 42 59 22 2c 20   "%s ORDER BY", 
24610 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  zMsg);.      }. 
24620 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
24630 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70  AddOp4(v, OP_Exp
24640 6c 61 69 6e 2c 20 69 2c 20 70 4c 65 76 65 6c 2d  lain, i, pLevel-
24650 3e 69 46 72 6f 6d 2c 20 30 2c 20 7a 4d 73 67 2c  >iFrom, 0, zMsg,
24660 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
24670 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
24680 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
24690 4e 20 2a 2f 0a 20 20 20 20 70 54 61 62 49 74 65  N */.    pTabIte
246a0 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
246b0 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
246c0 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62  .    pTab = pTab
246d0 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
246e0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
246f0 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
24700 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
24710 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61     if( (pTab->ta
24720 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65  bFlags & TF_Ephe
24730 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61  meral)!=0 || pTa
24740 62 2d 3e 70 53 65 6c 65 63 74 20 29 20 63 6f 6e  b->pSelect ) con
24750 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20 53  tinue;.#ifndef S
24760 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
24770 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ALTABLE.    if( 
24780 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
24790 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
247a0 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29  RTUALTABLE)!=0 )
247b0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
247c0 61 72 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e  ar *pVTab = (con
247d0 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65  st char *)sqlite
247e0 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70  3GetVTable(db, p
247f0 54 61 62 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  Tab);.      int 
24800 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d  iCur = pTabItem-
24810 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  >iCursor;.      
24820 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
24830 34 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69  4(v, OP_VOpen, i
24840 43 75 72 2c 20 30 2c 20 30 2c 20 70 56 54 61 62  Cur, 0, 0, pVTab
24850 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20  , P4_VTAB);.    
24860 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
24870 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c   if( (pLevel->pl
24880 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
24890 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a  RE_IDX_ONLY)==0.
248a0 20 20 20 20 20 20 20 20 20 26 26 20 28 77 63 74           && (wct
248b0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
248c0 4f 4d 49 54 5f 4f 50 45 4e 29 3d 3d 30 20 29 7b  OMIT_OPEN)==0 ){
248d0 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  .      int op = 
248e0 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
248f0 73 20 3f 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  s ? OP_OpenWrite
24900 20 3a 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a   : OP_OpenRead;.
24910 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
24920 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  nTable(pParse, p
24930 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
24940 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 6f 70 29  , iDb, pTab, op)
24950 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 57 49  ;.      if( !pWI
24960 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26  nfo->okOnePass &
24970 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53  & pTab->nCol<BMS
24980 20 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d   ){.        Bitm
24990 61 73 6b 20 62 20 3d 20 70 54 61 62 49 74 65 6d  ask b = pTabItem
249a0 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20  ->colUsed;.     
249b0 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20     int n = 0;.  
249c0 20 20 20 20 20 20 66 6f 72 28 3b 20 62 3b 20 62        for(; b; b
249d0 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20  =b>>1, n++){}.  
249e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
249f0 65 43 68 61 6e 67 65 50 34 28 76 2c 20 73 71 6c  eChangeP4(v, sql
24a00 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
24a10 64 64 72 28 76 29 2d 31 2c 20 0a 20 20 20 20 20  ddr(v)-1, .     
24a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a30 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e         SQLITE_IN
24a40 54 5f 54 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f  T_TO_PTR(n), P4_
24a50 49 4e 54 33 32 29 3b 0a 20 20 20 20 20 20 20 20  INT32);.        
24a60 61 73 73 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d  assert( n<=pTab-
24a70 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d  >nCol );.      }
24a80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
24a90 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
24aa0 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
24ab0 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
24ac0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
24ad0 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69   }.    pLevel->i
24ae0 54 61 62 43 75 72 20 3d 20 70 54 61 62 49 74 65  TabCur = pTabIte
24af0 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
24b00 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  if( (pLevel->pla
24b10 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
24b20 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 7b  E_INDEXED)!=0 ){
24b30 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
24b40 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  x = pLevel->plan
24b50 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20 20 20 4b  .u.pIdx;.      K
24b60 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73  eyInfo *pKey = s
24b70 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e  qlite3IndexKeyin
24b80 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78 29 3b  fo(pParse, pIx);
24b90 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 43  .      int iIdxC
24ba0 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ur = pLevel->iId
24bb0 78 43 75 72 3b 0a 20 20 20 20 20 20 61 73 73 65  xCur;.      asse
24bc0 72 74 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61  rt( pIx->pSchema
24bd0 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ==pTab->pSchema 
24be0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
24bf0 20 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20   iIdxCur>=0 );. 
24c00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
24c10 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
24c20 6e 52 65 61 64 2c 20 69 49 64 78 43 75 72 2c 20  nRead, iIdxCur, 
24c30 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a  pIx->tnum, iDb,.
24c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c50 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
24c60 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  Key, P4_KEYINFO_
24c70 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20  HANDOFF);.      
24c80 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
24c90 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65  "%s", pIx->zName
24ca0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ));.    }.    sq
24cb0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
24cc0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
24cd0 62 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f  b);.  }.  pWInfo
24ce0 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ->iTop = sqlite3
24cf0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
24d00 76 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  v);..  /* Genera
24d10 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 64  te the code to d
24d20 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20 20 45  o the search.  E
24d30 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ach iteration of
24d40 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f   the for.  ** lo
24d50 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61 74  op below generat
24d60 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69  es code for a si
24d70 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70  ngle nested loop
24d80 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20   of the VM.  ** 
24d90 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20  program..  */.  
24da0 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74  notReady = ~(Bit
24db0 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d  mask)0;.  for(i=
24dc0 30 3b 20 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69  0; i<nTabList; i
24dd0 2b 2b 29 7b 0a 20 20 20 20 6e 6f 74 52 65 61 64  ++){.    notRead
24de0 79 20 3d 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53  y = codeOneLoopS
24df0 74 61 72 74 28 70 57 49 6e 66 6f 2c 20 69 2c 20  tart(pWInfo, i, 
24e00 77 63 74 72 6c 46 6c 61 67 73 2c 20 6e 6f 74 52  wctrlFlags, notR
24e10 65 61 64 79 29 3b 0a 20 20 20 20 70 57 49 6e 66  eady);.    pWInf
24e20 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70  o->iContinue = p
24e30 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 61 64 64 72  WInfo->a[i].addr
24e40 43 6f 6e 74 3b 0a 20 20 7d 0a 0a 23 69 66 64 65  Cont;.  }..#ifde
24e50 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20 20 2f  f SQLITE_TEST  /
24e60 2a 20 46 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  * For testing an
24e70 64 20 64 65 62 75 67 67 69 6e 67 20 75 73 65 20  d debugging use 
24e80 6f 6e 6c 79 20 2a 2f 0a 20 20 2f 2a 20 52 65 63  only */.  /* Rec
24e90 6f 72 64 20 69 6e 20 74 68 65 20 71 75 65 72 79  ord in the query
24ea0 20 70 6c 61 6e 20 69 6e 66 6f 72 6d 61 74 69 6f   plan informatio
24eb0 6e 20 61 62 6f 75 74 20 74 68 65 20 63 75 72 72  n about the curr
24ec0 65 6e 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20 61  ent table.  ** a
24ed0 6e 64 20 74 68 65 20 69 6e 64 65 78 20 75 73 65  nd the index use
24ee0 64 20 74 6f 20 61 63 63 65 73 73 20 69 74 20 28  d to access it (
24ef0 69 66 20 61 6e 79 29 2e 20 20 49 66 20 74 68 65  if any).  If the
24f00 20 74 61 62 6c 65 20 69 74 73 65 6c 66 0a 20 20   table itself.  
24f10 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65 64 2c 20  ** is not used, 
24f20 69 74 73 20 6e 61 6d 65 20 69 73 20 6a 75 73 74  its name is just
24f30 20 27 7b 7d 27 2e 20 20 49 66 20 6e 6f 20 69 6e   '{}'.  If no in
24f40 64 65 78 20 69 73 20 75 73 65 64 0a 20 20 2a 2a  dex is used.  **
24f50 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6c 69   the index is li
24f60 73 74 65 64 20 61 73 20 22 7b 7d 22 2e 20 20 49  sted as "{}".  I
24f70 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  f the primary ke
24f80 79 20 69 73 20 75 73 65 64 20 74 68 65 0a 20 20  y is used the.  
24f90 2a 2a 20 69 6e 64 65 78 20 6e 61 6d 65 20 69 73  ** index name is
24fa0 20 27 2a 27 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72   '*'..  */.  for
24fb0 28 69 3d 30 3b 20 69 3c 6e 54 61 62 4c 69 73 74  (i=0; i<nTabList
24fc0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
24fd0 20 2a 7a 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a   *z;.    int n;.
24fe0 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57      pLevel = &pW
24ff0 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  Info->a[i];.    
25000 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62  pTabItem = &pTab
25010 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
25020 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 7a 20 3d 20  iFrom];.    z = 
25030 70 54 61 62 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  pTabItem->zAlias
25040 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29  ;.    if( z==0 )
25050 20 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70   z = pTabItem->p
25060 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
25070 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
25080 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69 66 28 20  n30(z);.    if( 
25090 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f  n+nQPlan < sizeo
250a0 66 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f  f(sqlite3_query_
250b0 70 6c 61 6e 29 2d 31 30 20 29 7b 0a 20 20 20 20  plan)-10 ){.    
250c0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c    if( pLevel->pl
250d0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
250e0 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20  RE_IDX_ONLY ){. 
250f0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73         memcpy(&s
25100 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
25110 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 22 2c  n[nQPlan], "{}",
25120 20 32 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50   2);.        nQP
25130 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20  lan += 2;.      
25140 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
25150 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71  emcpy(&sqlite3_q
25160 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
25170 5d 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  ], z, n);.      
25180 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20    nQPlan += n;. 
25190 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
251a0 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
251b0 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b  nQPlan++] = ' ';
251c0 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63  .    }.    testc
251d0 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  ase( pLevel->pla
251e0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
251f0 45 5f 52 4f 57 49 44 5f 45 51 20 29 3b 0a 20 20  E_ROWID_EQ );.  
25200 20 20 74 65 73 74 63 61 73 65 28 20 70 4c 65 76    testcase( pLev
25210 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
25220 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52   & WHERE_ROWID_R
25230 41 4e 47 45 20 29 3b 0a 20 20 20 20 69 66 28 20  ANGE );.    if( 
25240 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
25250 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 52 4f  lags & (WHERE_RO
25260 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57  WID_EQ|WHERE_ROW
25270 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20 20  ID_RANGE) ){.   
25280 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74     memcpy(&sqlit
25290 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
252a0 50 6c 61 6e 5d 2c 20 22 2a 20 22 2c 20 32 29 3b  Plan], "* ", 2);
252b0 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d  .      nQPlan +=
252c0 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   2;.    }else if
252d0 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
252e0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
252f0 49 4e 44 45 58 45 44 29 21 3d 30 20 29 7b 0a 20  INDEXED)!=0 ){. 
25300 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33       n = sqlite3
25310 53 74 72 6c 65 6e 33 30 28 70 4c 65 76 65 6c 2d  Strlen30(pLevel-
25320 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e  >plan.u.pIdx->zN
25330 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
25340 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f  n+nQPlan < sizeo
25350 66 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f  f(sqlite3_query_
25360 70 6c 61 6e 29 2d 32 20 29 7b 0a 20 20 20 20 20  plan)-2 ){.     
25370 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74     memcpy(&sqlit
25380 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
25390 50 6c 61 6e 5d 2c 20 70 4c 65 76 65 6c 2d 3e 70  Plan], pLevel->p
253a0 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d  lan.u.pIdx->zNam
253b0 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 6e  e, n);.        n
253c0 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20  QPlan += n;.    
253d0 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72      sqlite3_quer
253e0 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d  y_plan[nQPlan++]
253f0 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 7d 0a   = ' ';.      }.
25400 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25410 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33   memcpy(&sqlite3
25420 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
25430 61 6e 5d 2c 20 22 7b 7d 20 22 2c 20 33 29 3b 0a  an], "{} ", 3);.
25440 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20        nQPlan += 
25450 33 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77  3;.    }.  }.  w
25460 68 69 6c 65 28 20 6e 51 50 6c 61 6e 3e 30 20 26  hile( nQPlan>0 &
25470 26 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f  & sqlite3_query_
25480 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2d 31 5d 3d 3d  plan[nQPlan-1]==
25490 27 20 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ' ' ){.    sqlit
254a0 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 2d 2d  e3_query_plan[--
254b0 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 7d  nQPlan] = 0;.  }
254c0 0a 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79  .  sqlite3_query
254d0 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 20 3d 20  _plan[nQPlan] = 
254e0 30 3b 0a 20 20 6e 51 50 6c 61 6e 20 3d 20 30 3b  0;.  nQPlan = 0;
254f0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
25500 45 5f 54 45 53 54 20 2f 2f 20 54 65 73 74 69 6e  E_TEST // Testin
25510 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
25520 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20 2f  use only */..  /
25530 2a 20 52 65 63 6f 72 64 20 74 68 65 20 63 6f 6e  * Record the con
25540 74 69 6e 75 61 74 69 6f 6e 20 61 64 64 72 65 73  tinuation addres
25550 73 20 69 6e 20 74 68 65 20 57 68 65 72 65 49 6e  s in the WhereIn
25560 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  fo structure.  T
25570 68 65 6e 0a 20 20 2a 2a 20 63 6c 65 61 6e 20 75  hen.  ** clean u
25580 70 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20  p and return..  
25590 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e  */.  return pWIn
255a0 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  fo;..  /* Jump h
255b0 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ere if malloc fa
255c0 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65 67 69  ils */.whereBegi
255d0 6e 45 72 72 6f 72 3a 0a 20 20 77 68 65 72 65 49  nError:.  whereI
255e0 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e  nfoFree(db, pWIn
255f0 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  fo);.  return 0;
25600 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
25610 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  te the end of th
25620 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53  e WHERE loop.  S
25630 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a  ee comments on .
25640 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  ** sqlite3WhereB
25650 65 67 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74  egin() for addit
25660 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
25670 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
25680 65 33 57 68 65 72 65 45 6e 64 28 57 68 65 72 65  e3WhereEnd(Where
25690 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
256a0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
256b0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
256c0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
256d0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
256e0 74 20 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65  t i;.  WhereLeve
256f0 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 53 72 63  l *pLevel;.  Src
25700 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d  List *pTabList =
25710 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
25720 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
25730 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
25740 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f    /* Generate lo
25750 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63  op termination c
25760 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ode..  */.  sqli
25770 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
25780 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72  r(pParse);.  for
25790 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  (i=pWInfo->nLeve
257a0 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  l-1; i>=0; i--){
257b0 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70  .    pLevel = &p
257c0 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20  WInfo->a[i];.   
257d0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
257e0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76  lveLabel(v, pLev
257f0 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20  el->addrCont);. 
25800 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f     if( pLevel->o
25810 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
25820 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
25830 64 64 4f 70 32 28 76 2c 20 70 4c 65 76 65 6c 2d  ddOp2(v, pLevel-
25840 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c  >op, pLevel->p1,
25850 20 70 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20   pLevel->p2);.  
25860 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
25870 68 61 6e 67 65 50 35 28 76 2c 20 70 4c 65 76 65  hangeP5(v, pLeve
25880 6c 2d 3e 70 35 29 3b 0a 20 20 20 20 7d 0a 20 20  l->p5);.    }.  
25890 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c    if( pLevel->pl
258a0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
258b0 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c  RE_IN_ABLE && pL
258c0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30  evel->u.in.nIn>0
258d0 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
258e0 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20   InLoop *pIn;.  
258f0 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
25900 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
25910 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76  lveLabel(v, pLev
25920 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20  el->addrNxt);.  
25930 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c      for(j=pLevel
25940 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d  ->u.in.nIn, pIn=
25950 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49  &pLevel->u.in.aI
25960 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b  nLoop[j-1]; j>0;
25970 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20   j--, pIn--){.  
25980 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
25990 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e  eJumpHere(v, pIn
259a0 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a  ->addrInTop+1);.
259b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
259c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
259d0 4e 65 78 74 2c 20 70 49 6e 2d 3e 69 43 75 72 2c  Next, pIn->iCur,
259e0 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29   pIn->addrInTop)
259f0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
25a00 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
25a10 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d   pIn->addrInTop-
25a20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
25a30 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
25a40 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  db, pLevel->u.in
25a50 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d  .aInLoop);.    }
25a60 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
25a70 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
25a80 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29  pLevel->addrBrk)
25a90 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
25aa0 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20  ->iLeftJoin ){. 
25ab0 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
25ac0 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
25ad0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
25ae0 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65   OP_IfPos, pLeve
25af0 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20  l->iLeftJoin);. 
25b00 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c       assert( (pL
25b10 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
25b20 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
25b30 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  NLY)==0.        
25b40 20 20 20 7c 7c 20 28 70 4c 65 76 65 6c 2d 3e 70     || (pLevel->p
25b50 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
25b60 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20  ERE_INDEXED)!=0 
25b70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4c  );.      if( (pL
25b80 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
25b90 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
25ba0 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)==0 ){.     
25bb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
25bc0 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52  dOp1(v, OP_NullR
25bd0 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ow, pTabList->a[
25be0 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  i].iCursor);.   
25bf0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
25c00 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d  Level->iIdxCur>=
25c10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
25c20 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
25c30 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c  , OP_NullRow, pL
25c40 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a  evel->iIdxCur);.
25c50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
25c60 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50  ( pLevel->op==OP
25c70 5f 52 65 74 75 72 6e 20 29 7b 0a 20 20 20 20 20  _Return ){.     
25c80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
25c90 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
25ca0 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c  , pLevel->p1, pL
25cb0 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29  evel->addrFirst)
25cc0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
25cd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
25ce0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
25cf0 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e  oto, 0, pLevel->
25d00 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20  addrFirst);.    
25d10 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
25d20 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
25d30 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20   addr);.    }.  
25d40 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62 72 65  }..  /* The "bre
25d50 61 6b 22 20 70 6f 69 6e 74 20 69 73 20 68 65 72  ak" point is her
25d60 65 2c 20 6a 75 73 74 20 70 61 73 74 20 74 68 65  e, just past the
25d70 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 65   end of the oute
25d80 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74  r loop..  ** Set
25d90 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69   it..  */.  sqli
25da0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
25db0 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69  bel(v, pWInfo->i
25dc0 42 72 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c  Break);..  /* Cl
25dd0 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 63  ose all of the c
25de0 75 72 73 6f 72 73 20 74 68 61 74 20 77 65 72 65  ursors that were
25df0 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74   opened by sqlit
25e00 65 33 57 68 65 72 65 42 65 67 69 6e 2e 0a 20 20  e3WhereBegin..  
25e10 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  */.  assert( pWI
25e20 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 7c  nfo->nLevel==1 |
25e30 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  | pWInfo->nLevel
25e40 3d 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ==pTabList->nSrc
25e50 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   );.  for(i=0, p
25e60 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b  Level=pWInfo->a;
25e70 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65   i<pWInfo->nLeve
25e80 6c 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b  l; i++, pLevel++
25e90 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
25ea0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62  cList_item *pTab
25eb0 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
25ec0 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
25ed0 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  m];.    Table *p
25ee0 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Tab = pTabItem->
25ef0 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74  pTab;.    assert
25f00 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ( pTab!=0 );.   
25f10 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46   if( (pTab->tabF
25f20 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
25f30 72 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d  ral)!=0 || pTab-
25f40 3e 70 53 65 6c 65 63 74 20 29 20 63 6f 6e 74 69  >pSelect ) conti
25f50 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 57  nue;.    if( (pW
25f60 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
25f70 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 43 4c   & WHERE_OMIT_CL
25f80 4f 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  OSE)==0 ){.     
25f90 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b   if( !pWInfo->ok
25fa0 4f 6e 65 50 61 73 73 20 26 26 20 28 70 4c 65 76  OnePass && (pLev
25fb0 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
25fc0 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
25fd0 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)==0 ){.       
25fe0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
25ff0 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
26000 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
26010 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
26020 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70    if( (pLevel->p
26030 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
26040 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20  ERE_INDEXED)!=0 
26050 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
26060 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
26070 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c  OP_Close, pLevel
26080 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20  ->iIdxCur);.    
26090 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
260a0 2a 20 49 66 20 74 68 69 73 20 73 63 61 6e 20 75  * If this scan u
260b0 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61  ses an index, ma
260c0 6b 65 20 63 6f 64 65 20 73 75 62 73 74 69 74 75  ke code substitu
260d0 74 69 6f 6e 73 20 74 6f 20 72 65 61 64 20 64 61  tions to read da
260e0 74 61 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  ta.    ** from t
260f0 68 65 20 69 6e 64 65 78 20 69 6e 20 70 72 65 66  he index in pref
26100 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 74 61  erence to the ta
26110 62 6c 65 2e 20 53 6f 6d 65 74 69 6d 65 73 2c 20  ble. Sometimes, 
26120 74 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a  this means.    *
26130 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 65 65 64  * the table need
26140 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 66   never be read f
26150 72 6f 6d 2e 20 54 68 69 73 20 69 73 20 61 20 70  rom. This is a p
26160 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74  erformance boost
26170 2c 0a 20 20 20 20 2a 2a 20 61 73 20 74 68 65 20  ,.    ** as the 
26180 76 64 62 65 20 6c 65 76 65 6c 20 77 61 69 74 73  vdbe level waits
26190 20 75 6e 74 69 6c 20 74 68 65 20 74 61 62 6c 65   until the table
261a0 20 69 73 20 72 65 61 64 20 62 65 66 6f 72 65 20   is read before 
261b0 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20  actually.    ** 
261c0 73 65 65 6b 69 6e 67 20 74 68 65 20 74 61 62 6c  seeking the tabl
261d0 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
261e0 72 65 63 6f 72 64 20 63 6f 72 72 65 73 70 6f 6e  record correspon
261f0 64 69 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72  ding to the curr
26200 65 6e 74 0a 20 20 20 20 2a 2a 20 70 6f 73 69 74  ent.    ** posit
26210 69 6f 6e 20 69 6e 20 74 68 65 20 69 6e 64 65 78  ion in the index
26220 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a  ..    ** .    **
26230 20 43 61 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f   Calls to the co
26240 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20  de generator in 
26250 62 65 74 77 65 65 6e 20 73 71 6c 69 74 65 33 57  between sqlite3W
26260 68 65 72 65 42 65 67 69 6e 20 61 6e 64 0a 20 20  hereBegin and.  
26270 20 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72    ** sqlite3Wher
26280 65 45 6e 64 20 77 69 6c 6c 20 68 61 76 65 20 63  eEnd will have c
26290 72 65 61 74 65 64 20 63 6f 64 65 20 74 68 61 74  reated code that
262a0 20 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20   references the 
262b0 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72  table.    ** dir
262c0 65 63 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f  ectly.  This loo
262d0 70 20 73 63 61 6e 73 20 61 6c 6c 20 74 68 61 74  p scans all that
262e0 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f   code looking fo
262f0 72 20 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a  r opcodes.    **
26300 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20   that reference 
26310 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  the table and co
26320 6e 76 65 72 74 73 20 74 68 65 6d 20 69 6e 74 6f  nverts them into
26330 20 6f 70 63 6f 64 65 73 20 74 68 61 74 0a 20 20   opcodes that.  
26340 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74    ** reference t
26350 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f  he index..    */
26360 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c  .    if( (pLevel
26370 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
26380 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
26390 3d 30 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f  =0 && !db->mallo
263a0 63 46 61 69 6c 65 64 29 7b 0a 20 20 20 20 20 20  cFailed){.      
263b0 69 6e 74 20 6b 2c 20 6a 2c 20 6c 61 73 74 3b 0a  int k, j, last;.
263c0 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f        VdbeOp *pO
263d0 70 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  p;.      Index *
263e0 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  pIdx = pLevel->p
263f0 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 0a 20 20 20  lan.u.pIdx;..   
26400 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21     assert( pIdx!
26410 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 20  =0 );.      pOp 
26420 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
26430 4f 70 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 54  Op(v, pWInfo->iT
26440 6f 70 29 3b 0a 20 20 20 20 20 20 6c 61 73 74 20  op);.      last 
26450 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
26460 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
26470 20 20 20 66 6f 72 28 6b 3d 70 57 49 6e 66 6f 2d     for(k=pWInfo-
26480 3e 69 54 6f 70 3b 20 6b 3c 6c 61 73 74 3b 20 6b  >iTop; k<last; k
26490 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  ++, pOp++){.    
264a0 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21      if( pOp->p1!
264b0 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72  =pLevel->iTabCur
264c0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
264d0 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70       if( pOp->op
264e0 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20  code==OP_Column 
264f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ){.          for
26500 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43  (j=0; j<pIdx->nC
26510 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  olumn; j++){.   
26520 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70           if( pOp
26530 2d 3e 70 32 3d 3d 70 49 64 78 2d 3e 61 69 43 6f  ->p2==pIdx->aiCo
26540 6c 75 6d 6e 5b 6a 5d 20 29 7b 0a 20 20 20 20 20  lumn[j] ){.     
26550 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32           pOp->p2
26560 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
26570 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c      pOp->p1 = pL
26580 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
26590 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
265a0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
265b0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
265c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
265d0 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
265e0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
265f0 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20  X_ONLY)==0.     
26600 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3c 70            || j<p
26610 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  Idx->nColumn );.
26620 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
26630 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
26640 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  P_Rowid ){.     
26650 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70       pOp->p1 = p
26660 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
26670 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f            pOp->o
26680 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f  pcode = OP_IdxRo
26690 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  wid;.        }. 
266a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
266b0 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65  ..  /* Final cle
266c0 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 77 68 65 72  anup.  */.  wher
266d0 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57  eInfoFree(db, pW
266e0 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b  Info);.  return;
266f0 0a 7d 0a                                         .}.